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 // G4NavigationLevelRep inline implementation 27 // 28 // 1 October 1997, J.Apostolakis Initial version 29 // ---------------------------------------------------------------------- 30 31 extern G4GEOM_DLL G4Allocator<G4NavigationLevelRep>*& aNavigLevelRepAllocator(); 32 33 // Constructors 34 //-------------- 35 36 inline 37 G4NavigationLevelRep::G4NavigationLevelRep( G4VPhysicalVolume* pPhysVol, 38 const G4AffineTransform& afTransform, 39 EVolume volTp, 40 G4int repNo ) 41 : sTransform(afTransform), 42 sPhysicalVolumePtr(pPhysVol), 43 sReplicaNo(repNo), 44 sVolumeType(volTp) 45 { 46 } 47 48 inline 49 G4NavigationLevelRep::G4NavigationLevelRep() 50 : sVolumeType(kReplica) 51 { 52 } 53 54 inline 55 G4NavigationLevelRep::G4NavigationLevelRep( G4VPhysicalVolume* pPhysVol, 56 const G4AffineTransform& levelAbove, 57 const G4AffineTransform& relativeCurrent, 58 EVolume volTp, 59 G4int repNo ) 60 : sPhysicalVolumePtr(pPhysVol), 61 sReplicaNo(repNo), 62 sVolumeType(volTp) 63 { 64 sTransform.InverseProduct( levelAbove, relativeCurrent ); 65 } 66 67 inline 68 G4NavigationLevelRep::G4NavigationLevelRep( G4NavigationLevelRep& right ) 69 : sTransform(right.sTransform), 70 sPhysicalVolumePtr(right.sPhysicalVolumePtr), 71 sReplicaNo(right.sReplicaNo), 72 sVolumeType(right.sVolumeType) 73 { 74 } 75 76 // Destructor 77 //-------------- 78 79 inline 80 G4NavigationLevelRep::~G4NavigationLevelRep() 81 { 82 #ifdef DEBUG_NAVIG_LEVEL 83 if(fCountRef>0) 84 { 85 G4Exception("G4NavigationLevelRep::~G4NavigationLevelRep()", 86 "GeomVol0003", FatalException, 87 "Deletion of data-level object with positive reference count."); 88 } 89 #endif 90 } 91 92 // Operators 93 // -------------- 94 95 inline 96 G4NavigationLevelRep& 97 G4NavigationLevelRep::operator=( const G4NavigationLevelRep& right ) 98 { 99 if ( &right != this ) 100 { 101 sTransform = right.sTransform; 102 sPhysicalVolumePtr = right.sPhysicalVolumePtr; 103 sVolumeType = right.sVolumeType; 104 sReplicaNo = right.sReplicaNo; 105 fCountRef = right.fCountRef; 106 } 107 return *this; 108 } 109 110 // Accessors 111 // -------------- 112 113 inline 114 G4VPhysicalVolume* 115 G4NavigationLevelRep::GetPhysicalVolume() 116 { 117 return sPhysicalVolumePtr; 118 } 119 120 inline 121 const G4AffineTransform& 122 G4NavigationLevelRep::GetTransform() const 123 { 124 return sTransform; 125 } 126 127 inline 128 const G4AffineTransform* 129 G4NavigationLevelRep::GetTransformPtr() const 130 { 131 return &sTransform; 132 } 133 134 inline 135 EVolume G4NavigationLevelRep::GetVolumeType() const 136 { 137 return sVolumeType; 138 } 139 140 inline 141 G4int G4NavigationLevelRep::GetReplicaNo() const 142 { 143 return sReplicaNo; 144 } 145 146 inline 147 void G4NavigationLevelRep::AddAReference() 148 { 149 ++fCountRef; 150 } 151 152 inline 153 G4bool G4NavigationLevelRep::RemoveAReference() 154 { 155 return( --fCountRef <= 0 ); 156 } 157 158 // There is no provision that this class is subclassed. 159 // If it is subclassed & new data members are added then the 160 // following "new" & "delete" will fail and give errors. 161 // 162 inline 163 void* G4NavigationLevelRep::operator new(size_t) 164 { 165 if (aNavigLevelRepAllocator() == nullptr) 166 { 167 aNavigLevelRepAllocator() = new G4Allocator<G4NavigationLevelRep>; 168 } 169 return (void *) aNavigLevelRepAllocator()->MallocSingle(); 170 } 171 172 inline 173 void G4NavigationLevelRep::operator delete(void* aLevelRep) 174 { 175 aNavigLevelRepAllocator()->FreeSingle((G4NavigationLevelRep *) aLevelRep); 176 } 177