11#include <unordered_map>
13#include <fmt/format.h>
14#include <podio/CollectionBase.h>
15#include <podio/utilities/TypeHelpers.h>
50 using FunctionType = void (*)(Visitor&,
const podio::CollectionBase&);
53 std::unordered_map<std::string_view, FunctionType> m_map;
55 template <
typename CollectionT>
56 static void visitCollection(Visitor& visitor,
const podio::CollectionBase& collection) {
57 static_assert(std::is_base_of_v<podio::CollectionBase, CollectionT>,
58 "CollectionT must be derived from podio::CollectionBase");
59 visitor(*
static_cast<const CollectionT*
>(&collection));
62 template <
typename CollectionT>
void addToMap() {
63 m_map[CollectionT::typeName] = &visitCollection<CollectionT>;
66 template <
typename DataT>
void addDataTypeToMap() { addToMap<typename DataT::collection_type>(); }
68 template <
typename... DataTypes>
69 void addAllDataCollections(podio::utils::TypeList<DataTypes...>) {
70 (addDataTypeToMap<DataTypes>(), ...);
73 template <
typename... LinkTypes>
74 void addAllLinkCollections(podio::utils::TypeList<LinkTypes...>) {
75 (addDataTypeToMap<LinkTypes>(), ...);
81 addAllDataCollections(
typename edm4hep::edm4hepDataTypes{});
82 addAllDataCollections(
typename edm4eic::edm4eicDataTypes{});
85 addAllLinkCollections(
typename edm4hep::edm4hepLinkTypes{});
86 addAllLinkCollections(
typename edm4eic::edm4eicLinkTypes{});
89 const auto&
getMap()
const {
return m_map; }
124 void operator()(Visitor& visitor,
const podio::CollectionBase& collection) {
128 auto typeName = collection.getTypeName();
129 auto it = visitorMap.
getMap().find(typeName);
131 if (it != visitorMap.
getMap().end()) {
132 it->second(visitor, collection);
134 throw std::runtime_error(fmt::format(
135 "Unrecognized podio typename: {}.\n"
136 "This type was not found in the supported datamodels (EDM4hep, EDM4eic).\n"
138 " - The type is not defined in EDM4hep or EDM4eic datamodels.\n"
139 " - You may be using an incompatible or outdated version of the datamodels.\n"
140 " - There may be a typo in the type name.\n"
141 "Please check your datamodel installation and ensure you are using compatible versions.",
Definition datamodel_glue.h:48
void(*)(Visitor &, const podio::CollectionBase &) FunctionType
Definition datamodel_glue.h:50
CollectionVisitorMap()
Definition datamodel_glue.h:79
const auto & getMap() const
Definition datamodel_glue.h:89
Definition datamodel_glue.h:23
typename T::mutable_type mutable_t
Definition datamodel_glue.h:25
typename T::collection_type collection_t
Definition datamodel_glue.h:24
Definition datamodel_glue.h:123
void operator()(Visitor &visitor, const podio::CollectionBase &collection)
Definition datamodel_glue.h:124