SharedObjectsContainer.h
Go to the documentation of this file.00001
00002
00003 #ifndef GAUDIKERNEL_SHAREDOBJECTSCONTAINER_H
00004 #define GAUDIKERNEL_SHAREDOBJECTSCONTAINER_H 1
00005
00006
00007
00008
00009
00010 #include <algorithm>
00011
00012
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
00049 SharedObjectsContainer ()
00050 : ObjectContainerBase () , m_data() {} ;
00051
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() { m_data.clear() ; }
00100
00101 public:
00102
00104 virtual const CLID& clID() const
00105 { return SharedObjectsContainer<TYPE>::classID(); }
00107 static const CLID& classID()
00108 {
00109 static const CLID s_clid =
00110 ( ( static_cast<CLID> ( -1 ) << 16 )
00111 & !CLID_ObjectVector
00112 & !CLID_ObjectList
00113 & !static_cast<CLID> ( 0x00030000 )
00114 & !static_cast<CLID> ( 0x00040000 ) )
00115 + TYPE::classID() ;
00116
00117 return s_clid;
00118 }
00119
00120 public:
00121
00123 inline const ConstVector& data () const { return m_data ; }
00125 operator const ConstVector& () const { return data () ; }
00126
00127 public:
00128
00130 size_type size () const { return m_data.size () ; }
00132 bool empty () const { return m_data.empty () ; }
00136 void push_back ( const TYPE* object ) { m_data.push_back ( object ) ; }
00140 void insert ( const TYPE* object ) { m_data.push_back ( object ) ; }
00145 template <class DATA>
00146 void insert
00147 ( DATA first ,
00148 DATA last ) { m_data.insert ( end() , first ,last ) ; }
00175 template <class DATA, class PREDICATE>
00176 void insert
00177 ( DATA first ,
00178 DATA last ,
00179 const PREDICATE& cut )
00180 {
00181 m_data.reserve ( m_data.size() + std::distance ( first , last ) ) ;
00182 for ( ; first != last ; ++first )
00183 { if ( cut ( *first ) ) { m_data.push_back ( *first ) ; } }
00184 }
00212 template <class OUTPUT, class PREDICATE>
00213 OUTPUT get ( const PREDICATE& cut ,
00214 OUTPUT output ) const
00215 {
00216 for ( const_iterator iobj = begin() ; end() != iobj ; ++iobj )
00217 { if ( cut ( *iobj ) ) { *output = *iobj ; ++output ; } }
00218 return output ;
00219 }
00221 void erase ( iterator i ) { m_data.erase ( i ) ; }
00239 template <class PREDICATE>
00240 void erase ( const PREDICATE& cut )
00241 { m_data.erase( std::remove_if ( begin() , end() , cut ) , end() ) ; }
00260 bool erase ( const TYPE* object )
00261 {
00262 iterator i = std::find ( begin() , end() , object ) ;
00263 if ( end() == i ) { return false ; }
00264 m_data.erase ( i ) ;
00265 return true ;
00266 }
00267
00268 public:
00269
00271 reference operator[] ( size_type index ) { return m_data [index] ; }
00273 const_reference operator[] ( size_type index ) const { return m_data [index] ; }
00275 reference operator() ( size_type index ) { return m_data [index] ; }
00277 const_reference operator() ( size_type index ) const { return m_data [index] ; }
00279 reference at ( size_type index ) { return m_data.at(index) ; }
00281 const_reference at ( size_type index ) const { return m_data.at(index) ; }
00282
00283 public:
00284
00285 iterator begin () { return m_data . begin () ; }
00286 iterator end () { return m_data . end () ; }
00287 const_iterator begin () const { return m_data . begin () ; }
00288 const_iterator end () const { return m_data . end () ; }
00289 reverse_iterator rbegin () { return m_data . rbegin () ; }
00290 reverse_iterator rend () { return m_data . rend () ; }
00291 const_reverse_iterator rbegin () const { return m_data . rbegin () ; }
00292 const_reverse_iterator rend () const { return m_data . rend () ; }
00293
00294 public:
00295
00297 reference front () { return m_data . front () ; }
00299 const_reference front () const { return m_data . front () ; }
00301 reference back () { return m_data . back () ; }
00303 const_reference back () const { return m_data . back () ; }
00304
00305 public:
00306
00308 bool operator== ( const SharedObjectsContainer& right ) const
00309 { return &right == this || right.m_data == m_data ; }
00311 bool operator== ( const ConstVector& right ) const
00312 { return m_data == right ; }
00314 bool operator < ( const SharedObjectsContainer& right ) const
00315 { return m_data < right.m_data ; }
00317 bool operator < ( const ConstVector& right ) const
00318 { return m_data < right ; }
00319
00320 public:
00321
00325 virtual long index( const ContainedObject* object ) const
00326 {
00327 const_iterator _i = std::find ( begin() , end() , object ) ;
00328 return end() != _i ? ( _i - begin() ) : -1 ;
00329 }
00334 virtual ContainedObject* containedObject ( long index ) const
00335 {
00336 if ( 0 > index || !(index < (long) size () ) ) { return 0 ; }
00337 const ContainedObject* co = m_data[index] ;
00338 return const_cast<ContainedObject*>( co ) ;
00339 }
00341 virtual size_type numberOfObjects() const { return m_data.size() ; }
00346 virtual long add ( ContainedObject* object)
00347 {
00348 if ( 0 == object ) { return -1 ; }
00349 TYPE* _obj = dynamic_cast<TYPE*> ( object ) ;
00350 if ( 0 == _obj ) { return -1 ; }
00351 const size_type pos = size() ;
00352 push_back ( _obj ) ;
00353 return pos ;
00354 }
00359 virtual long remove ( ContainedObject* value )
00360 {
00361 iterator _i = std::find ( begin() , end() , value ) ;
00362 if ( end() == _i ) { return -1 ; }
00363 const size_type pos = _i - begin() ;
00364 m_data.erase ( _i ) ;
00365 return pos ;
00366 }
00367
00368 private:
00369
00370
00371 ConstVector m_data ;
00372
00373 };
00374
00375
00376
00377 #endif // GAUDIKERNEL_SHAREDOBJECTSCONTAINER_H
00378