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