Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4NavigationHistoryPool.hh
Go to the documentation of this file.
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
82 static G4ThreadLocal G4NavigationHistoryPool* fgInstance;
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//
92inline void G4NavigationHistoryPool::
93Register(std::vector<G4NavigationLevel> * pLevels)
94{
95 fPool.push_back(pLevels);
96}
97
98// ***************************************************************************
99// Deactivate levels collection in pool
100// ***************************************************************************
101//
103DeRegister(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//
112inline 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//
126inline 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
std::vector< G4NavigationLevel > * GetNewLevels()
static G4NavigationHistoryPool * GetInstance()
void DeRegister(std::vector< G4NavigationLevel > *pLevels)
std::vector< G4NavigationLevel > * GetLevels()
#define G4ThreadLocal
Definition: tls.hh:77