9 namespace DDSegmentation {
12 unsigned fieldOffset,
int signedWidth ) :
14 _offset( fieldOffset ),
15 _width( abs( signedWidth ) ),
18 _isSigned( signedWidth < 0 ),
25 s <<
" BitFieldElement '" <<
_name <<
"': out of range - offset : "
28 throw( std::runtime_error( s.str() ) ) ;
48 if( ( val & ( 1LL << (
_width - 1 ) ) ) != 0 ) {
60 if( in < _minVal || in >
_maxVal ) {
62 s <<
" BitFieldElement '" <<
_name <<
"': out of range : " << in
63 <<
" for width " <<
_width ;
64 throw( std::runtime_error( s.str() ) );
76 IndexMap::const_iterator it =
_map.find( name ) ;
78 if( it !=
_map.end() )
83 throw std::runtime_error(
" BitFieldElement: unknown name: " + name ) ;
90 for(
unsigned i=0;i<
_fields.size();i++){
101 std::stringstream os ;
103 for(
unsigned i=0;i<
_fields.size();i++){
105 if( i != 0 ) os <<
"," ;
115 std::stringstream os ;
117 for(
unsigned i=0;i<
_fields.size();i++){
119 if( i != 0 ) os <<
"," ;
122 <<
_fields[i].offset() <<
":" ;
137 _fields.emplace_back(name, offset, width);
144 std::stringstream s ;
145 s <<
" BitFieldElement::addField(" << name <<
"): bits already used " << std::hex <<
_joined
146 <<
" for mask " << bfv.
mask() ;
148 throw( std::runtime_error( s.str() ) ) ;
158 unsigned offset = 0 ;
161 std::vector<std::string> fieldDescriptors ;
164 std::for_each( initString.begin(), initString.end(), t ) ;
166 for(
unsigned i=0; i< fieldDescriptors.size() ; i++ ){
168 std::vector<std::string> subfields ;
171 std::for_each( fieldDescriptors[i].begin(), fieldDescriptors[i].end(), ts );
175 unsigned thisOffset ;
177 switch( subfields.size() ){
181 name = subfields[0] ;
182 width = atol( subfields[1].c_str() ) ;
183 thisOffset = offset ;
185 offset += abs( width ) ;
190 name = subfields[0] ;
191 thisOffset = atol( subfields[1].c_str() ) ;
192 width = atol( subfields[2].c_str() ) ;
194 offset = thisOffset + abs( width ) ;
200 std::stringstream s ;
201 s <<
" BitFieldCoder: invalid number of subfields "
202 << fieldDescriptors[i] ;
204 throw( std::runtime_error( s.str() ) ) ;
207 addField( name , thisOffset, width ) ;