![]() |
|
|
Generated: 8 Jan 2009 |
00001 // $Id: SharedObjectsContainer.h,v 1.2 2008/10/10 10:26:14 marcocle Exp $ 00002 // ============================================================================ 00003 #ifndef GAUDIKERNEL_SHAREDOBJECTSCONTAINER_H 00004 #define GAUDIKERNEL_SHAREDOBJECTSCONTAINER_H 1 00005 // ============================================================================ 00006 // Include files 00007 // ============================================================================ 00008 // STD & STL 00009 // ============================================================================ 00010 #include <algorithm> 00011 // ============================================================================ 00012 // GaudiKernel 00013 // ============================================================================ 00014 #include "GaudiKernel/Kernel.h" 00015 #include "GaudiKernel/ClassID.h" 00016 #include "GaudiKernel/ObjectContainerBase.h" 00017 // ============================================================================ 00029 template <class TYPE> 00030 class SharedObjectsContainer : public ObjectContainerBase 00031 { 00032 public: 00033 // ========================================================================== 00035 typedef std::vector<const TYPE*> ConstVector ; 00037 typedef typename ConstVector::value_type value_type ; 00038 typedef typename ConstVector::size_type size_type ; 00039 typedef typename ConstVector::reference reference ; 00040 typedef typename ConstVector::const_reference const_reference ; 00041 typedef typename ConstVector::iterator iterator ; 00042 typedef typename ConstVector::const_iterator const_iterator ; 00043 typedef typename ConstVector::reverse_iterator reverse_iterator ; 00044 typedef typename ConstVector::const_reverse_iterator const_reverse_iterator ; 00045 // ========================================================================== 00046 public: 00047 // ========================================================================== 00048 // the default constructor (creates the empty vector) 00049 SharedObjectsContainer () 00050 : ObjectContainerBase () , m_data() {} ; 00051 // the constructor from the data 00052 SharedObjectsContainer ( const ConstVector& data ) 00053 : ObjectContainerBase () , m_data ( data ) {} 00058 template <class DATA> 00059 SharedObjectsContainer 00060 ( DATA first , 00061 DATA last ) 00062 : DataObject () 00063 , m_data ( first , last ) 00064 {} 00088 template <class DATA, class PREDICATE> 00089 SharedObjectsContainer 00090 ( DATA first , 00091 DATA last , 00092 const PREDICATE& cut ) 00093 : DataObject () 00094 , m_data () 00095 { 00096 insert ( first , last , cut ) ; 00097 } 00099 SharedObjectsContainer ( const SharedObjectsContainer& right ) 00100 : DataObject ( right ) , m_data ( right.m_data ) {} 00102 ~SharedObjectsContainer() { m_data.clear() ; } 00103 // ========================================================================== 00104 public: 00105 // ========================================================================== 00107 virtual const CLID& clID() const 00108 { return SharedObjectsContainer<TYPE>::classID(); } 00110 static const CLID& classID() 00111 { 00112 static const CLID s_clid = 00113 ( ( static_cast<CLID> ( -1 ) << 16 ) // 16 used and 16 empty bits 00114 & !CLID_ObjectVector // not an ObjectVector 00115 & !CLID_ObjectList // not an ObjectList 00116 & !static_cast<CLID> ( 0x00030000 ) // not a KeyedContainer/map 00117 & !static_cast<CLID> ( 0x00040000 ) )// not a KeyedContainer/hashmap 00118 + TYPE::classID() ; // the specific CLID from the contents 00119 // 00120 return s_clid; 00121 } 00122 // ========================================================================== 00123 public: 00124 // ========================================================================== 00126 inline const ConstVector& data () const { return m_data ; } 00128 operator const ConstVector& () const { return data () ; } 00129 // ========================================================================== 00130 public: 00131 // ========================================================================== 00133 size_type size () const { return m_data.size () ; } 00135 bool empty () const { return m_data.empty () ; } 00139 void push_back ( const TYPE* object ) { m_data.push_back ( object ) ; } 00143 void insert ( const TYPE* object ) { m_data.push_back ( object ) ; } 00148 template <class DATA> 00149 void insert 00150 ( DATA first , 00151 DATA last ) { m_data.insert ( end() , first ,last ) ; } 00178 template <class DATA, class PREDICATE> 00179 void insert 00180 ( DATA first , 00181 DATA last , 00182 const PREDICATE& cut ) 00183 { 00184 m_data.reserve ( m_data.size() + std::distance ( first , last ) ) ; 00185 for ( ; first != last ; ++first ) 00186 { if ( cut ( *first ) ) { m_data.push_back ( *first ) ; } } 00187 } 00215 template <class OUTPUT, class PREDICATE> 00216 OUTPUT get ( const PREDICATE& cut , 00217 OUTPUT output ) const 00218 { 00219 for ( const_iterator iobj = begin() ; end() != iobj ; ++iobj ) 00220 { if ( cut ( *iobj ) ) { *output = *iobj ; ++output ; } } 00221 return output ; 00222 } 00224 void erase ( iterator i ) { m_data.erase ( i ) ; } 00242 template <class PREDICATE> 00243 void erase ( const PREDICATE& cut ) 00244 { m_data.erase( std::remove_if ( begin() , end() , cut ) , end() ) ; } 00263 bool erase ( const TYPE* object ) 00264 { 00265 iterator i = std::find ( begin() , end() , object ) ; 00266 if ( end() == i ) { return false ; } 00267 m_data.erase ( i ) ; 00268 return true ; 00269 } 00270 // ========================================================================== 00271 public: 00272 // ========================================================================== 00274 reference operator[] ( size_type index ) { return m_data [index] ; } 00276 const_reference operator[] ( size_type index ) const { return m_data [index] ; } 00278 reference operator() ( size_type index ) { return m_data [index] ; } 00280 const_reference operator() ( size_type index ) const { return m_data [index] ; } 00282 reference at ( size_type index ) { return m_data.at(index) ; } 00284 const_reference at ( size_type index ) const { return m_data.at(index) ; } 00285 // ========================================================================== 00286 public: 00287 // ========================================================================== 00288 iterator begin () { return m_data . begin () ; } 00289 iterator end () { return m_data . end () ; } 00290 const_iterator begin () const { return m_data . begin () ; } 00291 const_iterator end () const { return m_data . end () ; } 00292 reverse_iterator rbegin () { return m_data . rbegin () ; } 00293 reverse_iterator rend () { return m_data . rend () ; } 00294 const_reverse_iterator rbegin () const { return m_data . rbegin () ; } 00295 const_reverse_iterator rend () const { return m_data . rend () ; } 00296 // ========================================================================== 00297 public: 00298 // ========================================================================== 00300 reference front () { return m_data . front () ; } 00302 const_reference front () const { return m_data . front () ; } 00304 reference back () { return m_data . back () ; } 00306 const_reference back () const { return m_data . back () ; } 00307 // ========================================================================== 00308 public: 00309 // ========================================================================== 00311 bool operator== ( const SharedObjectsContainer& right ) const 00312 { return &right == this || right.m_data == m_data ; } 00314 bool operator== ( const ConstVector& right ) const 00315 { return m_data == right ; } 00317 bool operator < ( const SharedObjectsContainer& right ) const 00318 { return m_data < right.m_data ; } 00320 bool operator < ( const ConstVector& right ) const 00321 { return m_data < right ; } 00322 // ========================================================================== 00323 public: // ObjectContainerBase methods: 00324 // ========================================================================== 00328 virtual long index( const ContainedObject* object ) const 00329 { 00330 const_iterator _i = std::find ( begin() , end() , object ) ; 00331 return end() != _i ? ( _i - begin() ) : -1 ; // RETURN 00332 } 00337 virtual ContainedObject* containedObject ( long index ) const 00338 { 00339 if ( 0 > index || !(index < (long) size () ) ) { return 0 ; } // RETURN 00340 const ContainedObject* co = m_data[index] ; 00341 return const_cast<ContainedObject*>( co ) ; 00342 } 00344 virtual size_type numberOfObjects() const { return m_data.size() ; } 00349 virtual long add ( ContainedObject* object) 00350 { 00351 if ( 0 == object ) { return -1 ; } // RETURN 00352 TYPE* _obj = dynamic_cast<TYPE*> ( object ) ; 00353 if ( 0 == _obj ) { return -1 ; } // RETURN 00354 const size_type pos = size() ; 00355 push_back ( _obj ) ; 00356 return pos ; 00357 } 00362 virtual long remove ( ContainedObject* value ) 00363 { 00364 iterator _i = std::find ( begin() , end() , value ) ; 00365 if ( end() == _i ) { return -1 ; } // RETURN 00366 const size_type pos = _i - begin() ; 00367 m_data.erase ( _i ) ; 00368 return pos ; // RETURN 00369 } 00370 // ========================================================================== 00371 private: 00372 // ========================================================================== 00373 // the actual data 00374 ConstVector m_data ; // the actual data 00375 // ========================================================================== 00376 }; 00377 // ============================================================================ 00378 // The END 00379 // ============================================================================ 00380 #endif // GAUDIKERNEL_SHAREDOBJECTSCONTAINER_H 00381 // ============================================================================