ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4SurfBits.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4SurfBits.cc
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 // G4SurfBits implementation
27 //
28 // 19.10.12 - Marek Gayer, created and adapted from original implementation
29 // of Root's TBits class by P.Canal
30 // --------------------------------------------------------------------
31 
32 #include "G4SurfBits.hh"
33 #include "G4ios.hh"
34 
35 //______________________________________________________________________________
36 G4SurfBits::G4SurfBits(unsigned int nBits) : fNBits(nBits)
37 {
38  // G4SurfBits constructor. All bits set to 0
39 
40  if (fNBits <= 0) fNBits = 0;
41  fNBytes = fNBits ? ((fNBits-1)/8) + 1 : 1;
42  fAllBits = new unsigned char[fNBytes];
43  // this is redundant only with libNew
44  std::memset(fAllBits,0,fNBytes);
45 }
46 
47 //______________________________________________________________________________
49  : fNBits(original.fNBits), fNBytes(original.fNBytes)
50 {
51  // G4SurfBits copy constructor
52 
53  fAllBits = new unsigned char[fNBytes];
54  std::memcpy(fAllBits,original.fAllBits,fNBytes);
55 }
56 
57 //______________________________________________________________________________
59 {
60  // G4SurfBits assignment operator
61  if (this != &rhs)
62  {
63  // TObject::operator=(rhs);
64  fNBits = rhs.fNBits;
65  fNBytes = rhs.fNBytes;
66  delete [] fAllBits;
67  if (fNBytes != 0)
68  {
69  fAllBits = new unsigned char[fNBytes];
70  std::memcpy(fAllBits,rhs.fAllBits,fNBytes);
71  }
72  else
73  {
74  fAllBits = nullptr;
75  }
76  }
77  return *this;
78 }
79 
80 //______________________________________________________________________________
82 {
83  // G4SurfBits destructor
84 
85  delete [] fAllBits;
86 }
87 
88 //______________________________________________________________________________
90 {
91  // Clear the value.
92 
93  delete [] fAllBits;
94  fAllBits = nullptr;
95  fNBits = 0;
96  fNBytes = 0;
97 }
98 
99 //______________________________________________________________________________
101 {
102  // Reduce the storage used by the object to a minimun
103 
104  if (!fNBits || !fAllBits) return;
105  unsigned int needed;
106  for(needed=fNBytes-1; needed > 0 && fAllBits[needed]==0; ) { --needed; }
107  ++needed;
108 
109  if (needed!=fNBytes)
110  {
111  unsigned char* old_location = fAllBits;
112  fAllBits = new unsigned char[needed];
113 
114  std::memcpy(fAllBits,old_location,needed);
115  delete [] old_location;
116 
117  fNBytes = needed;
118  fNBits = 8*fNBytes;
119  }
120 }
121 
122 //______________________________________________________________________________
123 void G4SurfBits::Output(std::ostream &os) const
124 {
125  // Print the value to the std::ostream
126  for(unsigned int i=0; i<fNBytes; ++i)
127  {
128  unsigned char val = fAllBits[fNBytes - 1 - i];
129  for (unsigned int j=0; j<8; ++j)
130  {
131  os << (G4bool)(val&0x80);
132  val <<= 1;
133  }
134  }
135 }
136 
137 //______________________________________________________________________________
138 void G4SurfBits::Print() const
139 {
140  // Print the list of active bits
141  G4int count = 0;
142  for(unsigned int i=0; i<fNBytes; ++i)
143  {
144  unsigned char val = fAllBits[i];
145  for (unsigned int j=0; j<8; ++j)
146  {
147  if (val & 1) G4cout << " bit:" << count << " = 1" << G4endl;
148  ++count;
149  val = val >> 1;
150  }
151  }
152 }
153 
154 //______________________________________________________________________________
156 {
157  if (fAllBits != nullptr) std::memset(fAllBits, value ? 0xFF : 0, fNBytes);
158 }
159 
160 //______________________________________________________________________________
161 void G4SurfBits::ReserveBytes(unsigned int nbytes)
162 {
163  // Reverse each bytes.
164 
165  if (nbytes > fNBytes)
166  {
167  // do it in this order to remain exception-safe.
168  unsigned char *newBits = new unsigned char[nbytes];
169  delete [] fAllBits;
170  fNBytes = nbytes;
171  fAllBits = newBits;
172  }
173 }
174 
175 //______________________________________________________________________________
176 void G4SurfBits::set(unsigned int nBits, const char* array)
177 {
178  // set all the bytes
179  unsigned int nbytes=(nBits+7)>>3;
180 
181  ReserveBytes(nbytes);
182 
183  fNBits=nBits;
184  std::memcpy(fAllBits, array, nbytes);
185 }
186 
187 //______________________________________________________________________________
188 void G4SurfBits::Get(char* array) const
189 {
190  // Copy all the bytes.
191  std::memcpy(array, fAllBits, (fNBits+7)>>3);
192 }
193 
194 // If we are on a little endian machine, a bitvector represented using
195 // any integer type is identical to a bitvector represented using bytes.
196 
197 //______________________________________________________________________________
198 void G4SurfBits::set(unsigned int nBits, const G4int* array)
199 {
200  // set all the bytes.
201 
202  set(nBits, (const char*)array);
203 }
204 
205 //______________________________________________________________________________
206 void G4SurfBits::Get(G4int* array) const
207 {
208  // Get all the bytes.
209 
210  Get((char*)array);
211 }