20 namespace DDSegmentation {
23 unsigned fieldOffset,
int signedWidth ) :
25 _offset( fieldOffset ),
26 _width( abs( signedWidth ) ),
29 _isSigned( signedWidth < 0 ),
36 s <<
" BitFieldElement '" <<
_name <<
"': out of range - offset : "
39 throw( std::runtime_error( s.str() ) ) ;
59 if( ( val & ( 1LL << (
_width - 1 ) ) ) != 0 ) {
71 if( in < _minVal || in >
_maxVal ) {
73 s <<
" BitFieldElement '" <<
_name <<
"': out of range : " << in
74 <<
" for width " <<
_width ;
75 throw( std::runtime_error( s.str() ) );
87 IndexMap::const_iterator it =
_map.find( name ) ;
89 if( it !=
_map.end() )
94 throw std::runtime_error(
" BitFieldElement: unknown name: " + name ) ;
101 for(
unsigned i=0;i<
_fields.size();i++){
112 std::stringstream os ;
114 for(
unsigned i=0;i<
_fields.size();i++){
116 if( i != 0 ) os <<
"," ;
126 std::stringstream os ;
128 for(
unsigned i=0;i<
_fields.size();i++){
130 if( i != 0 ) os <<
"," ;
133 <<
_fields[i].offset() <<
":" ;
148 _fields.emplace_back(name, offset, width);
155 std::stringstream s ;
156 s <<
" BitFieldElement::addField(" << name <<
"): bits already used " << std::hex <<
_joined
157 <<
" for mask " << bfv.
mask() ;
159 throw( std::runtime_error( s.str() ) ) ;
169 unsigned offset = 0 ;
172 std::vector<std::string> fieldDescriptors ;
175 std::for_each( initString.begin(), initString.end(), t ) ;
177 for(
unsigned i=0; i< fieldDescriptors.size() ; i++ ){
179 std::vector<std::string> subfields ;
182 std::for_each( fieldDescriptors[i].begin(), fieldDescriptors[i].end(), ts );
186 unsigned thisOffset ;
188 switch( subfields.size() ){
192 name = subfields[0] ;
193 width = atol( subfields[1].c_str() ) ;
194 thisOffset = offset ;
196 offset += abs( width ) ;
201 name = subfields[0] ;
202 thisOffset = atol( subfields[1].c_str() ) ;
203 width = atol( subfields[2].c_str() ) ;
205 offset = thisOffset + abs( width ) ;
211 std::stringstream s ;
212 s <<
" BitFieldCoder: invalid number of subfields "
213 << fieldDescriptors[i] ;
215 throw( std::runtime_error( s.str() ) ) ;
218 addField( name , thisOffset, width ) ;