diff --git a/DDCore/include/DDSegmentation/BitFieldCoder.h b/DDCore/include/DDSegmentation/BitFieldCoder.h index c222db00f560c5c321f440d43394f54d5d97063d..ff798d978e5857e778f8ae621f6f30ca6047b37f 100644 --- a/DDCore/include/DDSegmentation/BitFieldCoder.h +++ b/DDCore/include/DDSegmentation/BitFieldCoder.h @@ -23,7 +23,6 @@ namespace DDSegmentation { class BitFieldElement{ public : - virtual ~BitFieldElement() {} /** The default c'tor. * @param name name of the field @@ -102,14 +101,11 @@ namespace DDSegmentation { typedef std::map<std::string, unsigned int> IndexMap ; - /** No default c'tor */ - BitFieldCoder() {} ; + BitFieldCoder() = default ; + ~BitFieldCoder() = default ; + BitFieldCoder(const BitFieldCoder&) = default ; + BitFieldCoder(BitFieldCoder&&) = default ; - ~BitFieldCoder() { // clean up - for(unsigned i=0;i<_fields.size();i++){ - delete _fields[i] ; - } - } /** The c'tor takes an initialization string of the form:<br> * \<fieldDesc\>[,\<fieldDesc\>...]<br> @@ -148,27 +144,27 @@ namespace DDSegmentation { /** get value of sub-field specified by index */ long64 get(long64 bitfield, size_t index) const { - return _fields.at(index)->value( bitfield ) ; + return _fields.at(index).value( bitfield ) ; } /** Access to field through name . */ long64 get(long64 bitfield, const std::string& name) const { - return _fields.at( index( name ) )->value( bitfield ) ; + return _fields.at( index( name ) ).value( bitfield ) ; } /** set value of sub-field specified by index */ void set(long64& bitfield, size_t index, ulong64 value) const { - _fields.at(index)->set( bitfield , value ) ; + _fields.at(index).set( bitfield , value ) ; } /** Access to field through name . */ void set(long64& bitfield, const std::string& name, ulong64 value) const { - _fields.at( index( name ) )->set( bitfield, value ) ; + _fields.at( index( name ) ).set( bitfield, value ) ; } @@ -190,14 +186,14 @@ namespace DDSegmentation { */ const BitFieldElement& operator[](const std::string& name) const { - return *_fields[ index( name ) ] ; + return _fields[ index( name ) ] ; } /** Const Access to field through index . */ const BitFieldElement& operator[](unsigned index) const { - return *_fields[ index ] ; + return _fields[ index ] ; } /** Return a valid description string of all fields @@ -208,7 +204,7 @@ namespace DDSegmentation { */ std::string valueString(ulong64 bitfield) const ; - const std::vector<BitFieldElement*>& fields() const { + const std::vector<BitFieldElement>& fields() const { return _fields; } @@ -233,7 +229,7 @@ namespace DDSegmentation { // -------------- data members:-------------- - std::vector<BitFieldElement*> _fields{} ; + std::vector<BitFieldElement> _fields{} ; IndexMap _map{} ; long64 _joined{} ; diff --git a/DDCore/src/IDDescriptor.cpp b/DDCore/src/IDDescriptor.cpp index fe9a19496890d9c54d5c9629aa590ad7469421d4..8fc8b70e036b1c799dfaac63e2fe49ccb62288f8 100644 --- a/DDCore/src/IDDescriptor.cpp +++ b/DDCore/src/IDDescriptor.cpp @@ -135,29 +135,29 @@ VolumeID IDDescriptor::encode(const std::vector<std::pair<std::string, int> >& i void IDDescriptor::decodeFields(VolumeID vid, vector<pair<const BitFieldElement*, VolumeID> >& flds) const { - const vector<BitFieldElement*>& v = access()->decoder.fields(); + const vector<BitFieldElement>& v = access()->decoder.fields(); flds.clear(); - for (auto f : v ) - flds.push_back(make_pair(f, f->value(vid))); + for (auto& f : v ) + flds.push_back(make_pair(&f, f.value(vid))); } /// Decode volume IDs and return string reprensentation for debugging purposes string IDDescriptor::str(VolumeID vid) const { - const vector<BitFieldElement*>& v = access()->decoder.fields(); + const vector<BitFieldElement>& v = access()->decoder.fields(); stringstream str; - for (auto f : v ) - str << f->name() << ":" << setw(4) << setfill('0') << hex << right << f->value(vid) + for (auto& f : v ) + str << f.name() << ":" << setw(4) << setfill('0') << hex << right << f.value(vid) << left << dec << " "; return str.str().substr(0,str.str().length()-1); } /// Decode volume IDs and return string reprensentation for debugging purposes string IDDescriptor::str(VolumeID vid, VolumeID mask) const { - const vector<BitFieldElement*>& v = access()->decoder.fields(); + const vector<BitFieldElement>& v = access()->decoder.fields(); stringstream str; - for (auto f : v ) { - if ( 0 == (mask&f->mask()) ) continue; - str << f->name() << ":" << setw(4) << setfill('0') << hex << right << f->value(vid) + for (auto& f : v ) { + if ( 0 == (mask&f.mask()) ) continue; + str << f.name() << ":" << setw(4) << setfill('0') << hex << right << f.value(vid) << left << dec << " "; } return str.str().substr(0,str.str().length()-1); diff --git a/DDCore/src/segmentations/BitField64.cpp b/DDCore/src/segmentations/BitField64.cpp index c5ae4a462617c0bdb9739d25e32bef001820c875..35bf19b1e861c1cd407e7b8d26585644ee53f9c6 100644 --- a/DDCore/src/segmentations/BitField64.cpp +++ b/DDCore/src/segmentations/BitField64.cpp @@ -17,7 +17,7 @@ namespace DDSegmentation { if( i != 0 ) os << "," ; - os << _coder->fields()[i]->name() << ":" << _coder->get( _value , i ) ; + os << _coder->fields()[i].name() << ":" << _coder->get( _value , i ) ; } return os.str() ; @@ -32,16 +32,16 @@ namespace DDSegmentation { for(unsigned i=0;i<b._coder->size();i++){ - const BitFieldElement* bv = b._coder->fields()[i] ; + const BitFieldElement& bv = b._coder->fields()[i] ; - os << " " << bv->name() - << " [" << bv->offset() << ":" ; + os << " " << bv.name() + << " [" << bv.offset() << ":" ; - if( bv->isSigned() ) os << "-" ; + if( bv.isSigned() ) os << "-" ; - os << bv->width() << "] : " ; + os << bv.width() << "] : " ; - os << b._coder->get( b._value , i) + os << b._coder->get( b._value , i) << std::endl ; } diff --git a/DDCore/src/segmentations/BitFieldCoder.cpp b/DDCore/src/segmentations/BitFieldCoder.cpp index abc27d7bb3999962501ab5a2b9f87081abc72aeb..26ca35fc60998ae8e727d9704ec67e7fe936f74d 100644 --- a/DDCore/src/segmentations/BitFieldCoder.cpp +++ b/DDCore/src/segmentations/BitFieldCoder.cpp @@ -103,8 +103,8 @@ namespace DDSegmentation { for(unsigned i=0;i<_fields.size();i++){ - if( hb < ( _fields[i]->offset() + _fields[i]->width() ) ) - hb = _fields[i]->offset() + _fields[i]->width() ; + if( hb < ( _fields[i].offset() + _fields[i].width() ) ) + hb = _fields[i].offset() + _fields[i].width() ; } return hb ; } @@ -118,7 +118,7 @@ namespace DDSegmentation { if( i != 0 ) os << "," ; - os << _fields[i]->name() << ":" << _fields[i]->value(bitfield) ; + os << _fields[i].name() << ":" << _fields[i].value(bitfield) ; } return os.str() ; @@ -132,54 +132,39 @@ namespace DDSegmentation { if( i != 0 ) os << "," ; - os << _fields[i]->name() << ":" - << _fields[i]->offset() << ":" ; + os << _fields[i].name() << ":" + << _fields[i].offset() << ":" ; - if( _fields[i]->isSigned() ) + if( _fields[i].isSigned() ) os << "-" ; - os << _fields[i]->width() ; + os << _fields[i].width() ; } -// for( IndexMap::const_iterator it = _map.begin() ; -// it != _map.end() ; ++it ){ -// if( it != _map.begin() ) -// os << "," ; - -// os << it->first << ":" -// << _fields[ it->second ]->offset() << ":" ; - -// if( _fields[ it->second ]->isSigned() ) -// os << "-" ; - -// os << _fields[ it->second ]->width() ; - -// } - return os.str() ; } void BitFieldCoder::addField( const std::string& name, unsigned offset, int width ){ - BitFieldElement* bfv = new BitFieldElement( name, offset, width ) ; - - _fields.push_back( bfv ) ; + _fields.push_back( BitFieldElement( name, offset, width ) ) ; + BitFieldElement& bfv = _fields.back() ; + _map[ name ] = _fields.size()-1 ; - if( _joined & bfv->mask() ) { + if( _joined & bfv.mask() ) { std::stringstream s ; s << " BitFieldElement::addField(" << name << "): bits already used " << std::hex << _joined - << " for mask " << bfv->mask() ; + << " for mask " << bfv.mask() ; throw( std::runtime_error( s.str() ) ) ; } - _joined |= _fields.back()->mask() ; + _joined |= bfv.mask() ; } diff --git a/DDTest/src/test_bitfieldcoder.cc b/DDTest/src/test_bitfieldcoder.cc index 9cf87da13e3b74d1c06e3d5a490b9cd80a73f35f..d548613c0d67d0333787b5091d8be3d0bf134f2d 100644 --- a/DDTest/src/test_bitfieldcoder.cc +++ b/DDTest/src/test_bitfieldcoder.cc @@ -42,6 +42,30 @@ int main(int /* argc */, char** /* argv */ ){ test( field , long64(0xbebafecacafebabeUL) , " same value 0xbebafecacafebabeUL from individual initialization " ); + + // make a copy for testing the access + const BitFieldCoder bf2 = bf ; + + test( bf2.get( field, "layer") , 373 , " acces field value: layer" ); + test( bf2.get( field, "module"), 254 , " acces field value: module" ); + test( bf2.get( field, "sensor"), 202 , " acces field value: sensor" ); + test( bf2.get( field, "side"), 1 , " acces field value: side" ); + test( bf2.get( field, "system"), 30 , " acces field value: system" ); + test( bf2.get( field, "x"), -310 , " acces field value: x" ); + test( bf2.get( field, "y"), -16710 , " acces field value: y" ); + + + + + test( bf2.get( field, bf2.index( "layer")) , 373 , " acces field value: layer" ); + test( bf2.get( field, bf2.index( "module")), 254 , " acces field value: module" ); + test( bf2.get( field, bf2.index( "sensor")), 202 , " acces field value: sensor" ); + test( bf2.get( field, bf2.index( "side")), 1 , " acces field value: side" ); + test( bf2.get( field, bf2.index( "system")), 30 , " acces field value: system" ); + test( bf2.get( field, bf2.index( "x")), -310 , " acces field value: x" ); + test( bf2.get( field, bf2.index( "y")), -16710 , " acces field value: y" ); + + // --------------------------------------------------------------------