/serializer.hpp

http://serializer.googlecode.com/ · C++ Header · 194 lines · 151 code · 27 blank · 16 comment · 12 complexity · f81c20eae1306c2a4b4732120ed6be63 MD5 · raw file

  1. /*
  2. **************************************************************************
  3. * *
  4. * Binary Data Serializer Library *
  5. * *
  6. * Author: Arash Partow - 2001 *
  7. * URL: http://www.partow.net *
  8. * *
  9. * Copyright notice: *
  10. * Free use of the Binary Data Serializer Library is permitted under the *
  11. * guidelines and in accordance with the most current version of the *
  12. * Common Public License. *
  13. * http://www.opensource.org/licenses/cpl.php *
  14. * *
  15. **************************************************************************
  16. */
  17. #ifndef INCLUDE_SERIALIZER_HPP
  18. #define INCLUDE_SERIALIZER_HPP
  19. #include <iostream>
  20. #include <string>
  21. #include <algorithm>
  22. #include <fstream>
  23. class serializer
  24. {
  25. public:
  26. serializer(char* buffer, const unsigned int& buffer_length)
  27. : original_buffer_(buffer),
  28. buffer_(buffer + 1),
  29. buffer_length_(buffer_length)
  30. {
  31. }
  32. void reset()
  33. {
  34. written_buffer_size_ = 0;
  35. read_buffer_size_ = 0;
  36. buffer_ = original_buffer_;
  37. }
  38. void clear()
  39. {
  40. reset();
  41. for(unsigned int i = 0; i < buffer_length_; ++i)
  42. {
  43. buffer_[i] = 0;
  44. }
  45. }
  46. void delete_internal_buffer()
  47. {
  48. delete[] original_buffer_;
  49. original_buffer_ = 0;
  50. buffer_ = 0;
  51. }
  52. unsigned int length() { return written_buffer_size_; }
  53. template<typename T> inline bool operator >> (T& output) { return read (output); }
  54. template<typename T> inline bool operator << (T& output) { return write(output); }
  55. inline bool read(char& output) { return read_pod(output); }
  56. inline bool read(int& output) { return read_pod(output); }
  57. inline bool read(unsigned int& output) { return read_pod(output); }
  58. inline bool read(float& output) { return read_pod(output); }
  59. inline bool read(double& output) { return read_pod(output); }
  60. inline bool read(std::string& output)
  61. {
  62. unsigned int length = 0;
  63. if (!read_pod(length))
  64. {
  65. return false;
  66. }
  67. if ((length + sizeof(unsigned int) + read_buffer_size_) > buffer_length_)
  68. {
  69. return false;
  70. }
  71. output.resize(length);
  72. std::copy(buffer_, buffer_ + length,output.begin());
  73. buffer_ += length;
  74. read_buffer_size_ += length;
  75. return true;
  76. }
  77. inline bool write(const char& input) { return write_pod(input); }
  78. inline bool write(const int& input) { return write_pod(input); }
  79. inline bool write(const unsigned int& input) { return write_pod(input); }
  80. inline bool write(const float& input) { return write_pod(input); }
  81. inline bool write(const double& input) { return write_pod(input); }
  82. inline bool write(const short& input) { return write_pod(input); }
  83. inline bool write(std::string& input)
  84. {
  85. return write(input.c_str(),static_cast<unsigned int>(input.size()));
  86. }
  87. inline bool write(const char* data, unsigned int length)
  88. {
  89. if ((length + sizeof(unsigned int) + written_buffer_size_) > buffer_length_)
  90. {
  91. return false;
  92. }
  93. write(length);
  94. std::copy(data,data + length,buffer_);
  95. buffer_ += length;
  96. written_buffer_size_ += length;
  97. return true;
  98. }
  99. inline void write_to_stream(std::ofstream& stream)
  100. {
  101. stream.write(original_buffer_,written_buffer_size_);
  102. }
  103. inline void read_from_stream(std::ifstream& stream, const unsigned int length)
  104. {
  105. if (length > buffer_length_)
  106. {
  107. return;
  108. }
  109. stream.read(original_buffer_,length);
  110. }
  111. inline void write_to_buffer(char data[])
  112. {
  113. std::copy(original_buffer_,original_buffer_ + written_buffer_size_,data);
  114. }
  115. inline void read_from_buffer(const char data[], const unsigned int& length)
  116. {
  117. if (length > buffer_length_)
  118. {
  119. return;
  120. }
  121. std::copy(data,data + length,original_buffer_);
  122. }
  123. private:
  124. serializer();
  125. serializer(const serializer& s);
  126. serializer& operator=(const serializer& s);
  127. template<typename T>
  128. inline bool write_pod(const T& data)
  129. {
  130. const unsigned int data_length = sizeof(T);
  131. if ((data_length + written_buffer_size_) > buffer_length_)
  132. {
  133. return false;
  134. }
  135. const char* ptr = reinterpret_cast<const char*>(&data);
  136. const char* end = reinterpret_cast<const char*>(&data) + sizeof(T);
  137. for(; ptr != end; ++buffer_, ++ptr)
  138. {
  139. *buffer_ = *ptr;
  140. }
  141. written_buffer_size_ += data_length;
  142. return true;
  143. }
  144. template<typename T>
  145. inline bool read_pod(T& data)
  146. {
  147. const unsigned int data_length = sizeof(T);
  148. if ((data_length + read_buffer_size_) > buffer_length_)
  149. {
  150. return false;
  151. }
  152. char* ptr = reinterpret_cast<char*>(&data);
  153. char* end = reinterpret_cast<char*>(&data) + sizeof(T);
  154. for(; ptr != end; ++buffer_, ++ptr)
  155. {
  156. *ptr = *buffer_;
  157. }
  158. read_buffer_size_ += data_length;
  159. return true;
  160. }
  161. char* original_buffer_;
  162. char* buffer_;
  163. unsigned int buffer_length_;
  164. unsigned int written_buffer_size_;
  165. unsigned int read_buffer_size_;
  166. };
  167. #endif