Advertisement
Guest User

Untitled

a guest
Oct 18th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.46 KB | None | 0 0
  1. #include <string>
  2. #include <vector>
  3. #include <iostream>
  4. #include <cstddef>
  5. #include <iomanip>
  6.  
  7. struct test
  8. {
  9. int x;
  10. float y;
  11. std::string z;
  12.  
  13. template <typename Serializer>
  14. void serialize (Serializer & s)
  15. {
  16. s(x);
  17. s(y);
  18. s(z);
  19. }
  20. };
  21.  
  22. template <typename T, typename ReadBuffer>
  23. void read (T & x, ReadBuffer & buffer)
  24. {
  25. buffer.read(reinterpret_cast<std::byte *>(std::addressof(x)), sizeof(x));
  26. }
  27.  
  28. template <typename T, typename WriteBuffer>
  29. void write (T const & x, WriteBuffer & buffer)
  30. {
  31. buffer.write(reinterpret_cast<std::byte const *>(std::addressof(x)), sizeof(x));
  32. }
  33.  
  34. template <typename A, typename ReadBuffer>
  35. void read_array (A & a, ReadBuffer & buffer)
  36. {
  37. std::size_t size;
  38. read(size, buffer);
  39. a.resize(size);
  40. buffer.read(reinterpret_cast<std::byte *>(a.data()), size * sizeof(*std::begin(a)));
  41. }
  42.  
  43. template <typename A, typename WriteBuffer>
  44. void write_array (A const & a, WriteBuffer & buffer)
  45. {
  46. write(a.size(), buffer);
  47. buffer.write(reinterpret_cast<std::byte const *>(a.data()), a.size() * sizeof(*std::begin(a)));
  48. }
  49.  
  50. template <typename ReadBuffer>
  51. void read (std::string & x, ReadBuffer & buffer)
  52. {
  53. read_array(x, buffer);
  54. }
  55.  
  56. template <typename WriteBuffer>
  57. void write (std::string const & x, WriteBuffer & buffer)
  58. {
  59. write_array(x, buffer);
  60. }
  61.  
  62. template <std::size_t ChunkSize>
  63. struct chunk_buffer
  64. {
  65. using chunk = std::array<std::byte, ChunkSize>;
  66.  
  67. std::vector<chunk> chunks;
  68.  
  69. std::size_t write_chunk, write_offset;
  70. std::size_t read_chunk, read_offset;
  71.  
  72. chunk_buffer ( )
  73. {
  74. clear();
  75. }
  76.  
  77. void clear ( )
  78. {
  79. reset();
  80.  
  81. chunks.resize(1);
  82. }
  83.  
  84. void reset ( )
  85. {
  86. write_chunk = 0;
  87. write_offset = 0;
  88. read_chunk = 0;
  89. read_offset = 0;
  90. }
  91.  
  92. void write (std::byte const * data, std::size_t size)
  93. {
  94. while (size > 0)
  95. {
  96. std::size_t s = std::min(chunks[write_chunk].size() - write_offset, size);
  97. std::copy(data, data + s, chunks[write_chunk].data() + write_offset);
  98. write_offset += s;
  99. data += s;
  100. size -= s;
  101.  
  102. if (size > 0)
  103. {
  104. ++write_chunk;
  105. write_offset = 0;
  106. if (chunks.size() <= write_chunk)
  107. chunks.resize(write_chunk + 1);
  108. }
  109. }
  110. }
  111.  
  112. void read (std::byte * data, std::size_t size)
  113. {
  114. while (size > 0)
  115. {
  116. std::size_t s = std::min(chunks[read_chunk].size() - read_offset, size);
  117. std::copy(chunks[read_chunk].data() + read_offset, chunks[read_chunk].data() + s + read_offset, data);
  118. read_offset += s;
  119. data += s;
  120. size -= s;
  121.  
  122. if (size > 0)
  123. {
  124. ++read_chunk;
  125. read_offset = 0;
  126. if (chunks.size() <= read_chunk)
  127. {
  128. throw std::runtime_error("Insufficient data in buffer for deserializing");
  129. }
  130. }
  131. }
  132. }
  133. };
  134.  
  135. template <typename WriteBuffer>
  136. struct serializer
  137. {
  138. WriteBuffer & buf;
  139.  
  140. serializer (WriteBuffer & buf) : buf(buf) { }
  141.  
  142. template <typename T>
  143. serializer & operator() (T const & x)
  144. {
  145. write(x, buf);
  146. return *this;
  147. }
  148. };
  149.  
  150. template <typename ReadBuffer>
  151. struct deserializer
  152. {
  153. ReadBuffer & buf;
  154.  
  155. deserializer (ReadBuffer & buf) : buf(buf) { }
  156.  
  157. template <typename T>
  158. deserializer & operator() (T & x)
  159. {
  160. read(x, buf);
  161. return *this;
  162. }
  163. };
  164.  
  165. int main ( )
  166. {
  167. chunk_buffer<0x400> buffer;
  168.  
  169. {
  170. test t { 42, 3.141592f, "Hello, world!" };
  171.  
  172. serializer s { buffer };
  173. t.serialize(s);
  174. }
  175.  
  176. {
  177. deserializer s { buffer };
  178.  
  179. test t;
  180. t.serialize(s);
  181.  
  182. std::cout << t.x << ' ' << t.y << ' ' << t.z << std::endl;
  183. }
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement