4#ifndef ExpressionParsing_PlainAccessor_h_
5#define ExpressionParsing_PlainAccessor_h_
9#include "GaudiKernel/EventContext.h"
25 template <
typename T_src>
28 std::size_t
size(
const std::vector<T_src> &cont)
const {
33 T_src
get(
const std::vector<T_src> &cont)
const {
39 T_src
get(
const std::vector<T_src> &cont, std::size_t idx)
const {
57 template <
typename T_src>
60 std::size_t
size(
const T_src &cont)
const {
66 T_src
get(
const T_src &cont)
const {
72 T_src
get(
const T_src &cont, std::size_t idx)
const {
96 virtual std::unique_ptr<IAccessor>
createAccessor(
const std::any &handle_key)
const = 0;
97 virtual bool registerReadKey(std::unordered_map<std::string, std::any > &read_keys,
99 const std::string &var_name,
100 std::vector<Gaudi::DataHandle *> &new_input_handles,
106 std::stringstream
msg;
107 msg <<
"Failed to add read handle key for " << var_name;
108 throw std::runtime_error(
msg.str());
111 template <
class T_Cont>
114 const std::string &var_name,
115 std::vector<Gaudi::DataHandle *> &new_input_handles,
118 const auto &[mapIterator, inserted] = read_keys.try_emplace(var_name, std::move(key));
120 if ( mapIterator->first == var_name
121 && mapIterator->second.type().hash_code() ==
typeid(key).hash_code()) {
130 if (parent.declare(*key_final).isFailure()) {
136 std::cout <<
"DEBUG PlainAccessorFactory::registerReadKey register read handle key for " << var_name <<
" [" <<
typeid(T_Cont).name() <<
"]."<< std::endl;
141 template <
typename T, IProxyLoader::VariableType T_variable_type>
144 virtual std::unique_ptr<IAccessor>
createAccessor(
const std::any &handle_key)
const override {
147 return std::make_unique<GenAccessor<std::vector<T>,
155 const std::string &var_name,
156 std::vector<Gaudi::DataHandle *> &new_input_handles,
161 template <
typename T, IProxyLoader::VariableType T_variable_type>
164 virtual std::unique_ptr<IAccessor>
createAccessor(
const std::any &handle_key)
const override {
175 const std::string &var_name,
176 std::vector<Gaudi::DataHandle *> &new_input_handles,
182 template <
typename T,IProxyLoader::VariableType T_variable_type>
187 template <
typename T,IProxyLoader::VariableType T_variable_type>
209 kit_iter=
m_kits.find(handle_key.type().hash_code());
210 if (kit_iter ==
m_kits.end()) {
211 std::stringstream
msg;
212 msg <<
"ExpressionParsing::PlainAccessorFactory: no kit for type " << handle_key.type().name();
213 throw std::runtime_error(
msg.str());
215 return kit_iter->second->createAccessor(handle_key);
218 const std::type_info &the_type,
220 const std::string &var_name,
221 std::vector<Gaudi::DataHandle *> &new_input_handles,
224 kit_iter=
m_kits.find(the_type.hash_code());
225 if (kit_iter ==
m_kits.end()) {
227 std::cout <<
"DEBUG PlainAccessorFactory::createReadKey no matching kit for " << the_type.name() <<
" " << the_type.hash_code() << std::endl;
228 for (
const std::pair<
const std::size_t,std::unique_ptr<IKit> > &elm :
m_kits) {
229 std::cout <<
"DEBUG PlainAccessorFactory::createReadKey have " << elm.first << std::endl;
234 return kit_iter->second->registerReadKey(read_keys, parent, var_name, new_input_handles,
verbose);
237 std::unordered_map<std::size_t,std::unique_ptr<IKit> >
m_kits;
Property holding a SG store/key/clid from which a ReadHandle is made.
Handle class for reading from StoreGate.
Generic accessor to access xAOD object content.
virtual bool registerReadKey(std::unordered_map< std::string, std::any > &read_keys, SGxAODProxyLoader::IParentHelper &parent, const std::string &var_name, std::vector< Gaudi::DataHandle * > &new_input_handles, bool verbose) const =0
virtual std::unique_ptr< IAccessor > createAccessor(const std::any &handle_key) const =0
virtual std::unique_ptr< IAccessor > createAccessor(const std::any &handle_key) const override
virtual bool registerReadKey(std::unordered_map< std::string, std::any > &read_keys, SGxAODProxyLoader::IParentHelper &parent, const std::string &var_name, std::vector< Gaudi::DataHandle * > &new_input_handles, bool verbose) const override
virtual std::unique_ptr< IAccessor > createAccessor(const std::any &handle_key) const override
virtual bool registerReadKey(std::unordered_map< std::string, std::any > &read_keys, SGxAODProxyLoader::IParentHelper &parent, const std::string &var_name, std::vector< Gaudi::DataHandle * > &new_input_handles, bool verbose) const override
static bool registerReadKey(std::unordered_map< std::string, std::any > &read_keys, SGxAODProxyLoader::IParentHelper &parent, const std::string &var_name, std::vector< Gaudi::DataHandle * > &new_input_handles, bool verbose)
void registerStdVectorKit()
static void throwFailedToAddHandle(const std::string &var_name)
bool registerReadKey(std::unordered_map< std::string, std::any > &read_keys, const std::type_info &the_type, SGxAODProxyLoader::IParentHelper &parent, const std::string &var_name, std::vector< Gaudi::DataHandle * > &new_input_handles, bool verbose=false)
void registerPlainValueKit()
std::unordered_map< std::size_t, std::unique_ptr< IKit > > m_kits
std::unique_ptr< IAccessor > createAccessor(const std::any &handle_key) const
Auxiliary class to create the corresponding auxiliary helper object.
PlainValueHelper< T_src > create(const EventContext &ctx, SG::ReadHandle< T_src > &handle) const
std::size_t size(const T_src &cont) const
T_src get(const T_src &cont) const
Get the scalar provided by the container.
T_src get(const T_src &cont, std::size_t idx) const
Get the specified element of the vector provided by the container.
Interface of an auxiliary class to pass the parent, e.g.
Auxiliary class to handle scalar like containers (AuxElement).
Auxiliary class to create the corresponding auxiliary helper object.
StdVectorHelper< T_src > create(const EventContext &ctx, SG::ReadHandle< std::vector< T_src > > &handle) const
Auxiliary class to handle method calls of "scalar" containers (AuxElement).
T_src get(const std::vector< T_src > &cont) const
Get the scalar provided by the container.
std::size_t size(const std::vector< T_src > &cont) const
T_src get(const std::vector< T_src > &cont, std::size_t idx) const
Get the specified element of the vector provided by the container.
Auxiliary class to handle vector like containers (AuxVectorBase).
Namespace holding all the expression evaluation code.
void initializeHandle(T_Key *key, std::vector< Gaudi::DataHandle * > &new_input_handles)
Auxiliary function to initialize newly create data handles.
void dumpDeclare(const T *key)
Function for debugging which dumps information about newly declared data handles.