StreamedBinaryRead.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. //
  2. // StreamedBinaryRead.h
  3. // cocos2d_libs
  4. //
  5. // Created by 徐俊杰 on 2021/5/7.
  6. //
  7. #ifndef StreamedBinaryRead_h
  8. #define StreamedBinaryRead_h
  9. #include "rparticle/Macros/RParticleMacros.h"
  10. #include "rparticle/Serialize/TransferFunctions/TransferBase.h"
  11. #include "rparticle/Serialize/TransferFunctions/JsonSerializeTraits.h"
  12. NS_RRP_BEGIN
  13. class StreamedBinaryRead : public TransferBase
  14. {
  15. public:
  16. StreamedBinaryRead(std::vector<unsigned char> data)
  17. : _data(data)
  18. , _currentByte(0)
  19. {}
  20. template<class T>
  21. void Transfer (T& data, const char* name, int metaFlag = 0);
  22. template<class T>
  23. void TransferDeepData (T& data);
  24. template<class T>
  25. void TransferBasicData (T& data);
  26. template<class T>
  27. void TransferSTLStyleArray (T& data, int metaFlag = 0);
  28. private:
  29. std::vector<unsigned char> _data;
  30. int _currentByte;
  31. };
  32. template<class T>
  33. void StreamedBinaryRead::Transfer (T& data, const char* _name, int metaFlag)
  34. {
  35. SerializeTraits<T>::Transfer (data, *this);
  36. }
  37. template<class T>
  38. inline void StreamedBinaryRead::TransferDeepData (T& data)
  39. {
  40. data.Transfer (*this);
  41. }
  42. template<class T>
  43. inline void StreamedBinaryRead::TransferBasicData (T& data)
  44. {
  45. union {
  46. T data;
  47. unsigned char c[sizeof(T)];
  48. } u;
  49. #if RRP_LITTLE_ENDIAN
  50. for (int i = 0; i < sizeof(T); i++)
  51. #else
  52. for (int i = sizeof(T) - 1; i >= 0; i--)
  53. #endif
  54. {
  55. u.c[i] = _data[_currentByte++];
  56. }
  57. data = u.data;
  58. }
  59. /*
  60. template<>
  61. inline void StreamedBinaryRead::TransferBasicData<SInt64> (SInt64& data)
  62. {
  63. }
  64. template<>
  65. inline void StreamedBinaryRead::TransferBasicData<UInt64> (UInt64& data)
  66. {
  67. }
  68. template<>
  69. inline void StreamedBinaryRead::TransferBasicData<float> (float& data)
  70. {
  71. }
  72. template<>
  73. inline void StreamedBinaryRead::TransferBasicData<double> (double& data)
  74. {
  75. }
  76. template<>
  77. inline void StreamedBinaryRead::TransferBasicData<char> (char& data)
  78. {
  79. }
  80. template<>
  81. inline void StreamedBinaryRead::TransferBasicData<SInt8> (SInt8& data)
  82. {
  83. }
  84. template<>
  85. inline void StreamedBinaryRead::TransferBasicData<UInt8> (UInt8& data)
  86. {
  87. }
  88. template<>
  89. inline void StreamedBinaryRead::TransferBasicData<SInt32> (SInt32& data)
  90. {
  91. }
  92. template<>
  93. inline void StreamedBinaryRead::TransferBasicData<UInt32> (UInt32& data)
  94. {
  95. }
  96. template<>
  97. inline void StreamedBinaryRead::TransferBasicData<SInt16> (SInt16& data)
  98. {
  99. }
  100. template<>
  101. inline void StreamedBinaryRead::TransferBasicData<UInt16> (UInt16& data)
  102. {
  103. }
  104. template<>
  105. inline void StreamedBinaryRead::TransferBasicData<bool> (bool& data)
  106. {
  107. }
  108. */
  109. template<>
  110. inline void StreamedBinaryRead::TransferBasicData<std::string> (std::string& data)
  111. {
  112. int length = 0;
  113. TransferBasicData(length);
  114. data.clear();
  115. for (int i = 0; i < length; i++) {
  116. data.push_back((char)_data[_currentByte++]);
  117. }
  118. }
  119. template<class T>
  120. void StreamedBinaryRead::TransferSTLStyleArray (T& data, int metaFlag)
  121. {
  122. size_t size;
  123. TransferBasicData(size);
  124. SerializeTraits<T>::ResizeSTLStyleArray (data, size);
  125. typename T::iterator dataIterator = data.begin ();
  126. for (int i = 0; i < size; i++) {
  127. Transfer(*dataIterator, "data", metaFlag);
  128. ++dataIterator;
  129. }
  130. }
  131. NS_RRP_END
  132. #endif /* StreamedBinaryRead_h */