datastream.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #pragma once
  2. /********************************************************************
  3. created: 2008-10-13
  4. author: lixianmin
  5. purpose: used for data serialization and deserialization
  6. Copyright (C) 2008 - All Rights Reserved
  7. *********************************************************************/
  8. #include <vector>
  9. #include <cassert>
  10. #include <algorithm>
  11. class datastream:public std::vector<char>
  12. {
  13. public:
  14. datastream& operator<<(bool data){return push(data);}
  15. datastream& operator<<(char data){return push(data);}
  16. datastream& operator<<(wchar_t data){return push(data);}
  17. datastream& operator<<(short data){return push(data);}
  18. datastream& operator<<(int data){return push(data);}
  19. datastream& operator<<(long data){return push(data);}
  20. datastream& operator<<(float data){return push(data);}
  21. datastream& operator<<(double data){return push(data);}
  22. datastream& operator<<(unsigned char data){return push(data);}
  23. datastream& operator<<(unsigned short data){return push(data);}
  24. datastream& operator<<(unsigned int data){return push(data);}
  25. datastream& operator<<(unsigned long data){return push(data);}
  26. datastream& operator>>(bool& data){return pop(data);}
  27. datastream& operator>>(char& data){return pop(data);}
  28. datastream& operator>>(wchar_t& data){return pop(data);}
  29. datastream& operator>>(short& data){return pop(data);}
  30. datastream& operator>>(int& data){return pop(data);}
  31. datastream& operator>>(long& data){return pop(data);}
  32. datastream& operator>>(float& data){return pop(data);}
  33. datastream& operator>>(double& data){return pop(data);}
  34. datastream& operator>>(unsigned char& data){return pop(data);}
  35. datastream& operator>>(unsigned short& data){return pop(data);}
  36. datastream& operator>>(unsigned int& data){return pop(data);}
  37. datastream& operator>>(unsigned long& data){return pop(data);}
  38. /*
  39. datastream& test(bool& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
  40. datastream& test(char& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
  41. datastream& test(short& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
  42. datastream& test(int& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
  43. datastream& test(long& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
  44. datastream& test(float& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
  45. datastream& test(double& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
  46. datastream& test(unsigned char& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
  47. datastream& test(unsigned short& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
  48. datastream& test(unsigned int& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
  49. datastream& test(unsigned long& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
  50. */
  51. //std::string´¦Àí
  52. datastream& operator<<(const char* data){return push(strlen(data), (void*)data);}
  53. datastream& operator<<(const wchar_t* data){return push(wcslen(data)<<1, (void*)data);}
  54. datastream& operator<<(const std::wstring& data){return push(data.size()<<1, (void*)data.c_str());}
  55. datastream& operator<<(const std::string& data)
  56. {
  57. push(data.size(), (void*)data.c_str());
  58. push_back('\0');
  59. return (*this);
  60. }
  61. datastream& operator>>(std::string& data)
  62. {
  63. std::vector<char>::iterator locate = find(begin(),end(),'\0');
  64. if(locate != end())
  65. {
  66. data = &operator[](0);
  67. erase(begin(),++locate);
  68. }
  69. else
  70. {
  71. push_back('\0');
  72. data = &operator[](0);
  73. erase(begin(),end());
  74. }
  75. return *this;
  76. }
  77. datastream& operator>>(std::wstring& data)
  78. {
  79. size_t nSize;
  80. pop(nSize);
  81. wchar_t* a=(wchar_t*)&operator[](0), *b=a+(nSize>>1);
  82. data.assign(a, b);
  83. std::vector<char>::iterator first=begin();
  84. erase(first, first+nSize);
  85. return *this;
  86. }
  87. /*
  88. datastream& test(std::string& data)
  89. {
  90. size_t nSize;
  91. test(nSize);
  92. std::vector<char>::iterator first=begin()+sizeof(nSize);
  93. data.assign(first, first+nSize);
  94. return *this;
  95. }
  96. datastream& test(std::wstring& data)
  97. {
  98. size_t nSize;
  99. test(nSize);
  100. wchar_t* first=(wchar_t*)&operator[](sizeof(nSize));
  101. data.assign(first, first+(nSize>>1));
  102. return *this;
  103. }
  104. */
  105. //std::vector´¦Àí
  106. /*
  107. template<typename C>
  108. datastream& operator<<(const std::vector<C>& data)
  109. {
  110. size_t nSize=data.size();
  111. push(nSize);
  112. for (int i=0; i<nSize; ++i)
  113. {
  114. operator<<(data[i]);
  115. }
  116. return *this;
  117. }
  118. template<typename C>
  119. datastream& operator>>(std::vector<C>& data)
  120. {
  121. size_t nSize;
  122. pop(nSize);
  123. C tmp;
  124. for (int i=0; i<nSize; ++i)
  125. {
  126. operator>>(tmp);
  127. data.push_back(tmp);
  128. }
  129. return *this;
  130. }
  131. */
  132. template<typename C>
  133. void readRowData(std::vector<C>& data)
  134. {
  135. if(data.size() == 0)
  136. {
  137. return;
  138. }
  139. if(size() >= sizeof(C)*data.size())
  140. {
  141. memcpy(&data[0], &operator[](0), sizeof(C)*data.size());
  142. erase(begin(),begin()+sizeof(C)*data.size());
  143. }
  144. else
  145. {
  146. assert(0);
  147. }
  148. //too slow,don't use it for big data blocks
  149. //for(DWORD i = 0;i < data.size();i++)
  150. //{
  151. // (*this) >> data[i];
  152. //}
  153. }
  154. private:
  155. char* inc_size(size_t delta_size)
  156. {
  157. size_t last_size=size();
  158. resize(last_size+delta_size);
  159. return &operator[](last_size);
  160. }
  161. template<typename C>
  162. datastream& push(C data)
  163. {
  164. memcpy(inc_size(sizeof(data)), &data, sizeof(data));
  165. return *this;
  166. }
  167. datastream& push(size_t size, void* data)
  168. {
  169. memcpy(inc_size(size), data, size);
  170. return *this;
  171. }
  172. template<typename C>
  173. datastream& pop(C& data)
  174. {
  175. memcpy(&data, &operator[](0), sizeof(data));
  176. erase(begin(), begin()+sizeof(data));
  177. return *this;
  178. }
  179. };