DD4hep  1.31.0
Detector Description Toolkit for High Energy Physics
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
BitFieldCoder.h
Go to the documentation of this file.
1 //==========================================================================
2 // AIDA Detector description implementation
3 //--------------------------------------------------------------------------
4 // Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
5 // All rights reserved.
6 //
7 // For the licensing terms see $DD4hepINSTALL/LICENSE.
8 // For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
9 //
10 //==========================================================================
11 
12 #ifndef DDSEGMENTATION_BITFIELDCODER_H
13 #define DDSEGMENTATION_BITFIELDCODER_H 1
14 
15 #include <map>
16 #include <string>
17 #include <vector>
18 #include <cstdint>
19 
20 namespace dd4hep {
21 
22  namespace DDSegmentation {
23 
24  typedef int64_t FieldID;
25  typedef uint64_t CellID;
26  typedef uint64_t VolumeID;
27 
28  class StringTokenizer ;
29 
32 
33  public :
35  BitFieldElement() = default ;
37  BitFieldElement(const BitFieldElement&) = default ;
40 
46  BitFieldElement( const std::string& name, unsigned offset, int signedWidth ) ;
48  ~BitFieldElement() = default ;
49 
52 
54  FieldID value(CellID bitfield) const;
55 
56  // assign the given value to the bit field
57  void set(CellID& bitfield, FieldID value) const ;
58 
60  const std::string& name() const { return _name ; }
61 
63  unsigned offset() const { return _offset ; }
64 
66  unsigned width() const { return _width ; }
67 
69  bool isSigned() const { return _isSigned ; }
70 
72  CellID mask() const { return _mask ; }
73 
75  int minValue() const { return _minVal; }
76 
78  int maxValue() const { return _maxVal; }
79 
80  protected:
81 
83  unsigned _offset {};
84  unsigned _width {};
85  int _minVal {};
86  int _maxVal {};
87  bool _isSigned {};
88  std::string _name;
89  };
90 
91 
92 
94 
114  public :
115  typedef std::map<std::string, unsigned int> IndexMap ;
116 
117  public :
119  BitFieldCoder() = default ;
121  BitFieldCoder(const BitFieldCoder&) = default ;
125  ~BitFieldCoder() = default ;
126 
128  BitFieldCoder& operator=(const BitFieldCoder&) = default ;
129 
144  BitFieldCoder( const std::string& initString ) : _joined(0){
145  init( initString ) ;
146  }
147 
150  static CellID toLong(unsigned low_Word, unsigned high_Word ) {
151  return ( ( low_Word & 0xffffffffULL ) | ( ( high_Word & 0xffffffffULL ) << 32 ) ) ;
152  }
153 
156  static unsigned lowWord(CellID bitfield) { return unsigned( bitfield & 0xffffFFFFUL ); }
157 
160  static unsigned highWord(CellID bitfield) { return unsigned( bitfield >> 32); }
161 
164  FieldID get(CellID bitfield, size_t idx) const {
165  return _fields.at(idx).value( bitfield ) ;
166  }
167 
170  FieldID get(CellID bitfield, const std::string& name) const {
171  return _fields.at( index( name ) ).value( bitfield ) ;
172  }
173 
176  void set(CellID& bitfield, size_t idx, FieldID value) const {
177  _fields.at(idx).set( bitfield , value ) ;
178  }
179 
182  void set(CellID& bitfield, const std::string& name, FieldID value) const {
183  _fields.at( index( name ) ).set( bitfield, value ) ;
184  }
185 
188  unsigned highestBit() const ;
189 
191  size_t size() const { return _fields.size() ; }
192 
195  size_t index( const std::string& name) const ;
196 
199  const BitFieldElement& operator[](const std::string& name) const {
200  return _fields[ index( name ) ] ;
201  }
202 
205  const BitFieldElement& operator[](unsigned idx) const {
206  return _fields[ idx ] ;
207  }
208 
211  std::string fieldDescription() const ;
212 
215  std::string valueString(CellID bitfield) const ;
216 
217  const std::vector<BitFieldElement>& fields() const {
218  return _fields;
219  }
220 
222  CellID mask() const { return _joined ; }
223 
224  protected:
225 
228  void addField( const std::string& name, unsigned offset, int width );
229 
233  void init( const std::string& initString) ;
234 
235  protected:
236  // -------------- data members:--------------
237  std::vector<BitFieldElement> _fields{} ;
240  };
241 
242 
244 
253  std::vector< std::string >& _tokens ;
254  char _del ;
255  char _last ;
256 
257  public:
258 
260  StringTokenizer( std::vector< std::string >& tokens, char del )
261  : _tokens(tokens)
262  , _del(del),
263  _last(del) {
264  }
265 
267  void operator()(const char& c) {
268  if( c != _del ) {
269  if( _last == _del ) {
270  _tokens.emplace_back("") ;
271  }
272  _tokens.back() += c ;
273  }
274  _last = c ;
275  }
276  };
277 
278  } // end namespace
279 } // end namespace
280 #endif
281 
282 
283 
284 
dd4hep::DDSegmentation::BitFieldElement::_minVal
int _minVal
Definition: BitFieldCoder.h:85
dd4hep::DDSegmentation::StringTokenizer::StringTokenizer
StringTokenizer(std::vector< std::string > &tokens, char del)
Definition: BitFieldCoder.h:260
dd4hep::DDSegmentation::VolumeID
uint64_t VolumeID
Definition: BitFieldCoder.h:26
dd4hep::DDSegmentation::BitFieldCoder::BitFieldCoder
BitFieldCoder(BitFieldCoder &&)=default
Move constructor.
dd4hep::DDSegmentation::BitFieldElement::offset
unsigned offset() const
Definition: BitFieldCoder.h:63
dd4hep::DDSegmentation::BitFieldElement::BitFieldElement
BitFieldElement(const BitFieldElement &)=default
Copy constructor.
dd4hep::DDSegmentation::BitFieldCoder::operator[]
const BitFieldElement & operator[](unsigned idx) const
Definition: BitFieldCoder.h:205
dd4hep::DDSegmentation::BitFieldElement
Helper class for BitFieldCoder that corresponds to one field value.
Definition: BitFieldCoder.h:31
dd4hep::DDSegmentation::BitFieldElement::_name
std::string _name
Definition: BitFieldCoder.h:88
dd4hep::DDSegmentation::BitFieldElement::BitFieldElement
BitFieldElement(BitFieldElement &&)=default
Move constructor.
dd4hep::DDSegmentation::BitFieldElement::_mask
CellID _mask
Definition: BitFieldCoder.h:82
dd4hep::DDSegmentation::BitFieldElement::isSigned
bool isSigned() const
Definition: BitFieldCoder.h:69
dd4hep::DDSegmentation::BitFieldElement::maxValue
int maxValue() const
Definition: BitFieldCoder.h:78
dd4hep::DDSegmentation::BitFieldCoder
Helper class for decoding and encoding a bit field of 64bits for convenient declaration.
Definition: BitFieldCoder.h:113
dd4hep::DDSegmentation::BitFieldCoder::~BitFieldCoder
~BitFieldCoder()=default
Default destructor.
dd4hep::DDSegmentation::BitFieldCoder::get
FieldID get(CellID bitfield, size_t idx) const
Definition: BitFieldCoder.h:164
dd4hep::DDSegmentation::StringTokenizer
Helper class for string tokenization.
Definition: BitFieldCoder.h:252
dd4hep::DDSegmentation::BitFieldCoder::highWord
static unsigned highWord(CellID bitfield)
Definition: BitFieldCoder.h:160
dd4hep::DDSegmentation::BitFieldElement::value
FieldID value(CellID bitfield) const
calculate this field's value given an external 64 bit bitmap
Definition: BitFieldCoder.cpp:56
dd4hep::DDSegmentation::BitFieldCoder::IndexMap
std::map< std::string, unsigned int > IndexMap
Definition: BitFieldCoder.h:115
dd4hep::DDSegmentation::BitFieldCoder::toLong
static CellID toLong(unsigned low_Word, unsigned high_Word)
Definition: BitFieldCoder.h:150
dd4hep::DDSegmentation::BitFieldElement::_isSigned
bool _isSigned
Definition: BitFieldCoder.h:87
dd4hep::DDSegmentation::BitFieldCoder::fields
const std::vector< BitFieldElement > & fields() const
Definition: BitFieldCoder.h:217
dd4hep::DDSegmentation::BitFieldCoder::_map
IndexMap _map
Definition: BitFieldCoder.h:238
dd4hep::DDSegmentation::StringTokenizer::_del
char _del
Definition: BitFieldCoder.h:254
dd4hep::DDSegmentation::BitFieldCoder::_fields
std::vector< BitFieldElement > _fields
Definition: BitFieldCoder.h:237
dd4hep::DDSegmentation::StringTokenizer::_last
char _last
Definition: BitFieldCoder.h:255
dd4hep::DDSegmentation::BitFieldElement::operator=
BitFieldElement & operator=(const BitFieldElement &)=default
Assignment operator.
dd4hep::DDSegmentation::BitFieldCoder::highestBit
unsigned highestBit() const
Definition: BitFieldCoder.cpp:97
dd4hep::DDSegmentation::BitFieldCoder::valueString
std::string valueString(CellID bitfield) const
Definition: BitFieldCoder.cpp:110
dd4hep::DDSegmentation::BitFieldCoder::addField
void addField(const std::string &name, unsigned offset, int width)
Definition: BitFieldCoder.cpp:145
dd4hep::DDSegmentation::FieldID
int64_t FieldID
Definition: BitFieldCoder.h:24
dd4hep::DDSegmentation::BitFieldCoder::BitFieldCoder
BitFieldCoder(const std::string &initString)
Definition: BitFieldCoder.h:144
dd4hep::DDSegmentation::StringTokenizer::_tokens
std::vector< std::string > & _tokens
Definition: BitFieldCoder.h:253
dd4hep::DDSegmentation::BitFieldCoder::operator[]
const BitFieldElement & operator[](const std::string &name) const
Definition: BitFieldCoder.h:199
dd4hep::DDSegmentation::BitFieldElement::set
void set(CellID &bitfield, FieldID value) const
Definition: BitFieldCoder.cpp:68
dd4hep::DDSegmentation::BitFieldCoder::operator=
BitFieldCoder & operator=(const BitFieldCoder &)=default
Assignment operator.
dd4hep::DDSegmentation::BitFieldElement::name
const std::string & name() const
Definition: BitFieldCoder.h:60
dd4hep::DDSegmentation::BitFieldCoder::lowWord
static unsigned lowWord(CellID bitfield)
Definition: BitFieldCoder.h:156
dd4hep::DDSegmentation::BitFieldCoder::set
void set(CellID &bitfield, const std::string &name, FieldID value) const
Definition: BitFieldCoder.h:182
dd4hep::DDSegmentation::BitFieldCoder::BitFieldCoder
BitFieldCoder(const BitFieldCoder &)=default
Copy constructor.
dd4hep::DDSegmentation::BitFieldElement::width
unsigned width() const
Definition: BitFieldCoder.h:66
dd4hep::DDSegmentation::StringTokenizer::operator()
void operator()(const char &c)
Definition: BitFieldCoder.h:267
dd4hep::DDSegmentation::BitFieldCoder::set
void set(CellID &bitfield, size_t idx, FieldID value) const
Definition: BitFieldCoder.h:176
dd4hep::DDSegmentation::BitFieldElement::mask
CellID mask() const
Definition: BitFieldCoder.h:72
dd4hep::DDSegmentation::BitFieldCoder::get
FieldID get(CellID bitfield, const std::string &name) const
Definition: BitFieldCoder.h:170
dd4hep::DDSegmentation::BitFieldElement::~BitFieldElement
~BitFieldElement()=default
Default destructor.
dd4hep::DDSegmentation::CellID
uint64_t CellID
Definition: BitFieldCoder.h:25
dd4hep::DDSegmentation::BitFieldCoder::index
size_t index(const std::string &name) const
Definition: BitFieldCoder.cpp:85
dd4hep::DDSegmentation::BitFieldElement::_maxVal
int _maxVal
Definition: BitFieldCoder.h:86
dd4hep::DDSegmentation::BitFieldCoder::BitFieldCoder
BitFieldCoder()=default
Default constructor.
dd4hep::DDSegmentation::BitFieldElement::_width
unsigned _width
Definition: BitFieldCoder.h:84
dd4hep::DDSegmentation::BitFieldCoder::_joined
CellID _joined
Definition: BitFieldCoder.h:239
dd4hep::DDSegmentation::BitFieldElement::minValue
int minValue() const
Definition: BitFieldCoder.h:75
dd4hep
Namespace for the AIDA detector description toolkit.
Definition: AlignmentsCalib.h:28
dd4hep::DDSegmentation::BitFieldCoder::init
void init(const std::string &initString)
Definition: BitFieldCoder.cpp:167
dd4hep::DDSegmentation::BitFieldCoder::fieldDescription
std::string fieldDescription() const
Definition: BitFieldCoder.cpp:124
dd4hep::DDSegmentation::BitFieldElement::BitFieldElement
BitFieldElement()=default
Default constructor.
dd4hep::DDSegmentation::BitFieldCoder::size
size_t size() const
Definition: BitFieldCoder.h:191
dd4hep::DDSegmentation::BitFieldElement::_offset
unsigned _offset
Definition: BitFieldCoder.h:83
dd4hep::DDSegmentation::BitFieldCoder::mask
CellID mask() const
Definition: BitFieldCoder.h:222