Gaudi Framework, version v22r0

Home   Generated: 9 Feb 2011

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() { 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 )  // 16 used and 16 empty bits
00111         & !CLID_ObjectVector                 // not an ObjectVector
00112         & !CLID_ObjectList                   // not an ObjectList
00113         & !static_cast<CLID> ( 0x00030000 )  // not a  KeyedContainer/map
00114         & !static_cast<CLID> ( 0x00040000 ) )// not a  KeyedContainer/hashmap
00115       + TYPE::classID() ;                // the specific CLID from the contents
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: // ObjectContainerBase methods:
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 ;                  // RETURN
00329   }
00334   virtual ContainedObject* containedObject ( long index ) const
00335   {
00336     if ( 0 > index || !(index < (long) size () ) ) { return 0 ; }    // RETURN
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 ; }                           // RETURN
00349     TYPE* _obj = dynamic_cast<TYPE*> ( object ) ;
00350     if ( 0 == _obj   ) { return -1 ; }                           // RETURN
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 ; }                          // RETURN
00363     const size_type pos = _i - begin() ;
00364     m_data.erase ( _i ) ;
00365     return pos ;                                                // RETURN
00366   }
00367   // ==========================================================================
00368 private:
00369   // ==========================================================================
00370   // the actual data
00371   ConstVector m_data ; // the actual data
00372   // ==========================================================================
00373 };
00374 // ============================================================================
00375 // The END
00376 // ============================================================================
00377 #endif // GAUDIKERNEL_SHAREDOBJECTSCONTAINER_H
00378 // ============================================================================
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines

Generated at Wed Feb 9 16:24:53 2011 for Gaudi Framework, version v22r0 by Doxygen version 1.6.2 written by Dimitri van Heesch, © 1997-2004