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"
8 #include "GaudiKernel/StreamBuffer.h"
9 #include "GaudiKernel/ObjectContainerBase.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;
42  typedef typename std::vector<TYPE*>::value_type value_type;
43 
45  typedef typename std::vector<TYPE*>::const_reference const_reference;
46 
47  typedef typename std::vector<TYPE*>::iterator iterator;
48  typedef typename std::vector<TYPE*>::const_iterator const_iterator;
49 
50  typedef typename std::vector<TYPE*>::reverse_iterator reverse_iterator;
51  typedef typename std::vector<TYPE*>::const_reverse_iterator const_reverse_iterator;
52 #ifdef _WIN32
53  typedef typename std::vector<TYPE*>::_Tptr pointer;
54  typedef typename std::vector<TYPE*>::_Ctptr const_pointer;
55 #else
56  typedef typename std::vector<TYPE*>::pointer pointer;
57  typedef typename std::vector<TYPE*>::const_pointer const_pointer;
58 #endif
59 
60 public:
62  ObjectVector()
63  : m_vector(0) { }
64  ObjectVector( const char* /* name */ )
65  : m_vector(0) { }
68  : ObjectContainerBase(), m_vector(value.m_vector) { }
69 
71  virtual ~ObjectVector() {
72  for( typename ObjectVector<TYPE>::iterator i = begin(); i != end(); i++ ) {
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 (0);
76  delete *i;
77  }
78  }
79 
81  virtual const CLID& clID() const {
83  }
85  static const CLID& classID() {
86  static CLID clid = TYPE::classID() + CLID_ObjectVector;
87  return clid;
88  }
89 
92  m_vector = right.m_vector;
93  return *this;
94  }
95 
98  return m_vector.begin();
99  }
100 
102  typename ObjectVector<TYPE>::const_iterator begin () const {
103  return m_vector.begin();
104  }
105 
107  typename ObjectVector<TYPE>::iterator end () {
108  return m_vector.end();
109  }
110 
112  typename ObjectVector<TYPE>::const_iterator end () const {
113  return m_vector.end();
114  }
115 
118  return m_vector.rbegin();
119  }
120 
124  return m_vector.rbegin();
125  }
126 
129  return m_vector.rend();
130  }
131 
134  return m_vector.rend();
135  }
136 
141  typename ObjectVector<TYPE>::size_type size () const {
142  return m_vector.size();
143  }
144 
146  virtual typename ObjectVector<TYPE>::size_type numberOfObjects() const {
147  return m_vector.size();
148  }
149 
151  typename ObjectVector<TYPE>::size_type max_size () const {
152  return m_vector.max_size();
153  }
154 
157  typename ObjectVector<TYPE>::size_type capacity () const {
158  return m_vector.capacity();
159  }
160 
168  void reserve( typename ObjectVector<TYPE>::size_type value ) {
169  m_vector.reserve( value );
170  }
171 
173  bool empty () const {
174  return m_vector.empty();
175  }
176 
179  return m_vector.front();
180  }
181 
183  typename ObjectVector<TYPE>::const_reference front () const {
184  return m_vector.front();
185  }
186 
188  typename ObjectVector<TYPE>::reference back () {
189  return m_vector.back();
190  }
191 
193  typename ObjectVector<TYPE>::const_reference back () const {
194  return m_vector.back();
195  }
196 
198  void push_back( typename ObjectVector<TYPE>::const_reference value ) {
199  if( 0 != value->parent() ) {
200  const_cast<ObjectContainerBase*>(value->parent())->remove(value);
201  }
202  value->setParent(this);
203  m_vector.push_back(value);
204  }
205 
207  virtual long add(ContainedObject* pObject) {
208  try {
209  typename ObjectVector<TYPE>::value_type ptr =
210  dynamic_cast<typename ObjectVector<TYPE>::value_type>(pObject);
211  if ( 0 != ptr ) {
212  push_back(ptr);
213  return m_vector.size()-1;
214  }
215  }
216  catch(...) {
217  }
218  return -1;
219  }
220 
223  void pop_back () {
224  typename ObjectVector<TYPE>::value_type position = m_vector.back();
225  // Set the back pointer to 0 to avoid repetitional searching
226  // for the object in the container, and deleting the object
227  position->setParent (0);
228  delete position;
229  // Removing from the container itself
230  m_vector.pop_back();
231  }
232 
235  virtual long remove(ContainedObject* value) {
236  // Find the object of the value value
238  for( i = begin(); i != end(); i++ ) {
239  if( value == *i ) {
240  break;
241  }
242  }
243  if( end() == i ) {
244  // Object cannot be released from the conatiner,
245  // as it is not contained in it
246  return StatusCode::FAILURE;
247  }
248  else {
249  // Set the back pointer to 0 to avoid repetitional searching
250  // for the object in the container and deleting the object
251  (*i)->setParent (0);
252  erase(i);
253  return StatusCode::SUCCESS;
254  }
255  }
256 
259  typename ObjectVector<TYPE>::const_reference value ) {
260  value->setParent(this);
261  typename ObjectVector<TYPE>::iterator i = m_vector.insert(position, value);
262  return i;
263  }
264 
266  void erase( typename ObjectVector<TYPE>::iterator position ) {
267  if( 0 != (*position)->parent() ) {
268  // Set the back pointer to 0 to avoid repetitional searching
269  // for the object in the container, and deleting the object
270  (*position)->setParent (0);
271  delete *position;
272  }
273  // Removing from the container itself
274  m_vector.erase(position);
275  }
276 
278  void erase( typename ObjectVector<TYPE>::iterator first,
279  typename ObjectVector<TYPE>::iterator last ) {
280  for(typename ObjectVector<TYPE>::iterator i = first; i != last; i++ ) {
281  // Set the back pointer to 0 to avoid repetitional searching
282  // for the object in the container, and deleting the object
283  (*i)->setParent(0);
284  delete *i;
285  }
286  // Removing from the container itself
287  m_vector.erase(first, last);
288  }
289 
291  void clear() {
292  erase(begin(), end());
293  }
294 
298  return m_vector[n];
299  }
300 
304  return m_vector[n];
305  }
306 
310  virtual long index( const ContainedObject* obj ) const {
311  long i;
312  for( i = 0; i < (long)m_vector.size(); i++ ) {
313  if( m_vector[i] == obj ) {
314  return i;
315  }
316  }
317  return -1;
318  }
319 
321  virtual ContainedObject* containedObject( long dist ) const {
322  return m_vector[dist];
323  }
324 
326  virtual std::ostream& fillStream( std::ostream& s ) const {
327  s << "class ObjectVector : size = "
328  << std::setw(12)
329  << size() << "\n";
330  // Output the base class
331  //ObjectContainerBase::fillStream(s);
332  if ( 0 != size() ) {
333  s << "\nContents of the STL vector :";
334  long count = 0;
336  for( iter = m_vector.begin(); iter != m_vector.end(); iter++, count++ ) {
337  s << "\nIndex "
338  << std::setw(12)
339  << count
340  << " of object of type " << **iter;
341  }
342  }
343  return s;
344  }
345 
346 private:
348  std::vector<TYPE*> m_vector;
349 };
350 
351 #endif // GAUDIKERNEL_OBJECTVECTOR_H
352 
ObjectVector< TYPE >::iterator end()
Return an iterator pointing to the end of the container.
Definition: ObjectVector.h:107
void clear()
Clear the entire content of the container and delete all contained objects.
Definition: ObjectVector.h:291
virtual long index(const ContainedObject *obj) const
Return distance of a given object from the beginning of its container It correcponds to the "index" (...
Definition: ObjectVector.h:310
const ObjectVector< TYPE > & operator=(const ObjectVector< TYPE > &right)
Clone operator.
Definition: ObjectVector.h:91
size_t size_type
size_type, to conform the STL container interface
virtual long add(ContainedObject *pObject)
Add an object to the container.
Definition: ObjectVector.h:207
ObjectVector< TYPE >::reference back()
Return reference to the last element.
Definition: ObjectVector.h:188
ObjectVector< TYPE >::iterator begin()
Return an iterator pointing to the beginning of the container.
Definition: ObjectVector.h:97
void erase(typename ObjectVector< TYPE >::iterator position)
Erase the object at "position" from the container. The removed object will be deleted.
Definition: ObjectVector.h:266
ObjectVector< TYPE >::reverse_iterator rbegin()
Return a reverse_iterator pointing to the beginning of the reversed container.
Definition: ObjectVector.h:117
std::vector< TYPE * >::const_iterator const_iterator
Definition: ObjectVector.h:48
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:198
ObjectVector is one of the basic Gaudi container classes capable of being registered in Data Stores...
std::vector< TYPE * >::const_reference const_reference
Definition: ObjectVector.h:45
std::vector< TYPE * >::const_pointer const_pointer
Definition: ObjectVector.h:57
std::vector< TYPE * > m_vector
The STL vector itself.
Definition: ObjectVector.h:348
virtual ~ObjectVector()
Destructor.
Definition: ObjectVector.h:71
virtual ObjectVector< TYPE >::size_type numberOfObjects() const
The same as size(), return number of objects in the container.
Definition: ObjectVector.h:146
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:178
std::vector< TYPE * >::reverse_iterator reverse_iterator
Definition: ObjectVector.h:50
virtual ContainedObject * containedObject(long dist) const
Return const pointer to an object of a given distance (index)
Definition: ObjectVector.h:321
ObjectVector< TYPE >::reference operator[](typename ObjectVector< TYPE >::size_type n)
Return the reference to the n'th object in the container.
Definition: ObjectVector.h:297
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:157
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:173
void reserve(typename ObjectVector< TYPE >::size_type value)
Reserve place for "value" objects in the container.
Definition: ObjectVector.h:168
unsigned int CLID
Class ID definition.
Definition: ClassID.h:8
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:258
All classes that their objects may be contained in an LHCb ObjectContainer (e.g.
ObjectVector< TYPE >::size_type max_size() const
Return the largest possible size of the container.
Definition: ObjectVector.h:151
ObjectVector()
Constructors.
Definition: ObjectVector.h:62
std::vector< TYPE * >::value_type value_type
Definition: ObjectVector.h:42
virtual std::ostream & fillStream(std::ostream &s) const
Fill the output stream (ASCII)
Definition: ObjectVector.h:326
std::vector< TYPE * >::pointer pointer
Definition: ObjectVector.h:56
virtual const CLID & clID() const
Retrieve class ID.
Definition: ObjectVector.h:81
string s
Definition: gaudirun.py:246
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:128
list i
Definition: ana.py:128
ObjectVector< TYPE >::size_type size() const
Return the size of the container.
Definition: ObjectVector.h:141
static const CLID & classID()
Retrieve class ID.
Definition: ObjectVector.h:85
TO * reference(FROM *from)
Definition: KeyedObject.cpp:20
void pop_back()
pop_back = remove the last element from the container The removed object will be deleted (see the met...
Definition: ObjectVector.h:223