#include <KeyedContainer.h>
Inheritance diagram for KeyedContainer< DATATYPE, MAPPING >:
DataObject virtual function overloads. | |
The implementation of these methods is required by the DataObject base class and determines the persistent run-time-type information. | |
virtual const CLID & | clID () const |
Retrieve class ID. | |
static const CLID & | classID () |
Retrieve class ID. | |
inline code of class DataObject | |
void | setRegistry (IRegistry *pRegistry) |
Set pointer to Registry. | |
IRegistry * | registry () const |
Get pointer to Registry. | |
LinkManager * | linkMgr () const |
Retrieve Link manager. | |
unsigned char | version () const |
Retrieve version number of this object representation. | |
void | setVersion (unsigned char vsn) |
Set version number of this object representation. | |
unsigned long | refCount () const |
Return the refcount. | |
virtual std::ostream & | fillStream (std::ostream &s) const |
Fill the output stream (ASCII). | |
std::ostream & | operator<< (std::ostream &s, const DataObject &obj) |
Output operator (ASCII). | |
Implementation helpers. | |
FORCE_INLINE value_type | i_object (const key_type &k) const |
Internal function to access objects within the container. | |
long | i_erase (const_reference v, const key_type &k) |
Internal function to erase an object from the container. | |
container_type | m_cont |
Map container to facilitate object access by key. | |
seq_type | m_sequential |
Array to allow sequential access to the object (can be ordered). | |
seq_type * | m_random |
Array to allow random access to objects (not exposed). | |
Public Types | |
typedef DATATYPE | contained_type |
Definition of the contained object type. | |
typedef MAPPING | container_type |
Definition of the implementing container type. | |
typedef size_t | size_type |
size_type, to conform the STL container interface | |
typedef std::vector< contained_type * > | seq_type |
Definition of the STL sequential access type. | |
typedef contained_type::key_type | key_type |
Definition of the key type: re-use definition of contained type. | |
typedef seq_type::value_type | value_type |
Sequential access: definition of type stored in sequential container. | |
typedef seq_type::reference | reference |
Sequential access: reference type used in sequential container. | |
typedef seq_type::const_reference | const_reference |
Sequential access: const reference type used in sequential container. | |
typedef seq_type::iterator | iterator |
Sequential access: iterator type used in sequential container. | |
typedef seq_type::const_iterator | const_iterator |
Sequential access: const iterator type used in sequential container. | |
typedef seq_type::reverse_iterator | reverse_iterator |
Sequential access: reverse iterator type used in sequential container. | |
typedef seq_type::const_reverse_iterator | const_reverse_iterator |
Sequential access: const reverse iterator type used in sequential container. | |
Public Member Functions | |
virtual unsigned long | addRef () |
Add reference to object. | |
virtual unsigned long | release () |
release reference to object | |
const std::string & | name () const |
Retreive DataObject name. It is the name when registered in the store. | |
virtual StreamBuffer & | serialize (StreamBuffer &s) |
Serialization mechanism: Serialize the object for reading. | |
virtual StreamBuffer & | serialize (StreamBuffer &s) const |
Serialization mechanism: Serialize the object for writing. | |
Constructors/Destructors | |
KeyedContainer (void) | |
Standard Constructor. | |
virtual | ~KeyedContainer () |
Destructor. | |
NOT FOR GENERAL USE ObjectContainerBase function overloads. | |
The implementation of these methods ensure the behaviour of the class as a type of class ObjectContainerBase. This base class and its behaviour are only used by "generic" object handlers. These classes collaborate with several classes such as the
For this reason, the entry points in this section are reserved for "generic" object handling and should NOT be used in public. | |
virtual size_type | numberOfObjects () const |
ObjectContainerBase overload: Number of objects in the container. | |
virtual long | add (ContainedObject *pObject) |
ObjectContainerBase overload: Add an object to the container. | |
virtual long | remove (ContainedObject *pObject) |
ObjectContainerBase overload: Remove an object from the container. | |
virtual ContainedObject * | containedObject (long key_value) const |
ObjectContainerBase overload: Retrieve the object by reference given the long integer representation of the object's key. | |
virtual long | index (const ContainedObject *p) const |
ObjectContainerBase overload: Retrieve the full long integer representation of the object's key from the object base class pointer. | |
virtual size_type | containedObjects (std::vector< ContainedObject * > &v) const |
Retrieve the full content of the object container. | |
Container related implementation. | |
These methods allow to manipulate the container as a whole and to retrieve information about the internal behaviour of the container. | |
size_type | size () const |
Number of objects in the container. | |
bool | empty () const |
For consistency with STL: check if container is empty. | |
void | reserve (size_type value) |
Reserve place for "value" objects in the container. | |
void | clear () |
Clear the entire content and erase the objects from the container. | |
virtual const std::vector< const ContainedObject * > * | containedObjects () const |
Retrieve the full content of the object container by reference. | |
virtual void | configureDirectAccess () |
Reconfigure direct access to elements (Needed by POOL data loading). | |
Sequential array access to objects using iterators. | |
Sequential object access using iterators is much faster then object access by key. In case all objects of the container should be addressed, use iterators rather than direct object access.
| |
iterator | begin () |
Retrieve start iterator. | |
const_iterator | begin () const |
Retrieve start const iterator. | |
iterator | end () |
Retrieve terminating iterator. | |
const_iterator | end () const |
Retrieve terminating const iterator. | |
reverse_iterator | rbegin () |
reverse_iterator returns the beginning of the reversed container | |
const_reverse_iterator | rbegin () const |
const reverse_iterator returns the beginning of the reversed container | |
reverse_iterator | rend () |
reverse_iterator pointing to the end of the reversed container | |
const_reverse_iterator | rend () const |
const reverse_iterator pointing to the end of the reversed container | |
Random access to objects in the container. | |
Access to objects is given by Key. Please note, that random object access is nearly in all cases significantly slower than sequential access. If all objects in the contaienr should be addresses sequentially, use iterators rather than direct access. Direct access should only be used for selective retrieval of objects. | |
value_type | object (const key_type &kval) const |
Object access by key. | |
value_type | operator() (const key_type &kval) const |
STL algorithms support for object access. | |
Insert/Remove objects from the container. | |
Objects generally are identified by key. Since keys are stored with the objects, insertions and removals are possible by key or by reference. | |
long | erase (const key_type &kval) |
Remove/erase object (identified by key) from the container. | |
long | erase (const value_type val) |
Remove/erase object (identified by pointer value) from the container. | |
long | erase (iterator pos) |
Remove/erase object (identified by iterator) from the container. | |
void | erase (iterator pos_start, iterator pos_stop, bool use_temp=false) |
Remove/erase objects by iterator range. | |
const key_type & | insert (const value_type val, const key_type &kval) |
Insert entry to the container with a valid key. | |
const key_type & | insert (const value_type val) |
Insert entry to the container with automatic key assignment. | |
Private Types | |
typedef Containers::traits< container_type, contained_type > | traits |
Traits class definition. | |
Friends | |
struct | GaudiDict::KeyedContainerDict< DATATYPE > |
Classes | |
struct | _InsertRelease |
Internal functor for insertion of objects. More... | |
struct | _RemoveRelease |
Internal functor for insertion of objects. More... |
This class represents a container, where the contained objects are accessed by a key. Such a key can be any class, which is able to convert to and from a 32-bit (long) integer.
To insert objects into the container, this implementation determines the key in the following way:
Access to objects is given two-fold:
The KeyedContainer class uses for further specialization a traits class. By specializing these traits extra behaviour can be forced on request for special containers or special keys.
Definition at line 64 of file KeyedContainer.h.
typedef DATATYPE KeyedContainer< DATATYPE, MAPPING >::contained_type |
typedef MAPPING KeyedContainer< DATATYPE, MAPPING >::container_type |
typedef std::vector<contained_type*> KeyedContainer< DATATYPE, MAPPING >::seq_type |
Definition of the STL sequential access type.
The following type definitions are generic to most STL containers and are also presented by the KeyedContainer class. These forward declarations typically are used by STL algorithms.
Definition at line 82 of file KeyedContainer.h.
typedef contained_type::key_type KeyedContainer< DATATYPE, MAPPING >::key_type |
Definition of the key type: re-use definition of contained type.
Definition at line 84 of file KeyedContainer.h.
typedef seq_type::value_type KeyedContainer< DATATYPE, MAPPING >::value_type |
Sequential access: definition of type stored in sequential container.
Definition at line 86 of file KeyedContainer.h.
typedef seq_type::reference KeyedContainer< DATATYPE, MAPPING >::reference |
Sequential access: reference type used in sequential container.
Definition at line 88 of file KeyedContainer.h.
typedef seq_type::const_reference KeyedContainer< DATATYPE, MAPPING >::const_reference |
Sequential access: const reference type used in sequential container.
Definition at line 90 of file KeyedContainer.h.
typedef seq_type::iterator KeyedContainer< DATATYPE, MAPPING >::iterator |
Sequential access: iterator type used in sequential container.
Definition at line 92 of file KeyedContainer.h.
typedef seq_type::const_iterator KeyedContainer< DATATYPE, MAPPING >::const_iterator |
Sequential access: const iterator type used in sequential container.
Definition at line 94 of file KeyedContainer.h.
typedef seq_type::reverse_iterator KeyedContainer< DATATYPE, MAPPING >::reverse_iterator |
Sequential access: reverse iterator type used in sequential container.
Definition at line 96 of file KeyedContainer.h.
typedef seq_type::const_reverse_iterator KeyedContainer< DATATYPE, MAPPING >::const_reverse_iterator |
Sequential access: const reverse iterator type used in sequential container.
Definition at line 100 of file KeyedContainer.h.
typedef Containers::traits<container_type, contained_type> KeyedContainer< DATATYPE, MAPPING >::traits [private] |
Traits class definition.
Specializing traits allows to specialize the container implementation for special needs.
Definition at line 106 of file KeyedContainer.h.
typedef size_t ObjectContainerBase::size_type [inherited] |
size_type, to conform the STL container interface
Reimplemented in SharedObjectsContainer< TYPE >.
Definition at line 33 of file ObjectContainerBase.h.
KeyedContainer< DATATYPE, MAPPING >::KeyedContainer | ( | void | ) | [inline] |
Standard Constructor.
Definition at line 181 of file KeyedContainer.h.
00182 { 00183 // avoid problems with strict-aliasing rules 00184 seq_type** rptr = &m_random; 00185 seq_type* sptr = &m_sequential; 00186 m_cont.setup((void*)sptr,(void**)rptr); 00187 }
KeyedContainer< DATATYPE, MAPPING >::~KeyedContainer | ( | ) | [inline, virtual] |
FORCE_INLINE value_type KeyedContainer< DATATYPE, MAPPING >::i_object | ( | const key_type & | k | ) | const [inline, private] |
Internal function to access objects within the container.
Definition at line 134 of file KeyedContainer.h.
00134 { 00135 return 0==m_cont.isDirect() 00136 ? value_type(*(m_random->begin()+traits::hash(k))) 00137 : value_type(m_cont.object(traits::hash(k))); 00138 }
long KeyedContainer< DATATYPE, MAPPING >::i_erase | ( | const_reference | v, | |
const key_type & | k | |||
) | [inline, private] |
Internal function to erase an object from the container.
Definition at line 141 of file KeyedContainer.h.
00141 { 00142 value_type p = value_type(m_cont.erase(traits::hash(k), v)); 00143 if ( p ) { 00144 if ( p->parent() == this ) { 00145 p->setParent(0); 00146 } 00147 } 00148 return traits::release(p) <= 0 ? (long) Containers::OBJ_ERASED 00149 : (long) Containers::OBJ_DELETED; 00150 }
virtual const CLID& KeyedContainer< DATATYPE, MAPPING >::clID | ( | ) | const [inline, virtual] |
Retrieve class ID.
Reimplemented from DataObject.
Definition at line 198 of file KeyedContainer.h.
00198 { return this->classID(); }
static const CLID& KeyedContainer< DATATYPE, MAPPING >::classID | ( | ) | [inline, static] |
Retrieve class ID.
Reimplemented from DataObject.
Definition at line 200 of file KeyedContainer.h.
00200 { 00201 static CLID clid = contained_type::classID() + container_type::classID(); 00202 return clid; 00203 }
virtual size_type KeyedContainer< DATATYPE, MAPPING >::numberOfObjects | ( | ) | const [inline, virtual] |
ObjectContainerBase overload: Number of objects in the container.
Implements ObjectContainerBase.
Definition at line 223 of file KeyedContainer.h.
00223 { return m_sequential.size(); }
long KeyedContainer< DATATYPE, MAPPING >::add | ( | ContainedObject * | pObject | ) | [inline, virtual] |
ObjectContainerBase overload: Add an object to the container.
Plese see the documentation of the member function
const key_type& insert(DATATYPE* pObject)
for further details.
pObject | Pointer to the object to be inserted into the container. |
Implements ObjectContainerBase.
Definition at line 603 of file KeyedContainer.h.
00604 { 00605 return traits::identifier(insert(dynamic_cast<typename seq_type::value_type>(pObject))); 00606 }
long KeyedContainer< DATATYPE, MAPPING >::remove | ( | ContainedObject * | pObject | ) | [inline, virtual] |
ObjectContainerBase overload: Remove an object from the container.
Because this function is also called from the destructor of The ContainedObject class, it is no longer possible to deduce the key from the object itself. It is hence necessary to relay on the **NON-EXISTENCE** of virtual inheritance, ie. (void*)pObject = (void*)(contained_object). If the virtual object table is still intact, the normal erase is called.
pObject | Pointer to the object to be removed from the container. |
Implements ObjectContainerBase.
Definition at line 610 of file KeyedContainer.h.
00611 { 00612 contained_type* p1 = dynamic_cast<contained_type*>(p); 00613 if ( p1 ) { // Normal case; object still fully intact 00614 return this->erase(p1); 00615 } 00616 else if ( p ) { 00617 const ObjectContainerBase* par = p->parent(); 00618 // The following should never occur: object is in a funny state, 00619 // Because the parent was explicitly set to NULL in the 00620 // KeyeObject destructor. 00621 // - It cannot be a KeyedObject: It would not have a parent 00622 // - Still the parent is present: We are not in the destructor 00623 // of KeyedObject 00624 if ( par ) { 00625 Containers::invalidContainerOperation(); 00626 } 00627 return m_cont.erase(0, p)==0 ? (long) Containers::OBJ_ERASED 00628 : (long) Containers::OBJ_NOT_FOUND; 00629 } 00630 return (long) Containers::OBJ_NOT_FOUND; 00631 }
virtual ContainedObject* KeyedContainer< DATATYPE, MAPPING >::containedObject | ( | long | key_value | ) | const [inline, virtual] |
ObjectContainerBase overload: Retrieve the object by reference given the long integer representation of the object's key.
Implements ObjectContainerBase.
Definition at line 254 of file KeyedContainer.h.
00254 { 00255 return i_object( traits::makeKey( key_value ) ); 00256 }
long KeyedContainer< DATATYPE, MAPPING >::index | ( | const ContainedObject * | p | ) | const [inline, virtual] |
ObjectContainerBase overload: Retrieve the full long integer representation of the object's key from the object base class pointer.
Implements ObjectContainerBase.
Definition at line 578 of file KeyedContainer.h.
00579 { 00580 const contained_type* ptr = dynamic_cast<const contained_type*>(p); 00581 if ( ptr ) return traits::identifier(ptr->key()); 00582 return -1; 00583 }
KeyedContainer< DATATYPE, MAPPING >::size_type KeyedContainer< DATATYPE, MAPPING >::containedObjects | ( | std::vector< ContainedObject * > & | v | ) | const [inline, virtual] |
Retrieve the full content of the object container.
v | Vector of contained objects, which will host all objects contained in this container. |
Definition at line 588 of file KeyedContainer.h.
00589 { 00590 typename seq_type::const_iterator i = m_sequential.begin(); 00591 typename seq_type::const_iterator s = m_sequential.end(); 00592 vec.clear(); 00593 vec.reserve(size()); 00594 for ( ; i != s; i++ ) { 00595 ContainedObject* p = const_cast<typename seq_type::value_type>(*i); 00596 vec.push_back(p); 00597 } 00598 return vec.size(); 00599 }
size_type KeyedContainer< DATATYPE, MAPPING >::size | ( | ) | const [inline] |
Number of objects in the container.
Definition at line 275 of file KeyedContainer.h.
00275 { return m_sequential.size(); }
bool KeyedContainer< DATATYPE, MAPPING >::empty | ( | ) | const [inline] |
For consistency with STL: check if container is empty.
Definition at line 277 of file KeyedContainer.h.
00277 { return m_sequential.empty(); }
void KeyedContainer< DATATYPE, MAPPING >::reserve | ( | size_type | value | ) | [inline] |
Reserve place for "value" objects in the container.
Definition at line 279 of file KeyedContainer.h.
00279 { m_cont.reserve(value); }
void KeyedContainer< DATATYPE, MAPPING >::clear | ( | ) | [inline] |
Clear the entire content and erase the objects from the container.
Definition at line 281 of file KeyedContainer.h.
const std::vector< const ContainedObject * > * KeyedContainer< DATATYPE, MAPPING >::containedObjects | ( | ) | const [inline, virtual] |
Retrieve the full content of the object container by reference.
Returned is the random access container if in sequntial direct access mode. Otherwise the sequential access container is returned
Definition at line 527 of file KeyedContainer.h.
00527 { 00528 return (const std::vector<const ContainedObject*>*) 00529 ((0==m_cont.isDirect()) ? m_random : &m_sequential); 00530 }
void KeyedContainer< DATATYPE, MAPPING >::configureDirectAccess | ( | ) | [inline, virtual] |
Reconfigure direct access to elements (Needed by POOL data loading).
Definition at line 497 of file KeyedContainer.h.
00498 { 00499 int count = 0; 00500 m_cont.clearDirect(); 00501 typename seq_type::iterator i = m_sequential.begin(); 00502 typename seq_type::iterator s = m_sequential.end(); 00503 for ( ; i != s; i++ ) { 00504 typename seq_type::value_type v = *i; 00505 if ( v ) { 00506 if ( !v->hasKey() ) { 00507 traits::setKey(v, v->key()); 00508 traits::addRef(v); 00509 } 00510 long k0 = traits::hash(v->key()); 00511 if(m_cont.insertDirect(this, v, v, k0) == Containers::OBJ_INSERTED) { 00512 } 00513 } 00514 else { 00515 ++count; 00516 } 00517 } 00518 if ( count > 0 ) { 00519 Containers::cannotInsertToContainer(); 00520 } 00521 }
iterator KeyedContainer< DATATYPE, MAPPING >::begin | ( | ) | [inline] |
Retrieve start iterator.
Definition at line 306 of file KeyedContainer.h.
00306 { return m_sequential.begin(); }
const_iterator KeyedContainer< DATATYPE, MAPPING >::begin | ( | ) | const [inline] |
Retrieve start const iterator.
Definition at line 308 of file KeyedContainer.h.
00308 { return m_sequential.begin(); }
iterator KeyedContainer< DATATYPE, MAPPING >::end | ( | ) | [inline] |
Retrieve terminating iterator.
Definition at line 310 of file KeyedContainer.h.
00310 { return m_sequential.end(); }
const_iterator KeyedContainer< DATATYPE, MAPPING >::end | ( | ) | const [inline] |
Retrieve terminating const iterator.
Definition at line 312 of file KeyedContainer.h.
00312 { return m_sequential.end(); }
reverse_iterator KeyedContainer< DATATYPE, MAPPING >::rbegin | ( | ) | [inline] |
reverse_iterator returns the beginning of the reversed container
Definition at line 314 of file KeyedContainer.h.
00314 { return m_sequential.rbegin(); }
const_reverse_iterator KeyedContainer< DATATYPE, MAPPING >::rbegin | ( | ) | const [inline] |
const reverse_iterator returns the beginning of the reversed container
Definition at line 316 of file KeyedContainer.h.
00316 { return m_sequential.rbegin(); }
reverse_iterator KeyedContainer< DATATYPE, MAPPING >::rend | ( | ) | [inline] |
reverse_iterator pointing to the end of the reversed container
Definition at line 318 of file KeyedContainer.h.
00318 { return m_sequential.rend(); }
const_reverse_iterator KeyedContainer< DATATYPE, MAPPING >::rend | ( | ) | const [inline] |
const reverse_iterator pointing to the end of the reversed container
Definition at line 320 of file KeyedContainer.h.
00320 { return m_sequential.rend(); }
value_type KeyedContainer< DATATYPE, MAPPING >::object | ( | const key_type & | kval | ) | const [inline] |
Object access by key.
Access contained objects by key.
kval | Key of the object to be returned. |
Definition at line 340 of file KeyedContainer.h.
00340 { return i_object(kval); }
value_type KeyedContainer< DATATYPE, MAPPING >::operator() | ( | const key_type & | kval | ) | const [inline] |
STL algorithms support for object access.
Access contained objects by key using the operator(), which is demanded by STL algorithms.
kval | Key of the object to be returned. |
Definition at line 351 of file KeyedContainer.h.
00351 { return i_object(kval); }
long KeyedContainer< DATATYPE, MAPPING >::erase | ( | const key_type & | kval | ) | [inline] |
Remove/erase object (identified by key) from the container.
kval | Key to identify the object within the container. |
Definition at line 376 of file KeyedContainer.h.
00376 { return i_erase(0, kval); }
long KeyedContainer< DATATYPE, MAPPING >::erase | ( | const value_type | val | ) | [inline] |
Remove/erase object (identified by pointer value) from the container.
This member function removes an object, which is identified by its reference from the container. No key value is supplied. To identify the object within the container, the key of the object is used as it can be retrieved using the KeyedObject::key() method.
val | Reference to object to be removed from the container. |
Definition at line 398 of file KeyedContainer.h.
00398 { 00399 return (val) ? i_erase(val, val->key()) : (long) Containers::OBJ_NOT_FOUND; 00400 }
long KeyedContainer< DATATYPE, MAPPING >::erase | ( | iterator | pos | ) | [inline] |
Remove/erase object (identified by iterator) from the container.
This member function removes an object, which is identified by its reference from the container. No key value is supplied. To identify the object within the container, the key of the object is used as it can be retrieved using the KeyedObject::key() method.
val | Reference to object to be removed from the container. |
Definition at line 422 of file KeyedContainer.h.
00422 { return erase(*pos); }
void KeyedContainer< DATATYPE, MAPPING >::erase | ( | iterator | pos_start, | |
iterator | pos_stop, | |||
bool | use_temp = false | |||
) | [inline] |
Remove/erase objects by iterator range.
This member function removes all objects, which are within the sequential iterator range [pos_start, pos_stop[.
pos_start | Starting iterator of the range to be removed. | |
pos_stop | Starting iterator of the range to be removed. | |
use_temp | Flag to indicate that a temporary arry should be used. |
Definition at line 635 of file KeyedContainer.h.
00638 { 00639 bool is_start = start_pos == m_sequential.begin(); 00640 bool is_stop = stop_pos == m_sequential.end(); 00641 if ( is_start && is_stop ) { 00642 // Nothing special. Taken care of by Keyed object manager 00643 } 00644 else if ( is_start || is_stop || use_tmp ) { 00645 std::vector<DATATYPE*> tmp(m_sequential.begin(), start_pos); 00646 tmp.insert(tmp.end(), stop_pos, m_sequential.end()); 00647 std::for_each(tmp.begin(), tmp.end(), traits::addRef); 00648 this->erase(m_sequential.begin(), m_sequential.end()); 00649 std::for_each(tmp.begin(), tmp.end(), _InsertRelease(this)); 00650 return; 00651 } 00652 std::for_each(start_pos, stop_pos, _RemoveRelease(this)); 00653 seq_type *sptr = &m_sequential; // avoid problems with strict-aliasing rules 00654 std::vector<void*>* v = (std::vector<void*>*)sptr; 00655 std::vector<void*>::iterator i1 = 00656 v->begin() + std::distance(m_sequential.begin(), start_pos); 00657 std::vector<void*>::iterator i2 = 00658 v->begin() + std::distance(m_sequential.begin(), stop_pos); 00659 m_cont.erase(i1, i2); 00660 }
const KeyedContainer< DATATYPE, MAPPING >::key_type & KeyedContainer< DATATYPE, MAPPING >::insert | ( | const value_type | val, | |
const key_type & | kval | |||
) | [inline] |
Insert entry to the container with a valid key.
This member function inserts an element, which is identified by its reference to the container. The element will be inserted using the specified key. If the object is already keyed, the long representations of the supplied key and the object's key must agree.
The object will not be inserted and an exception will be raised under the following conditions:
val | Reference to object to be inserted into the container. The object reference may NOT be NULL. | |
kval | Key to identify the object within the container. |
Definition at line 534 of file KeyedContainer.h.
00536 { 00537 if ( val ) { 00538 long k0 = traits::hash(kval); 00539 if ( !val->hasKey() || (traits::hash(val->key()) == k0) ) { 00540 if(m_cont.insert(this,val,val,k0) == Containers::OBJ_INSERTED) { 00541 if ( !val->hasKey() ) traits::setKey(val, kval); 00542 traits::addRef(val); 00543 return val->key(); 00544 } 00545 } 00546 } 00547 // Cannot insert object...indicate bad object insertion... 00548 Containers::cannotInsertToContainer(); 00549 return val->key(); 00550 }
const KeyedContainer< DATATYPE, MAPPING >::key_type & KeyedContainer< DATATYPE, MAPPING >::insert | ( | const value_type | val | ) |
Insert entry to the container with automatic key assignment.
This member function inserts an element, which is identified by its reference to the container. No key value is supplied. The key used to insert the object is retrieved from the element itself. In the event the object already has a key, the assigned key of the object is used. If no key was assigned to the object, (i.e. the object's key is equal to the invalid key), a key is generated according to the number of objects present in the container.
The object will not be inserted and an exception will be raised under the following conditions:
val | Reference to object to be inserted into the container. |
Definition at line 555 of file KeyedContainer.h.
00556 { 00557 if ( 0 != val ) { 00558 if ( val->hasKey() ) { 00559 if (m_cont.insert(this,val,val,traits::hash(val->key())) 00560 == Containers::OBJ_INSERTED) { 00561 traits::addRef(val); 00562 return val->key(); 00563 } 00564 } 00565 long k0; 00566 if ( m_cont.insert(this, val, val, &k0) == Containers::OBJ_INSERTED ) { 00567 traits::setKey(val, traits::makeKey(k0)); 00568 traits::addRef(val); 00569 return val->key(); 00570 } 00571 } 00572 // Cannot insert object...indicate bad object insertion... 00573 Containers::cannotInsertToContainer(); 00574 return val->key(); 00575 }
virtual unsigned long DataObject::addRef | ( | ) | [virtual, inherited] |
Add reference to object.
virtual unsigned long DataObject::release | ( | ) | [virtual, inherited] |
release reference to object
const std::string& DataObject::name | ( | ) | const [inherited] |
Retreive DataObject name. It is the name when registered in the store.
Reimplemented in NTuple::File, and ServiceHistory.
virtual StreamBuffer& DataObject::serialize | ( | StreamBuffer & | s | ) | [virtual, inherited] |
Serialization mechanism: Serialize the object for reading.
Reimplemented in RefTableBase< FROM, MAPENTRY >, RefTableBase< FROM, SmartRefVector< TO > >, and RefTableBase< FROM, SmartRef< TO > >.
virtual StreamBuffer& DataObject::serialize | ( | StreamBuffer & | s | ) | const [virtual, inherited] |
Serialization mechanism: Serialize the object for writing.
Reimplemented in RefTableBase< FROM, MAPENTRY >, RefTableBase< FROM, SmartRefVector< TO > >, and RefTableBase< FROM, SmartRef< TO > >.
void DataObject::setRegistry | ( | IRegistry * | pRegistry | ) | [inline, inherited] |
Set pointer to Registry.
Definition at line 67 of file DataObject.h.
00067 { 00068 m_pRegistry = pRegistry; 00069 }
IRegistry* DataObject::registry | ( | ) | const [inline, inherited] |
Get pointer to Registry.
Definition at line 71 of file DataObject.h.
00071 { 00072 return m_pRegistry; 00073 }
LinkManager* DataObject::linkMgr | ( | ) | const [inline, inherited] |
Retrieve Link manager.
Definition at line 75 of file DataObject.h.
00075 { 00076 return m_pLinkMgr; 00077 }
unsigned char DataObject::version | ( | ) | const [inline, inherited] |
Retrieve version number of this object representation.
Definition at line 79 of file DataObject.h.
00079 { 00080 return m_version; 00081 }
void DataObject::setVersion | ( | unsigned char | vsn | ) | [inline, inherited] |
Set version number of this object representation.
Definition at line 83 of file DataObject.h.
00083 { 00084 m_version = vsn; 00085 }
unsigned long DataObject::refCount | ( | ) | const [inline, inherited] |
Return the refcount.
Definition at line 87 of file DataObject.h.
00087 { 00088 return m_refCount; 00089 }
virtual std::ostream& DataObject::fillStream | ( | std::ostream & | s | ) | const [inline, virtual, inherited] |
Fill the output stream (ASCII).
Reimplemented in ObjectList< TYPE >, and ObjectVector< TYPE >.
Definition at line 91 of file DataObject.h.
friend struct GaudiDict::KeyedContainerDict< DATATYPE > [friend] |
Definition at line 67 of file KeyedContainer.h.
std::ostream& operator<< | ( | std::ostream & | s, | |
const DataObject & | obj | |||
) | [friend, inherited] |
Output operator (ASCII).
Definition at line 96 of file DataObject.h.
00096 { 00097 return obj.fillStream(s); 00098 }
container_type KeyedContainer< DATATYPE, MAPPING >::m_cont [private] |
seq_type KeyedContainer< DATATYPE, MAPPING >::m_sequential [private] |
Array to allow sequential access to the object (can be ordered).
Definition at line 114 of file KeyedContainer.h.
seq_type* KeyedContainer< DATATYPE, MAPPING >::m_random [private] |
Array to allow random access to objects (not exposed).
Definition at line 116 of file KeyedContainer.h.