File indexing completed on 2025-02-21 10:00:34
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #ifndef GAUDIKERNEL_OBJECTVECTOR_H
0012 #define GAUDIKERNEL_OBJECTVECTOR_H
0013
0014
0015 #include "GaudiKernel/ClassID.h"
0016 #include "GaudiKernel/Kernel.h"
0017 #include "GaudiKernel/ObjectContainerBase.h"
0018 #include "GaudiKernel/StreamBuffer.h"
0019
0020 #include <iomanip>
0021 #include <vector>
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045 template <class TYPE>
0046 class ObjectVector : public ObjectContainerBase {
0047
0048 public:
0049 typedef TYPE contained_type;
0050 typedef typename std::vector<TYPE*>::value_type value_type;
0051
0052 typedef typename std::vector<TYPE*>::reference reference;
0053 typedef typename std::vector<TYPE*>::const_reference const_reference;
0054
0055 typedef typename std::vector<TYPE*>::iterator iterator;
0056 typedef typename std::vector<TYPE*>::const_iterator const_iterator;
0057
0058 typedef typename std::vector<TYPE*>::reverse_iterator reverse_iterator;
0059 typedef typename std::vector<TYPE*>::const_reverse_iterator const_reverse_iterator;
0060 #ifdef _WIN32
0061 typedef typename std::vector<TYPE*>::_Tptr pointer;
0062 typedef typename std::vector<TYPE*>::_Ctptr const_pointer;
0063 #else
0064 typedef typename std::vector<TYPE*>::pointer pointer;
0065 typedef typename std::vector<TYPE*>::const_pointer const_pointer;
0066 #endif
0067
0068 public:
0069
0070 ObjectVector() = default;
0071 ObjectVector( const ObjectVector<TYPE>& ) = delete;
0072 ObjectVector& operator=( const ObjectVector<TYPE>& ) = delete;
0073 ObjectVector( ObjectVector&& rhs ) : ObjectContainerBase( std::move( rhs ) ), m_vector{ std::move( rhs.m_vector ) } {
0074 std::for_each( begin(), end(), [this]( TYPE* obj ) { obj->setParent( this ); } );
0075 }
0076
0077
0078 ~ObjectVector() override {
0079 for ( auto& i : m_vector ) {
0080
0081
0082 i->setParent( nullptr );
0083 delete i;
0084 }
0085 }
0086
0087
0088 const CLID& clID() const override { return ObjectVector<TYPE>::classID(); }
0089
0090 static const CLID& classID() {
0091 static const CLID clid = TYPE::classID() + CLID_ObjectVector;
0092 return clid;
0093 }
0094
0095
0096 typename ObjectVector<TYPE>::iterator begin() { return m_vector.begin(); }
0097
0098
0099 typename ObjectVector<TYPE>::const_iterator begin() const { return m_vector.begin(); }
0100
0101
0102 typename ObjectVector<TYPE>::iterator end() { return m_vector.end(); }
0103
0104
0105 typename ObjectVector<TYPE>::const_iterator end() const { return m_vector.end(); }
0106
0107
0108 typename ObjectVector<TYPE>::reverse_iterator rbegin() { return m_vector.rbegin(); }
0109
0110
0111
0112 typename ObjectVector<TYPE>::const_reverse_iterator rbegin() const { return m_vector.rbegin(); }
0113
0114
0115 typename ObjectVector<TYPE>::reverse_iterator rend() { return m_vector.rend(); }
0116
0117
0118 typename ObjectVector<TYPE>::const_reverse_iterator rend() const { return m_vector.rend(); }
0119
0120
0121
0122
0123
0124 typename ObjectVector<TYPE>::size_type size() const { return m_vector.size(); }
0125
0126
0127 typename ObjectVector<TYPE>::size_type numberOfObjects() const override { return m_vector.size(); }
0128
0129
0130 typename ObjectVector<TYPE>::size_type max_size() const { return m_vector.max_size(); }
0131
0132
0133
0134 typename ObjectVector<TYPE>::size_type capacity() const { return m_vector.capacity(); }
0135
0136
0137
0138
0139
0140
0141
0142
0143 void reserve( typename ObjectVector<TYPE>::size_type value ) { m_vector.reserve( value ); }
0144
0145
0146 bool empty() const { return m_vector.empty(); }
0147
0148
0149 typename ObjectVector<TYPE>::reference front() { return m_vector.front(); }
0150
0151
0152 typename ObjectVector<TYPE>::const_reference front() const { return m_vector.front(); }
0153
0154
0155 typename ObjectVector<TYPE>::reference back() { return m_vector.back(); }
0156
0157
0158 typename ObjectVector<TYPE>::const_reference back() const { return m_vector.back(); }
0159
0160
0161 void push_back( typename ObjectVector<TYPE>::const_reference value ) {
0162 if ( value->parent() ) { const_cast<ObjectContainerBase*>( value->parent() )->remove( value ); }
0163 value->setParent( this );
0164 m_vector.push_back( value );
0165 }
0166
0167
0168 long add( ContainedObject* pObject ) override {
0169 try {
0170 auto ptr = dynamic_cast<typename ObjectVector<TYPE>::value_type>( pObject );
0171 if ( ptr ) {
0172 push_back( ptr );
0173 return m_vector.size() - 1;
0174 }
0175 } catch ( ... ) {}
0176 return -1;
0177 }
0178
0179
0180
0181 void pop_back() {
0182 auto position = m_vector.back();
0183
0184
0185 position->setParent( nullptr );
0186 delete position;
0187
0188 m_vector.pop_back();
0189 }
0190
0191
0192
0193 long remove( ContainedObject* value ) override {
0194
0195 auto i = std::find_if( begin(), end(), [&]( const ContainedObject* j ) { return j == value; } );
0196 if ( i == end() ) {
0197
0198
0199 return 0;
0200 }
0201 long idx = std::distance( begin(), i );
0202
0203
0204 ( *i )->setParent( nullptr );
0205 erase( i );
0206 return idx;
0207 }
0208
0209
0210 typename ObjectVector<TYPE>::iterator insert( typename ObjectVector<TYPE>::iterator position,
0211 typename ObjectVector<TYPE>::const_reference value ) {
0212 value->setParent( this );
0213 return m_vector.insert( position, value );
0214 }
0215
0216
0217 void erase( typename ObjectVector<TYPE>::iterator position ) {
0218 if ( ( *position )->parent() ) {
0219
0220
0221 ( *position )->setParent( nullptr );
0222 delete *position;
0223 }
0224
0225 m_vector.erase( position );
0226 }
0227
0228
0229 void erase( typename ObjectVector<TYPE>::iterator first, typename ObjectVector<TYPE>::iterator last ) {
0230 for ( auto i = first; i != last; i++ ) {
0231
0232
0233 ( *i )->setParent( nullptr );
0234 delete *i;
0235 }
0236
0237 m_vector.erase( first, last );
0238 }
0239
0240
0241 void clear() { erase( begin(), end() ); }
0242
0243
0244 typename ObjectVector<TYPE>::reference operator[]( typename ObjectVector<TYPE>::size_type n ) { return m_vector[n]; }
0245
0246
0247 typename ObjectVector<TYPE>::const_reference operator[]( typename ObjectVector<TYPE>::size_type n ) const {
0248 return m_vector[n];
0249 }
0250
0251
0252
0253
0254 long index( const ContainedObject* obj ) const override {
0255 auto i = std::find_if( begin(), end(), [&]( const ContainedObject* o ) { return o == obj; } );
0256 return i != end() ? std::distance( begin(), i ) : -1;
0257 }
0258
0259
0260 ContainedObject const* containedObject( long dist ) const override { return m_vector[dist]; }
0261 ContainedObject* containedObject( long dist ) override { return m_vector[dist]; }
0262
0263
0264 std::ostream& fillStream( std::ostream& s ) const override {
0265 s << "class ObjectVector : size = " << std::setw( 12 ) << size() << "\n";
0266
0267
0268 if ( !empty() ) {
0269 s << "\nContents of the STL vector :";
0270 long count = 0;
0271 for ( const auto& i : m_vector ) { s << "\nIndex " << std::setw( 12 ) << count++ << " of object of type " << *i; }
0272 }
0273 return s;
0274 }
0275
0276 private:
0277
0278 std::vector<TYPE*> m_vector;
0279 };
0280
0281 #endif