The Gaudi Framework  v29r0 (ff2e7097)
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"
16 // ============================================================================
28 template <class TYPE>
30 {
31 public:
32  // ==========================================================================
36  typedef typename ConstVector::value_type value_type;
37  typedef typename ConstVector::size_type size_type;
39  typedef typename ConstVector::const_reference const_reference;
40  typedef typename ConstVector::iterator iterator;
41  typedef typename ConstVector::const_iterator const_iterator;
42  typedef typename ConstVector::reverse_iterator reverse_iterator;
43  typedef typename ConstVector::const_reverse_iterator const_reverse_iterator;
44  // ==========================================================================
45 public:
46  // ==========================================================================
47  // the default constructor (creates the empty vector)
48  SharedObjectsContainer() = default;
49  // move constructor and move assignement
52  // the constructor from the data
53  SharedObjectsContainer( const ConstVector& data ) : m_data( data ) {}
54  SharedObjectsContainer( ConstVector&& data ) : m_data( std::move( data ) ) {}
55 
60  template <class DATA>
61  SharedObjectsContainer( DATA first, DATA last ) : m_data( first, last )
62  {
63  }
87  template <class DATA, class PREDICATE>
88  SharedObjectsContainer( DATA first, DATA last, const PREDICATE& cut )
89  {
90  insert( first, last, cut );
91  }
92  // ==========================================================================
93 public:
94  // ==========================================================================
96  const CLID& clID() const override { return SharedObjectsContainer<TYPE>::classID(); }
98  static const CLID& classID()
99  {
100  static const CLID s_clid = ( ( static_cast<CLID>( -1 ) << 16 ) // 16 used and 16 empty bits
101  & !CLID_ObjectVector // not an ObjectVector
102  & !CLID_ObjectList // not an ObjectList
103  & !static_cast<CLID>( 0x00030000 ) // not a KeyedContainer/map
104  & !static_cast<CLID>( 0x00040000 ) ) // not a KeyedContainer/hashmap
105  + TYPE::classID(); // the specific CLID from the contents
106  //
107  return s_clid;
108  }
109  // ==========================================================================
110 public:
111  // ==========================================================================
113  inline const ConstVector& data() const { return m_data; }
115  operator const ConstVector&() const { return data(); }
116  // ==========================================================================
117 public:
118  // ==========================================================================
120  size_type size() const { return m_data.size(); }
122  bool empty() const { return m_data.empty(); }
126  void push_back( const TYPE* object ) { m_data.push_back( object ); }
130  void insert( const TYPE* object ) { m_data.push_back( object ); }
135  template <class DATA>
136  void insert( DATA first, DATA last )
137  {
138  m_data.insert( end(), first, last );
139  }
166  template <class DATA, class PREDICATE>
167  void insert( DATA first, DATA last, const PREDICATE& cut )
168  {
169  m_data.reserve( m_data.size() + std::distance( first, last ) );
170  std::copy_if( first, last, std::back_inserter( m_data ), std::cref( cut ) );
171  }
196  template <class OUTPUT, class PREDICATE>
197  OUTPUT get( const PREDICATE& cut, OUTPUT output ) const
198  {
199  return std::copy_if( begin(), end(), output, std::cref( cut ) );
200  }
202  void erase( iterator i ) { m_data.erase( i ); }
220  template <class PREDICATE>
221  void erase( const PREDICATE& cut )
222  {
223  m_data.erase( std::remove_if( begin(), end(), cut ), end() );
224  }
243  bool erase( const TYPE* object )
244  {
245  auto i = std::find( begin(), end(), object );
246  if ( end() == i ) {
247  return false;
248  }
249  m_data.erase( i );
250  return true;
251  }
252  // ==========================================================================
253 public:
254  // ==========================================================================
256  reference operator[]( size_type index ) { return m_data[index]; }
258  const_reference operator[]( size_type index ) const { return m_data[index]; }
260  reference operator()( size_type index ) { return m_data[index]; }
262  const_reference operator()( size_type index ) const { return m_data[index]; }
264  reference at( size_type index ) { return m_data.at( index ); }
266  const_reference at( size_type index ) const { return m_data.at( index ); }
267  // ==========================================================================
268 public:
269  // ==========================================================================
270  iterator begin() { return m_data.begin(); }
271  iterator end() { return m_data.end(); }
272  const_iterator begin() const { return m_data.begin(); }
273  const_iterator end() const { return m_data.end(); }
274  reverse_iterator rbegin() { return m_data.rbegin(); }
275  reverse_iterator rend() { return m_data.rend(); }
276  const_reverse_iterator rbegin() const { return m_data.rbegin(); }
277  const_reverse_iterator rend() const { return m_data.rend(); }
278  // ==========================================================================
279 public:
280  // ==========================================================================
282  reference front() { return m_data.front(); }
284  const_reference front() const { return m_data.front(); }
286  reference back() { return m_data.back(); }
288  const_reference back() const { return m_data.back(); }
289  // ==========================================================================
290 public:
291  // ==========================================================================
293  bool operator==( const SharedObjectsContainer& right ) const { return &right == this || right.m_data == m_data; }
295  bool operator==( const ConstVector& right ) const { return m_data == right; }
297  bool operator<( const SharedObjectsContainer& right ) const { return m_data < right.m_data; }
299  bool operator<( const ConstVector& right ) const { return m_data < right; }
300  // ==========================================================================
301  // ObjectContainerBase methods:
302  // ==========================================================================
303 public:
307  long index( const ContainedObject* object ) const override
308  {
309  auto _i = std::find( begin(), end(), object );
310  return end() != _i ? ( _i - begin() ) : -1; // RETURN
311  }
316  ContainedObject* containedObject( long index ) const override
317  {
318  if ( 0 > index || !( index < (long)size() ) ) {
319  return nullptr;
320  } // RETURN
321  const ContainedObject* co = m_data[index];
322  return const_cast<ContainedObject*>( co );
323  }
325  size_type numberOfObjects() const override { return m_data.size(); }
330  long add( ContainedObject* object ) override
331  {
332  if ( !object ) {
333  return -1;
334  } // RETURN
335  TYPE* _obj = dynamic_cast<TYPE*>( object );
336  if ( !_obj ) {
337  return -1;
338  } // RETURN
339  const size_type pos = size();
340  push_back( _obj );
341  return pos;
342  }
347  long remove( ContainedObject* value ) override
348  {
349  auto _i = std::find( begin(), end(), value );
350  if ( end() == _i ) {
351  return -1;
352  } // RETURN
353  const size_type pos = _i - begin();
354  m_data.erase( _i );
355  return pos; // RETURN
356  }
357  // ==========================================================================
358 private:
359  // ==========================================================================
360  // the actual data
361  ConstVector m_data; // the actual data
362  // ==========================================================================
363 };
364 // ============================================================================
365 // The END
366 // ============================================================================
367 #endif // GAUDIKERNEL_SHAREDOBJECTSCONTAINER_H
368 // ============================================================================
bool erase(const TYPE *object)
erase the first occurance of the certain element
reference front()
the first element (only for non-empty vectors)
Very simple class to represent the container of objects which are not owned by this container...
ContainedObject * containedObject(long index) const override
Pointer to an object of a given distance.
T empty(T...args)
const_reference at(size_type index) const
checked access (const-version)
T copy_if(T...args)
bool operator==(const ConstVector &right) const
equal content with corresponding vector ?
T distance(T...args)
reference operator()(size_type index)
&#39;functional&#39;-access
const_iterator begin() const
void erase(const PREDICATE &cut)
erase the objects which satisfy the criteria
bool operator==(const SharedObjectsContainer &right) const
equal content with other container ?
T rend(T...args)
void push_back(const TYPE *object)
insert one object into the container
T front(T...args)
bool operator<(const SharedObjectsContainer &right) const
comparisons with other container
ConstVector::size_type size_type
STL namespace.
ConstVector::reverse_iterator reverse_iterator
T end(T...args)
size_type size() const
get the actual size of the container
size_type numberOfObjects() const override
Number of objects in the container.
T remove_if(T...args)
SharedObjectsContainer(DATA first, DATA last, const PREDICATE &cut)
the templated constructor from the pair of iterators and the predicate.
void insert(DATA first, DATA last, const PREDICATE &cut)
add the sequence of &#39;good&#39;objects into the container
ConstVector::iterator iterator
ConstVector::const_reference const_reference
T at(T...args)
void insert(const TYPE *object)
insert one object into the container
T push_back(T...args)
const_reference front() const
the first element (only for non-empty vectors) (const-version)
const_iterator end() const
const_reverse_iterator rbegin() const
ConstVector::const_iterator const_iterator
const_reference operator()(size_type index) const
&#39;functional&#39;-access (const version)
SharedObjectsContainer(const ConstVector &data)
const_reference back() const
the last element (only for non-empty vectors) (const-version)
const_reference operator[](size_type index) const
index access (const-version)
const ConstVector & data() const
get the access to the underlying container (const)
T erase(T...args)
reference at(size_type index)
checked access
long index(const ContainedObject *object) const override
Distance of a given object from the beginning of its container.
long add(ContainedObject *object) override
Virtual functions (forwards to the concrete container definitions) Add an object to the container...
unsigned int CLID
Class ID definition.
Definition: ClassID.h:8
SharedObjectsContainer()=default
bool empty() const
empty container?
reference operator[](size_type index)
index access
SharedObjectsContainer & operator=(SharedObjectsContainer &&)=default
std::vector< const TYPE * > ConstVector
the actual container type
T insert(T...args)
All classes that their objects may be contained in an LHCb ObjectContainer (e.g.
T find(T...args)
const_reverse_iterator rend() const
T size(T...args)
SharedObjectsContainer(ConstVector &&data)
T cref(T...args)
T begin(T...args)
T back_inserter(T...args)
static const CLID & classID()
Retrieve the unuqie class ID (static)
T back(T...args)
ConstVector::reference reference
reference back()
the last element (only for non-empty vectors)
ObjectContainerBase is the base class for Gaudi container classes.
void insert(DATA first, DATA last)
add the sequence of objects into the container
bool operator<(const ConstVector &right) const
comparisons with corresponding vector
const CLID & clID() const override
Retrieve the unique class ID (virtual)
SharedObjectsContainer(DATA first, DATA last)
the templated constructor from the pair of iterators
TO * reference(FROM *from)
Definition: KeyedObject.cpp:21
T reserve(T...args)
void erase(iterator i)
erase the object by iterator
ConstVector::const_reverse_iterator const_reverse_iterator
T rbegin(T...args)
ConstVector::value_type value_type
various types (to make STL happy)