Go to the documentation of this file. 1 #ifndef art_Framework_Services_Registry_detail_helper_macros_h 2 #define art_Framework_Services_Registry_detail_helper_macros_h 15 #define ART_DETAIL_STRINGIZED_VALUE(value) #value 16 #define ART_DETAIL_STRINGIZED_TYPE(svc) ART_DETAIL_STRINGIZED_VALUE(svc) 19 #define DEFINE_ART_SERVICE_TYPEID(svc) \ 20 art::TypeID get_typeid() const override { return TypeID{typeid(svc)}; } 25 #define DEFINE_ART_SERVICE_SCOPE(scopeArg) \ 26 ServiceScope scope() const override { return scope_val; } \ 27 static constexpr ServiceScope scope_val{ServiceScope::scopeArg}; 29 #define DEFINE_ART_SERVICE_RETRIEVER(svc) \ 30 void* retrieve(std::shared_ptr<ServiceWrapperBase>& swb) \ 31 const final override \ 33 return &std::dynamic_pointer_cast<ServiceWrapper<svc>>(swb)->get(); \ 36 #define DEFINE_ART_SERVICE_MAKER(svc, scopeArg) \ 37 std::unique_ptr<ServiceWrapperBase> make(fhicl::ParameterSet const& pset, \ 38 ActivityRegistry& reg) \ 39 const final override \ 41 if constexpr (is_shared(ServiceScope::scopeArg) && \ 42 detail::handle_allowed_v<svc>) { \ 43 SharedResourcesRegistry::instance()->registerSharedResource( \ 44 SharedResource<svc>); \ 45 } else if constexpr (is_legacy(ServiceScope::scopeArg)) { \ 46 ensure_only_one_thread(pset); \ 48 return std::make_unique<ServiceWrapper<svc>>(pset, reg); \ 52 #define DEFINE_ART_SERVICE_HELPER_CREATE(svc) \ 53 static std::unique_ptr<ServiceHelperBase> createHelper() \ 55 return std::make_unique<ServiceHelper<svc>>(); \ 59 #define ART_DETAIL_DECLARE_SERVICE(svc, scopeArg) \ 60 namespace art::detail { \ 62 struct ServiceHelper<svc> : public ServiceImplHelper, \ 63 public ServiceLGMHelper, \ 64 public ServiceLGRHelper { \ 65 DEFINE_ART_SERVICE_TYPEID(svc) \ 66 DEFINE_ART_SERVICE_SCOPE(scopeArg) \ 67 DEFINE_ART_SERVICE_RETRIEVER(svc) \ 68 DEFINE_ART_SERVICE_MAKER(svc, scopeArg) \ 70 is_interface_impl() const override \ 78 #define ART_DETAIL_DECLARE_SERVICE_INTERFACE(iface, scopeArg) \ 79 namespace art::detail { \ 81 struct ServiceHelper<iface> : public ServiceInterfaceHelper, \ 82 public ServiceLGRHelper { \ 83 DEFINE_ART_SERVICE_TYPEID(iface) \ 84 DEFINE_ART_SERVICE_SCOPE(scopeArg) \ 85 DEFINE_ART_SERVICE_RETRIEVER(iface) \ 90 #define ART_DETAIL_DECLARE_SERVICE_INTERFACE_IMPL(svc, iface, scopeArg) \ 91 namespace art::detail { \ 93 struct ServiceHelper<svc> : public ServiceInterfaceImplHelper, \ 94 public ServiceLGMHelper, \ 95 public ServiceLGRHelper { \ 96 DEFINE_ART_SERVICE_TYPEID(svc) \ 97 DEFINE_ART_SERVICE_SCOPE(scopeArg) \ 98 DEFINE_ART_SERVICE_RETRIEVER(svc) \ 99 DEFINE_ART_SERVICE_MAKER(svc, scopeArg) \ 101 get_interface_typeid() const final override \ 103 return TypeID{typeid(iface)}; \ 105 std::unique_ptr<ServiceWrapperBase> \ 107 std::shared_ptr<ServiceWrapperBase> const& swb) const final override \ 109 return std::dynamic_pointer_cast<ServiceWrapper<svc>>(swb) \ 112 static_assert(is_shared(ServiceHelper<iface>::scope_val) || \ 113 is_legacy(ServiceHelper<svc>::scope_val), \ 114 "\n\nart error: An implementation that inherits from a " \ 115 "LEGACY interface\n" \ 116 " must be a LEGACY service\n\n"); \ 122 #define ART_DETAIL_DECLARE_SYSTEM_SERVICE(svc, scopeArg) \ 123 namespace art::detail { \ 125 struct ServiceHelper<svc> : public ServiceImplHelper, \ 126 public ServiceLGRHelper { \ 127 DEFINE_ART_SERVICE_TYPEID(svc) \ 128 DEFINE_ART_SERVICE_SCOPE(scopeArg) \ 130 is_interface_impl() const override \ 134 DEFINE_ART_SERVICE_RETRIEVER(svc) \ 139 #define DEFINE_ART_SH_CREATE(svc) DEFINE_ART_SH_CREATE_DETAIL(svc, service) 141 #define DEFINE_ART_SIH_CREATE(svc) DEFINE_ART_SH_CREATE_DETAIL(svc, iface) 143 #define DEFINE_ART_SH_CREATE_DETAIL(svc, type) \ 144 EXTERN_C_FUNC_DECLARE_START \ 145 std::unique_ptr<art::detail::ServiceHelperBase> create_##type##_helper() \ 147 return std::make_unique<art::detail::ServiceHelper<svc>>(); \ 149 EXTERN_C_FUNC_DECLARE_END