Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v28r2p1 (f1a77ff4)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
ObjectVector.h
Go to the documentation of this file.
1 #ifndef GAUDIKERNEL_OBJECTVECTOR_H
2 #define GAUDIKERNEL_OBJECTVECTOR_H
3 
4 
5 // Include files
6 #include "GaudiKernel/Kernel.h"
7 #include "GaudiKernel/ClassID.h"
10 
11 #include <vector>
12 #include <iomanip>
13 
14 
15 // Definition of the CLID for this class defined in ClassID.h
16 //static const CLID CLID_ObjectList = (1<<17); // ObjectVector (bit 17 set)
17 
37 template <class TYPE>
38 class ObjectVector : public ObjectContainerBase {
39 
40 public:
41  typedef TYPE contained_type;
43 
46 
49 
52 #ifdef _WIN32
53  typedef typename std::vector<TYPE*>::_Tptr pointer;
55 #else
58 #endif
59 
60 public:
62  ObjectVector() = default;
63  ObjectVector( const ObjectVector<TYPE>& ) = delete;
64  ObjectVector& operator=( const ObjectVector<TYPE>& ) = delete;
66  : ObjectContainerBase(std::move(rhs))
67  , m_vector{std::move(rhs.m_vector)}
68  {
69  std::for_each(begin(), end(), [this](TYPE* obj) {obj->setParent(this);});
70  }
71 
73  ~ObjectVector() override {
74  for( auto& i : m_vector ) {
75  // Set the back pointer to 0 to avoid repetitional searching
76  // for the object in the container, and deleting the object
77  i->setParent (nullptr);
78  delete i;
79  }
80  }
81 
83  const CLID& clID() const override {
85  }
87  static const CLID& classID() {
88  static const CLID clid = TYPE::classID() + CLID_ObjectVector;
89  return clid;
90  }
91 
92 
95  return m_vector.begin();
96  }
97 
100  return m_vector.begin();
101  }
102 
105  return m_vector.end();
106  }
107 
110  return m_vector.end();
111  }
112 
115  return m_vector.rbegin();
116  }
117 
121  return m_vector.rbegin();
122  }
123 
126  return m_vector.rend();
127  }
128 
131  return m_vector.rend();
132  }
133 
139  return m_vector.size();
140  }
141 
143  typename ObjectVector<TYPE>::size_type numberOfObjects() const override {
144  return m_vector.size();
145  }
146 
149  return m_vector.max_size();
150  }
151 
155  return m_vector.capacity();
156  }
157 
165  void reserve( typename ObjectVector<TYPE>::size_type value ) {
166  m_vector.reserve( value );
167  }
168 
170  bool empty () const {
171  return m_vector.empty();
172  }
173 
176  return m_vector.front();
177  }
178 
181  return m_vector.front();
182  }
183 
186  return m_vector.back();
187  }
188 
191  return m_vector.back();
192  }
193 
196  if( value->parent() ) {
197  const_cast<ObjectContainerBase*>(value->parent())->remove(value);
198  }
199  value->setParent(this);
200  m_vector.push_back(value);
201  }
202 
204  long add(ContainedObject* pObject) override {
205  try {
206  auto ptr = dynamic_cast<typename ObjectVector<TYPE>::value_type>(pObject);
207  if ( ptr ) {
208  push_back(ptr);
209  return m_vector.size()-1;
210  }
211  }
212  catch(...) {
213  }
214  return -1;
215  }
216 
219  void pop_back () {
220  auto position = m_vector.back();
221  // Set the back pointer to 0 to avoid repetitional searching
222  // for the object in the container, and deleting the object
223  position->setParent(nullptr);
224  delete position;
225  // Removing from the container itself
226  m_vector.pop_back();
227  }
228 
231  long remove(ContainedObject* value) override {
232  // Find the object of the value value
233  auto i = std::find_if( begin(), end(), [&](const ContainedObject* j) { return j==value; } );
234  if( i == end() ) {
235  // Object cannot be released from the conatiner,
236  // as it is not contained in it
237  return StatusCode::FAILURE;
238  }
239  // Set the back pointer to 0 to avoid repetitional searching
240  // for the object in the container and deleting the object
241  (*i)->setParent (nullptr);
242  erase(i);
243  return StatusCode::SUCCESS;
244  }
245 
248  typename ObjectVector<TYPE>::const_reference value ) {
249  value->setParent(this);
250  return m_vector.insert(position, value);
251  }
252 
254  void erase( typename ObjectVector<TYPE>::iterator position ) {
255  if( (*position)->parent() ) {
256  // Set the back pointer to 0 to avoid repetitional searching
257  // for the object in the container, and deleting the object
258  (*position)->setParent (nullptr);
259  delete *position;
260  }
261  // Removing from the container itself
262  m_vector.erase(position);
263  }
264 
266  void erase( typename ObjectVector<TYPE>::iterator first,
267  typename ObjectVector<TYPE>::iterator last ) {
268  for(auto i = first; i != last; i++ ) {
269  // Set the back pointer to 0 to avoid repetitional searching
270  // for the object in the container, and deleting the object
271  (*i)->setParent(nullptr);
272  delete *i;
273  }
274  // Removing from the container itself
275  m_vector.erase(first, last);
276  }
277 
279  void clear() {
280  erase(begin(), end());
281  }
282 
286  return m_vector[n];
287  }
288 
292  return m_vector[n];
293  }
294 
298  long index( const ContainedObject* obj ) const override {
299  auto i = std::find_if( begin(), end(), [&](const ContainedObject *o)
300  { return o == obj; } );
301  return i!=end() ? std::distance( begin(), i ) : -1 ;
302  }
303 
305  ContainedObject* containedObject( long dist ) const override {
306  return m_vector[dist];
307  }
308 
310  std::ostream& fillStream( std::ostream& s ) const override {
311  s << "class ObjectVector : size = "
312  << std::setw(12)
313  << size() << "\n";
314  // Output the base class
315  //ObjectContainerBase::fillStream(s);
316  if ( !empty() ) {
317  s << "\nContents of the STL vector :";
318  long count = 0;
319  for(const auto& i : m_vector) {
320  s << "\nIndex "
321  << std::setw(12)
322  << count++
323  << " of object of type " << *i;
324  }
325  }
326  return s;
327  }
328 
329 private:
332 };
333 
334 #endif // GAUDIKERNEL_OBJECTVECTOR_H
ObjectVector< TYPE >::iterator end()
Return an iterator pointing to the end of the container.
Definition: ObjectVector.h:104
void clear()
Clear the entire content of the container and delete all contained objects.
Definition: ObjectVector.h:279
T empty(T...args)
T distance(T...args)
long add(ContainedObject *pObject) override
Add an object to the container.
Definition: ObjectVector.h:204
size_t size_type
size_type, to conform the STL container interface
const CLID & clID() const override
Retrieve class ID.
Definition: ObjectVector.h:83
ObjectVector< TYPE >::reference back()
Return reference to the last element.
Definition: ObjectVector.h:185
ObjectVector< TYPE >::iterator begin()
Return an iterator pointing to the beginning of the container.
Definition: ObjectVector.h:94
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:254
ObjectVector< TYPE >::reverse_iterator rbegin()
Return a reverse_iterator pointing to the beginning of the reversed container.
Definition: ObjectVector.h:114
ObjectVector< TYPE >::const_iterator begin() const
Return a const_iterator pointing to the beginning of the container.
Definition: ObjectVector.h:99
std::vector< TYPE * >::const_iterator const_iterator
Definition: ObjectVector.h:48
std::vector< TYPE * > m_vector
The STL vector itself.
Definition: ObjectVector.h:331
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:195
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:305
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:266
std::vector< TYPE * >::const_reference const_reference
Definition: ObjectVector.h:45
ObjectVector< TYPE >::const_reverse_iterator rend() const
Return a const_reverse_iterator pointing to the end of the reversed container.
Definition: ObjectVector.h:130
T end(T...args)
std::vector< TYPE * >::const_pointer const_pointer
Definition: ObjectVector.h:57
T setw(T...args)
ObjectVector(ObjectVector &&rhs)
Definition: ObjectVector.h:65
std::vector< TYPE * >::const_reverse_iterator const_reverse_iterator
Definition: ObjectVector.h:51
ObjectVector< TYPE >::reference front()
Return reference to the first element.
Definition: ObjectVector.h:175
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:180
std::vector< TYPE * >::reverse_iterator reverse_iterator
Definition: ObjectVector.h:50
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:285
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:298
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:154
ObjectVector()=default
Constructors.
T erase(T...args)
T pop_back(T...args)
T capacity(T...args)
std::vector< TYPE * >::iterator iterator
Definition: ObjectVector.h:47
bool empty() const
Return true if the size of the container is 0.
Definition: ObjectVector.h:170
~ObjectVector() override
Destructor.
Definition: ObjectVector.h:73
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:165
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:120
std::vector< TYPE * >::reference reference
Definition: ObjectVector.h:44
ObjectVector< TYPE >::iterator insert(typename ObjectVector< TYPE >::iterator position, typename ObjectVector< TYPE >::const_reference value)
Insert "value" before "position".
Definition: ObjectVector.h:247
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:148
STL class.
ObjectVector< TYPE >::const_reference back() const
Return const_reference to the last element.
Definition: ObjectVector.h:190
std::ostream & fillStream(std::ostream &s) const override
Fill the output stream (ASCII)
Definition: ObjectVector.h:310
std::vector< TYPE * >::value_type value_type
Definition: ObjectVector.h:42
ObjectVector< TYPE >::size_type numberOfObjects() const override
The same as size(), return number of objects in the container.
Definition: ObjectVector.h:143
T begin(T...args)
std::vector< TYPE * >::pointer pointer
Definition: ObjectVector.h:56
T max_size(T...args)
T back(T...args)
string s
Definition: gaudirun.py:245
TYPE contained_type
Definition: ObjectVector.h:41
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:125
T for_each(T...args)
ObjectVector< TYPE >::size_type size() const
Return the size of the container.
Definition: ObjectVector.h:138
ObjectVector< TYPE >::const_iterator end() const
Return a const_iterator pointing to the end of the container.
Definition: ObjectVector.h:109
STL class.
static const CLID & classID()
Retrieve class ID.
Definition: ObjectVector.h:87
void pop_back()
pop_back = remove the last element from the container The removed object will be deleted (see the met...
Definition: ObjectVector.h:219
T reserve(T...args)
T rbegin(T...args)