Guest User

Untitled

a guest
May 27th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.13 KB | None | 0 0
  1. template <long SWAP_ENDIAN>
  2.  
  3. class BufferStreamOrder
  4.  
  5. {
  6.  
  7. std::vector<char> v;
  8.  
  9. size_t offset;
  10.  
  11. public:
  12.  
  13. inline BufferStreamOrder & WriteIn(const void *p, size_t len)
  14.  
  15. {
  16.  
  17. if (v.size() < offset+len)
  18.  
  19. v.resize(offset+len);
  20.  
  21.  
  22.  
  23. memcpy(&v[offset], p, len);
  24.  
  25. offset += len;
  26.  
  27. return *this;
  28.  
  29. }
  30.  
  31. protected:
  32.  
  33. template <class T>
  34.  
  35. inline BufferStreamOrder & WriteTemplate(const T v)
  36.  
  37. {
  38.  
  39. if (SWAP_ENDIAN)
  40.  
  41. {
  42.  
  43. T v2 = swapVal(v);
  44.  
  45. return WriteIn(&v2, sizeof(v));
  46.  
  47. }
  48.  
  49. else
  50.  
  51. return WriteIn(&v, sizeof(v));
  52.  
  53. };
  54.  
  55.  
  56.  
  57. public:
  58.  
  59. BufferStreamOrder() { offset=0; }
  60.  
  61.  
  62.  
  63. inline long resize(size_t size)
  64.  
  65. {
  66.  
  67. v.reserve(size);
  68.  
  69. }
  70.  
  71.  
  72.  
  73. inline BufferStreamOrder & empty() { offset = 0; return *this; }
  74.  
  75.  
  76.  
  77. inline char *Get() { return &v[0]; }
  78.  
  79. inline size_t WriteLen() { return offset; }
  80.  
  81.  
  82.  
  83.  
  84.  
  85. inline BufferStreamOrder & writeIn(u8 v) { return WriteTemplate(v); }
  86.  
  87. inline BufferStreamOrder & writeIn(s8 v) { return WriteTemplate(v); }
  88.  
  89. inline BufferStreamOrder & writeIn(u16 v) { return WriteTemplate(v); }
  90.  
  91. inline BufferStreamOrder & writeIn(s16 v) { return WriteTemplate(v); }
  92.  
  93. inline BufferStreamOrder & writeIn(u32 v) { return WriteTemplate(v); }
  94.  
  95. inline BufferStreamOrder & writeIn(s32 v) { return WriteTemplate(v); }
  96.  
  97. inline BufferStreamOrder & writeIn(u64 v) { return WriteTemplate(v); }
  98.  
  99. inline BufferStreamOrder & writeIn(s64 v) { return WriteTemplate(v); }
  100.  
  101. inline BufferStreamOrder & operator << (u8 v) { return WriteTemplate(v); }
  102.  
  103. inline BufferStreamOrder & operator << (s8 v) { return WriteTemplate(v); }
  104.  
  105. inline BufferStreamOrder & operator << (s16 v) { return WriteTemplate(v); }
  106.  
  107. inline BufferStreamOrder & operator << (u16 v) { return WriteTemplate(v); }
  108.  
  109. inline BufferStreamOrder & operator << (s32 v) { return WriteTemplate(v); }
  110.  
  111. inline BufferStreamOrder & operator << (u32 v) { return WriteTemplate(v); }
  112.  
  113. inline BufferStreamOrder & operator << (s64 v) { return WriteTemplate(v); }
  114.  
  115. inline BufferStreamOrder & operator << (u64 v) { return WriteTemplate(v); }
  116.  
  117. //*/
  118.  
  119. inline BufferStreamOrder & operator << (const char *psz) { return WriteIn(psz, strlen(psz)); }
  120.  
  121. };
  122.  
  123. typedef size_t (*ReadFunction_t)(void *dst, const void *pUser, size_t len);
  124.  
  125. template <long SWAP_ENDIAN>
  126.  
  127. class ReadStreamOrder
  128.  
  129. {
  130.  
  131. public:
  132.  
  133. //there is no reason to hide these
  134.  
  135. void *userData;
  136.  
  137. ReadFunction_t readFunction;
  138.  
  139.  
  140.  
  141. inline ReadStreamOrder & ReadIn(void *dst, const void *pUser, size_t len)
  142.  
  143. {
  144.  
  145. readFunction(dst, pUser, len);
  146.  
  147. return *this;
  148.  
  149. }
  150.  
  151. protected:
  152.  
  153. template <class T>
  154.  
  155. inline ReadStreamOrder & ReadTemplate(T &v)
  156.  
  157. {
  158.  
  159. if (SWAP_ENDIAN)
  160.  
  161. {
  162.  
  163. T v2;
  164.  
  165. ReadIn(&v2, userData, sizeof(v));
  166.  
  167. v = swapVal(v2);
  168.  
  169. return *this;
  170.  
  171. }
  172.  
  173. else
  174.  
  175. return ReadIn(&v, userData, sizeof(v));
  176.  
  177. };
  178.  
  179.  
  180.  
  181. public:
  182.  
  183. ReadStreamOrder(ReadFunction_t readFunc_, void *userData_) { readFunction = readFunc_; userData = userData_; }
  184.  
  185.  
  186.  
  187. #define WRITEIN(T) inline ReadStreamOrder &writeIn(T &v) { return ReadTemplate(v); }
  188.  
  189. WRITEIN(u8)
  190.  
  191. WRITEIN(s8)
  192.  
  193. WRITEIN(u16)
  194.  
  195. WRITEIN(s16)
  196.  
  197. WRITEIN(u32)
  198.  
  199. WRITEIN(s32)
  200.  
  201. WRITEIN(u64)
  202.  
  203. WRITEIN(s64)
  204.  
  205. #undef WRITEIN
  206.  
  207. #define WRITEIN(T) inline ReadStreamOrder & operator >> (T &v) { return ReadTemplate(v); }
  208.  
  209. WRITEIN(u8)
  210.  
  211. WRITEIN(s8)
  212.  
  213. WRITEIN(u16)
  214.  
  215. WRITEIN(s16)
  216.  
  217. WRITEIN(u32)
  218.  
  219. WRITEIN(s32)
  220.  
  221. WRITEIN(u64)
  222.  
  223. WRITEIN(s64)
  224.  
  225. #undef WRITEIN
  226.  
  227. /*
  228.  
  229. inline ReadStreamOrder & writeIn(u8 &v) { return ReadTemplate(v); }
  230.  
  231. inline ReadStreamOrder & writeIn(s8 &v) { return ReadTemplate(v); }
  232.  
  233. inline ReadStreamOrder & writeIn(u16 &v) { return ReadTemplate(v); }
  234.  
  235. inline ReadStreamOrder & writeIn(s16 &v) { return ReadTemplate(v); }
  236.  
  237. inline ReadStreamOrder & writeIn(u32 &v) { return ReadTemplate(v); }
  238.  
  239. inline ReadStreamOrder & writeIn(s32 &v) { return ReadTemplate(v); }
  240.  
  241. inline ReadStreamOrder & writeIn(u64 &v) { return ReadTemplate(v); }
  242.  
  243. inline ReadStreamOrder & writeIn(s64 &v) { return ReadTemplate(v); }
  244.  
  245. inline ReadStreamOrder & operator >> (u8 &v) { return ReadTemplate(v); }
  246.  
  247. inline ReadStreamOrder & operator >> (s8 &v) { return ReadTemplate(v); }
  248.  
  249. inline ReadStreamOrder & operator >> (s16 &v) { return ReadTemplate(v); }
  250.  
  251. inline ReadStreamOrder & operator >> (u16 &v) { return ReadTemplate(v); }
  252.  
  253. inline ReadStreamOrder & operator >> (s32 &v) { return ReadTemplate(v); }
  254.  
  255. inline ReadStreamOrder & operator >> (u32 &v) { return ReadTemplate(v); }
  256.  
  257. inline ReadStreamOrder & operator >> (s64 &v) { return ReadTemplate(v); }
  258.  
  259. inline ReadStreamOrder & operator >> (u64 &v) { return ReadTemplate(v); }
  260.  
  261. //*/
  262.  
  263. inline ReadStreamOrder & operator >> (const char *psz) { return ReadIn(psz, strlen(psz)); }
  264.  
  265.  
  266.  
  267. template <class T> inline T Get() { T v; ReadTemplate(v); return v; }
  268.  
  269. template <class T> inline long Equal(T v) { T v2; ReadTemplate(v2); return v == v2; }
  270.  
  271. };
  272.  
  273. #ifdef __BIG_ENDIAN__
  274.  
  275. typedef BufferStreamOrder<1> BufferStreamLE;
  276.  
  277. typedef BufferStreamOrder<0> BufferStreamBE;
  278.  
  279. typedef ReadStreamOrder<1> ReadStreamLE;
  280.  
  281. typedef ReadStreamOrder<0> ReadStreamBE;
  282.  
  283.  
  284.  
  285. #endif
  286.  
  287. #if defined __LITTLE_ENDIAN__
  288.  
  289. typedef BufferStreamOrder<0> BufferStreamLE;
  290.  
  291. typedef BufferStreamOrder<1> BufferStreamBE;
  292.  
  293. typedef ReadStreamOrder<0> ReadStreamLE;
  294.  
  295. typedef ReadStreamOrder<1> ReadStreamBE;
  296.  
  297. #endif
  298.  
  299. typedef BufferStreamOrder<0> BufferStream;
  300.  
  301. typedef ReadStreamOrder<0> ReadStream;
Add Comment
Please, Sign In to add comment