| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

SharedObjectsContainer.h

Go to the documentation of this file.
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 // ============================================================================
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 19:56:58 2011 for GaudiKernel by doxygen 1.4.7