File indexing completed on 2025-01-18 09:59:10
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 #ifndef G4THitsCollection_h
0030 #define G4THitsCollection_h 1
0031
0032 #include "G4Allocator.hh"
0033 #include "G4VHitsCollection.hh"
0034 #include "globals.hh"
0035
0036 #include <vector>
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048 class G4HitsCollection : public G4VHitsCollection
0049 {
0050 public:
0051 using G4VHitsCollection::G4VHitsCollection;
0052 ~G4HitsCollection() override = default;
0053 G4bool operator==(const G4HitsCollection& right) const;
0054
0055 protected:
0056 void* theCollection = nullptr;
0057 };
0058
0059 #if defined G4DIGI_ALLOC_EXPORT
0060 extern G4DLLEXPORT G4Allocator<G4HitsCollection>*& anHCAllocator_G4MT_TLS_();
0061 #else
0062 extern G4DLLIMPORT G4Allocator<G4HitsCollection>*& anHCAllocator_G4MT_TLS_();
0063 #endif
0064
0065 template <class T>
0066 class G4THitsCollection : public G4HitsCollection
0067 {
0068 public:
0069 G4THitsCollection();
0070 G4THitsCollection(G4String detName, G4String colNam);
0071 ~G4THitsCollection() override;
0072
0073 G4bool operator==(const G4THitsCollection<T>& right) const;
0074
0075 inline void* operator new(size_t);
0076 inline void operator delete(void* anHC);
0077
0078
0079 void DrawAllHits() override;
0080
0081
0082 void PrintAllHits() override;
0083
0084
0085
0086
0087 inline T* operator[](size_t i) const { return (*((std::vector<T*>*)theCollection))[i]; }
0088
0089
0090 inline std::vector<T*>* GetVector() const { return (std::vector<T*>*)theCollection; }
0091
0092
0093
0094 inline size_t insert(T* aHit)
0095 {
0096 auto theHitsCollection = (std::vector<T*>*)theCollection;
0097 theHitsCollection->push_back(aHit);
0098 return theHitsCollection->size();
0099 }
0100
0101
0102 inline size_t entries() const
0103 {
0104 auto theHitsCollection = (std::vector<T*>*)theCollection;
0105 return theHitsCollection->size();
0106 }
0107
0108 G4VHit* GetHit(size_t i) const override { return (*((std::vector<T*>*)theCollection))[i]; }
0109
0110 size_t GetSize() const override { return ((std::vector<T*>*)theCollection)->size(); }
0111 };
0112
0113 template <class T>
0114 inline void* G4THitsCollection<T>::operator new(size_t)
0115 {
0116 if (anHCAllocator_G4MT_TLS_() == nullptr) {
0117 anHCAllocator_G4MT_TLS_() = new G4Allocator<G4HitsCollection>;
0118 }
0119 return (void*)anHCAllocator_G4MT_TLS_()->MallocSingle();
0120 }
0121
0122 template <class T>
0123 inline void G4THitsCollection<T>::operator delete(void* anHC)
0124 {
0125 anHCAllocator_G4MT_TLS_()->FreeSingle((G4HitsCollection*)anHC);
0126 }
0127
0128 template <class T>
0129 G4THitsCollection<T>::G4THitsCollection()
0130 {
0131 auto theHitsCollection = new std::vector<T*>;
0132 theCollection = (void*)theHitsCollection;
0133 }
0134
0135 template <class T>
0136 G4THitsCollection<T>::G4THitsCollection(G4String detName, G4String colNam)
0137 : G4HitsCollection(detName, colNam)
0138 {
0139 auto theHitsCollection = new std::vector<T*>;
0140 theCollection = (void*)theHitsCollection;
0141 }
0142
0143 template <class T>
0144 G4THitsCollection<T>::~G4THitsCollection()
0145 {
0146 auto theHitsCollection = (std::vector<T*>*)theCollection;
0147 for (const auto* hit : *theHitsCollection) {
0148 delete hit;
0149 }
0150 theHitsCollection->clear();
0151 delete theHitsCollection;
0152 }
0153
0154 template <class T>
0155 G4bool G4THitsCollection<T>::operator==(const G4THitsCollection<T>& right) const
0156 {
0157 return (collectionName == right.collectionName);
0158 }
0159
0160 template <class T>
0161 void G4THitsCollection<T>::DrawAllHits()
0162 {
0163 auto theHitsCollection = (std::vector<T*>*)theCollection;
0164 for (auto* hit : *theHitsCollection) {
0165 hit->Draw();
0166 }
0167 }
0168
0169 template <class T>
0170 void G4THitsCollection<T>::PrintAllHits()
0171 {
0172 auto theHitsCollection = (std::vector<T*>*)theCollection;
0173 for (auto* hit : *theHitsCollection) {
0174 hit->Print();
0175 }
0176 }
0177
0178 #endif