中间件底层,websocket

SerializeDynamicArray.hpp 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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_SERIALIZEDYNAMICARRAY_HPP
  18. #define INCLUDE_SF_SERIALIZEDYNAMICARRAY_HPP
  19. #include <SF/SerializeFundamental.hpp>
  20. #include <SF/SfNew.hpp>
  21. namespace SF {
  22. // serialize C-style dynamic arrays
  23. template<typename T, typename N>
  24. class DynamicArray
  25. {
  26. public:
  27. DynamicArray( const T *&pt, const N &n ) : pt_( const_cast< T*&>(pt) ), n_( const_cast<N &>(n) ) {}
  28. DynamicArray( T *&pt, const N &n ) : pt_( const_cast< T*&>(pt) ), n_( const_cast<N &>(n) ) {}
  29. DynamicArray(const DynamicArray &rhs) : pt_(rhs.pt_), n_(rhs.n_) {}
  30. T *&get() { return pt_; }
  31. N &length() { return n_; }
  32. T &operator[](unsigned int idx) { RCF_ASSERT( get() != NULL && 0 <= idx && idx < length() ); return *(get() + idx); }
  33. private:
  34. DynamicArray &operator=(const DynamicArray &rhs); // Can't reassign reference members
  35. T *&pt_;
  36. N &n_;
  37. };
  38. // If T is fundamental.
  39. template<typename T, typename N>
  40. inline void serializeDynamicArray(
  41. RCF::TrueType *,
  42. Archive &ar,
  43. DynamicArray<T,N> &da)
  44. {
  45. if (ar.isRead())
  46. {
  47. I_Encoding &e = ar.getIstream()->getEncoding();
  48. DataPtr data;
  49. bool bRet = ar.getIstream()->get( data );
  50. if (bRet)
  51. {
  52. UInt32 nCount = e.getCount( data , (T *) NULL);
  53. da.get() = new T[ nCount ];
  54. da.length() = nCount;
  55. e.toObject(data, da.get(), nCount );
  56. }
  57. }
  58. else if (ar.isWrite())
  59. {
  60. if (da.length() > 0)
  61. {
  62. I_Encoding &e = ar.getOstream()->getEncoding();
  63. DataPtr data;
  64. e.toData(data, da.get(), da.length() );
  65. ar.getOstream()->put(data);
  66. }
  67. }
  68. }
  69. // If T is non-fundamental.
  70. template<typename T, typename N>
  71. inline void serializeDynamicArray(
  72. RCF::FalseType *,
  73. Archive &ar,
  74. DynamicArray<T,N> &da)
  75. {
  76. if (ar.isRead())
  77. {
  78. UInt32 nCount;
  79. ar & nCount;
  80. da.get() = new T[nCount];
  81. da.length() = nCount;
  82. for (UInt32 i=0; i<da.length(); i++)
  83. ar & da[i];
  84. }
  85. else if (ar.isWrite())
  86. {
  87. ar & da.length();
  88. for (UInt32 i=0; i<da.length(); i++)
  89. ar & da[i];
  90. }
  91. }
  92. template<typename T, typename N>
  93. inline void serialize(Archive &ar, DynamicArray<T,N> &da)
  94. {
  95. typedef typename RCF::IsFundamental<T>::type FundamentalOrNot;
  96. serializeDynamicArray( (FundamentalOrNot *) NULL, ar, da);
  97. }
  98. SF_NO_CTOR_T2( DynamicArray )
  99. template<typename T, typename N>
  100. inline DynamicArray<T,N> dynamicArray(const T *&pt, const N &size)
  101. {
  102. return DynamicArray<T,N>(pt, size);
  103. }
  104. template<typename T, typename N>
  105. inline DynamicArray<T,N> dynamicArray( T *&pt, const N &size)
  106. {
  107. return DynamicArray<T,N>(pt, size);
  108. }
  109. } // namespace SF
  110. #endif // ! INCLUDE_SF_SERIALIZEDYNAMICARRAY_HPP