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(DATA first, DATA last)
00060 : ObjectContainerBase(), m_data(first, last) {}
00084 template <class DATA, class PREDICATE>
00085 SharedObjectsContainer(DATA first, DATA last, const PREDICATE& cut)
00086 : ObjectContainerBase(), m_data()
00087 {
00088 insert ( first , last , cut ) ;
00089 }
00091 virtual ~SharedObjectsContainer() { m_data.clear() ; }
00092
00093 public:
00094
00096 virtual const CLID& clID() const
00097 { return SharedObjectsContainer<TYPE>::classID(); }
00099 static const CLID& classID()
00100 {
00101 static const CLID s_clid =
00102 ( ( static_cast<CLID> ( -1 ) << 16 )
00103 & !CLID_ObjectVector
00104 & !CLID_ObjectList
00105 & !static_cast<CLID> ( 0x00030000 )
00106 & !static_cast<CLID> ( 0x00040000 ) )
00107 + TYPE::classID() ;
00108
00109 return s_clid;
00110 }
00111
00112 public:
00113
00115 inline const ConstVector& data () const { return m_data ; }
00117 operator const ConstVector& () const { return data () ; }
00118
00119 public:
00120
00122 size_type size () const { return m_data.size () ; }
00124 bool empty () const { return m_data.empty () ; }
00128 void push_back ( const TYPE* object ) { m_data.push_back ( object ) ; }
00132 void insert ( const TYPE* object ) { m_data.push_back ( object ) ; }
00137 template <class DATA>
00138 void insert
00139 ( DATA first ,
00140 DATA last ) { m_data.insert ( end() , first ,last ) ; }
00167 template <class DATA, class PREDICATE>
00168 void insert
00169 ( DATA first ,
00170 DATA last ,
00171 const PREDICATE& cut )
00172 {
00173 m_data.reserve ( m_data.size() + std::distance ( first , last ) ) ;
00174 for ( ; first != last ; ++first )
00175 { if ( cut ( *first ) ) { m_data.push_back ( *first ) ; } }
00176 }
00204 template <class OUTPUT, class PREDICATE>
00205 OUTPUT get ( const PREDICATE& cut ,
00206 OUTPUT output ) const
00207 {
00208 for ( const_iterator iobj = begin() ; end() != iobj ; ++iobj )
00209 { if ( cut ( *iobj ) ) { *output = *iobj ; ++output ; } }
00210 return output ;
00211 }
00213 void erase ( iterator i ) { m_data.erase ( i ) ; }
00231 template <class PREDICATE>
00232 void erase ( const PREDICATE& cut )
00233 { m_data.erase( std::remove_if ( begin() , end() , cut ) , end() ) ; }
00252 bool erase ( const TYPE* object )
00253 {
00254 iterator i = std::find ( begin() , end() , object ) ;
00255 if ( end() == i ) { return false ; }
00256 m_data.erase ( i ) ;
00257 return true ;
00258 }
00259
00260 public:
00261
00263 reference operator[] ( size_type index ) { return m_data [index] ; }
00265 const_reference operator[] ( size_type index ) const { return m_data [index] ; }
00267 reference operator() ( size_type index ) { return m_data [index] ; }
00269 const_reference operator() ( size_type index ) const { return m_data [index] ; }
00271 reference at ( size_type index ) { return m_data.at(index) ; }
00273 const_reference at ( size_type index ) const { return m_data.at(index) ; }
00274
00275 public:
00276
00277 iterator begin () { return m_data . begin () ; }
00278 iterator end () { return m_data . end () ; }
00279 const_iterator begin () const { return m_data . begin () ; }
00280 const_iterator end () const { return m_data . end () ; }
00281 reverse_iterator rbegin () { return m_data . rbegin () ; }
00282 reverse_iterator rend () { return m_data . rend () ; }
00283 const_reverse_iterator rbegin () const { return m_data . rbegin () ; }
00284 const_reverse_iterator rend () const { return m_data . rend () ; }
00285
00286 public:
00287
00289 reference front () { return m_data . front () ; }
00291 const_reference front () const { return m_data . front () ; }
00293 reference back () { return m_data . back () ; }
00295 const_reference back () const { return m_data . back () ; }
00296
00297 public:
00298
00300 bool operator== ( const SharedObjectsContainer& right ) const
00301 { return &right == this || right.m_data == m_data ; }
00303 bool operator== ( const ConstVector& right ) const
00304 { return m_data == right ; }
00306 bool operator < ( const SharedObjectsContainer& right ) const
00307 { return m_data < right.m_data ; }
00309 bool operator < ( const ConstVector& right ) const
00310 { return m_data < right ; }
00311
00312 public:
00313
00317 virtual long index( const ContainedObject* object ) const
00318 {
00319 const_iterator _i = std::find ( begin() , end() , object ) ;
00320 return end() != _i ? ( _i - begin() ) : -1 ;
00321 }
00326 virtual ContainedObject* containedObject ( long index ) const
00327 {
00328 if ( 0 > index || !(index < (long) size () ) ) { return 0 ; }
00329 const ContainedObject* co = m_data[index] ;
00330 return const_cast<ContainedObject*>( co ) ;
00331 }
00333 virtual size_type numberOfObjects() const { return m_data.size() ; }
00338 virtual long add ( ContainedObject* object)
00339 {
00340 if ( 0 == object ) { return -1 ; }
00341 TYPE* _obj = dynamic_cast<TYPE*> ( object ) ;
00342 if ( 0 == _obj ) { return -1 ; }
00343 const size_type pos = size() ;
00344 push_back ( _obj ) ;
00345 return pos ;
00346 }
00351 virtual long remove ( ContainedObject* value )
00352 {
00353 iterator _i = std::find ( begin() , end() , value ) ;
00354 if ( end() == _i ) { return -1 ; }
00355 const size_type pos = _i - begin() ;
00356 m_data.erase ( _i ) ;
00357 return pos ;
00358 }
00359
00360 private:
00361
00362
00363 ConstVector m_data ;
00364
00365 };
00366
00367
00368
00369 #endif // GAUDIKERNEL_SHAREDOBJECTSCONTAINER_H
00370