| # Gaudi Framework, version v20r3
Generated: 24 Nov 2008

# ToolHandle.h

Go to the documentation of this file.

    00001 #ifndef GAUDIKERNEL_TOOLHANDLE_H
    00002 #define GAUDIKERNEL_TOOLHANDLE_H
    00003
    00004 //Includes
    00005 #include "GaudiKernel/GaudiHandle.h"
    00006 #include "GaudiKernel/ServiceHandle.h"
    00007 #include "GaudiKernel/IToolSvc.h"
    00008 #include "GaudiKernel/INamedInterface.h"
    00009
    00010 #include <string>
    00011 #include <vector>
    00012 #include <stdexcept>
    00013
    00014 // class predeclarations
    00015 class IInterface;
    00016 class IAlgTool;
    00017 class IToolSvc;
    00018
    00020 class ToolHandleInfo {
    00021 protected:
    00022   ToolHandleInfo( const IInterface* parent = 0, bool createIf = true )
    00023     : m_parent(parent), m_createIf(createIf)
    00024     {}
    00025
    00026 public:
    00027   virtual ~ToolHandleInfo() {};
    00028
    00029   bool isPublic() const {
    00030      return !m_parent;
    00031   }
    00032
    00033   bool createIf() const {
    00034      return m_createIf;
    00035   }
    00036
    00037   const IInterface* parent() const {
    00038      return m_parent;
    00039   }
    00040
    00041   //
    00042   // Some helper functions
    00043   //
    00044   const std::string toolComponentType( const IInterface* parent ) const {
    00045     return parent ? "PrivateTool" : "PublicTool";
    00046   }
    00047
    00048   const std::string toolParentName( const IInterface* parent ) const {
    00049     if (parent) {
    00050       const INamedInterface* pNamed = dynamic_cast<const INamedInterface*>(parent);
    00051       if (pNamed) {
    00052         return pNamed->name();
    00053       } else {
    00054         return "";
    00055       }
    00056     } else {
    00057       return "ToolSvc";
    00058     }
    00059   }
    00060
    00061 private:
    00062   const IInterface* m_parent;
    00063   bool m_createIf;
    00064 };
    00065
    00076 template< class T >
    00077 class ToolHandle : public ToolHandleInfo, public GaudiHandle<T> {
    00078 public:
    00079   //
    00080   // Constructors etc.
    00081   //
    00085   ToolHandle( const IInterface* parent = 0, bool createIf = true )
    00086     : ToolHandleInfo(parent,createIf),
    00087       GaudiHandle<T>( GaudiHandle<T>::getDefaultType(),
    00088                       ToolHandleInfo::toolComponentType(parent),
    00089                       ToolHandleInfo::toolParentName(parent) ),
    00090       m_pToolSvc( "ToolSvc", GaudiHandleBase::parentName() )
    00091   {}
    00092
    00110   ToolHandle( const std::string& toolTypeAndName, const IInterface* parent = 0, bool createIf = true )
    00111     : ToolHandleInfo(parent,createIf),
    00112       GaudiHandle<T>( toolTypeAndName,
    00113                       ToolHandleInfo::toolComponentType(parent),
    00114                       ToolHandleInfo::toolParentName(parent) ),
    00115       m_pToolSvc( "ToolSvc", GaudiHandleBase::parentName() )
    00116   {}
    00117
    00120   StatusCode retrieve() const { // not really const, because it updates m_pObject
    00121     return GaudiHandle<T>::retrieve();
    00122   }
    00123
    00126   StatusCode release() const { // not really const, because it updates m_pObject
    00127     return GaudiHandle<T>::release();
    00128   }
    00129
    00131   virtual StatusCode retrieve( T*& algTool ) const {
    00132     return m_pToolSvc->retrieve( GaudiHandleBase::typeAndName(), T::interfaceID(),
    00133                                  (IAlgTool*&)(algTool),
    00134                                  ToolHandleInfo::parent(), ToolHandleInfo::createIf() );
    00135   }
    00136
    00138   virtual StatusCode release( T* algTool ) const {
    00139     return m_pToolSvc->releaseTool( algTool );
    00140   }
    00141
    00142 private:
    00143   //
    00144   // Private data members
    00145   //
    00146   mutable ServiceHandle<IToolSvc> m_pToolSvc;
    00147 };
    00148
    00159 template < class T >
    00160 class ToolHandleArray : public ToolHandleInfo, public GaudiHandleArray< ToolHandle<T> > {
    00161 public:
    00162   //
    00163   // Constructors
    00164   //
    00171   ToolHandleArray( const std::vector< std::string >& myTypesAndNames,
    00172                    const IInterface* parent = 0, bool createIf = true )
    00173     : ToolHandleInfo( parent, createIf ),
    00174       GaudiHandleArray< ToolHandle<T> >( myTypesAndNames,
    00175                                          ToolHandleInfo::toolComponentType(parent),
    00176                                          ToolHandleInfo::toolParentName(parent) )
    00177   {}
    00178
    00183   ToolHandleArray( const IInterface* parent = 0, bool createIf = true )
    00184     : ToolHandleInfo( parent, createIf ),
    00185       GaudiHandleArray< ToolHandle<T> >( ToolHandleInfo::toolComponentType(parent),
    00186                                          ToolHandleInfo::toolParentName(parent) )
    00187   { }
    00188
    00193   virtual bool push_back( const std::string& toolTypeAndName ) {
    00194     ToolHandle<T> handle( toolTypeAndName,
    00195                           ToolHandleInfo::parent(),
    00196                           ToolHandleInfo::createIf() );
    00197     GaudiHandleArray< ToolHandle<T> >::push_back( handle );
    00198     return true;
    00199   }
    00200
    00202   virtual bool push_back( const ToolHandle<T>& myHandle ) {
    00203     return push_back( myHandle.typeAndName() );
    00204   }
    00205
    00206 };
    00207
    00208
    00209 template <class T>
    00210 inline std::ostream& operator<<( std::ostream& os, const ToolHandle<T>& handle ) {
    00211   return operator<<(os, static_cast<const GaudiHandleInfo&>(handle) );
    00212 }
    00213
    00214
    00215 template <class T>
    00216 inline std::ostream& operator<<( std::ostream& os, const ToolHandleArray<T>& handle ) {
    00217   return operator<<(os, static_cast<const GaudiHandleInfo&>(handle) );
    00218 }
    00219
    00220
    00221 #endif // ! GAUDIKERNEL_TOOLHANDLE_H