The Gaudi Framework  v40r0 (475e45c1)
ToolHandle< T > Class Template Reference

#include <GaudiKernel/ToolHandle.h>

Inheritance diagram for ToolHandle< T >:
Collaboration diagram for ToolHandle< T >:

Public Member Functions

 ToolHandle (const IInterface *parent=nullptr, bool createIf=true)
 Constructor for a tool with default tool type and name. More...
 
template<typename CT = T, typename NCT = std::remove_const_t<T>>
 requires (std::is_const_v< CT > &&!std::is_same_v< CT, NCT >) ToolHandle(const ToolHandle< NCT > &other)
 Copy constructor from a non const T to const T tool handle. More...
 
 ToolHandle (const std::string &toolTypeAndName, const IInterface *parent=nullptr, bool createIf=true)
 Create a handle ('smart pointer') to a tool. More...
 
template<std::derived_from< IProperty > OWNER>
 ToolHandle (OWNER *owner, std::string propName, std::string toolType, std::string doc="")
 Autodeclaring constructor with property propName, tool type/name and documentation. More...
 
template<typename... Args>
 ToolHandle (std::tuple< Args... > &&args)
 
StatusCode initialize (const std::string &toolTypeAndName, const IInterface *parent=nullptr, bool createIf=true)
 
StatusCode retrieve () const override
 Retrieve the AlgTool. More...
 
StatusCode retrieve (DisableTool sd) override
 
StatusCode retrieve (EnableTool sd) override
 
StatusCode release () const
 Release the AlgTool. More...
 
StatusCode retrieve (T *&algTool) const override
 Do the real retrieval of the AlgTool. More...
 
StatusCode release (T *algTool) const override
 Do the real release of the AlgTool. More...
 
std::string typeAndName () const override
 
std::add_const_t< T > * get () const
 
T * get ()
 
- Public Member Functions inherited from BaseToolHandle
StatusCode retrieve (IAlgTool *&tool) const
 
const IAlgTool * get () const
 
IAlgTool * get ()
 
bool isEnabled () const
 Helper to check if the ToolHandle should be retrieved. More...
 
void enable ()
 
void disable ()
 
bool setEnabled (bool flag)
 
- Public Member Functions inherited from ToolHandleInfo
virtual ~ToolHandleInfo ()=default
 
bool isPublic () const noexcept
 
bool createIf () const noexcept
 
const IInterface * parent () const noexcept
 
- Public Member Functions inherited from GaudiHandle< T >
template<typename CT = T, typename NCT = std::remove_const_t<T>>
 GaudiHandle (const GaudiHandle< NCT > &other) requires(std
 Copy constructor needed for correct ref-counting. More...
 
 GaudiHandle (const GaudiHandle &other)
 Copy constructor needed for correct ref-counting. More...
 
template<typename CT = T, typename NCT = std::remove_const_t<T>>
 requires (std::is_const_v< CT > &&!std::is_same_v< CT, NCT >) GaudiHandle &operator
 Assignment operator for correct ref-counting. More...
 
- Public Member Functions inherited from GaudiHandleBase
const std::string & typeAndName () const
 The full type and name: "type/name". More...
 
std::string type () const
 The concrete component class name: the part before the '/'. More...
 
std::string name () const
 The instance name: the part after the '/'. More...
 
bool empty () const
 Check if the handle has been set to empty string (i.e. More...
 
void setTypeAndName (std::string myTypeAndName)
 The component "type/name" string. More...
 
void setName (std::string_view myName)
 Set the instance name (part after the '/') without changing the class type. More...
 
std::string pythonPropertyClassName () const override
 Name of the componentType with "Handle" appended. More...
 
std::string messageName () const
 name used for printing messages More...
 
std::string pythonRepr () const override
 Python representation of handle, i.e. More...
 
- Public Member Functions inherited from GaudiHandleInfo
virtual ~GaudiHandleInfo ()
 virtual destructor so that derived class destructor is called. More...
 
const std::string & componentType () const
 
const std::string & propertyName () const
 name as used in declareProperty(name,gaudiHandle) More...
 
void setPropertyName (std::string propName)
 set name as used in declareProperty(name,gaudiHandle). More...
 
const std::string & parentName () const
 The name of the parent. More...
 

Protected Member Functions

const IAlgTool * getAsIAlgTool () const override
 
IAlgTool * getAsIAlgTool () override
 
StatusCode i_retrieve (IAlgTool *&algTool) const override
 
- Protected Member Functions inherited from BaseToolHandle
 BaseToolHandle (const IInterface *parent=nullptr, bool createIf=true)
 
- Protected Member Functions inherited from ToolHandleInfo
 ToolHandleInfo (const IInterface *parent=nullptr, bool createIf=true)
 
- Protected Member Functions inherited from GaudiHandle< T >
 GaudiHandle (std::string myTypeAndName, std::string myComponentType, std::string myParentName)
 
- Protected Member Functions inherited from GaudiHandleBase
 GaudiHandleBase (std::string myTypeAndName, std::string myComponentType, std::string myParentName)
 Create a handle ('smart pointer') to a gaudi component. More...
 
- Protected Member Functions inherited from GaudiHandleInfo
 GaudiHandleInfo (std::string myComponentType, std::string myParentName)
 Some basic information and helper functions shared between various handles/arrays. More...
 
void setComponentType (std::string componentType)
 The component type. More...
 
void setParentName (std::string parent)
 The name of the parent. More...
 

Private Member Functions

template<typename... Args, std::size_t... Is>
 ToolHandle (std::tuple< Args... > &&args, std::index_sequence< Is... >)
 

Private Attributes

ServiceHandle< IToolSvc > m_pToolSvc
 

Friends

class Gaudi::Algorithm
 
class AlgTool
 
class Service
 
std::ostream & operator<< (std::ostream &os, const ToolHandle< T > &handle)
 

Additional Inherited Members

- Public Types inherited from GaudiHandleBase
using PropertyType = GaudiHandleProperty
 
- Static Public Member Functions inherited from ToolHandleInfo
static std::string toolComponentType (const IInterface *parent)
 
static std::string toolParentName (const IInterface *parent)
 
- Protected Attributes inherited from BaseToolHandle
bool m_enabled = true
 
- Protected Attributes inherited from ToolHandleInfo
const IInterface * m_parent = nullptr
 
bool m_createIf { true }
 

Detailed Description

template<class T>
class ToolHandle< T >

Handle to be used in lieu of naked pointers to tools. This allows better control through the framework of tool loading and usage. @paramater T is the AlgTool interface class (or concrete class) of the tool to use, and must derive from IAlgTool.

Author
Wim Lavrijsen WLavr.nosp@m.ijse.nosp@m.n@lbl.nosp@m..gov
Marti.nosp@m.n.Wo.nosp@m.udstr.nosp@m.a@ce.nosp@m.rn.ch

Definition at line 130 of file ToolHandle.h.

Constructor & Destructor Documentation

◆ ToolHandle() [1/5]

template<class T >
template<typename... Args, std::size_t... Is>
ToolHandle< T >::ToolHandle ( std::tuple< Args... > &&  args,
std::index_sequence< Is... >   
)
inlineprivate

Definition at line 137 of file ToolHandle.h.

138  : ToolHandle( std::get<Is>( std::move( args ) )... ) {}

◆ ToolHandle() [2/5]

template<class T >
ToolHandle< T >::ToolHandle ( const IInterface *  parent = nullptr,
bool  createIf = true 
)
inline

Constructor for a tool with default tool type and name.

Can be called only if the type T is a concrete tool type (not an interface), and you want to use the default name.

Definition at line 144 of file ToolHandle.h.

◆ ToolHandle() [3/5]

template<class T >
ToolHandle< T >::ToolHandle ( const std::string &  toolTypeAndName,
const IInterface *  parent = nullptr,
bool  createIf = true 
)
inline

Create a handle ('smart pointer') to a tool.

The arguments are passed on to ToolSvc, and have the same meaning:

StatusCode ToolSvc::retrieveTool ( const std::string& type ,
T*& tool ,
const IInterface* parent = 0 ,
bool createIf = true )
Parameters
ownerclass owning the ToolHandle
toolType"MyToolType/MyToolName" "MyToolType" is short for "MyToolType/MyToolType" 'MyToolType' is the name of the class of the concrete tool 'MyToolName' is to distinguish several tool instances of the same class
parentthe parent Algorithm,Tool or Service of which this tool is a member. If non-zero, the the tool is a private tool of the parent, otherwise it is a public (shared) tool.
createIfif true, create tool if not yet existing.

Definition at line 188 of file ToolHandle.h.

190  , GaudiHandle<T>( toolTypeAndName, toolComponentType( parent ), toolParentName( parent ) )
191  , m_pToolSvc( "ToolSvc", GaudiHandleBase::parentName() ) {
192  }

◆ ToolHandle() [4/5]

template<class T >
template<std::derived_from< IProperty > OWNER>
ToolHandle< T >::ToolHandle ( OWNER *  owner,
std::string  propName,
std::string  toolType,
std::string  doc = "" 
)
inline

Autodeclaring constructor with property propName, tool type/name and documentation.

Note
the use of requires is required to avoid ambiguities

Definition at line 197 of file ToolHandle.h.

197  : ToolHandle( owner ) {
198  // convert name and type to a valid type/name string
199  // - if type does not contain '/' use type/type
200  // - otherwise type is already a type/name string
201  if ( !toolType.empty() and toolType.find( '/' ) == std::string::npos ) { toolType += '/' + toolType; }
202  owner->declareTool( *this, std::move( toolType ) ).ignore();
203  auto p = owner->OWNER::PropertyHolderImpl::declareProperty( std::move( propName ), *this, std::move( doc ) );
204  p->template setOwnerType<OWNER>();
205  }

◆ ToolHandle() [5/5]

template<class T >
template<typename... Args>
ToolHandle< T >::ToolHandle ( std::tuple< Args... > &&  args)
inline

Definition at line 208 of file ToolHandle.h.

208 : ToolHandle( std::move( args ), std::index_sequence_for<Args...>{} ) {}

Member Function Documentation

◆ get() [1/2]

template<class T >
T* ToolHandle< T >::get ( )
inline

Definition at line 275 of file ToolHandle.h.

275 { return GaudiHandle<T>::get(); }

◆ get() [2/2]

template<class T >
std::add_const_t<T>* ToolHandle< T >::get ( ) const
inline

Definition at line 273 of file ToolHandle.h.

273 { return GaudiHandle<T>::get(); }

◆ getAsIAlgTool() [1/2]

template<class T >
const IAlgTool* ToolHandle< T >::getAsIAlgTool ( ) const
inlineoverrideprotectedvirtual

Implements BaseToolHandle.

Definition at line 282 of file ToolHandle.h.

282  {
283  // const cast to support T being const
284  return GaudiHandle<T>::get();
285  }

◆ getAsIAlgTool() [2/2]

template<class T >
IAlgTool* ToolHandle< T >::getAsIAlgTool ( )
inlineoverrideprotectedvirtual

Implements BaseToolHandle.

Definition at line 287 of file ToolHandle.h.

287  {
288  // const cast to support T being const
290  }

◆ i_retrieve()

template<class T >
StatusCode ToolHandle< T >::i_retrieve ( IAlgTool *&  algTool) const
inlineoverrideprotectedvirtual

Implements BaseToolHandle.

Definition at line 292 of file ToolHandle.h.

292  {
295  }

◆ initialize()

template<class T >
StatusCode ToolHandle< T >::initialize ( const std::string &  toolTypeAndName,
const IInterface *  parent = nullptr,
bool  createIf = true 
)
inline

Definition at line 211 of file ToolHandle.h.

212  {
213 
214  GaudiHandleBase::setTypeAndName( toolTypeAndName );
217 
218  m_parent = parent;
220 
221  return m_pToolSvc.initialize( "ToolSvc", GaudiHandleBase::parentName() );
222  }

◆ release() [1/2]

template<class T >
StatusCode ToolHandle< T >::release ( ) const
inline

Release the AlgTool.

Function must be repeated here to avoid hiding the function release( T*& )

Definition at line 250 of file ToolHandle.h.

250  { // not really const, because it updates m_pObject
251  return GaudiHandle<T>::release();
252  }

◆ release() [2/2]

template<class T >
StatusCode ToolHandle< T >::release ( T *  algTool) const
inlineoverridevirtual

Do the real release of the AlgTool.

Reimplemented from GaudiHandle< T >.

Definition at line 269 of file ToolHandle.h.

269 { return m_pToolSvc->releaseTool( ::details::nonConst( algTool ) ); }

◆ requires()

template<class T >
template<typename CT = T, typename NCT = std::remove_const_t<T>>
ToolHandle< T >::requires ( std::is_const_v< CT > &&!std::is_same_v< CT, NCT >  ) const &
inline

Copy constructor from a non const T to const T tool handle.

Definition at line 151 of file ToolHandle.h.

153  : BaseToolHandle( other.parent(), other.createIf() )
154  , GaudiHandle<CT>( other )
155  , m_pToolSvc( "ToolSvc", GaudiHandleBase::parentName() ) {}

◆ retrieve() [1/4]

template<class T >
StatusCode ToolHandle< T >::retrieve ( ) const
inlineoverridevirtual

Retrieve the AlgTool.

Release existing tool if needed. Function must be repeated here to avoid hiding the function retrieve( T*& )

Implements BaseToolHandle.

Definition at line 226 of file ToolHandle.h.

226  { // not really const, because it updates m_pObject
227  return GaudiHandle<T>::retrieve();
228  }

◆ retrieve() [2/4]

template<class T >
StatusCode ToolHandle< T >::retrieve ( DisableTool  sd)
inlineoverridevirtual

Implements BaseToolHandle.

Definition at line 230 of file ToolHandle.h.

230  {
231  if ( isEnabled() && sd == DisableTool{ false } ) {
232  return GaudiHandle<T>::retrieve();
233  } else {
234  disable();
235  return StatusCode::SUCCESS;
236  }
237  }

◆ retrieve() [3/4]

template<class T >
StatusCode ToolHandle< T >::retrieve ( EnableTool  sd)
inlineoverridevirtual

Implements BaseToolHandle.

Definition at line 239 of file ToolHandle.h.

239  {
240  if ( isEnabled() && sd == EnableTool{ true } ) {
241  return GaudiHandle<T>::retrieve();
242  } else {
243  disable();
244  return StatusCode::SUCCESS;
245  }
246  }

◆ retrieve() [4/4]

template<class T >
StatusCode ToolHandle< T >::retrieve ( T *&  algTool) const
inlineoverride

Do the real retrieval of the AlgTool.

Definition at line 255 of file ToolHandle.h.

255  {
256  IAlgTool* iface = nullptr;
257  if ( i_retrieve( iface ).isFailure() ) { return StatusCode::FAILURE; }
258 
259  algTool = dynamic_cast<T*>( iface );
260  if ( !algTool ) {
261  throw GaudiException( "unable to dcast AlgTool " + typeAndName() + " to interface " +
262  System::typeinfoName( typeid( T ) ),
263  typeAndName() + " retrieve", StatusCode::FAILURE );
264  }
265  return StatusCode::SUCCESS;
266  }

◆ typeAndName()

template<class T >
std::string ToolHandle< T >::typeAndName ( ) const
inlineoverridevirtual

Implements BaseToolHandle.

Definition at line 271 of file ToolHandle.h.

271 { return GaudiHandleBase::typeAndName(); }

Friends And Related Function Documentation

◆ AlgTool

template<class T >
friend class AlgTool
friend

Definition at line 133 of file ToolHandle.h.

◆ Gaudi::Algorithm

template<class T >
friend class Gaudi::Algorithm
friend

Definition at line 132 of file ToolHandle.h.

◆ operator<<

template<class T >
std::ostream& operator<< ( std::ostream &  os,
const ToolHandle< T > &  handle 
)
friend

Definition at line 277 of file ToolHandle.h.

277  {
278  return os << static_cast<const GaudiHandleInfo&>( handle );
279  }

◆ Service

template<class T >
friend class Service
friend

Definition at line 134 of file ToolHandle.h.

Member Data Documentation

◆ m_pToolSvc

template<class T >
ServiceHandle<IToolSvc> ToolHandle< T >::m_pToolSvc
mutableprivate

Definition at line 301 of file ToolHandle.h.


The documentation for this class was generated from the following file:
GaudiHandleInfo::parentName
const std::string & parentName() const
The name of the parent.
Definition: GaudiHandle.h:62
IAlgTool
Definition: IAlgTool.h:29
BaseToolHandle::disable
void disable()
Definition: ToolHandle.h:107
BaseToolHandle::BaseToolHandle
BaseToolHandle(const IInterface *parent=nullptr, bool createIf=true)
Definition: ToolHandle.h:81
GaudiException
Definition: GaudiException.h:29
ServiceHandle::initialize
StatusCode initialize(const std::string &serviceName, const std::string &theParentName)
Definition: ServiceHandle.h:64
GaudiPartProp.decorators.get
get
decorate the vector of properties
Definition: decorators.py:283
ToolHandleInfo::toolComponentType
static std::string toolComponentType(const IInterface *parent)
Definition: ToolHandle.h:59
System::typeinfoName
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:301
BaseToolHandle::isEnabled
bool isEnabled() const
Helper to check if the ToolHandle should be retrieved.
Definition: ToolHandle.h:99
GaudiHandleInfo::setParentName
void setParentName(std::string parent)
The name of the parent.
Definition: GaudiHandle.h:84
GaudiHandle
Definition: GaudiHandle.h:176
ToolHandleInfo::toolParentName
static std::string toolParentName(const IInterface *parent)
Definition: ToolHandle.h:61
bug_34121.tool
tool
Definition: bug_34121.py:18
GaudiHandle::release
virtual StatusCode release(T *comp) const
Release the component.
Definition: GaudiHandle.h:305
details::nonConst
std::remove_const_t< T > * nonConst(T *p)
Cast a pointer to a non const type.
Definition: GaudiHandle.h:26
StatusCode
Definition: StatusCode.h:64
Gaudi::tagged_bool_ns::tagged_bool
Definition: TaggedBool.h:15
IInterface::interfaceID
static const InterfaceID & interfaceID()
Return an instance of InterfaceID identifying the interface.
Definition: IInterface.h:234
ToolHandle::ToolHandle
ToolHandle(std::tuple< Args... > &&args, std::index_sequence< Is... >)
Definition: ToolHandle.h:137
ToolHandle::i_retrieve
StatusCode i_retrieve(IAlgTool *&algTool) const override
Definition: ToolHandle.h:292
IToolSvc::retrieve
virtual StatusCode retrieve(std::string_view type, const InterfaceID &iid, IAlgTool *&tool, const IInterface *parent=0, bool createIf=true)=0
Retrieve tool with tool dependent part of the name automatically assigned.
ToolHandle::m_pToolSvc
ServiceHandle< IToolSvc > m_pToolSvc
Definition: ToolHandle.h:301
GaudiHandleBase::type
std::string type() const
The concrete component class name: the part before the '/'.
Definition: GaudiHandle.cpp:21
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:99
gaudirun.args
args
Definition: gaudirun.py:336
ToolHandleInfo::m_parent
const IInterface * m_parent
Definition: ToolHandle.h:67
IInterface
Definition: IInterface.h:225
IToolSvc::releaseTool
virtual StatusCode releaseTool(IAlgTool *tool)=0
Release the tool.
ToolHandleInfo::m_createIf
bool m_createIf
Definition: ToolHandle.h:68
GaudiHandleInfo::setComponentType
void setComponentType(std::string componentType)
The component type.
Definition: GaudiHandle.h:81
GaudiHandleBase::typeAndName
const std::string & typeAndName() const
The full type and name: "type/name".
Definition: GaudiHandle.h:128
ToolHandle::typeAndName
std::string typeAndName() const override
Definition: ToolHandle.h:271
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:100
ToolHandleInfo::parent
const IInterface * parent() const noexcept
Definition: ToolHandle.h:53
ToolHandleInfo::createIf
bool createIf() const noexcept
Definition: ToolHandle.h:51
GaudiHandleBase::setTypeAndName
void setTypeAndName(std::string myTypeAndName)
The component "type/name" string.
Definition: GaudiHandle.cpp:19