| The Gaudi Framework v32r1 (f65d50dc)

SharedObjectsContainer.h
Go to the documentation of this file.
1 #ifndef GAUDIKERNEL_SHAREDOBJECTSCONTAINER_H
2 #define GAUDIKERNEL_SHAREDOBJECTSCONTAINER_H 1
3 // ============================================================================
4 // Include files
5 // ============================================================================
6 // STD & STL
7 // ============================================================================
8 #include <algorithm>
9 #include <vector>
10 // ============================================================================
11 // GaudiKernel
12 // ============================================================================
13 #include "GaudiKernel/ClassID.h"
14 #include "GaudiKernel/Kernel.h"
15 #include "GaudiKernel/ObjectContainerBase.h"
16 // ============================================================================
28 template <class TYPE>
29 class SharedObjectsContainer : public ObjectContainerBase {
30 public:
31 // ==========================================================================
33 typedef std::vector<const TYPE*> ConstVector;
35 typedef typename ConstVector::value_type value_type;
36 typedef typename ConstVector::size_type size_type;
37 typedef typename ConstVector::reference reference;
38 typedef typename ConstVector::const_reference const_reference;
39 typedef typename ConstVector::iterator iterator;
40 typedef typename ConstVector::const_iterator const_iterator;
41 typedef typename ConstVector::reverse_iterator reverse_iterator;
42 typedef typename ConstVector::const_reverse_iterator const_reverse_iterator;
43 // ==========================================================================
44 public:
45 // ==========================================================================
46 // the default constructor (creates the empty vector)
47 SharedObjectsContainer() = default;
48 // move constructor and move assignement
49 SharedObjectsContainer( SharedObjectsContainer&& ) = default;
50 SharedObjectsContainer& operator=( SharedObjectsContainer&& ) = default;
51 // the constructor from the data
52 SharedObjectsContainer( const ConstVector& data ) : m_data( data ) {}
53 SharedObjectsContainer( ConstVector&& data ) : m_data( std::move( data ) ) {}
54
59 template <class DATA>
60 SharedObjectsContainer( DATA first, DATA last ) : m_data( first, last ) {}
84 template <class DATA, class PREDICATE>
85 SharedObjectsContainer( DATA first, DATA last, const PREDICATE& cut ) {
86 insert( first, last, cut );
87 }
88 // ==========================================================================
89 public:
90 // ==========================================================================
92 const CLID& clID() const override { return SharedObjectsContainer<TYPE>::classID(); }
94 static const CLID& classID() {
95 static const CLID s_clid = ( ( static_cast<CLID>( -1 ) << 16 ) // 16 used and 16 empty bits
96 & !CLID_ObjectVector // not an ObjectVector
97 & !CLID_ObjectList // not an ObjectList
98 & !static_cast<CLID>( 0x00030000 ) // not a KeyedContainer/map
99 & !static_cast<CLID>( 0x00040000 ) ) // not a KeyedContainer/hashmap
100 + TYPE::classID(); // the specific CLID from the contents
101 //
102 return s_clid;
103 }
104 // ==========================================================================
105 public:
106 // ==========================================================================
108 inline const ConstVector& data() const { return m_data; }
110 operator const ConstVector&() const { return data(); }
111 // ==========================================================================
112 public:
113 // ==========================================================================
115 size_type size() const { return m_data.size(); }
117 bool empty() const { return m_data.empty(); }
121 void push_back( const TYPE* object ) { m_data.push_back( object ); }
125 void insert( const TYPE* object ) { m_data.push_back( object ); }
130 template <class DATA>
131 void insert( DATA first, DATA last ) {
132 m_data.insert( end(), first, last );
133 }
160 template <class DATA, class PREDICATE>
161 void insert( DATA first, DATA last, const PREDICATE& cut ) {
162 m_data.reserve( m_data.size() + std::distance( first, last ) );
163 std::copy_if( first, last, std::back_inserter( m_data ), std::cref( cut ) );
164 }
189 template <class OUTPUT, class PREDICATE>
190 OUTPUT get( const PREDICATE& cut, OUTPUT output ) const {
191 return std::copy_if( begin(), end(), output, std::cref( cut ) );
192 }
194 void erase( iterator i ) { m_data.erase( i ); }
212 template <class PREDICATE>
213 void erase( const PREDICATE& cut ) {
214 m_data.erase( std::remove_if( begin(), end(), cut ), end() );
215 }
234 bool erase( const TYPE* object ) {
235 auto i = std::find( begin(), end(), object );
236 if ( end() == i ) { return false; }
237 m_data.erase( i );
238 return true;
239 }
240 // ==========================================================================
241 public:
242 // ==========================================================================
244 reference operator[]( size_type index ) { return m_data[index]; }
246 const_reference operator[]( size_type index ) const { return m_data[index]; }
248 reference operator()( size_type index ) { return m_data[index]; }
250 const_reference operator()( size_type index ) const { return m_data[index]; }
252 reference at( size_type index ) { return m_data.at( index ); }
254 const_reference at( size_type index ) const { return m_data.at( index ); }
255 // ==========================================================================
256 public:
257 // ==========================================================================
258 iterator begin() { return m_data.begin(); }
259 iterator end() { return m_data.end(); }
260 const_iterator begin() const { return m_data.begin(); }
261 const_iterator end() const { return m_data.end(); }
262 reverse_iterator rbegin() { return m_data.rbegin(); }
263 reverse_iterator rend() { return m_data.rend(); }
264 const_reverse_iterator rbegin() const { return m_data.rbegin(); }
265 const_reverse_iterator rend() const { return m_data.rend(); }
266 // ==========================================================================
267 public:
268 // ==========================================================================
270 reference front() { return m_data.front(); }
272 const_reference front() const { return m_data.front(); }
274 reference back() { return m_data.back(); }
276 const_reference back() const { return m_data.back(); }
277 // ==========================================================================
278 public:
279 // ==========================================================================
281 bool operator==( const SharedObjectsContainer& right ) const { return &right == this || right.m_data == m_data; }
283 bool operator==( const ConstVector& right ) const { return m_data == right; }
285 bool operator<( const SharedObjectsContainer& right ) const { return m_data < right.m_data; }
287 bool operator<( const ConstVector& right ) const { return m_data < right; }
288 // ==========================================================================
289 // ObjectContainerBase methods:
290 // ==========================================================================
291 public:
295 long index( const ContainedObject* object ) const override {
296 auto _i = std::find( begin(), end(), object );
297 return end() != _i ? ( _i - begin() ) : -1; // RETURN
298 }
303 const ContainedObject* containedObject( long index ) const override {
304 if ( 0 > index || !( index < (long)size() ) ) { return nullptr; } // RETURN
305 return m_data[index];
306 }
307 ContainedObject* containedObject( long index ) override {
308 if ( 0 > index || !( index < (long)size() ) ) { return nullptr; } // RETURN
309 return &const_cast<TYPE&>( *m_data[index] );
310 }
312 size_type numberOfObjects() const override { return m_data.size(); }
317 long add( ContainedObject* object ) override {
318 if ( !object ) { return -1; } // RETURN
319 TYPE* _obj = dynamic_cast<TYPE*>( object );
320 if ( !_obj ) { return -1; } // RETURN
321 const size_type pos = size();
322 push_back( _obj );
323 return pos;
324 }
329 long remove( ContainedObject* value ) override {
330 auto _i = std::find( begin(), end(), value );
331 if ( end() == _i ) { return -1; } // RETURN
332 const size_type pos = _i - begin();
333 m_data.erase( _i );
334 return pos; // RETURN
335 }
336 // ==========================================================================
337 private:
338 // ==========================================================================
339 // the actual data
340 ConstVector m_data; // the actual data
341 // ==========================================================================
342 };
343 // ============================================================================
344 // The END
345 // ============================================================================
346 #endif // GAUDIKERNEL_SHAREDOBJECTSCONTAINER_H
SharedObjectsContainer::erase
bool erase(const TYPE *object)
erase the first occurance of the certain element
Definition: SharedObjectsContainer.h:234
SharedObjectsContainer::containedObject
const ContainedObject * containedObject(long index) const override
Pointer to an object of a given distance.
Definition: SharedObjectsContainer.h:303
SharedObjectsContainer::at
const_reference at(size_type index) const
checked access (const-version)
Definition: SharedObjectsContainer.h:254
SharedObjectsContainer::front
reference front()
the first element (only for non-empty vectors)
Definition: SharedObjectsContainer.h:270
SharedObjectsContainer
Very simple class to represent the container of objects which are not owned by this container.
Definition: SharedObjectsContainer.h:29
ClassID.h
Kernel.h
std::vector::empty
T empty(T... args)
std::copy_if
T copy_if(T... args)
std::distance
T distance(T... args)
SharedObjectsContainer::operator()
reference operator()(size_type index)
'functional'-access
Definition: SharedObjectsContainer.h:248
SharedObjectsContainer::erase
void erase(const PREDICATE &cut)
erase the objects which satisfy the criteria
Definition: SharedObjectsContainer.h:213
SharedObjectsContainer::clID
const CLID & clID() const override
Retrieve the unique class ID (virtual)
Definition: SharedObjectsContainer.h:92
ObjectContainerBase::size_type
size_t size_type
size_type, to conform the STL container interface
Definition: ObjectContainerBase.h:29
gaudirun.output
output
Definition: gaudirun.py:484
SharedObjectsContainer::size
size_type size() const
get the actual size of the container
Definition: SharedObjectsContainer.h:115
std::vector::rend
T rend(T... args)
SharedObjectsContainer::push_back
void push_back(const TYPE *object)
insert one object into the container
Definition: SharedObjectsContainer.h:121
std::vector::front
T front(T... args)
SharedObjectsContainer::operator()
const_reference operator()(size_type index) const
'functional'-access (const version)
Definition: SharedObjectsContainer.h:250
SharedObjectsContainer::size_type
ConstVector::size_type size_type
Definition: SharedObjectsContainer.h:36
std
STL namespace.
ObjectContainerBase.h
SharedObjectsContainer::reverse_iterator
ConstVector::reverse_iterator reverse_iterator
Definition: SharedObjectsContainer.h:41
std::vector::end
T end(T... args)
SharedObjectsContainer::numberOfObjects
size_type numberOfObjects() const override
Number of objects in the container.
Definition: SharedObjectsContainer.h:312
std::remove_if
T remove_if(T... args)
SharedObjectsContainer::get
OUTPUT get(const PREDICATE &cut, OUTPUT output) const
get from the container all objects which satisfy the certain criteria
Definition: SharedObjectsContainer.h:190
SharedObjectsContainer::operator[]
const_reference operator[](size_type index) const
index access (const-version)
Definition: SharedObjectsContainer.h:246
SharedObjectsContainer::SharedObjectsContainer
SharedObjectsContainer(DATA first, DATA last, const PREDICATE &cut)
the templated constructor from the pair of iterators and the predicate.
Definition: SharedObjectsContainer.h:85
SharedObjectsContainer::insert
void insert(DATA first, DATA last, const PREDICATE &cut)
add the sequence of 'good'objects into the container
Definition: SharedObjectsContainer.h:161
SharedObjectsContainer::rbegin
reverse_iterator rbegin()
Definition: SharedObjectsContainer.h:262
SharedObjectsContainer::iterator
ConstVector::iterator iterator
Definition: SharedObjectsContainer.h:39
SharedObjectsContainer::front
const_reference front() const
the first element (only for non-empty vectors) (const-version)
Definition: SharedObjectsContainer.h:272
SharedObjectsContainer::const_reference
ConstVector::const_reference const_reference
Definition: SharedObjectsContainer.h:38
SharedObjectsContainer::index
long index(const ContainedObject *object) const override
Distance of a given object from the beginning of its container.
Definition: SharedObjectsContainer.h:295
std::vector::at
T at(T... args)
SharedObjectsContainer::insert
void insert(const TYPE *object)
insert one object into the container
Definition: SharedObjectsContainer.h:125
std::vector::push_back
T push_back(T... args)
SharedObjectsContainer::const_iterator
ConstVector::const_iterator const_iterator
Definition: SharedObjectsContainer.h:40
SharedObjectsContainer::operator<
bool operator<(const ConstVector &right) const
comparisons with corresponding vector
Definition: SharedObjectsContainer.h:287
SharedObjectsContainer::begin
iterator begin()
Definition: SharedObjectsContainer.h:258
SharedObjectsContainer::SharedObjectsContainer
SharedObjectsContainer(const ConstVector &data)
Definition: SharedObjectsContainer.h:52
SharedObjectsContainer::begin
const_iterator begin() const
Definition: SharedObjectsContainer.h:260
std::vector::erase
T erase(T... args)
SharedObjectsContainer::end
iterator end()
Definition: SharedObjectsContainer.h:259
SharedObjectsContainer::at
reference at(size_type index)
checked access
Definition: SharedObjectsContainer.h:252
SharedObjectsContainer::add
long add(ContainedObject *object) override
Virtual functions (forwards to the concrete container definitions) Add an object to the container.
Definition: SharedObjectsContainer.h:317
SharedObjectsContainer::remove
long remove(ContainedObject *value) override
Release object from the container (the pointer will be removed from the container,...
Definition: SharedObjectsContainer.h:329
CLID
unsigned int CLID
Class ID definition.
Definition: ClassID.h:8
SharedObjectsContainer::SharedObjectsContainer
SharedObjectsContainer()=default
SharedObjectsContainer::operator<
bool operator<(const SharedObjectsContainer &right) const
comparisons with other container
Definition: SharedObjectsContainer.h:285
SharedObjectsContainer::rend
reverse_iterator rend()
Definition: SharedObjectsContainer.h:263
SharedObjectsContainer::operator[]
reference operator[](size_type index)
index access
Definition: SharedObjectsContainer.h:244
SharedObjectsContainer::operator=
SharedObjectsContainer & operator=(SharedObjectsContainer &&)=default
SharedObjectsContainer::ConstVector
std::vector< const TYPE * > ConstVector
the actual container type
Definition: SharedObjectsContainer.h:33
std::vector::insert
T insert(T... args)
ContainedObject
All classes that their objects may be contained in an LHCb ObjectContainer (e.g.
Definition: ContainedObject.h:31
std::find
T find(T... args)
std::vector::size
T size(T... args)
SharedObjectsContainer::SharedObjectsContainer
SharedObjectsContainer(ConstVector &&data)
Definition: SharedObjectsContainer.h:53
std::vector< const TYPE * >
std::cref
T cref(T... args)
SharedObjectsContainer::data
const ConstVector & data() const
get the access to the underlying container (const)
Definition: SharedObjectsContainer.h:108
std::vector::begin
T begin(T... args)
SharedObjectsContainer::operator==
bool operator==(const SharedObjectsContainer &right) const
equal content with other container ?
Definition: SharedObjectsContainer.h:281
std::back_inserter
T back_inserter(T... args)
SharedObjectsContainer::classID
static const CLID & classID()
Retrieve the unuqie class ID (static)
Definition: SharedObjectsContainer.h:94
SharedObjectsContainer::rend
const_reverse_iterator rend() const
Definition: SharedObjectsContainer.h:265
SharedObjectsContainer::operator==
bool operator==(const ConstVector &right) const
equal content with corresponding vector ?
Definition: SharedObjectsContainer.h:283
SharedObjectsContainer::rbegin
const_reverse_iterator rbegin() const
Definition: SharedObjectsContainer.h:264
std::vector::back
T back(T... args)
SharedObjectsContainer::reference
ConstVector::reference reference
Definition: SharedObjectsContainer.h:37
SharedObjectsContainer::back
reference back()
the last element (only for non-empty vectors)
Definition: SharedObjectsContainer.h:274
ObjectContainerBase
ObjectContainerBase is the base class for Gaudi container classes.
Definition: ObjectContainerBase.h:19
SharedObjectsContainer::insert
void insert(DATA first, DATA last)
add the sequence of objects into the container
Definition: SharedObjectsContainer.h:131
SharedObjectsContainer::end
const_iterator end() const
Definition: SharedObjectsContainer.h:261
SharedObjectsContainer::empty
bool empty() const
empty container?
Definition: SharedObjectsContainer.h:117
SharedObjectsContainer::SharedObjectsContainer
SharedObjectsContainer(DATA first, DATA last)
the templated constructor from the pair of iterators
Definition: SharedObjectsContainer.h:60
SharedObjectsContainer::m_data
ConstVector m_data
Definition: SharedObjectsContainer.h:340
std::vector::reserve
T reserve(T... args)
SharedObjectsContainer::back
const_reference back() const
the last element (only for non-empty vectors) (const-version)
Definition: SharedObjectsContainer.h:276
SharedObjectsContainer::erase
void erase(iterator i)
erase the object by iterator
Definition: SharedObjectsContainer.h:194
SharedObjectsContainer::const_reverse_iterator
ConstVector::const_reverse_iterator const_reverse_iterator
Definition: SharedObjectsContainer.h:42
SharedObjectsContainer::containedObject
ContainedObject * containedObject(long index) override
Definition: SharedObjectsContainer.h:307
std::vector::rbegin
T rbegin(T... args)
SharedObjectsContainer::value_type
ConstVector::value_type value_type
various types (to make STL happy)
Definition: SharedObjectsContainer.h:35