The Gaudi Framework  v30r3 (a5ef0a68)
ObjectVector.h
Go to the documentation of this file.
1 #ifndef GAUDIKERNEL_OBJECTVECTOR_H
2 #define GAUDIKERNEL_OBJECTVECTOR_H
3 
4 // Include files
5 #include "GaudiKernel/ClassID.h"
6 #include "GaudiKernel/Kernel.h"
9 
10 #include <iomanip>
11 #include <vector>
12 
13 // Definition of the CLID for this class defined in ClassID.h
14 // static const CLID CLID_ObjectList = (1<<17); // ObjectVector (bit 17 set)
15 
35 template <class TYPE>
36 class ObjectVector : public ObjectContainerBase
37 {
38 
39 public:
40  typedef TYPE contained_type;
42 
45 
48 
51 #ifdef _WIN32
52  typedef typename std::vector<TYPE*>::_Tptr pointer;
54 #else
57 #endif
58 
59 public:
61  ObjectVector() = default;
62  ObjectVector( const ObjectVector<TYPE>& ) = delete;
63  ObjectVector& operator=( const ObjectVector<TYPE>& ) = delete;
64  ObjectVector( ObjectVector&& rhs ) : ObjectContainerBase( std::move( rhs ) ), m_vector{std::move( rhs.m_vector )}
65  {
66  std::for_each( begin(), end(), [this]( TYPE* obj ) { obj->setParent( this ); } );
67  }
68 
70  ~ObjectVector() override
71  {
72  for ( auto& i : m_vector ) {
73  // Set the back pointer to 0 to avoid repetitional searching
74  // for the object in the container, and deleting the object
75  i->setParent( nullptr );
76  delete i;
77  }
78  }
79 
81  const CLID& clID() const override { return ObjectVector<TYPE>::classID(); }
83  static const CLID& classID()
84  {
85  static const CLID clid = TYPE::classID() + CLID_ObjectVector;
86  return clid;
87  }
88 
91 
93  typename ObjectVector<TYPE>::const_iterator begin() const { return m_vector.begin(); }
94 
96  typename ObjectVector<TYPE>::iterator end() { return m_vector.end(); }
97 
99  typename ObjectVector<TYPE>::const_iterator end() const { return m_vector.end(); }
100 
103 
107 
110 
113 
118  typename ObjectVector<TYPE>::size_type size() const { return m_vector.size(); }
119 
121  typename ObjectVector<TYPE>::size_type numberOfObjects() const override { return m_vector.size(); }
122 
125 
129 
137  void reserve( typename ObjectVector<TYPE>::size_type value ) { m_vector.reserve( value ); }
138 
140  bool empty() const { return m_vector.empty(); }
141 
144 
147 
150 
152  typename ObjectVector<TYPE>::const_reference back() const { return m_vector.back(); }
153 
156  {
157  if ( value->parent() ) {
158  const_cast<ObjectContainerBase*>( value->parent() )->remove( value );
159  }
160  value->setParent( this );
161  m_vector.push_back( value );
162  }
163 
165  long add( ContainedObject* pObject ) override
166  {
167  try {
168  auto ptr = dynamic_cast<typename ObjectVector<TYPE>::value_type>( pObject );
169  if ( ptr ) {
170  push_back( ptr );
171  return m_vector.size() - 1;
172  }
173  } catch ( ... ) {
174  }
175  return -1;
176  }
177 
180  void pop_back()
181  {
182  auto position = m_vector.back();
183  // Set the back pointer to 0 to avoid repetitional searching
184  // for the object in the container, and deleting the object
185  position->setParent( nullptr );
186  delete position;
187  // Removing from the container itself
188  m_vector.pop_back();
189  }
190 
193  long remove( ContainedObject* value ) override
194  {
195  // Find the object of the value value
196  auto i = std::find_if( begin(), end(), [&]( const ContainedObject* j ) { return j == value; } );
197  if ( i == end() ) {
198  // Object cannot be released from the conatiner,
199  // as it is not contained in it
200  return 0;
201  }
202  long idx = std::distance( begin(), i );
203  // Set the back pointer to 0 to avoid repetitional searching
204  // for the object in the container and deleting the object
205  ( *i )->setParent( nullptr );
206  erase( i );
207  return idx;
208  }
209 
212  typename ObjectVector<TYPE>::const_reference value )
213  {
214  value->setParent( this );
215  return m_vector.insert( position, value );
216  }
217 
219  void erase( typename ObjectVector<TYPE>::iterator position )
220  {
221  if ( ( *position )->parent() ) {
222  // Set the back pointer to 0 to avoid repetitional searching
223  // for the object in the container, and deleting the object
224  ( *position )->setParent( nullptr );
225  delete *position;
226  }
227  // Removing from the container itself
228  m_vector.erase( position );
229  }
230 
233  {
234  for ( auto i = first; i != last; i++ ) {
235  // Set the back pointer to 0 to avoid repetitional searching
236  // for the object in the container, and deleting the object
237  ( *i )->setParent( nullptr );
238  delete *i;
239  }
240  // Removing from the container itself
241  m_vector.erase( first, last );
242  }
243 
245  void clear() { erase( begin(), end() ); }
246 
249 
252  {
253  return m_vector[n];
254  }
255 
259  long index( const ContainedObject* obj ) const override
260  {
261  auto i = std::find_if( begin(), end(), [&]( const ContainedObject* o ) { return o == obj; } );
262  return i != end() ? std::distance( begin(), i ) : -1;
263  }
264 
266  ContainedObject* containedObject( long dist ) const override { return m_vector[dist]; }
267 
269  std::ostream& fillStream( std::ostream& s ) const override
270  {
271  s << "class ObjectVector : size = " << std::setw( 12 ) << size() << "\n";
272  // Output the base class
273  // ObjectContainerBase::fillStream(s);
274  if ( !empty() ) {
275  s << "\nContents of the STL vector :";
276  long count = 0;
277  for ( const auto& i : m_vector ) {
278  s << "\nIndex " << std::setw( 12 ) << count++ << " of object of type " << *i;
279  }
280  }
281  return s;
282  }
283 
284 private:
287 };
288 
289 #endif // GAUDIKERNEL_OBJECTVECTOR_H
ObjectVector< TYPE >::iterator end()
Return an iterator pointing to the end of the container.
Definition: ObjectVector.h:96
void clear()
Clear the entire content of the container and delete all contained objects.
Definition: ObjectVector.h:245
T empty(T...args)
T distance(T...args)
long add(ContainedObject *pObject) override
Add an object to the container.
Definition: ObjectVector.h:165
size_t size_type
size_type, to conform the STL container interface
const CLID & clID() const override
Retrieve class ID.
Definition: ObjectVector.h:81
ObjectVector< TYPE >::reference back()
Return reference to the last element.
Definition: ObjectVector.h:149
ObjectVector< TYPE >::iterator begin()
Return an iterator pointing to the beginning of the container.
Definition: ObjectVector.h:90
T rend(T...args)
T front(T...args)
void erase(typename ObjectVector< TYPE >::iterator position)
Erase the object at "position" from the container. The removed object will be deleted.
Definition: ObjectVector.h:219
ObjectVector< TYPE >::reverse_iterator rbegin()
Return a reverse_iterator pointing to the beginning of the reversed container.
Definition: ObjectVector.h:102
ObjectVector< TYPE >::const_reference operator[](typename ObjectVector< TYPE >::size_type n) const
Return the const_reference to the n&#39;th object in the container.
Definition: ObjectVector.h:251
ObjectVector< TYPE >::const_iterator begin() const
Return a const_iterator pointing to the beginning of the container.
Definition: ObjectVector.h:93
std::vector< TYPE * >::const_iterator const_iterator
Definition: ObjectVector.h:47
std::vector< TYPE * > m_vector
The STL vector itself.
Definition: ObjectVector.h:286
void push_back(typename ObjectVector< TYPE >::const_reference value)
push_back = append = insert a new element at the end of the container
Definition: ObjectVector.h:155
ObjectVector is one of the basic Gaudi container classes capable of being registered in Data Stores...
STL namespace.
ContainedObject * containedObject(long dist) const override
Return const pointer to an object of a given distance (index)
Definition: ObjectVector.h:266
void erase(typename ObjectVector< TYPE >::iterator first, typename ObjectVector< TYPE >::iterator last)
Erase the range [first, last) from the container. The removed object will be deleted.
Definition: ObjectVector.h:232
std::vector< TYPE * >::const_reference const_reference
Definition: ObjectVector.h:44
ObjectVector< TYPE >::const_reverse_iterator rend() const
Return a const_reverse_iterator pointing to the end of the reversed container.
Definition: ObjectVector.h:112
T end(T...args)
std::vector< TYPE * >::const_pointer const_pointer
Definition: ObjectVector.h:56
T setw(T...args)
ObjectVector(ObjectVector &&rhs)
Definition: ObjectVector.h:64
std::vector< TYPE * >::const_reverse_iterator const_reverse_iterator
Definition: ObjectVector.h:50
ObjectVector< TYPE >::reference front()
Return reference to the first element.
Definition: ObjectVector.h:143
ObjectVector & operator=(const ObjectVector< TYPE > &)=delete
T push_back(T...args)
ObjectVector< TYPE >::const_reference front() const
Return const_reference to the first element.
Definition: ObjectVector.h:146
std::vector< TYPE * >::reverse_iterator reverse_iterator
Definition: ObjectVector.h:49
ObjectVector< TYPE >::reference operator[](typename ObjectVector< TYPE >::size_type n)
Return the reference to the n&#39;th object in the container.
Definition: ObjectVector.h:248
long index(const ContainedObject *obj) const override
Return distance of a given object from the beginning of its container It correcponds to the "index" (...
Definition: ObjectVector.h:259
ObjectVector< TYPE >::size_type capacity() const
Return number of elements for which memory has been allocated It is always greater than or equal to s...
Definition: ObjectVector.h:128
ObjectVector()=default
Constructors.
T erase(T...args)
T pop_back(T...args)
T capacity(T...args)
std::vector< TYPE * >::iterator iterator
Definition: ObjectVector.h:46
bool empty() const
Return true if the size of the container is 0.
Definition: ObjectVector.h:140
~ObjectVector() override
Destructor.
Definition: ObjectVector.h:70
unsigned int CLID
Class ID definition.
Definition: ClassID.h:8
void reserve(typename ObjectVector< TYPE >::size_type value)
Reserve place for "value" objects in the container.
Definition: ObjectVector.h:137
T move(T...args)
ObjectVector< TYPE >::const_reverse_iterator rbegin() const
Return a const_reverse_iterator pointing to the beginning of the reversed container.
Definition: ObjectVector.h:106
std::vector< TYPE * >::reference reference
Definition: ObjectVector.h:43
ObjectVector< TYPE >::iterator insert(typename ObjectVector< TYPE >::iterator position, typename ObjectVector< TYPE >::const_reference value)
Insert "value" before "position".
Definition: ObjectVector.h:211
T insert(T...args)
All classes that their objects may be contained in an LHCb ObjectContainer (e.g.
T find_if(T...args)
T size(T...args)
ObjectVector< TYPE >::size_type max_size() const
Return the largest possible size of the container.
Definition: ObjectVector.h:124
STL class.
ObjectVector< TYPE >::const_reference back() const
Return const_reference to the last element.
Definition: ObjectVector.h:152
std::ostream & fillStream(std::ostream &s) const override
Fill the output stream (ASCII)
Definition: ObjectVector.h:269
std::vector< TYPE * >::value_type value_type
Definition: ObjectVector.h:41
ObjectVector< TYPE >::size_type numberOfObjects() const override
The same as size(), return number of objects in the container.
Definition: ObjectVector.h:121
T begin(T...args)
std::vector< TYPE * >::pointer pointer
Definition: ObjectVector.h:55
T max_size(T...args)
T back(T...args)
string s
Definition: gaudirun.py:253
TYPE contained_type
Definition: ObjectVector.h:40
ObjectContainerBase is the base class for Gaudi container classes.
ObjectVector< TYPE >::reverse_iterator rend()
Return a reverse_iterator pointing to the end of the reversed container.
Definition: ObjectVector.h:109
T for_each(T...args)
ObjectVector< TYPE >::size_type size() const
Return the size of the container.
Definition: ObjectVector.h:118
ObjectVector< TYPE >::const_iterator end() const
Return a const_iterator pointing to the end of the container.
Definition: ObjectVector.h:99
STL class.
static const CLID & classID()
Retrieve class ID.
Definition: ObjectVector.h:83
void pop_back()
pop_back = remove the last element from the container The removed object will be deleted (see the met...
Definition: ObjectVector.h:180
T reserve(T...args)
T rbegin(T...args)