Gaudi Framework, version v23r4

Home   Generated: Mon Sep 17 2012

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(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 )  // 16 used and 16 empty bits
00103         & !CLID_ObjectVector                 // not an ObjectVector
00104         & !CLID_ObjectList                   // not an ObjectList
00105         & !static_cast<CLID> ( 0x00030000 )  // not a  KeyedContainer/map
00106         & !static_cast<CLID> ( 0x00040000 ) )// not a  KeyedContainer/hashmap
00107       + TYPE::classID() ;                // the specific CLID from the contents
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: // ObjectContainerBase methods:
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 ;                  // RETURN
00321   }
00326   virtual ContainedObject* containedObject ( long index ) const
00327   {
00328     if ( 0 > index || !(index < (long) size () ) ) { return 0 ; }    // RETURN
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 ; }                           // RETURN
00341     TYPE* _obj = dynamic_cast<TYPE*> ( object ) ;
00342     if ( 0 == _obj   ) { return -1 ; }                           // RETURN
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 ; }                          // RETURN
00355     const size_type pos = _i - begin() ;
00356     m_data.erase ( _i ) ;
00357     return pos ;                                                // RETURN
00358   }
00359   // ==========================================================================
00360 private:
00361   // ==========================================================================
00362   // the actual data
00363   ConstVector m_data ; // the actual data
00364   // ==========================================================================
00365 };
00366 // ============================================================================
00367 // The END
00368 // ============================================================================
00369 #endif // GAUDIKERNEL_SHAREDOBJECTSCONTAINER_H
00370 // ============================================================================
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines

Generated at Mon Sep 17 2012 13:49:32 for Gaudi Framework, version v23r4 by Doxygen version 1.7.2 written by Dimitri van Heesch, © 1997-2004