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 ( 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 )
00114 & !CLID_ObjectVector
00115 & !CLID_ObjectList
00116 & !static_cast<CLID> ( 0x00030000 )
00117 & !static_cast<CLID> ( 0x00040000 ) )
00118 + TYPE::classID() ;
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:
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 ;
00332 }
00337 virtual ContainedObject* containedObject ( long index ) const
00338 {
00339 if ( 0 > index || !(index < (long) size () ) ) { return 0 ; }
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 ; }
00352 TYPE* _obj = dynamic_cast<TYPE*> ( object ) ;
00353 if ( 0 == _obj ) { return -1 ; }
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 ; }
00366 const size_type pos = _i - begin() ;
00367 m_data.erase ( _i ) ;
00368 return pos ;
00369 }
00370
00371 private:
00372
00373
00374 ConstVector m_data ;
00375
00376 };
00377
00378
00379
00380 #endif // GAUDIKERNEL_SHAREDOBJECTSCONTAINER_H
00381