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>
17
class
AbstractSparseIDArray
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
voxel_octree
SparseIDArray.hpp
Generated by
1.8.20