ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4NavigationHistoryPool.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4NavigationHistoryPool.hh
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 // G4NavigationHistoryPool
27 //
28 // Class description:
29 //
30 // Thread-local pool for navigation history levels collections being
31 // allocated by G4NavigationHistory. Allows for reuse of the vectors
32 // allocated according to lifetime of G4NavigationHistory objects.
33 
34 // 07.05.14 G.Cosmo Initial version
35 // --------------------------------------------------------------------
36 #ifndef G4NAVIGATIONHISTORYPOOL_HH
37 #define G4NAVIGATIONHISTORYPOOL_HH
38 
39 #include <vector>
40 
41 #include "G4NavigationLevel.hh"
42 
44 {
45  public: // with description
46 
48  // Return unique instance of G4NavigationHistoryPool.
49 
50  inline std::vector<G4NavigationLevel> * GetNewLevels();
51  // Return the pointer to a new collection of levels being allocated.
52 
53  inline std::vector<G4NavigationLevel> * GetLevels();
54  // Return the pointer of the first available collection of levels
55  // If none are available (i.e. empty Free vector) allocate collection.
56 
57  inline void DeRegister(std::vector<G4NavigationLevel> * pLevels);
58  // Deactivate levels collection in pool.
59 
60  void Clean();
61  // Delete all levels stored in the pool.
62 
63  void Print() const;
64  // Print number of entries.
65 
67  // Destructor: takes care to delete allocated levels.
68 
69  private:
70 
72  // Default constructor.
73 
74  inline void Register(std::vector<G4NavigationLevel> * pLevels);
75  // Register levels collection to pool and activate it.
76 
77  void Reset();
78  // Set internal vectors content to zero.
79 
80  private:
81 
83 
84  std::vector<std::vector<G4NavigationLevel> *> fPool;
85  std::vector<std::vector<G4NavigationLevel> *> fFree;
86 };
87 
88 // ***************************************************************************
89 // Register levels collection to pool (add and/or activate)
90 // ***************************************************************************
91 //
92 inline void G4NavigationHistoryPool::
93 Register(std::vector<G4NavigationLevel> * pLevels)
94 {
95  fPool.push_back(pLevels);
96 }
97 
98 // ***************************************************************************
99 // Deactivate levels collection in pool
100 // ***************************************************************************
101 //
102 inline void G4NavigationHistoryPool::
103 DeRegister(std::vector<G4NavigationLevel> * pLevels)
104 {
105  fFree.push_back(pLevels);
106 }
107 
108 // ***************************************************************************
109 // Return the pointer of a new collection of levels allocated
110 // ***************************************************************************
111 //
112 inline std::vector<G4NavigationLevel> * G4NavigationHistoryPool::GetNewLevels()
113 {
114  std::vector<G4NavigationLevel> * aLevelVec =
115  new std::vector<G4NavigationLevel>(kHistoryMax);
116  Register(aLevelVec);
117 
118  return aLevelVec;
119 }
120 
121 // ***************************************************************************
122 // Return the pointer of the first available collection of levels
123 // If none are available (i.e. non active) allocate collection
124 // ***************************************************************************
125 //
126 inline std::vector<G4NavigationLevel> * G4NavigationHistoryPool::GetLevels()
127 {
128  std::vector<G4NavigationLevel> * levels = 0;
129 
130  if (fFree.size() !=0)
131  {
132  levels = fFree.back();
133  fFree.pop_back();
134  }
135  else
136  {
137  levels = GetNewLevels();
138  }
139 
140  return levels;
141 }
142 
143 #endif