Go to the documentation of this file.
   11 #ifndef GAUDIKERNEL_KEYEDCONTAINER_H 
   12 #define GAUDIKERNEL_KEYEDCONTAINER_H 
   32 #  define FORCE_INLINE __forceinline 
   34 #  define FORCE_INLINE inline 
   73 template <
class DATATYPE, 
class MAPPING = Containers::HashMap>
 
  127 #ifdef CHECK_KEYED_CONTAINER 
  130       if ( traits::checkBounds( m_random, k ) ) {
 
  132         if ( traits::checkKey( p, k ) ) { 
return p; }
 
  137     return traits::checkKey( p, k ) ? p : 0;
 
  145   long i_erase( const_reference 
v, 
const key_type& k ) {
 
  147     value_type p = value_type( m_cont.
erase( traits::hash( k ), 
v ) );
 
  149       if ( p->parent() == 
this ) { p->setParent( 0 ); }
 
  170       if ( 
par == m_obj ) { p->setParent( 0 ); }
 
  183     seq_type** rptr = &m_random;
 
  184     seq_type*  sptr = &m_sequential;
 
  185     m_cont.
setup( (
void*)sptr, (
void**)rptr );
 
  189       , m_cont( 
std::move( other.m_cont ) )
 
  190       , m_sequential( 
std::move( other.m_sequential ) ) {
 
  191     m_cont.
setup( (
void*)&m_sequential, (
void**)&m_random );
 
  194     other.m_cont.setup( (
void*)&other.m_sequential, (
void**)&other.m_random );
 
  210     static CLID clid = contained_type::classID() + container_type::classID();
 
  265     return i_object( traits::makeKey( key_value ) );
 
  498 template <
class DATATYPE, 
class MAPPING>
 
  505 template <
class DATATYPE, 
class MAPPING>
 
  509   typename seq_type::iterator i = m_sequential.
begin();
 
  510   typename seq_type::iterator 
s = m_sequential.
end();
 
  511   for ( ; i != 
s; i++ ) {
 
  512     typename seq_type::value_type 
v = *i;
 
  514       if ( !
v->hasKey() ) {
 
  515         traits::setKey( 
v, 
v->key() );
 
  518       long k0 = traits::hash( 
v->key() );
 
  529 template <
class DATATYPE, 
class MAPPING>
 
  534 template <
class DATATYPE, 
class MAPPING>
 
  538     long k0 = traits::hash( kval );
 
  539     if ( !val->hasKey() || ( traits::hash( val->key() ) == k0 ) ) {
 
  541         if ( !val->hasKey() ) traits::setKey( val, kval );
 
  542         traits::addRef( val );
 
  553 template <
class DATATYPE, 
class MAPPING> 
 
  557     if ( val->hasKey() ) {
 
  559         traits::addRef( val );
 
  565       traits::setKey( val, traits::makeKey( k0 ) );
 
  566       traits::addRef( val );
 
  575 template <
class DATATYPE, 
class MAPPING>
 
  578   if ( ptr ) 
return traits::identifier( ptr->key() );
 
  583 template <
class DATATYPE, 
class MAPPING>
 
  586   typename seq_type::const_iterator i = m_sequential.
begin();
 
  587   typename seq_type::const_iterator 
s = m_sequential.
end();
 
  590   for ( ; i != 
s; i++ ) {
 
  598 template <
class DATATYPE, 
class MAPPING>
 
  600   return traits::identifier( 
insert( 
dynamic_cast<typename seq_type::value_type
>( pObject ) ) );
 
  604 template <
class DATATYPE, 
class MAPPING>
 
  608     return this->erase( 
p1 );
 
  623 template <
class DATATYPE, 
class MAPPING>
 
  625   bool is_start = start_pos == m_sequential.
begin();
 
  626   bool is_stop  = stop_pos == m_sequential.
end();
 
  627   if ( is_start && is_stop ) {
 
  629   } 
else if ( is_start || is_stop || use_tmp ) {
 
  633     this->erase( m_sequential.
begin(), m_sequential.
end() );
 
  637   std::for_each( start_pos, stop_pos, _RemoveRelease( 
this ) );
 
  642   m_cont.
erase( i1, i2 );
 
  646 #endif // GAUDIKERNEL_KEYEDCONTAINER_H 
  
 
long erase(const key_type &kval)
Remove/erase object (identified by key) from the container.
 
bool empty() const
For consistency with STL: check if container is empty.
 
iterator end()
Retrieve terminating iterator.
 
GAUDI_API void cannotInsertToContainer()
Function to be called to indicate that an object cannot be inserted to the container.
 
KeyedObjectManager Class to manage keyed objects.
 
ContainedObject * containedObject(long key_value) override
ObjectContainerBase overload: Retrieve the object by reference given the long integer representation ...
 
constexpr auto size(const T &, Args &&...) noexcept
 
long insertDirect(ObjectContainerBase *b, ContainedObject *c, void *o, long k)
Insert element into direct access map.
 
contained_type::key_type key_type
Definition of the key type: re-use definition of contained type.
 
seq_type * m_random
Array to allow random access to objects (not exposed)
 
seq_type::const_iterator const_iterator
Sequential access: const iterator type used in sequential container.
 
StatusCode update() override
Reconfigure direct access to elements (Needed by POOL data loading) This function reuses the "update"...
 
const_iterator begin() const
Retrieve start const iterator.
 
long
(c) Copyright 1998-2020 CERN for the benefit of the LHCb and ATLAS collaborations # # This software i...
 
@ OBJ_NOT_FOUND
Object not present in the container.
 
reverse_iterator rend()
reverse_iterator pointing to the end of the reversed container
 
value_type operator()(const key_type &kval) const
STL algorithms support for object access.
 
seq_type::const_reverse_iterator const_reverse_iterator
Sequential access: const reverse iterator type used in sequential container.
 
long insert(ObjectContainerBase *b, ContainedObject *c, void *o, long *k)
Insert new object into container.
 
void clearDirect()
Clear all direct access fields.
 
@ OBJ_INSERTED
Object was inserted into the container.
 
void operator()(value_type p)
 
seq_type::value_type value_type
Sequential access: definition of type stored in sequential container.
 
ContainedObject const  * containedObject(long key_value) const override
Pointer to an object of a given distance.
 
GAUDI_API void invalidContainerOperation()
Function to be called to indicate that an operation should be performed on the container or it's cont...
 
Internal functor for insertion of objects.
 
void reserve(size_type value)
Reserve place for "value" objects in the container.
 
void operator()(value_type p)
 
void clear()
Clear the entire content and erase the objects from the container.
 
KeyedContainer< DATATYPE, MAPPING > * m_obj
 
long add(ContainedObject *pObject) override
ObjectContainerBase overload: Add an object to the container.
 
void * object(long key) const
Retrieve object identified by a key from the container.
 
MAPPING container_type
Definition of the implementing container type.
 
ObjectContainerBase * m_obj
 
value_type object(const key_type &kval) const
Object access by key.
 
@ OBJ_ERASED
Object was removed, but not deleted
 
DATATYPE contained_type
Definition of the contained object type.
 
double * begin(CLHEP::HepVector &v)
 
long erase(const value_type val)
Remove/erase object (identified by pointer value) from the container.
 
seq_type::const_reference const_reference
Sequential access: const reference type used in sequential container.
 
size_t size_type
size_type, to conform the STL container interface
 
template class KeyedContainer, KeyedContainer.h
 
unsigned int CLID
Class ID definition.
 
reverse_iterator rbegin()
reverse_iterator returns the beginning of the reversed container
 
const key_type & insert(const value_type val, const key_type &kval)
Insert entry to the container with a valid key.
 
seq_type::iterator iterator
Sequential access: iterator type used in sequential container.
 
void * erase(long key, const void *obj)
Remove object from container (very inefficient if key is invalid)
 
static const CLID & classID()
Retrieve class ID.
 
const ObjectContainerBase * parent() const
Access to parent object.
 
int key_type
Definition of the key-type to access object.
 
KeyedContainer(const KeyedContainer &)=delete
 
void reserve(long size)
Reserve buffer space.
 
_InsertRelease(KeyedContainer< DATATYPE, MAPPING > *p)
 
const_iterator end() const
Retrieve terminating const iterator.
 
constexpr static const auto SUCCESS
 
long index(const ContainedObject *p) const override
ObjectContainerBase overload: Retrieve the full long integer representation of the object's key from ...
 
void setParent(ObjectContainerBase *value)
Update parent member.
 
_RemoveRelease(ObjectContainerBase *p)
 
virtual const std::vector< const ContainedObject * > * containedObjects() const
Retrieve the full content of the object container by reference.
 
Internal functor for insertion of objects.
 
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.
 
void setup(void *seq, void **rndm)
Setup of the Map and the parent object.
 
FORCE_INLINE value_type i_object(const key_type &k) const
Internal function to access objects within the container.
 
seq_type m_sequential
Array to allow sequential access to the object (can be ordered).
 
seq_type::reverse_iterator reverse_iterator
Sequential access: reverse iterator type used in sequential container.
 
long remove(ContainedObject *pObject) override
ObjectContainerBase overload: Remove an object from the container.
 
seq_type::reference reference
Sequential access: reference type used in sequential container.
 
long isDirect() const
Check if the container is dirty.
 
virtual size_type numberOfObjects() const =0
Number of objects in the container.
 
Containers::traits< container_type, contained_type > traits
Traits class definition.
 
virtual size_type containedObjects(std::vector< ContainedObject * > &v) const
Retrieve the full content of the object container.
 
static const CLID & classID()
Retrieve reference to class definition structure (static access)
 
virtual const CLID & clID() const
Retrieve reference to class definition structure.
 
constexpr struct Gaudi::Functional::details::insert_t insert
 
~KeyedContainer() override
Destructor.
 
KeyedContainer(KeyedContainer &&other)
 
const_reverse_iterator rend() const
const reverse_iterator pointing to the end of the reversed container
 
const key_type & insert(const value_type val)
Insert entry to the container with automatic key assignment.
 
const_reverse_iterator rbegin() const
const reverse_iterator returns the beginning of the reversed container
 
@ OBJ_DELETED
Object was removed from the container and deleted.
 
void clear()
Clear content of the vector.