中间件底层,websocket

SerializeSmartPtr.hpp 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. //******************************************************************************
  2. // RCF - Remote Call Framework
  3. //
  4. // Copyright (c) 2005 - 2020, Delta V Software. All rights reserved.
  5. // http://www.deltavsoft.com
  6. //
  7. // RCF is distributed under dual licenses - closed source or GPL.
  8. // Consult your particular license for conditions of use.
  9. //
  10. // If you have not purchased a commercial license, you are using RCF
  11. // under GPL terms.
  12. //
  13. // Version: 3.2
  14. // Contact: support <at> deltavsoft.com
  15. //
  16. //******************************************************************************
  17. #ifndef INCLUDE_SF_SERIALIZESMARTPTR_HPP
  18. #define INCLUDE_SF_SERIALIZESMARTPTR_HPP
  19. #include <SF/Archive.hpp>
  20. #include <SF/Stream.hpp>
  21. namespace SF {
  22. // 1. Non-ref counted smart pointer. SmartPtr<T> must support reset() and operator->().
  23. template<typename T, typename SmartPtrT>
  24. inline void serializeSimpleSmartPtr(SmartPtrT **ppt, SF::Archive &ar)
  25. {
  26. if (ar.isRead())
  27. {
  28. if (ar.isFlagSet(Archive::POINTER))
  29. {
  30. *ppt = new SmartPtrT();
  31. }
  32. T *pt = NULL;
  33. ar & pt;
  34. (**ppt).reset(pt);
  35. }
  36. else if (ar.isWrite())
  37. {
  38. T *pt = NULL;
  39. if (*ppt && (**ppt).get())
  40. {
  41. pt = (**ppt).operator->();
  42. }
  43. ar & pt;
  44. }
  45. }
  46. #define SF_SERIALIZE_SIMPLE_SMARTPTR( SmartPtr ) \
  47. template<typename T> \
  48. inline bool invokeCustomSerializer(SmartPtr<T> **ppt, Archive &ar, int) \
  49. { \
  50. serializeSimpleSmartPtr<T>(ppt, ar); \
  51. return true; \
  52. }
  53. // 2. Ref counted smart pointer. Must support operator=(), operator->(), and get().
  54. template<typename T, typename SmartPtrT>
  55. inline void serializeRefCountedSmartPtr(SmartPtrT **ppt, SF::Archive &ar)
  56. {
  57. if (ar.isRead())
  58. {
  59. if (ar.isFlagSet(Archive::POINTER))
  60. {
  61. *ppt = new SmartPtrT;
  62. }
  63. T *pt = NULL;
  64. ar & pt;
  65. ContextRead &ctx = ar.getIstream()->getTrackingContext();
  66. if (!ctx.getEnabled())
  67. {
  68. // No pointer tracking.
  69. **ppt = SmartPtrT(pt);
  70. }
  71. else
  72. {
  73. // Pointer tracking enabled, so some extra gymnastics involved.
  74. void *pv = NULL;
  75. if (pt && ctx.getEnabled() && ctx.query((void *)pt, typeid(SmartPtrT), pv))
  76. {
  77. SmartPtrT *ps_prev = reinterpret_cast<SmartPtrT *>(pv);
  78. **ppt = *ps_prev;
  79. }
  80. else if (pt)
  81. {
  82. if (ctx.getEnabled())
  83. {
  84. ctx.add((void *)pt, typeid(SmartPtrT), *ppt);
  85. }
  86. **ppt = SmartPtrT(pt);
  87. }
  88. }
  89. }
  90. else /*if (ar.isWrite())*/
  91. {
  92. T *pt = NULL;
  93. if (*ppt)
  94. {
  95. pt = (**ppt).get();
  96. }
  97. ar & pt;
  98. }
  99. }
  100. #define SF_SERIALIZE_REFCOUNTED_SMARTPTR( SmartPtr ) \
  101. template<typename T> \
  102. inline bool invokeCustomSerializer(SmartPtr<T> **ppt, Archive &ar, int) \
  103. { \
  104. serializeRefCountedSmartPtr<T>(ppt, ar); \
  105. return true; \
  106. }
  107. } // namespace SF
  108. #endif // ! INCLUDE_SF_SERIALIZERSMARTPTR_HPP