1 #ifndef GAUDIKERNEL_KEYEDCONTAINER_H
2 #define GAUDIKERNEL_KEYEDCONTAINER_H
9 template <
class T>
struct KeyedContainerDict;
13 #include "GaudiKernel/ObjectContainerBase.h"
14 #include "GaudiKernel/KeyedObjectManager.h"
15 #include "GaudiKernel/KeyedObject.h"
21 #define FORCE_INLINE __forceinline
23 #define FORCE_INLINE inline
62 template <
class DATATYPE,
class MAPPING=Containers::HashMap >
69 typedef DATATYPE contained_type;
71 typedef MAPPING container_type;
79 typedef typename std::vector<contained_type*> seq_type;
82 typedef typename contained_type::key_type key_type;
84 typedef typename seq_type::value_type value_type;
88 typedef typename seq_type::const_reference const_reference;
90 typedef typename seq_type::iterator iterator;
92 typedef typename seq_type::const_iterator const_iterator;
94 typedef typename seq_type::reverse_iterator reverse_iterator;
98 typedef typename seq_type::const_reverse_iterator const_reverse_iterator;
109 container_type m_cont;
112 seq_type m_sequential;
117 #ifdef CHECK_KEYED_CONTAINER
118 value_type i_object(
const key_type& k)
const {
119 if ( 0 == m_cont.isDirect() ) {
120 if ( traits::checkBounds(m_random, k) ) {
121 value_type p = *(m_random->begin()+traits::hash(k));
122 if ( traits::checkKey(p, k) ) {
128 value_type p = value_type(m_cont.object(traits::hash(k)));
129 return traits::checkKey(p, k) ? p : 0;
132 FORCE_INLINE value_type i_object(
const key_type& k)
const {
133 return 0==m_cont.isDirect()
134 ? value_type(*(m_random->begin()+traits::hash(k)))
135 : value_type(m_cont.object(traits::hash(k)));
138 long i_erase(const_reference v,
const key_type& k) {
140 value_type p = value_type(m_cont.erase(traits::hash(k), v));
142 if ( p->parent() == this ) {
151 struct _InsertRelease {
154 void operator()(value_type p) {
161 struct _RemoveRelease {
164 void operator()(value_type p) {
166 if ( par == m_obj ) {
182 seq_type** rptr = &m_random;
183 seq_type* sptr = &m_sequential;
184 m_cont.setup((
void*)sptr,(
void**)rptr);
199 static CLID clid = contained_type::classID() + container_type::classID();
220 virtual size_type
numberOfObjects()
const {
return m_sequential.size(); }
253 return i_object( traits::makeKey( key_value ) );
264 virtual size_type containedObjects(std::vector<ContainedObject*>& v)
const;
272 size_type size()
const {
return m_sequential.size(); }
275 bool empty()
const {
return m_sequential.empty(); }
277 void reserve(size_type
value) { m_cont.reserve(value); }
279 void clear() { erase(
begin(),
end()); }
285 virtual const std::vector<const ContainedObject*>* containedObjects()
const;
306 iterator
begin() {
return m_sequential.begin(); }
309 const_iterator
begin()
const {
return m_sequential.begin(); }
311 iterator
end() {
return m_sequential.end(); }
313 const_iterator
end()
const {
return m_sequential.end(); }
315 reverse_iterator rbegin() {
return m_sequential.rbegin(); }
317 const_reverse_iterator rbegin()
const {
return m_sequential.rbegin(); }
319 reverse_iterator rend() {
return m_sequential.rend(); }
321 const_reverse_iterator rend()
const {
return m_sequential.rend(); }
341 value_type object(
const key_type& kval)
const {
return i_object(kval); }
352 value_type operator()(
const key_type& kval)
const {
return i_object(kval); }
377 long erase(
const key_type& kval) {
return i_erase(0, kval); }
399 long erase(
const value_type val) {
423 long erase(iterator pos) {
return erase(*pos); }
433 void erase(iterator pos_start, iterator pos_stop,
bool use_temp=
false);
453 const key_type& insert(
const value_type val,
const key_type& kval);
476 const key_type& insert(
const value_type val);
489 template <
class DATATYPE,
class MAPPING>
inline
497 template <
class DATATYPE,
class MAPPING>
inline
501 m_cont.clearDirect();
502 typename seq_type::iterator
i = m_sequential.begin();
503 typename seq_type::iterator
s = m_sequential.end();
504 for ( ; i !=
s; i++ ) {
505 typename seq_type::value_type v = *
i;
507 if ( !v->hasKey() ) {
508 traits::setKey(v, v->key());
511 long k0 = traits::hash(v->key());
527 template <
class DATATYPE,
class MAPPING>
inline
528 const std::vector<const ContainedObject*>*
530 return (
const std::vector<const ContainedObject*>*)
531 ((0==m_cont.isDirect()) ? m_random : &m_sequential);
534 template <
class DATATYPE,
class MAPPING>
inline
537 const key_type& kval)
540 long k0 = traits::hash(kval);
541 if ( !val->hasKey() || (traits::hash(val->key()) == k0) ) {
543 if ( !val->hasKey() ) traits::setKey(val, kval);
555 template <
class DATATYPE,
class MAPPING>
560 if ( val->hasKey() ) {
561 if (m_cont.insert(
this,val,val,traits::hash(val->key()))
569 traits::setKey(val, traits::makeKey(k0));
579 template <
class DATATYPE,
class MAPPING>
inline
582 const contained_type* ptr =
dynamic_cast<const contained_type*
>(p);
583 if ( ptr )
return traits::identifier(ptr->key());
588 template <
class DATATYPE,
class MAPPING>
inline
590 (std::vector<ContainedObject*>& vec)
const
592 typename seq_type::const_iterator i = m_sequential.begin();
593 typename seq_type::const_iterator s = m_sequential.end();
596 for ( ; i !=
s; i++ ) {
604 template <
class DATATYPE,
class MAPPING>
inline
607 return traits::identifier(insert(dynamic_cast<typename seq_type::value_type>(pObject)));
611 template <
class DATATYPE,
class MAPPING>
inline
614 contained_type* p1 =
dynamic_cast<contained_type*
>(p);
616 return this->erase(p1);
635 template <
class DATATYPE,
class MAPPING>
inline
641 bool is_start = start_pos == m_sequential.begin();
642 bool is_stop = stop_pos == m_sequential.end();
643 if ( is_start && is_stop ) {
646 else if ( is_start || is_stop || use_tmp ) {
647 std::vector<DATATYPE*> tmp(m_sequential.begin(), start_pos);
648 tmp.insert(tmp.end(), stop_pos, m_sequential.end());
649 std::for_each(tmp.begin(), tmp.end(), traits::addRef);
650 this->erase(m_sequential.begin(), m_sequential.end());
651 std::for_each(tmp.begin(), tmp.end(), _InsertRelease(
this));
654 std::for_each(start_pos, stop_pos, _RemoveRelease(
this));
655 seq_type *sptr = &m_sequential;
656 std::vector<void*>* v = (std::vector<void*>*)sptr;
657 std::vector<void*>::iterator i1 =
658 v->begin() + std::distance(m_sequential.begin(), start_pos);
659 std::vector<void*>::iterator i2 =
660 v->begin() + std::distance(m_sequential.begin(), stop_pos);
661 m_cont.erase(i1, i2);
665 #endif // GAUDIKERNEL_KEYEDCONTAINER_H
virtual const std::vector< const ContainedObject * > * containedObjects() const
Retrieve the full content of the object container by reference.
virtual StatusCode update()
Provide empty placeholder for internal object reconfiguration callback.
static const CLID & classID()
Retrieve reference to class definition structure (static access)
virtual StatusCode update()
Reconfigure direct access to elements (Needed by POOL data loading) This function reuses the "update"...
size_t size_type
size_type, to conform the STL container interface
virtual long add(ContainedObject *pObject)
ObjectContainerBase overload: Add an object to the container.
auto begin(reverse_wrapper< T > &w)
virtual size_type numberOfObjects() const =0
Number of objects in the container.
Object was removed, but not deleted.
template class KeyedContainer, KeyedContainer.h
virtual ContainedObject * containedObject(long dist) const =0
Pointer to an object of a given distance.
long erase(const key_type &kval)
Remove/erase object (identified by key) from the container.
virtual long add(ContainedObject *pObject)=0
Virtual functions (forwards to the concrete container definitions) Add an object to the container...
const ObjectContainerBase * parent() const
Access to parent object.
const key_type & insert(const value_type val, const key_type &kval)
Insert entry to the container with a valid key.
virtual ~KeyedContainer()
Destructor.
GAUDI_API void cannotInsertToContainer()
Function to be called to indicate that an object cannot be inserted to the container.
virtual const CLID & clID() const
Retrieve reference to class definition structure.
auto end(reverse_wrapper< T > &w)
This class is used for returning status codes from appropriate routines.
unsigned int CLID
Class ID definition.
All classes that their objects may be contained in an LHCb ObjectContainer (e.g.
virtual long index(const ContainedObject *p) const
ObjectContainerBase overload: Retrieve the full long integer representation of the object's key from ...
Object was removed from the container and deleted.
Object was inserted into the container.
virtual long index(const ContainedObject *obj) const =0
Distance of a given object from the beginning of its container.
contained_type::key_type key_type
Definition of the key type: re-use definition of contained type.
virtual long remove(ContainedObject *pObject)
ObjectContainerBase overload: Remove an object from the container.
ObjectContainerBase is the base class for Gaudi container classes.
GAUDI_API void invalidContainerOperation()
Function to be called to indicate that an operation should be performed on the container or it's cont...
Object not present in the container.
TO * reference(FROM *from)