4#ifndef _ExpressionEvaluation_MethodAccessor_h_
5#define _ExpressionEvaluation_MethodAccessor_h_
15#include "TMethodCall.h"
16#include "TVirtualCollectionProxy.h"
29 template <
class T_Cont,
typename T_src>
33 : m_methodCall( method_call),
37 assert( m_methodCall.call() !=
nullptr );
43 std::size_t
size(
const T_Cont &)
const {
48 T_src
get(
const T_Cont &)
const {
56 T_src
get(
const T_Cont &, std::size_t idx)
const {
58 void *element_data=(*m_collectionProxy)[idx];
59 m_methodCall.call()->Execute(element_data, ret);
69 : m_methodCall(
std::move(method_call)),
90 template <
class T_Cont,
typename T_src>
94 : m_methodCall( method_call),
98 assert( m_methodCall.call() !=
nullptr );
101 std::size_t
size(
const T_Cont &cont)
const {
106 T_src
get(
const T_Cont &)
const {
109 m_methodCall.call()->Execute(data_nc, ret);
114 T_src
get(
const T_Cont &, [[maybe_unused]] std::size_t idx)
const {
118 m_methodCall.call()->Execute(data_nc, ret);
150 TVirtualCollectionProxy *proxy=
nullptr)
const = 0;
153 TVirtualCollectionProxy *proxy=
nullptr)
const = 0;
158 template <
class T_src>
170 TVirtualCollectionProxy *proxy)
const override {
172 std::stringstream
msg;
173 msg <<
"Cannot use method access of types SG::AuxVectorBase without a collection proxy.";
174 throw std::logic_error(
msg.str());
182 TVirtualCollectionProxy *proxy=
nullptr)
const override {
192 template <
class T_Aux,
class T_ScalarVectorHelper>
195 TVirtualCollectionProxy *proxy,
200 T_ScalarVectorHelper> >(key,
207 T_ScalarVectorHelper> >(key,
226 TVirtualCollectionProxy *proxy=
nullptr)
const {
227 return getKit(method_call).
create(key,std::move(method_call), proxy);
234 TVirtualCollectionProxy *proxy=
nullptr)
const {
235 return getKit(method_call).
create(key,std::move(method_call), proxy);
243 std::map<TMethodCall::EReturnType, std::unique_ptr<IMethodAccessorKit> >
::const_iterator
244 iter =
m_kits.find(method_call.
call()->ReturnType());
245 if (iter ==
m_kits.end()) {
246 std::stringstream
msg;
247 msg <<
"ExpressionParsing::MethodAccessorFactory: no kit for return type " << method_call.
call()->GetMethod()->GetReturnTypeNormalizedName ();
248 throw std::runtime_error(
msg.str());
250 return *(iter->second);
252 std::map<TMethodCall::EReturnType, std::unique_ptr<IMethodAccessorKit> >
m_kits;
char data[hepevt_bytes_allocation_ATLAS]
Property holding a SG store/key/clid from which a ReadHandle is made.
Handle class for reading from StoreGate.
Define macros for attributes used to control the static checker.
Auxiliary class to create the corresponding auxiliary helper object.
RootUtils::TSMethodCall m_methodCall ATLAS_THREAD_SAFE
CollectionMethodHelper< T_Cont, T_src > create(const EventContext &, SG::ReadHandle< T_Cont > &handle) const
Kit(RootUtils::TSMethodCall &&method_call, TVirtualCollectionProxy &collection_proxy)
const TVirtualCollectionProxy * m_collectionProxy
std::unique_ptr< TVirtualCollectionProxy > m_collectionProxy
RootUtils::TSMethodCall m_methodCall ATLAS_THREAD_SAFE
T_src get(const T_Cont &) const
Get the scalar provided by the container.
std::size_t size(const T_Cont &) const
CollectionMethodHelper(const RootUtils::TSMethodCall &method_call, const TVirtualCollectionProxy &collection_proxy, const void *data, unsigned int n_elements)
T_src get(const T_Cont &, std::size_t idx) const
Get the specified element of the vector provided by the container.
Generic accessor to access xAOD object content.
virtual std::unique_ptr< IAccessor > create(const SG::ReadHandleKey< SG::AuxElement > &key, RootUtils::TSMethodCall &&method_call, TVirtualCollectionProxy *proxy=nullptr) const =0
friend class MethodAccessorFactory
virtual ~IMethodAccessorKit()
virtual std::unique_ptr< IAccessor > create(const SG::ReadHandleKey< SG::AuxVectorBase > &key, RootUtils::TSMethodCall &&method_call, TVirtualCollectionProxy *proxy=nullptr) const =0
Auxiliary class to create a specific accessor which calls a method of an AuxElement or AuxVectorBase.
std::unique_ptr< IAccessor > createAccessor(const SG::ReadHandleKey< T_Aux > &key, RootUtils::TSMethodCall &&method_call, TVirtualCollectionProxy *proxy, ExpressionParsing::IProxyLoader::VariableType variable_type) const
virtual std::unique_ptr< IAccessor > create(const SG::ReadHandleKey< SG::AuxVectorBase > &key, RootUtils::TSMethodCall &&method_call, TVirtualCollectionProxy *proxy) const override
create an accessor which called the specified method of an AuxVectorBase.
virtual std::unique_ptr< IAccessor > create(const SG::ReadHandleKey< SG::AuxElement > &key, RootUtils::TSMethodCall &&method_call, TVirtualCollectionProxy *proxy=nullptr) const override
create an accessor which called the specified method of an AuxElement.
ExpressionParsing::IProxyLoader::VariableType m_scalarType
ExpressionParsing::IProxyLoader::VariableType m_vectorType
MethodAccessorKit(ExpressionParsing::IProxyLoader::VariableType scalar_type, ExpressionParsing::IProxyLoader::VariableType vector_type)
const IMethodAccessorKit & getKit(RootUtils::TSMethodCall &method_call) const
Get an specific class which creates the accessor for the given method.
std::unique_ptr< IAccessor > create(const SG::ReadHandleKey< SG::AuxVectorBase > &key, RootUtils::TSMethodCall &&method_call, TVirtualCollectionProxy *proxy=nullptr) const
Create an accessor which calls the specified method of an AuxVectorBase.
std::map< TMethodCall::EReturnType, std::unique_ptr< IMethodAccessorKit > > m_kits
std::unique_ptr< IAccessor > create(const SG::ReadHandleKey< SG::AuxElement > &key, RootUtils::TSMethodCall &&method_call, TVirtualCollectionProxy *proxy=nullptr) const
Create an accessor which calls the specified method of an AuxElement.
Auxiliary class to create the corresponding auxiliary helper object.
Kit(RootUtils::TSMethodCall &&method_call)
MethodHelper< T_Cont, T_src > create(const EventContext &, SG::ReadHandle< T_Cont > &handle) const
RootUtils::TSMethodCall m_methodCall ATLAS_THREAD_SAFE
T_src get(const T_Cont &) const
Get the scalar provided by the container.
MethodHelper(const RootUtils::TSMethodCall &method_call, const void *data)
RootUtils::TSMethodCall m_methodCall ATLAS_THREAD_SAFE
std::size_t size(const T_Cont &cont) const
T_src get(const T_Cont &, std::size_t idx) const
Get the specified element of the vector provided by the container.
Helper for making a thread-safe function call.
TMethodCall * call()
Return a pointer to the thread-specific TMethodCall.
Property holding a SG store/key/clid from which a ReadHandle is made.
const_pointer_type cptr()
Dereference the pointer.
Namespace holding all the expression evaluation code.
const SG::AuxVectorData * getVectorData(const T &cont)
std::size_t getContainerSize(const T &cont)
Convert a type_info to a normalized string representation (matching the names used in the root dictio...