Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/dna/management/include/G4KDNode.icc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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