Geant4-11
G4Octree.hh
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27/*
28 * G4Octree.cc
29 *
30 * Created on: Feb 15, 2019
31 * Author: HoangTran
32 */
33
34#ifndef G4Octree_hh
35#define G4Octree_hh 1
36#include <array>
37#include <vector>
38#include <algorithm>
39#include <type_traits>
40#include <utility>
41#include <iterator>
42#include <iostream>
43#include <typeinfo>
44#include <list>
45#include "G4ThreeVector.hh"
46#include "G4DNABoundingBox.hh"
47#include "G4Allocator.hh"
48
49//using std::vector;
50//using std::array;
51//using namespace std;
52
53const size_t max_per_node = 2;
54const size_t max_depth = 100;
55
56template <typename Iterator, class Extractor,typename Point = G4ThreeVector>
57class G4Octree {
58public:
60 G4Octree(Iterator,Iterator);
61 G4Octree(Iterator,Iterator, Extractor);
62
64
65 //G4Octree(const tree_type& rhs);
67 void swap(tree_type& rhs);
68
71
73
74 size_t size() const;
75
76 template <typename OutPutContainer>
77 void radiusNeighbors(const Point& query, const G4double& radius, OutPutContainer& resultIndices) const;
78
79 void *operator new(size_t);
80 void operator delete(void *);
81
82private:
84 {
89 };
90
91 class Node;
92
93 using NodeVector = std::vector<std::pair<Iterator,Point>>;
94 using childNodeArray = std::array<Node*,8>;
96 {
97 std::array<std::pair<Iterator,Point>,
99 size_t size_;
100 };
101
102 class Node
103 {
104 public:
105 Node(const NodeVector& input_values);
106 Node(const NodeVector& input_values,
107 const G4DNABoundingBox& box,
108 size_t current_depth);
109 Node() = default;
110 Node(const Node&) = delete;
112 template <typename OutPutContainer>
113 G4bool radiusNeighbors(const Point& query, G4double radius,
114 OutPutContainer& resultIndices) const;
115 private:
116 void* fpValue;
120
121 void init_max_depth_leaf(const NodeVector& input_values);
122 void init_leaf(const NodeVector& input_values);
124 const NodeVector& input_values,
125 size_t current_depth);
127 {
128 using wrapped_type = typename NodeVector::const_iterator;
131 {}
132 Point operator*() const
133 {
134 return ((*it__).second);
135 }
137 {
138 ++it__;
139 return *this;
140 }
142 {
143 InnerIterator other = *this;
144 ++it__;
145 return other;
146 }
147
149 {
150 return this->it__ == rhs.it__;
151 }
152
154 {
155 return !operator==(rhs);
156 }
157 };
158 };
159 private:
162 size_t size_;
164
165};
166//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
167#include "G4Octree.icc"
168#endif
const size_t max_per_node
Definition: G4Octree.hh:53
const size_t max_depth
Definition: G4Octree.hh:54
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
Node(const NodeVector &input_values, const G4DNABoundingBox &box, size_t current_depth)
G4DNABoundingBox fBigVolume
Definition: G4Octree.hh:117
void init_internal(const NodeVector &input_values, size_t current_depth)
Node(const NodeVector &input_values)
Node()=default
NodeTypes fNodeType
Definition: G4Octree.hh:118
Node(const Node &)=delete
void init_leaf(const NodeVector &input_values)
G4bool radiusNeighbors(const Point &query, G4double radius, OutPutContainer &resultIndices) const
void init_max_depth_leaf(const NodeVector &input_values)
G4bool fIsActivated
Definition: G4Octree.hh:119
void * fpValue
Definition: G4Octree.hh:116
G4Octree(tree_type &&rhs)
size_t size_
Definition: G4Octree.hh:162
void swap(tree_type &rhs)
std::array< Node *, 8 > childNodeArray
Definition: G4Octree.hh:94
size_t size() const
tree_type & operator=(tree_type rhs)
@ DEFAULT
Definition: G4Octree.hh:85
@ MAX_DEPTH_LEAF
Definition: G4Octree.hh:87
@ INTERNAL
Definition: G4Octree.hh:88
Node * head_
Definition: G4Octree.hh:161
G4ThreadLocalStatic G4Allocator< tree_type > * fgAllocator
Definition: G4Octree.hh:163
G4Octree(Iterator, Iterator, Extractor)
std::vector< std::pair< Iterator, Point > > NodeVector
Definition: G4Octree.hh:93
G4Octree(Iterator, Iterator)
Extractor functor_
Definition: G4Octree.hh:160
void radiusNeighbors(const Point &query, const G4double &radius, OutPutContainer &resultIndices) const
std::array< std::pair< Iterator, Point >, max_per_node > values_
Definition: G4Octree.hh:98
G4bool operator==(const InnerIterator &rhs) const
Definition: G4Octree.hh:148
InnerIterator operator++(G4int)
Definition: G4Octree.hh:141
G4bool operator!=(const InnerIterator &rhs) const
Definition: G4Octree.hh:153
InnerIterator(wrapped_type it)
Definition: G4Octree.hh:130
InnerIterator & operator++()
Definition: G4Octree.hh:136
typename NodeVector::const_iterator wrapped_type
Definition: G4Octree.hh:128
#define G4ThreadLocalStatic
Definition: tls.hh:76