The Gaudi Framework  v40r0 (475e45c1)
ObjectVector.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2025 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #pragma once
12 
13 #include <GaudiKernel/ClassID.h>
14 #include <GaudiKernel/Kernel.h>
17 #include <iomanip>
18 #include <vector>
19 
20 // Definition of the CLID for this class defined in ClassID.h
21 // static const CLID CLID_ObjectList = (1<<17); // ObjectVector (bit 17 set)
22 
42 template <class TYPE>
43 class ObjectVector : public ObjectContainerBase {
44 
45 public:
46  typedef TYPE contained_type;
47  typedef typename std::vector<TYPE*>::value_type value_type;
48 
50  typedef typename std::vector<TYPE*>::const_reference const_reference;
51 
52  typedef typename std::vector<TYPE*>::iterator iterator;
53  typedef typename std::vector<TYPE*>::const_iterator const_iterator;
54 
55  typedef typename std::vector<TYPE*>::reverse_iterator reverse_iterator;
56  typedef typename std::vector<TYPE*>::const_reverse_iterator const_reverse_iterator;
57 #ifdef _WIN32
58  typedef typename std::vector<TYPE*>::_Tptr pointer;
59  typedef typename std::vector<TYPE*>::_Ctptr const_pointer;
60 #else
61  typedef typename std::vector<TYPE*>::pointer pointer;
62  typedef typename std::vector<TYPE*>::const_pointer const_pointer;
63 #endif
64 
65 public:
66  ObjectVector() = default;
67  ObjectVector( const ObjectVector<TYPE>& ) = delete;
69  ObjectVector( ObjectVector&& rhs ) : ObjectContainerBase( std::move( rhs ) ), m_vector{ std::move( rhs.m_vector ) } {
70  std::for_each( begin(), end(), [this]( TYPE* obj ) { obj->setParent( this ); } );
71  }
72 
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 { return ObjectVector<TYPE>::classID(); }
85  static const CLID& classID() {
86  static const CLID clid = TYPE::classID() + CLID_ObjectVector;
87  return clid;
88  }
89 
91  typename ObjectVector<TYPE>::iterator begin() { return m_vector.begin(); }
92 
94  typename ObjectVector<TYPE>::const_iterator begin() const { return m_vector.begin(); }
95 
97  typename ObjectVector<TYPE>::iterator end() { return m_vector.end(); }
98 
100  typename ObjectVector<TYPE>::const_iterator end() const { return m_vector.end(); }
101 
103  typename ObjectVector<TYPE>::reverse_iterator rbegin() { return m_vector.rbegin(); }
104 
107  typename ObjectVector<TYPE>::const_reverse_iterator rbegin() const { return m_vector.rbegin(); }
108 
110  typename ObjectVector<TYPE>::reverse_iterator rend() { return m_vector.rend(); }
111 
113  typename ObjectVector<TYPE>::const_reverse_iterator rend() const { return m_vector.rend(); }
114 
119  typename ObjectVector<TYPE>::size_type size() const { return m_vector.size(); }
120 
122  typename ObjectVector<TYPE>::size_type numberOfObjects() const override { return m_vector.size(); }
123 
125  typename ObjectVector<TYPE>::size_type max_size() const { return m_vector.max_size(); }
126 
129  typename ObjectVector<TYPE>::size_type capacity() const { return m_vector.capacity(); }
130 
138  void reserve( typename ObjectVector<TYPE>::size_type value ) { m_vector.reserve( value ); }
139 
141  bool empty() const { return m_vector.empty(); }
142 
144  typename ObjectVector<TYPE>::reference front() { return m_vector.front(); }
145 
147  typename ObjectVector<TYPE>::const_reference front() const { return m_vector.front(); }
148 
150  typename ObjectVector<TYPE>::reference back() { return m_vector.back(); }
151 
153  typename ObjectVector<TYPE>::const_reference back() const { return m_vector.back(); }
154 
157  if ( value->parent() ) { const_cast<ObjectContainerBase*>( value->parent() )->remove( value ); }
158  value->setParent( this );
159  m_vector.push_back( value );
160  }
161 
163  long add( ContainedObject* pObject ) override {
164  try {
165  auto ptr = dynamic_cast<typename ObjectVector<TYPE>::value_type>( pObject );
166  if ( ptr ) {
167  push_back( ptr );
168  return m_vector.size() - 1;
169  }
170  } catch ( ... ) {}
171  return -1;
172  }
173 
176  void pop_back() {
177  auto position = m_vector.back();
178  // Set the back pointer to 0 to avoid repetitional searching
179  // for the object in the container, and deleting the object
180  position->setParent( nullptr );
181  delete position;
182  // Removing from the container itself
183  m_vector.pop_back();
184  }
185 
188  long remove( ContainedObject* value ) override {
189  // Find the object of the value value
190  auto i = std::find_if( begin(), end(), [&]( const ContainedObject* j ) { return j == value; } );
191  if ( i == end() ) {
192  // Object cannot be released from the conatiner,
193  // as it is not contained in it
194  return 0;
195  }
196  long idx = std::distance( begin(), i );
197  // Set the back pointer to 0 to avoid repetitional searching
198  // for the object in the container and deleting the object
199  ( *i )->setParent( nullptr );
200  erase( i );
201  return idx;
202  }
203 
206  typename ObjectVector<TYPE>::const_reference value ) {
207  value->setParent( this );
208  return m_vector.insert( position, value );
209  }
210 
212  void erase( typename ObjectVector<TYPE>::iterator position ) {
213  if ( ( *position )->parent() ) {
214  // Set the back pointer to 0 to avoid repetitional searching
215  // for the object in the container, and deleting the object
216  ( *position )->setParent( nullptr );
217  delete *position;
218  }
219  // Removing from the container itself
220  m_vector.erase( position );
221  }
222 
224  void erase( typename ObjectVector<TYPE>::iterator first, typename ObjectVector<TYPE>::iterator last ) {
225  for ( auto i = first; i != last; i++ ) {
226  // Set the back pointer to 0 to avoid repetitional searching
227  // for the object in the container, and deleting the object
228  ( *i )->setParent( nullptr );
229  delete *i;
230  }
231  // Removing from the container itself
232  m_vector.erase( first, last );
233  }
234 
236  void clear() { erase( begin(), end() ); }
237 
240 
243  return m_vector[n];
244  }
245 
249  long index( const ContainedObject* obj ) const override {
250  auto i = std::find_if( begin(), end(), [&]( const ContainedObject* o ) { return o == obj; } );
251  return i != end() ? std::distance( begin(), i ) : -1;
252  }
253 
255  ContainedObject const* containedObject( long dist ) const override { return m_vector[dist]; }
256  ContainedObject* containedObject( long dist ) override { return m_vector[dist]; }
257 
259  std::ostream& fillStream( std::ostream& s ) const override {
260  s << "class ObjectVector : size = " << std::setw( 12 ) << size() << "\n";
261  // Output the base class
262  // ObjectContainerBase::fillStream(s);
263  if ( !empty() ) {
264  s << "\nContents of the STL vector :";
265  long count = 0;
266  for ( const auto& i : m_vector ) { s << "\nIndex " << std::setw( 12 ) << count++ << " of object of type " << *i; }
267  }
268  return s;
269  }
270 
271 private:
272  std::vector<TYPE*> m_vector;
273 };
ObjectVector::max_size
ObjectVector< TYPE >::size_type max_size() const
Return the largest possible size of the container.
Definition: ObjectVector.h:125
ObjectVector::const_iterator
std::vector< TYPE * >::const_iterator const_iterator
Definition: ObjectVector.h:53
ObjectVector::rend
ObjectVector< TYPE >::const_reverse_iterator rend() const
Return a const_reverse_iterator pointing to the end of the reversed container.
Definition: ObjectVector.h:113
ObjectVector::operator=
ObjectVector & operator=(const ObjectVector< TYPE > &)=delete
ObjectVector::clID
const CLID & clID() const override
Retrieve class ID.
Definition: ObjectVector.h:83
ObjectVector::front
ObjectVector< TYPE >::reference front()
Return reference to the first element.
Definition: ObjectVector.h:144
ObjectVector
Definition: ContainedObject.h:19
ObjectVector::iterator
std::vector< TYPE * >::iterator iterator
Definition: ObjectVector.h:52
ObjectVector::capacity
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:129
ObjectVector::begin
ObjectVector< TYPE >::const_iterator begin() const
Return a const_iterator pointing to the beginning of the container.
Definition: ObjectVector.h:94
GaudiPartProp.decorators.std
std
Definition: decorators.py:32
ObjectVector::containedObject
ContainedObject * containedObject(long dist) override
Definition: ObjectVector.h:256
gaudirun.s
string s
Definition: gaudirun.py:346
ObjectVector::value_type
std::vector< TYPE * >::value_type value_type
Definition: ObjectVector.h:47
ClassID.h
ObjectVector::pop_back
void pop_back()
pop_back = remove the last element from the container The removed object will be deleted (see the met...
Definition: ObjectVector.h:176
ObjectVector::size
ObjectVector< TYPE >::size_type size() const
Return the size of the container.
Definition: ObjectVector.h:119
ObjectVector::front
ObjectVector< TYPE >::const_reference front() const
Return const_reference to the first element.
Definition: ObjectVector.h:147
ObjectVector::ObjectVector
ObjectVector(const ObjectVector< TYPE > &)=delete
ObjectVector::ObjectVector
ObjectVector(ObjectVector &&rhs)
Definition: ObjectVector.h:69
ObjectVector::push_back
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:156
ObjectVector::reserve
void reserve(typename ObjectVector< TYPE >::size_type value)
Reserve place for "value" objects in the container.
Definition: ObjectVector.h:138
StreamBuffer.h
ObjectVector::reference
std::vector< TYPE * >::reference reference
Definition: ObjectVector.h:49
ObjectVector::begin
ObjectVector< TYPE >::iterator begin()
Return an iterator pointing to the beginning of the container.
Definition: ObjectVector.h:91
ObjectVector::index
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:249
ObjectVector::end
ObjectVector< TYPE >::const_iterator end() const
Return a const_iterator pointing to the end of the container.
Definition: ObjectVector.h:100
ObjectVector::contained_type
TYPE contained_type
Definition: ObjectVector.h:46
ObjectVector::const_pointer
std::vector< TYPE * >::const_pointer const_pointer
Definition: ObjectVector.h:62
ObjectVector::operator[]
ObjectVector< TYPE >::const_reference operator[](typename ObjectVector< TYPE >::size_type n) const
Return the const_reference to the n'th object in the container.
Definition: ObjectVector.h:242
Gaudi::cxx::for_each
void for_each(ContainerOfSynced &c, Fun &&f)
Definition: SynchronizedValue.h:98
ObjectVector::insert
ObjectVector< TYPE >::iterator insert(typename ObjectVector< TYPE >::iterator position, typename ObjectVector< TYPE >::const_reference value)
Insert "value" before "position".
Definition: ObjectVector.h:205
ProduceConsume.j
j
Definition: ProduceConsume.py:104
ObjectVector::erase
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:224
ObjectVector::rbegin
ObjectVector< TYPE >::reverse_iterator rbegin()
Return a reverse_iterator pointing to the beginning of the reversed container.
Definition: ObjectVector.h:103
ObjectVector::const_reference
std::vector< TYPE * >::const_reference const_reference
Definition: ObjectVector.h:50
ObjectVector::back
ObjectVector< TYPE >::reference back()
Return reference to the last element.
Definition: ObjectVector.h:150
ObjectVector::erase
void erase(typename ObjectVector< TYPE >::iterator position)
Erase the object at "position" from the container. The removed object will be deleted.
Definition: ObjectVector.h:212
CLID
unsigned int CLID
Class ID definition.
Definition: ClassID.h:16
cpluginsvc.n
n
Definition: cpluginsvc.py:234
ObjectVector::pointer
std::vector< TYPE * >::pointer pointer
Definition: ObjectVector.h:61
ObjectVector::rbegin
ObjectVector< TYPE >::const_reverse_iterator rbegin() const
Return a const_reverse_iterator pointing to the beginning of the reversed container.
Definition: ObjectVector.h:107
ObjectVector::const_reverse_iterator
std::vector< TYPE * >::const_reverse_iterator const_reverse_iterator
Definition: ObjectVector.h:56
ObjectVector::numberOfObjects
ObjectVector< TYPE >::size_type numberOfObjects() const override
The same as size(), return number of objects in the container.
Definition: ObjectVector.h:122
ObjectVector::back
ObjectVector< TYPE >::const_reference back() const
Return const_reference to the last element.
Definition: ObjectVector.h:153
ObjectVector::~ObjectVector
~ObjectVector() override
Definition: ObjectVector.h:73
ObjectContainerBase
Definition: ObjectContainerBase.h:26
ObjectVector::end
ObjectVector< TYPE >::iterator end()
Return an iterator pointing to the end of the container.
Definition: ObjectVector.h:97
ObjectVector::remove
long remove(ContainedObject *value) override
Release object from the container (the poiter will be removed from the container, but the object itse...
Definition: ObjectVector.h:188
Kernel.h
ObjectVector::empty
bool empty() const
Return true if the size of the container is 0.
Definition: ObjectVector.h:141
fixtures.reference
Generator[dict, None, None] reference(request, Optional[Path] reference_path)
Definition: fixtures.py:211
ObjectContainerBase.h
ObjectVector::fillStream
std::ostream & fillStream(std::ostream &s) const override
Fill the output stream (ASCII)
Definition: ObjectVector.h:259
ObjectVector::reverse_iterator
std::vector< TYPE * >::reverse_iterator reverse_iterator
Definition: ObjectVector.h:55
ObjectVector::operator[]
ObjectVector< TYPE >::reference operator[](typename ObjectVector< TYPE >::size_type n)
Return the reference to the n'th object in the container.
Definition: ObjectVector.h:239
ObjectVector::containedObject
ContainedObject const * containedObject(long dist) const override
Return const pointer to an object of a given distance (index)
Definition: ObjectVector.h:255
ObjectVector::m_vector
std::vector< TYPE * > m_vector
Definition: ObjectVector.h:272
ObjectVector::rend
ObjectVector< TYPE >::reverse_iterator rend()
Return a reverse_iterator pointing to the end of the reversed container.
Definition: ObjectVector.h:110
ObjectVector::add
long add(ContainedObject *pObject) override
Add an object to the container.
Definition: ObjectVector.h:163
ObjectVector::ObjectVector
ObjectVector()=default
ContainedObject
Definition: ContainedObject.h:37
ObjectVector::classID
static const CLID & classID()
Retrieve class ID.
Definition: ObjectVector.h:85
ObjectVector::clear
void clear()
Clear the entire content of the container and delete all contained objects.
Definition: ObjectVector.h:236