36 auto p =
m.insert( map_type::value_type(
key, obj ) );
70 typedef typename CONT::value_type
v_type;
79 throw GaudiException(
"Cannot assign key to keyed object! Object already has a key.",
"KeyedObject",
87 throw GaudiException(
"Keyed Container structures are inconsistent - severe problem!",
"KeyedContainer",
92 throw GaudiException(
"Keyed Container cannot satisfy request - severe problem!",
"KeyedContainer",
98 if (
sizeof(
typename T::map_type ) >
sizeof(
m_setup.buffer ) ) {
107 : m_seq(
nullptr ), m_direct( other.m_direct ), m_keyCtxt( other.m_keyCtxt ) {
110 other.m_keyCtxt = -1;
111 other.m_seq =
nullptr;
129 *rndm = &m_setup.s->v;
135 auto&
s = *m_setup.s;
137 for (
auto p :
s.v )
s.insert( p, i++ );
145 return insert( pBase, pObject, obj, *
key );
152 if (
key > m_keyCtxt ) { m_keyCtxt =
key; }
153 if ( 1 == m_direct ) {
154 if ( m_setup.s->insert( obj,
key ) ) {
156 m_seq->push_back( obj );
159 }
else if (
key ==
long( m_setup.s->v.size() ) ) {
160 m_setup.s->v.push_back( obj );
162 m_seq->push_back( obj );
168 return insert( pBase, pObject, obj,
key );
178 if (
key > m_keyCtxt ) { m_keyCtxt =
key; }
179 if ( 1 == m_direct ) {
180 if ( m_setup.s->insert( obj,
key ) ) {
184 }
else if (
key ==
long( m_setup.s->v.size() ) ) {
185 m_setup.s->v.push_back( obj );
192 return insertDirect( pBase, pObject, obj,
key );
201 typedef typename T::map_type MTYP;
203 if ( 1 == m_direct ) {
204 auto&
m = m_setup.s->m;
205 auto i = ( obj ? std::find_if(
m.begin(),
m.end(), FND( obj ) ) : m_setup.s->m.find(
key ) );
206 if ( i != m_setup.s->m.end() ) {
208 auto j = std::find( m_seq->begin(), m_seq->end(), o );
209 if (
j != m_seq->end() ) {
211 m_setup.s->m.erase( i );
218 return erase(
key, obj );
223 if ( 0 == m_direct ) onDirty();
224 auto i = m_setup.s->m.find(
key );
225 if ( i != m_setup.s->m.end() )
return ( *i ).second;
231 switch ( m_direct ) {
235 m_setup.s->v.reserve( len );
240 m_seq->reserve( len );
251 switch ( m_direct ) {
253 m_setup.s->m.clear();
256 m_setup.s->v.clear();
268 typedef typename T::map_type MTYP;
270 if ( 0 == m_direct ) {
272 return erase( beg,
end );
274 if ( beg == m_seq->begin() &&
end == m_seq->end() ) {
277 for (
auto j = beg;
j !=
end; ++
j ) {
279 auto i = std::find_if( m_setup.s->m.begin(), m_setup.s->m.end(), FND( *
j ) );
280 if ( i != m_setup.s->m.end() ) {
281 m_setup.s->m.erase( i );
286 m_seq->erase( beg,
end );
298 return CLID_ObjectVector + 0x00030000;
302 return CLID_ObjectVector + 0x00040000;
322 #ifdef CHECK_KEYED_CONTAINER
323 unsigned long siz = m_setup.s->m_idx.size();
324 if ( value >= 0 &&
size_t( value ) < siz ) {
325 long ent = *( m_setup.s->m_idx.begin() + value );
326 if ( ent >= 0 ) {
return *( m_setup.s->v.begin() + ent ); }
330 return *( m_setup.s->v.begin() + ( *( m_setup.s->m_idx.begin() + value ) ) );
337 m_setup.s->m_idx.reserve( m_setup.s->v.size() + 1 );
338 for (
size_t i = 0, stop = m_setup.s->v.size(); i < stop; ++i ) {
340 m_setup.s->m_idx.push_back( i );
348 if ( 0 == m_direct ) {
349 m_seq->push_back( o );
350 m_setup.s->v.push_back( o );
351 if ( !
c->parent() )
c->setParent( b );
362 if ( 0 == m_direct ) {
363 if ( k == m_keyCtxt + 1 ) {
return insert( b,
c, o, &k ); }
368 if ( k > m_keyCtxt ) m_keyCtxt = k;
370 if ( k + 1 >
long( m_setup.s->m_idx.size() ) ) { m_setup.s->m_idx.resize( k + 1, -1 ); }
371 auto idx = m_setup.s->m_idx.begin() + k;
373 *idx = m_setup.s->v.size();
374 m_setup.s->v.push_back( o );
375 m_seq->push_back( o );
376 if ( !
c->parent() )
c->setParent( b );
386 if ( 0 == m_direct ) {
387 if ( k == m_keyCtxt + 1 ) {
388 m_setup.s->v.push_back( o );
389 if ( !
c->parent() )
c->setParent( b );
394 return insertDirect( b,
c, o, k );
397 if ( k > m_keyCtxt ) m_keyCtxt = k;
399 if ( k + 1 >
long( m_setup.s->m_idx.size() ) ) { m_setup.s->m_idx.resize( k + 1, -1 ); }
400 auto idx = m_setup.s->m_idx.begin() + k;
402 *idx = m_setup.s->v.size();
403 m_setup.s->v.push_back( o );
404 if ( !
c->parent() )
c->setParent( b );
414 m_setup.s->v.clear();
415 m_setup.s->m_idx.clear();
423 if ( 0 == m_direct ) {
425 return erase(
key, obj );
428 auto& idx = m_setup.s->m_idx;
429 for (
auto& elem : idx ) {
430 auto j = m_setup.s->v.begin() + ( elem );
431 auto k = std::find( m_seq->begin(), m_seq->end(), *
j );
435 m_setup.s->v.erase(
j );
441 }
else if (
key >= 0 &&
key <
long( m_setup.s->m_idx.size() ) ) {
442 auto idx = m_setup.s->m_idx.begin() +
key;
444 auto i = m_setup.s->v.begin() + ( *idx );
447 auto j = std::find( m_seq->begin(), m_seq->end(), o );
450 m_setup.s->v.erase( i );
463 if ( beg == m_seq->begin() &&
end == m_seq->end() ) {
466 }
else if ( 0 == m_direct ) {
468 return erase( beg,
end );
470 long cnt = 0, nobj =
end - beg;
471 auto& idx = m_setup.s->m_idx;
472 for (
auto& elem : idx ) {
473 auto j = m_setup.s->v.begin() + ( elem );
474 auto k = std::find( beg,
end, *
j );
476 m_setup.s->v.erase(
j );
480 if ( cnt == nobj )
break;
483 m_seq->erase( beg,
end );
492 return CLID_ObjectVector + 0x00050000;
521 m_seq->push_back( o );
522 m_setup.s->v.push_back( o );
523 if ( !
c->parent() )
c->setParent( b );
524 *k = ( m_setup.s->v.size() - 1 );
531 if ( k ==
long( m_setup.s->v.size() ) ) {
return insert( b,
c, o, &k ); }
539 if ( k ==
long( m_setup.s->v.size() ) ) {
540 m_setup.s->v.push_back( o );
541 if ( !
c->parent() )
c->setParent( b );
551 m_setup.s->v.clear();
566 if ( beg == m_seq->begin() &&
end == m_seq->end() ) {
576 return CLID_ObjectVector + 0x00060000;