Voxomap
A C++11 voxel container.
SparseIDArray.hpp
Go to the documentation of this file.
1 #ifndef _VOXOMAP_SPARSEIDARRAY_HPP_
2 #define _VOXOMAP_SPARSEIDARRAY_HPP_
3 
4 #include <cstdint>
5 #include <memory>
6 #include <vector>
7 #include <string>
8 
9 namespace voxomap
10 {
11 
16 template <typename T, uint8_t T_Size, template<class...> class T_Container = std::vector>
18 {
19  static_assert(T_Size <= 32, "SparseIDArray can't have size > 32"); // because ids are store on a uint16_t
20 
21 protected:
25  AbstractSparseIDArray();
29  AbstractSparseIDArray(AbstractSparseIDArray const& other);
30 
31 public:
35  uint16_t getNbData() const;
36 
42  bool hasData(uint8_t x) const;
49  bool hasData(uint8_t x, uint8_t y) const;
57  bool hasData(uint8_t x, uint8_t y, uint8_t z) const;
58 
66  T* findData(uint8_t x, uint8_t y, uint8_t z);
74  T const* findData(uint8_t x, uint8_t y, uint8_t z) const;
75 
85  template <typename... Args>
86  bool addData(uint8_t x, uint8_t y, uint8_t z, T*& data, Args&&... args);
96  template <typename... Args>
97  bool updateData(uint8_t x, uint8_t y, uint8_t z, T*& data, Args&&... args);
106  template <typename... Args>
107  void putData(uint8_t x, uint8_t y, uint8_t z, T*& data, Args&&... args);
116  bool removeData(uint8_t x, uint8_t y, uint8_t z);
125  bool removeData(uint8_t x, uint8_t y, uint8_t z, T* data);
126 
131  void serialize(std::string& str) const;
138  size_t unserialize(char const* str, size_t size);
139 
143  void shrinkToFit();
144 
145 protected:
146  // Serialization structure, use when there is less than 128 voxels inside area
147  struct SerializationData
148  {
149  SerializationData(uint16_t position, uint16_t id);
150  SerializationData(SerializationData const& other) = default;
151  SerializationData(SerializationData&& other) = default;
152 
153 #if (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) || defined(__BIG_ENDIAN__)
154  uint16_t id : 7;
155  uint16_t position : 9;
156 #else
157  uint16_t position : 9;
158  uint16_t id : 7;
159 #endif
160  };
161 
162  uint16_t getId(uint8_t x, uint8_t y, uint8_t z) const;
163  void setId(uint8_t x, uint8_t y, uint8_t z, uint16_t id);
164  uint16_t getNewId();
165  template <typename T_Old, typename T_New>
166  void reallocIds();
167  template <typename Type>
168  void changeId(uint16_t oldId, uint16_t newId);
169  template <typename Type>
170  void reset(Type& data);
171  template <typename Type>
172  void reset(std::unique_ptr<Type>& data);
173  template <typename Type>
174  void reset(std::shared_ptr<Type>& data);
175 
176  template <typename T_Data>
177  void copy(T_Container<T_Data> const& other);
178  template <typename T_Data>
179  void copy(T_Container<std::unique_ptr<T_Data>> const& other);
180 
181  template <typename T_Data>
182  typename std::enable_if<std::is_trivially_copyable<T_Data>::value>::type serializeContainer(std::string& str, T_Container<T_Data> const& datas) const;
183  template <typename T_Data>
184  typename std::enable_if<!std::is_trivially_copyable<T_Data>::value>::type serializeContainer(std::string& str, T_Container<T_Data> const& datas) const;
185  template <typename T_Data>
186  void serializeContainer(std::string& str, T_Container<T_Data*> const& datas) const;
187  template <typename T_Data>
188  void serializeContainer(std::string& str, T_Container<std::unique_ptr<T_Data>> const& datas) const;
189  template <typename T_Data>
190  void serializeContainer(std::string& str, T_Container<std::shared_ptr<T_Data>> const& datas) const;
191  template <typename T_Data>
192  typename std::enable_if<std::is_trivially_copyable<T_Data>::value>::type serializeData(std::string& str, T_Data const& data) const;
193  template <typename T_Data>
194  typename std::enable_if<!std::is_trivially_copyable<T_Data>::value>::type serializeData(std::string& str, T_Data const& data) const;
195 
196  template <typename T_Data>
197  typename std::enable_if<std::is_trivially_copyable<T_Data>::value, size_t>::type unserializeContainer(char const* str, size_t size, T_Container<T_Data>& datas);
198  template <typename T_Data>
199  typename std::enable_if<!std::is_trivially_copyable<T_Data>::value, size_t>::type unserializeContainer(char const* str, size_t size, T_Container<T_Data>& datas);
200  template <typename T_Data>
201  size_t unserializeContainer(char const* str, size_t size, T_Container<T_Data*>& datas);
202  template <typename T_Data>
203  size_t unserializeContainer(char const* str, size_t size, T_Container<std::unique_ptr<T_Data>>& datas);
204  template <typename T_Data>
205  size_t unserializeContainer(char const* str, size_t size, T_Container<std::shared_ptr<T_Data>>& datas);
206  template <typename T_Data>
207  typename std::enable_if<std::is_trivially_copyable<T_Data>::value, size_t>::type unserializeData(char const* str, size_t size, T_Data& data);
208  template <typename T_Data>
209  typename std::enable_if<!std::is_trivially_copyable<T_Data>::value, size_t>::type unserializeData(char const* str, size_t size, T_Data& data);
210 
211  T_Container<T> _data; //<! Contains the data
212  T_Container<uint16_t> _idFreed; //<! List of unused data inside \a _datas
213  std::unique_ptr<uint8_t[]> _ids; //<! 3D Array of id
214 };
215 
216 
217 template <typename T, uint8_t T_Size, template<class...> class T_Container = std::vector>
218 class SparseIDArray : public AbstractSparseIDArray<T, T_Size, T_Container>
219 {
220  using AbstractSparseIDArray<T, T_Size, T_Container>::AbstractSparseIDArray;
221 };
222 
223 
227 template <typename T, uint8_t T_Size, template<class...> class T_Container>
228 class SparseIDArray<std::unique_ptr<T>, T_Size, T_Container> : public AbstractSparseIDArray<std::unique_ptr<T>, T_Size, T_Container>
229 {
230 public:
231  SparseIDArray() = default;
232  SparseIDArray(SparseIDArray const& other) = default;
233  SparseIDArray(SparseIDArray&& other) = default;
234 
242  T* findData(uint8_t x, uint8_t y, uint8_t z);
250  T const* findData(uint8_t x, uint8_t y, uint8_t z) const;
251 };
252 
253 }
254 
255 #include "SparseIDArray.ipp"
256 
257 #endif // _VOXOMAP_SPARSEIDARRAY_HPP_
voxomap
Definition: Node.hpp:8
voxomap::SparseIDArray
Definition: SparseIDArray.hpp:219
voxomap::AbstractSparseIDArray
Definition: SparseIDArray.hpp:18