11 namespace Containers {
56 typedef typename CONT::value_type
v_type;
63 return (*
this)(cmp.second);
68 throw GaudiException(
"Cannot assign key to keyed object! Object already has a key.",
79 throw GaudiException(
"Keyed Container structures are inconsistent - severe problem!",
85 throw GaudiException(
"Keyed Container cannot satisfy request - severe problem!",
94 if (
sizeof(
typename T::map_type) >
sizeof(
m_setup.buffer) ) {
110 template <
class T>
void
114 *rndm = &m_setup.s->v;
120 for(
int i = 0, stop = m_setup.s->v.size();
i < stop;
i++ ) {
121 m_setup.s->insert(*(m_setup.s->v.begin()+
i),
i);
123 m_setup.s->v.clear();
134 return insert(pBase, pObject, obj, *key);
145 if ( key > m_keyCtxt ) {
149 if ( m_setup.s->insert(obj, key) ) {
150 if ( !pObject->
parent() ) {
153 m_seq->push_back(obj);
157 else if ( key ==
long(m_setup.s->v.size()) ) {
158 m_setup.s->v.push_back(obj);
159 if ( !pObject->
parent() ) {
162 m_seq->push_back(obj);
169 return insert(pBase, pObject, obj, key);
183 if ( key > m_keyCtxt ) {
187 if ( m_setup.s->insert(obj, key) ) {
188 if ( !pObject->
parent() ) {
194 else if ( key ==
long(m_setup.s->v.size()) ) {
195 m_setup.s->v.push_back(obj);
196 if ( !pObject->
parent() ) {
205 return insertDirect(pBase, pObject, obj, key);
215 typedef typename T::map_type MTYP;
217 if ( 1 == m_direct ) {
218 typename T::map_type&
m = m_setup.s->m;
219 typename T::map_type::iterator
i = (0==obj) ? m_setup.s->m.find(key)
221 if ( i != m_setup.s->m.end() ) {
222 void* o = (*i).second;
224 if ( j != m_seq->end() ) {
226 m_setup.s->m.erase(i);
233 return erase(key, obj);
239 if ( 0 == m_direct ) {
242 typename T::map_type::const_iterator
i = m_setup.s->m.find(key);
243 if ( i != m_setup.s->m.end() ) {
256 m_setup.s->v.reserve(len);
274 typedef typename T::map_type MTYP;
277 m_setup.s->m.clear();
280 m_setup.s->v.clear();
294 typedef typename T::map_type MTYP;
296 if ( 0 == m_direct ) {
298 return erase(beg, end);
300 if ( beg == m_seq->begin() && end == m_seq->end() ) {
305 typename T::map_type&
m = m_setup.s->m;
306 typename T::map_type::iterator
i =
std::find_if(m.begin(),m.end(),FND(*j));
307 if ( i != m_setup.s->m.end() ) {
308 m_setup.s->m.erase(i);
313 m_seq->erase(beg, end);
318 namespace Containers {
344 namespace Containers {
350 #ifdef CHECK_KEYED_CONTAINER
351 unsigned long siz = m_setup.s->m_idx.size();
352 if ( value >= 0 &&
size_t(value) < siz ) {
353 long ent = *(m_setup.s->m_idx.begin()+value);
355 return *(m_setup.s->v.begin() + ent);
360 return *(m_setup.s->v.begin() + (*(m_setup.s->m_idx.begin()+value)));
367 m_setup.s->m_idx.reserve(m_setup.s->v.size()+1);
368 for(
int i = 0, stop = m_setup.s->v.size();
i < stop; ++
i) {
369 if ( m_setup.s->v[
i] == 0 ) {
372 m_setup.s->m_idx.push_back(
i);
384 if ( 0 == m_direct ) {
386 m_setup.s->v.push_back(o);
402 if ( 0 == m_direct ) {
403 if ( k == m_keyCtxt+1 ) {
404 return insert(b, c, o, &k);
407 return insert(b, c, o, k);
410 if ( k > m_keyCtxt ) m_keyCtxt = k;
412 if ( k+1 >
long(m_setup.s->m_idx.size()) ) {
413 m_setup.s->m_idx.resize(k+1, -1);
417 *idx = m_setup.s->v.
size();
418 m_setup.s->v.push_back(o);
434 if ( 0 == m_direct ) {
435 if ( k == m_keyCtxt+1 ) {
436 m_setup.s->v.push_back(o);
442 return insertDirect(b, c, o, k);
445 if ( k > m_keyCtxt ) m_keyCtxt = k;
447 if ( k+1 >
long(m_setup.s->m_idx.size()) ) {
448 m_setup.s->m_idx.resize(k+1, -1);
452 *idx = m_setup.s->v.
size();
453 m_setup.s->v.push_back(o);
464 m_setup.s->v.clear();
465 m_setup.s->m_idx.clear();
476 typedef id_type::iterator id_iter;
479 if ( 0 == m_direct ) {
481 return erase(key, obj);
484 id_type& idx = m_setup.s->m_idx;
485 for ( id_iter
i=idx.begin();
i != idx.end();
i++ ) {
491 m_setup.s->v.erase(j);
493 m_setup.s->m_idx.end(),
500 else if ( key >= 0 && key <
long(m_setup.s->m_idx.size()) ) {
501 id_iter idx = m_setup.s->m_idx.begin()+key;
504 if ( i == m_setup.s->v.end() ) {
509 if ( j == m_seq->end() ) {
513 m_setup.s->v.erase(i);
515 m_setup.s->m_idx.end(),
531 typedef id_type::iterator id_iter;
532 if ( beg == m_seq->begin() && end == m_seq->end() ) {
536 else if ( 0 == m_direct ) {
538 return erase(beg, end);
541 long cnt = 0, nobj = end-beg;
542 id_type& idx = m_setup.s->m_idx;
543 for ( id_iter
i=idx.begin();
i != idx.end();
i++ ) {
547 m_setup.s->v.erase(j);
549 m_setup.s->m_idx.end(),
553 if ( cnt == nobj )
break;
556 m_seq->erase(beg, end);
580 namespace Containers {
602 m_setup.s->v.push_back(o);
604 *k = (m_setup.s->v.size()-1);
615 if ( k ==
long(m_setup.s->v.size()) ) {
616 return insert(b, c, o, &k);
629 if ( k ==
long(m_setup.s->v.size()) ) {
630 m_setup.s->v.push_back(o);
641 m_setup.s->v.clear();
660 if ( beg == m_seq->begin() && end == m_seq->end() ) {