Helios++
Helios software for LiDAR simulations
serial_adt.h
1 #pragma once
2 
3 #include <serial_adt_utils.h>
4 #include <IterableTreeNode.h>
5 #include <MultiThreadKDTreeFactory.h>
6 #include <MultiThreadSAHKDTreeFactory.h>
7 #include <KDGroveFactory.h>
8 
9 
10 namespace boost{ namespace serialization{
11 
12 // *** ITERABLE TREE NODE SERIALIZATION *** //
13 // ****************************************** //
14 template <class Archive, typename NodeType>
15 void save_construct_data(
16  Archive &ar,
17  IterableTreeNode<NodeType> const *itn,
18  unsigned int const version
19 ){
20  // Save data required to construct instance
21  ar << itn->node;
22  ar << itn->depth;
23 }
24 
25 template <class Archive, typename NodeType>
26 void load_construct_data(
27  Archive &ar,
29  unsigned int const version
30 ){
31  // Load data from archive required to construct new instance
32  NodeType *node;
33  int depth;
34  node << ar;
35  depth << ar;
36 
37  // Invoke inplace constructor
38  ::new(itn)IterableTreeNode<NodeType>(node, depth);
39 }
40 
41 
42 // *** KDTREE FACTORY SERIALIZATION *** //
43 // ************************************** //
44 template <class Archive>
45 void save_construct_data(
46  Archive &ar,
47  MultiThreadKDTreeFactory const *mtkdtf,
48  unsigned int const version
49 ){
50  // Save data required to construct instance
51  ar << mtkdtf->getKdtf();
52  ar << mtkdtf->getNumJobs();
53  ar << mtkdtf->getGeomJobs();
54 
55  // Save geometric strategy type
56  char gsType = KDTREE_FACTORY_EXTRACT_GSTYPE(mtkdtf);
57  ar << gsType;
58 }
59 
60 template <class Archive>
61 void load_construct_data(
62  Archive &ar,
64  unsigned int const version
65 ){
66  // Load data from archive required to construct new instance
67  std::shared_ptr<SimpleKDTreeFactory> kdtf;
68  size_t numJobs, geomJobs;
69  char gsType;
70  ar >> kdtf;
71  ar >> numJobs;
72  ar >> geomJobs;
73  ar >> gsType;
74 
75  // Build geometric strategy and invoke factory's inplace constructor
76  KDTREE_FACTORY_INPLACE_CONSTRUCT<MultiThreadKDTreeFactory>(
77  mtkdtf,
78  kdtf,
79  numJobs,
80  geomJobs,
81  gsType
82  );
83 }
84 
85 template <class Archive>
86 void save_construct_data(
87  Archive &ar,
88  MultiThreadSAHKDTreeFactory const *mtkdtf,
89  unsigned int const version
90 ){
91  // Save data required to construct instance
92  ar << mtkdtf->getKdtf();
93  ar << mtkdtf->getNumJobs();
94  ar << mtkdtf->getGeomJobs();
95 
96  // Save geometric strategy type
97  char gsType = KDTREE_FACTORY_EXTRACT_GSTYPE(mtkdtf);
98  ar << gsType;
99 }
100 
101 template <class Archive>
102 void load_construct_data(
103  Archive &ar,
105  unsigned int const version
106 ){
107  // Load data from archive required to construct new instance
108  std::shared_ptr<SimpleKDTreeFactory> kdtf;
109  size_t numJobs, geomJobs;
110  char gsType;
111  ar >> kdtf;
112  ar >> numJobs;
113  ar >> geomJobs;
114  ar >> gsType;
115 
116  // Build geometric strategy and invoke factory's inplace constructor
117  KDTREE_FACTORY_INPLACE_CONSTRUCT<MultiThreadSAHKDTreeFactory>(
118  mtkdtf,
119  kdtf,
120  numJobs,
121  geomJobs,
122  gsType
123  );
124 }
125 
126 
127 // *** KDGROVE FACTORY SERIALIZATION *** //
128 // *************************************** //
129 template <class Archive>
130 void save_construct_data(
131  Archive &ar,
132  KDGroveFactory const *kdgf,
133  unsigned int const version
134 ){
135  // Register KDTree factories
136  ar.template register_type<SimpleKDTreeFactory>();
137  ar.template register_type<SAHKDTreeFactory>();
138  ar.template register_type<AxisSAHKDTreeFactory>();
139  ar.template register_type<FastSAHKDTreeFactory>();
140  ar.template register_type<MultiThreadKDTreeFactory>();
141  ar.template register_type<MultiThreadSAHKDTreeFactory>();
142 
143  // Save data required to construct instance
144  ar << kdgf->getKdtf();
145 }
146 
147 template <class Archive>
148 void load_construct_data(
149  Archive &ar,
150  KDGroveFactory *kdgf,
151  unsigned int const version
152 ){
153  // Register KDTree factories
154  ar.template register_type<SimpleKDTreeFactory>();
155  ar.template register_type<SAHKDTreeFactory>();
156  ar.template register_type<AxisSAHKDTreeFactory>();
157  ar.template register_type<FastSAHKDTreeFactory>();
158  ar.template register_type<MultiThreadKDTreeFactory>();
159  ar.template register_type<MultiThreadSAHKDTreeFactory>();
160 
161  // Load data from archive required to construct new instance
162  std::shared_ptr<KDTreeFactory> kdtf;
163  ar >> kdtf;
164 
165  // Build KDGroveFactory through inplace constructor
166  ::new(kdgf)KDGroveFactory(kdtf);
167 }
168 
169 }};
Class representing an iterable tree node. It is a wrapper for a given tree node type which handles so...
Definition: IterableTreeNode.h:12
NodeType * node
Tree node being wrapped.
Definition: IterableTreeNode.h:34
int depth
Depth of tree node being wrapped.
Definition: IterableTreeNode.h:38
Definition: KDGroveFactory.h:18
shared_ptr< KDTreeFactory > getKdtf() const
Obtain the KDTreeFactory used by the KDGroveFactory.
Definition: KDGroveFactory.h:151
Decorator for any KDTree factory which provides support for multi thread KDTree building.
Definition: MultiThreadKDTreeFactory.h:34
virtual size_t getGeomJobs() const
Obtain the number of threads for geometry-level parallelization.
Definition: MultiThreadKDTreeFactory.h:423
virtual size_t getNumJobs() const
Obtain the number of threads for node-level parallelization.
Definition: MultiThreadKDTreeFactory.h:418
virtual shared_ptr< SimpleKDTreeFactory > getKdtf() const
Obtain the SimpleKDTreeFactory used to build tree nodes.
Definition: MultiThreadKDTreeFactory.h:406
Decorator for any SAH KDTree which provides support for multi thread KDTree building.
Definition: MultiThreadSAHKDTreeFactory.h:15