ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4BlockingList.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4BlockingList.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 // class G4BlockingList
27 //
28 // Class description:
29 //
30 // A utility class responsible for (efficiently) maintaining a List
31 // of blocked volume numbers, with rapid `reset' operations.
32 //
33 // Notes:
34 //
35 // Implemented via a ValVector of ints: a tag value is used to set
36 // the indices of blocked volumes. On reset the current tag value is
37 // increased, so that the ValVector must only be zeroed when the
38 // numerical range of the tag is used.
39 
40 // 24.7.96, P.Kent - Separated from G4Navigator
41 // --------------------------------------------------------------------
42 #ifndef G4BLOCKINGLIST_HH
43 #define G4BLOCKINGLIST_HH
44 
45 #include "G4Types.hh"
46 #include <vector>
47 
48 const G4int kBlockingListMaxDefault = 500; // Block up to 511 daughters
49  // initially
51 const G4int kBlockTagNoMax = 2147483647; // 2^31-1 maximum tag no may reach
52 
54 {
55  public: // with description
56 
58  G4int stride = kBlockingListStride);
59  // Create empty blocking List of default size and `stride' resize count.
60 
62  // Destructor. No operations.
63 
64  void Reset();
65  // Efficiently `Reset' the blocking List, so that no volumes
66  // are blocked [Advance tag number and only fully clear List
67  // if tag max reached]
68 
69  void FullyReset();
70  // Clear the blocking List and reset tag value [slow].
71 
72  void Enlarge(const G4int nv);
73  // Enlarges blocking List if current size < nv, in units of stride.
74  // Clears the new part of the List.
75 
76  size_t Length() const;
77  // Returns the current length of the List. Note a length of 16
78  // means volumes of indices between 0 & 15 inclusive may be blocked.
79 
80  void BlockVolume(const G4int v);
81  // Block the volume number v.
82  // Requires: 0<=v<Length().
83 
84  G4bool IsBlocked(const G4int v) const;
85  // Return true if the volume number v is blocked, else false.
86  // Requires: 0 <= v < Length().
87 
88  private:
89 
91  // Current blocked volume tag number.
92 
93  std::vector<G4int> fBlockingList;
94  // Blocked volumes: Elements with indices
95  // corresponding to blocked volume set to fBlockTagNo.
96 };
97 
98 #include "G4BlockingList.icc"
99 
100 #endif