Geant4 Cross Reference |
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 // Author: Mathieu Karamitros (kara (AT) cenbg . in2p3 . fr) 28 // 29 // History: 30 // ----------- 31 // 10 Oct 2011 M.Karamitros created 32 // 33 // ------------------------------------------------------------------- 34 35 //______________________________________________________________________ 36 template<typename PointT> 37 G4KDNode<PointT>::G4KDNode(G4KDTree* tree, 38 PointT* point, 39 G4KDNode_Base* parent) : 40 G4KDNode_Base(tree, parent) 41 { 42 fPoint = point; 43 fValid = true; 44 } 45 46 // Copy constructor should not be used 47 template<typename PointT> 48 G4KDNode<PointT>::G4KDNode(const G4KDNode<PointT>& right) : 49 G4KDNode_Base(right), fPoint(0) 50 { 51 fValid = false; 52 } 53 54 template<typename PointT> 55 G4KDNode<PointT>::~G4KDNode() {} // NOLINT Intel ICC has ODR link failures if this is =default 56 // It also cannot be inline, which includes it being inside the class body! 57 58 // Assignement should not be used 59 template<typename PointT> 60 G4KDNode<PointT>& G4KDNode<PointT>::operator=(const G4KDNode<PointT>& right) 61 { 62 if(this == &right) return *this; 63 fPoint = right.fPoint; 64 fTree = right.fTree; 65 fLeft = right.fLeft; 66 fRight = right.fRight; 67 fParent = right.fParent; 68 fSide = right.fSide; 69 fAxis = right.fAxis; 70 return *this; 71 } 72 73 template<typename Position> 74 G4KDNode_Base* G4KDNode_Base::FindParent(const Position& x0) 75 { 76 G4KDNode_Base* aParent = nullptr; 77 G4KDNode_Base* next = this; 78 G4int split = -1; 79 while(next != nullptr && next->IsValid()) 80 { 81 split = (G4int)next->fAxis; 82 aParent = next; 83 84 // works if node called "next" is valid 85 if(x0[split] > (*next)[split]) next = next->fRight; 86 else next = next->fLeft; 87 } 88 return aParent; 89 } 90 91 template<typename PointT> 92 G4KDNode_Base* G4KDNode_Base::Insert(PointT* point) 93 { 94 G4KDNode_Base* aParent = FindParent(*point); 95 // TODO check p == aParent->pos 96 // Exception 97 98 G4KDNode_Base* newNode = new G4KDNode<PointT>(fTree, point, aParent); 99 100 if((*point)[(G4int)aParent->fAxis] > (*aParent)[aParent->fAxis]) 101 { 102 aParent->fRight = newNode; 103 newNode->fSide = 1; 104 } 105 else 106 { 107 aParent->fLeft = newNode; 108 newNode->fSide = -1; 109 } 110 111 return newNode; 112 } 113 114 template<typename PointT> 115 G4KDNode_Base* G4KDNode_Base::Insert(const PointT& point) 116 { 117 G4KDNode_Base* aParent = FindParent(point); 118 // TODO check p == aParent->pos 119 // Exception 120 121 G4KDNode_Base* newNode = new G4KDNodeCopy<PointT>(fTree, point, aParent); 122 123 if(point[aParent->fAxis] > (*aParent)[aParent->fAxis]) 124 { 125 aParent->fRight = newNode; 126 newNode->fSide = 1; 127 } 128 else 129 { 130 aParent->fLeft = newNode; 131 newNode->fSide = -1; 132 } 133 134 return newNode; 135 } 136 137