source: trunk/source/event/src/G4TrackStack.cc @ 964

Last change on this file since 964 was 964, checked in by garnier, 15 years ago

update event

File size: 5.0 KB
Line 
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// $Id: G4TrackStack.cc,v 1.6 2006/06/29 18:10:26 gunter Exp $
28// GEANT4 tag $Name: geant4-09-02-ref-02 $
29//
30
31#include "G4TrackStack.hh"
32#include "G4VTrajectory.hh"
33
34G4TrackStack::G4TrackStack()
35:n_stackedTrack(0),firstStackedTrack(0),lastStackedTrack(0)
36{;}
37
38G4TrackStack::~G4TrackStack()
39{
40  if( n_stackedTrack != 0 )
41  {
42    G4StackedTrack * aStackedTrack = firstStackedTrack;
43    G4StackedTrack * nextStackedTrack;
44
45    // delete tracks in the stack
46    while( aStackedTrack != 0 )
47    {
48      nextStackedTrack = aStackedTrack->GetNext();
49      delete aStackedTrack->GetTrack();
50      delete aStackedTrack->GetTrajectory();
51      delete aStackedTrack;
52      aStackedTrack = nextStackedTrack;
53    }
54  }
55}
56
57const G4TrackStack & G4TrackStack::operator=(const G4TrackStack &right) 
58{
59  n_stackedTrack = right.n_stackedTrack;
60  firstStackedTrack = right.firstStackedTrack;
61  lastStackedTrack = right.lastStackedTrack;
62  return *this; 
63}
64
65int G4TrackStack::operator==(const G4TrackStack &right) const
66{ return (firstStackedTrack==right.firstStackedTrack); }
67int G4TrackStack::operator!=(const G4TrackStack &right) const
68{ return (firstStackedTrack!=right.firstStackedTrack); }
69
70void G4TrackStack::TransferTo(G4TrackStack * aStack)
71{
72  if(n_stackedTrack==0) return;
73
74  if(aStack->n_stackedTrack == 0)
75  {
76    *aStack = *this;
77  }
78  else
79  {
80    aStack->lastStackedTrack->SetNext( firstStackedTrack );
81    firstStackedTrack->SetPrevious( aStack->lastStackedTrack );
82    aStack->lastStackedTrack = lastStackedTrack;
83    aStack->n_stackedTrack += n_stackedTrack;
84  }
85
86  n_stackedTrack = 0;
87  firstStackedTrack = 0;
88  lastStackedTrack = 0;
89}
90
91G4StackedTrack * G4TrackStack::PopFromStack()
92{
93  if( n_stackedTrack == 0 ) return 0;
94  G4StackedTrack * aStackedTrack = lastStackedTrack;
95  GrabFromStack( aStackedTrack );
96  return aStackedTrack;
97}
98
99void G4TrackStack::PushToStack( G4StackedTrack * aStackedTrack )
100{
101  if( n_stackedTrack == 0 )
102  {
103    aStackedTrack->SetPrevious( 0 );
104    firstStackedTrack = aStackedTrack;
105  }
106  else
107  {
108    lastStackedTrack->SetNext( aStackedTrack );
109    aStackedTrack->SetPrevious( lastStackedTrack );
110  }
111  lastStackedTrack = aStackedTrack;
112  n_stackedTrack++;
113}
114
115void G4TrackStack::GrabFromStack( G4StackedTrack * aStackedTrack )
116{
117  if( n_stackedTrack == 1 )
118  {
119    firstStackedTrack = 0;
120    lastStackedTrack = 0;
121  }
122  else
123  {
124    if( aStackedTrack == firstStackedTrack )
125    {
126      firstStackedTrack = aStackedTrack->GetNext();
127      firstStackedTrack->SetPrevious( 0 );
128    }
129    else
130    {
131      if( aStackedTrack == lastStackedTrack )
132      {
133        lastStackedTrack = aStackedTrack->GetPrevious();
134        lastStackedTrack->SetNext( 0 );
135      }
136      else
137      {
138        aStackedTrack->GetPrevious()
139          ->SetNext( aStackedTrack->GetNext() );
140        aStackedTrack->GetNext()
141          ->SetPrevious( aStackedTrack->GetPrevious() );
142      }
143    }
144  }
145  n_stackedTrack--;
146}
147
148void G4TrackStack::clear()
149{
150  G4StackedTrack * aStackedTrack = firstStackedTrack;
151  G4StackedTrack * nextStackedTrack;
152
153  if ( n_stackedTrack == 0 ) return;
154
155  // delete tracks in the stack
156  while( aStackedTrack != 0 )
157  {
158    nextStackedTrack = aStackedTrack->GetNext();
159    delete aStackedTrack->GetTrack();
160    delete aStackedTrack->GetTrajectory();
161    delete aStackedTrack;
162    aStackedTrack = nextStackedTrack;
163  }
164  n_stackedTrack = 0;
165  firstStackedTrack = 0;
166  lastStackedTrack = 0;
167}
168
169
Note: See TracBrowser for help on using the repository browser.