Serializable.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. /*
  2. * TI Voxel Lib component.
  3. *
  4. * Copyright (c) 2014 Texas Instruments Inc.
  5. */
  6. #ifndef VOXEL_SERIALIZABLE_H
  7. #define VOXEL_SERIALIZABLE_H
  8. #include "Common.h"
  9. #include "SerializedObject.h"
  10. #include "Logger.h"
  11. namespace Voxel
  12. {
  13. class Serializable
  14. {
  15. public:
  16. virtual size_t serializedSize() const = 0;
  17. virtual bool read(SerializedObject &object) = 0;
  18. virtual bool write(SerializedObject &object) const = 0;
  19. virtual ~Serializable() {}
  20. };
  21. typedef Ptr<Serializable> SerializablePtr;
  22. template <typename T>
  23. class BasicSerializable: public Serializable
  24. {
  25. public:
  26. T value;
  27. BasicSerializable() {}
  28. BasicSerializable(const T &v) { value = v; }
  29. size_t serializedSize() const { return sizeof(T); }
  30. bool read(SerializedObject &object)
  31. {
  32. return object.get((char *)&value, sizeof(T)) == sizeof(T);
  33. }
  34. bool write(SerializedObject &object) const
  35. {
  36. return object.put((const char *)&value, sizeof(T)) == sizeof(T);
  37. }
  38. virtual ~BasicSerializable() {}
  39. };
  40. typedef BasicSerializable<uint32_t> SerializableUnsignedInt;
  41. typedef BasicSerializable<int32_t> SerializableSignedInt;
  42. typedef BasicSerializable<float> SerializableFloat;
  43. typedef Ptr<SerializableUnsignedInt> SerializableUnsignedIntPtr;
  44. typedef Ptr<SerializableSignedInt> SerializableSignedIntPtr;
  45. typedef Ptr<SerializableFloat> SerializableFloatPtr;
  46. class SerializableString: public Serializable, public String
  47. {
  48. public:
  49. SerializableString() {}
  50. SerializableString(const String &other): String(other) {}
  51. size_t serializedSize() const { return sizeof(uint32_t) + size(); }
  52. bool read(SerializedObject &object)
  53. {
  54. uint32_t size;
  55. if(object.get((char *)&size, sizeof(uint32_t)) != sizeof(uint32_t))
  56. return false;
  57. resize(size);
  58. if(object.get((char *)data(), sizeof(char)*size) != sizeof(char)*size)
  59. return false;
  60. return true;
  61. }
  62. bool write(SerializedObject &object) const
  63. {
  64. uint32_t size = this->size();
  65. if(object.put((const char *)&size, sizeof(uint32_t)) != sizeof(uint32_t))
  66. return false;
  67. if(object.put((const char *)data(), sizeof(char)*size) != sizeof(char)*size)
  68. return false;
  69. return true;
  70. }
  71. virtual ~SerializableString() {}
  72. };
  73. typedef Ptr<SerializableString> SerializableStringPtr;
  74. }
  75. namespace std {
  76. template <>
  77. struct hash<Voxel::SerializableString> {
  78. std::size_t operator()(const Voxel::SerializableString &k) const
  79. {
  80. return hash<string>()(k);
  81. }
  82. };
  83. }
  84. namespace Voxel {
  85. // NOTE: Key is expected to be derived from Serializable
  86. template <typename Key>
  87. class SerializableMap: public Map<Key, SerializablePtr>, Serializable
  88. {
  89. public:
  90. SerializableMap(Map<Key, SerializablePtr> &other): Map<Key, SerializablePtr>(other) {}
  91. SerializableMap(SerializableMap &other): Map<Key, SerializablePtr>(other) {}
  92. SerializableMap() {}
  93. virtual size_t serializedSize() const
  94. {
  95. uint32_t size = sizeof(uint32_t);
  96. for(auto &x: *this)
  97. {
  98. size += x.first.serializedSize();
  99. size += x.second->serializedSize();
  100. }
  101. return size;
  102. }
  103. virtual bool write(SerializedObject &object) const
  104. {
  105. uint32_t size = serializedSize() - sizeof(uint32_t);
  106. if(object.size() - object.currentPutOffset() < size)
  107. return false;
  108. if(object.put((const char *)&size, sizeof(uint32_t)) != sizeof(uint32_t))
  109. return false;
  110. for(auto &x: *this)
  111. {
  112. if(!x.first.write(object) || !x.second->write(object))
  113. return false;
  114. }
  115. return true;
  116. }
  117. virtual bool read(SerializedObject &object)
  118. {
  119. uint32_t size;
  120. if(object.get((char *)&size, sizeof(uint32_t)) != sizeof(uint32_t))
  121. return false;
  122. uint32_t g = object.currentGetOffset();
  123. Key k;
  124. while(object.currentGetOffset() - g < size)
  125. {
  126. if(!k.read(object))
  127. return false;
  128. auto x = this->find(k);
  129. if(x == this->end())
  130. {
  131. logger(LOG_WARNING) << "SerializableMap: Found unknown key '" << k << "'" << std::endl;
  132. continue;
  133. }
  134. if(!x->second->read(object))
  135. return false;
  136. }
  137. return object.currentGetOffset() == (g + size);
  138. }
  139. virtual ~SerializableMap() {}
  140. };
  141. class StringKeySerializableMap: public SerializableMap<SerializableString>
  142. {
  143. public:
  144. SerializablePtr &operator [](const String &key)
  145. {
  146. return SerializableMap<SerializableString>::operator[](SerializableString(key));
  147. }
  148. virtual ~StringKeySerializableMap() {}
  149. };
  150. typedef Ptr<StringKeySerializableMap> StringKeySerializableMapPtr;
  151. }
  152. #endif