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 #include "G4ITBox.hh" 36 37 G4ITBox::G4ITBox() 38 = default; 39 40 G4ITBox::~G4ITBox() 41 { 42 if( fNbIT != 0 ) 43 { 44 G4IT * aIT = fpFirstIT; 45 G4IT * nextIT; 46 47 while( aIT != nullptr ) 48 { 49 nextIT = aIT->GetNext(); 50 delete aIT; 51 aIT = nextIT; 52 } 53 } 54 55 if(fpPreviousBox != nullptr) fpPreviousBox->SetNextBox(fpNextBox) ; 56 if(fpNextBox != nullptr) fpNextBox->SetPreviousBox(fpPreviousBox); 57 } 58 59 const G4ITBox & G4ITBox::operator=(const G4ITBox &right) 60 { 61 fNbIT = right.fNbIT; 62 fpFirstIT = right.fpFirstIT; 63 fpLastIT = right.fpLastIT; 64 fpPreviousBox = nullptr; 65 fpNextBox = nullptr; 66 return *this; 67 } 68 69 void G4ITBox::Push( G4IT * aIT ) 70 { 71 if( fNbIT == 0 ) 72 { 73 aIT->SetPrevious( nullptr ); 74 fpFirstIT = aIT; 75 } 76 else 77 { 78 fpLastIT->SetNext( aIT ); 79 aIT->SetPrevious( fpLastIT ); 80 } 81 fpLastIT = aIT; 82 fNbIT++; 83 aIT->SetITBox(this); 84 } 85 86 void G4ITBox::Extract( G4IT * aStackedIT ) 87 { 88 if( aStackedIT == fpFirstIT ) 89 { 90 fpFirstIT = aStackedIT->GetNext(); 91 } 92 else if( aStackedIT == fpLastIT ) 93 { 94 fpLastIT = aStackedIT->GetPrevious(); 95 96 } 97 98 if( aStackedIT->GetNext() != nullptr) 99 aStackedIT->GetNext()->SetPrevious(aStackedIT->GetPrevious()); 100 if( aStackedIT->GetPrevious() != nullptr) 101 aStackedIT->GetPrevious()->SetNext(aStackedIT->GetNext()); 102 103 aStackedIT->SetNext(nullptr); 104 aStackedIT->SetPrevious(nullptr); 105 aStackedIT->SetITBox(nullptr); 106 fNbIT--; 107 } 108 109 G4IT* G4ITBox::FindIT(const G4Track& track) 110 { 111 if( fNbIT == 0 ) return nullptr; 112 113 G4IT * temp = fpLastIT; 114 G4bool find = false; 115 116 while(!find && temp != nullptr) 117 { 118 if(temp-> GetTrack() == &track) 119 { 120 find = true; 121 break; 122 } 123 temp = temp->GetPrevious(); 124 } 125 126 return temp; 127 } 128 129 const G4IT* G4ITBox::FindIT(const G4Track& track) const 130 { 131 if( fNbIT == 0 ) return nullptr; 132 133 const G4IT * temp = fpLastIT; 134 G4bool find = false; 135 136 while(!find && temp != nullptr) 137 { 138 if(temp-> GetTrack() == &track) 139 { 140 find = true; 141 break; 142 } 143 temp = temp->GetPrevious(); 144 } 145 146 return temp; 147 } 148 149 void G4ITBox::TransferTo(G4ITBox * aStack) 150 { 151 G4IT * ITToTransfer = fpFirstIT; 152 while(fNbIT != 0) 153 { 154 Extract(ITToTransfer); 155 aStack->Push(ITToTransfer); 156 ITToTransfer = ITToTransfer->GetNext(); 157 } 158 } 159