Helios++
Helios software for LiDAR simulations
serial_adt_utils.h
1 #ifndef _SERIAL_ADT_UTILS
2 #define _SERIAL_ADT_UTILS
3 
4 #include <MultiThreadKDTreeFactory.h>
5 #include <SimpleKDTreeGeometricStrategy.h>
6 #include <SAHKDTreeGeometricStrategy.h>
7 #include <AxisSAHKDTreeGeometricStrategy.h>
8 #include <FastSAHKDTreeGeometricStrategy.h>
9 
10 #include <memory>
11 
12 using std::dynamic_pointer_cast;
13 
14 // *** UTIL FUNCTIONS *** //
15 // ************************ //
16 char KDTREE_FACTORY_EXTRACT_GSTYPE(
17  MultiThreadKDTreeFactory const *mtkdtf
18 );
19 
20 template <typename T>
21 void KDTREE_FACTORY_INPLACE_CONSTRUCT (
22  T *mtkdtf,
23  std::shared_ptr<SimpleKDTreeFactory> kdtf,
24  size_t const numJobs,
25  size_t const geomJobs,
26  char const gsType
27 ){
28  if(gsType == 1){
29  std::shared_ptr<SimpleKDTreeGeometricStrategy> gs = \
30  std::make_shared<SimpleKDTreeGeometricStrategy>(*kdtf);
31  ::new(mtkdtf)T(kdtf, gs, numJobs, geomJobs);
32  }
33  else if(gsType == 2){
34  std::shared_ptr<SAHKDTreeGeometricStrategy> gs = \
35  std::make_shared<SAHKDTreeGeometricStrategy>(
36  *std::dynamic_pointer_cast<SAHKDTreeFactory>(kdtf)
37  );
38  ::new(mtkdtf)T(kdtf, gs, numJobs, geomJobs);
39  }
40  else if(gsType == 3){
41  std::shared_ptr<AxisSAHKDTreeGeometricStrategy> gs = \
42  std::make_shared<AxisSAHKDTreeGeometricStrategy>(
43  *std::dynamic_pointer_cast<AxisSAHKDTreeFactory>(kdtf)
44  );
45  ::new(mtkdtf)T(kdtf, gs, numJobs, geomJobs);
46  }
47  else if(gsType == 4){
48  std::shared_ptr<FastSAHKDTreeGeometricStrategy> gs = \
49  std::make_shared<FastSAHKDTreeGeometricStrategy>(
50  *std::dynamic_pointer_cast<FastSAHKDTreeFactory>(kdtf)
51  );
52  ::new(mtkdtf)T(kdtf, gs, numJobs, geomJobs);
53  }
54  else{
55  ::new(mtkdtf)T(kdtf, nullptr, numJobs, geomJobs);
56  }
57 }
58 
59 
60 #endif
Decorator for any KDTree factory which provides support for multi thread KDTree building.
Definition: MultiThreadKDTreeFactory.h:34