26template<
typename DataT>
49template<
typename DataT>
56inline std::string
demangle(
const char * name)
60 std::unique_ptr<char, void (*)(
void *)> res{
61 abi::__cxa_demangle(name, NULL, NULL, &status), std::free};
62 return (status == 0) ? res.get() : name;
77inline void Write(std::ostream & out,
const T & val)
79 static_assert(std::is_trivially_copyable_v<T>,
"Must be trivially copyable");
80 out.write(
reinterpret_cast<const char *
>(&val),
sizeof(T));
83template<
typename DataT>
86 static_assert(std::is_trivially_copyable_v<DataT>,
"DataT must be trivially copyable");
92 header,
"Bonxai::VoxelGrid<%s,%d,%d>(%lf)\n", type_name.c_str(), grid.
innetBits(),
95 out.write(header, std::strlen(header));
100 for (
const auto & it : grid.
rootMap()) {
101 const CoordT & root_coord = it.first;
106 const auto & inner_grid = it.second;
107 for (
size_t w = 0; w < inner_grid.mask().wordCount(); w++) {
108 Write(out, inner_grid.mask().getWord(w));
110 for (
auto inner = inner_grid.mask().beginOn(); inner; ++inner) {
111 const uint32_t inner_index = *inner;
112 const auto & leaf_grid = *(inner_grid.cell(inner_index));
114 for (
size_t w = 0; w < leaf_grid.mask().wordCount(); w++) {
115 Write(out, leaf_grid.mask().getWord(w));
117 for (
auto leaf = leaf_grid.mask().beginOn(); leaf; ++leaf) {
118 const uint32_t leaf_index = *leaf;
119 Write(out, leaf_grid.cell(leaf_index));
126inline T
Read(std::istream & input)
129 static_assert(std::is_trivially_copyable_v<T>,
"Must be trivially copyable");
130 input.read(
reinterpret_cast<char *
>(&out),
sizeof(T));
136 const std::string expected_prefix =
"Bonxai::VoxelGrid<";
137 if (header.rfind(expected_prefix, 0) != 0) {
138 throw std::runtime_error(
"Header wasn't recognized");
140 int p1 = header.find(
",", 18) + 1;
141 auto part_type = header.substr(18, p1 - 18 - 1);
143 int p2 = header.find(
",", p1 + 1) + 1;
144 auto part_ibits = header.substr(p1, p2 - p1 - 1);
146 int p3 = header.find(
">", p2) + 1;
147 auto part_lbits = header.substr(p2, p3 - p2 - 1);
149 int p4 = header.find(
"(", p3) + 1;
150 int p5 = header.find(
")", p4);
151 auto part_res = header.substr(p4, p5 - p4);
162template<
typename DataT>
167 throw std::runtime_error(
"DataT does not match");
176 for (
size_t root_index = 0; root_index < root_count; root_index++) {
182 auto inner_it = grid.
rootMap().find(root_coord);
183 if (inner_it == grid.
rootMap().end()) {
188 auto & inner_grid = inner_it->second;
190 for (
size_t w = 0; w < inner_grid.mask().wordCount(); w++) {
192 inner_grid.mask().setWord(w, word);
194 for (
auto inner = inner_grid.mask().beginOn(); inner; ++inner) {
195 auto & leaf_grid = inner_grid.cell(*inner);
198 for (
size_t w = 0; w < leaf_grid->mask().wordCount(); w++) {
200 leaf_grid->mask().setWord(w, word);
202 for (
auto leaf = leaf_grid->mask().beginOn(); leaf; ++leaf) {
203 const uint32_t leaf_index = *leaf;
Definition bonxai.hpp:124
uint32_t innetBits() const
Definition bonxai.hpp:155
Grid< std::shared_ptr< LeafGrid > > InnerGrid
Definition bonxai.hpp:138
uint32_t leafBits() const
Definition bonxai.hpp:159
const RootMap & rootMap() const
Definition bonxai.hpp:168
double voxelSize() const
Definition bonxai.hpp:163
std::shared_ptr< LeafGrid > allocateLeafGrid()
Definition bonxai.hpp:610
Definition serialization.hpp:54
std::string demangle(const char *name)
Definition serialization.hpp:68
void Write(std::ostream &out, const T &val)
Definition serialization.hpp:77
void Serialize(std::ostream &out, const VoxelGrid< DataT > &grid)
Serialize a grid to ostream.
Definition serialization.hpp:84
T Read(std::istream &input)
Definition serialization.hpp:126
VoxelGrid< DataT > Deserialize(std::istream &input, HeaderInfo info)
Deserialize create a grid.
Definition serialization.hpp:163
HeaderInfo GetHeaderInfo(std::string header)
GetHeaderInfo is used to recover informations from the header of a file/stream.
Definition serialization.hpp:134
Definition grid_coord.hpp:67
int32_t z
Definition grid_coord.hpp:70
int32_t y
Definition grid_coord.hpp:69
int32_t x
Definition grid_coord.hpp:68