1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
#ifndef FWCore_ServiceRegistry_ServiceMaker_h
#define FWCore_ServiceRegistry_ServiceMaker_h
// -*- C++ -*-
//
// Package: ServiceRegistry
// Class : ServiceMaker
//
/**\class ServiceMaker ServiceMaker.h FWCore/ServiceRegistry/interface/ServiceMaker.h
Description: Used to make an instance of a Service
Usage:
<usage>
*/
//
// Original Author: Chris Jones
// Created: Mon Sep 5 13:33:00 EDT 2005
//
// user include files
#include "FWCore/ParameterSet/interface/ParameterSetDescriptionFillerPluginFactory.h"
#include "FWCore/ServiceRegistry/interface/ServiceMakerBase.h"
#include "FWCore/ServiceRegistry/interface/ServicePluginFactory.h"
#include "FWCore/ServiceRegistry/interface/ServiceWrapper.h"
#include "FWCore/ServiceRegistry/interface/ServicesManager.h"
#include "FWCore/Utilities/interface/stringize.h"
// system include files
#include <memory>
#include <typeinfo>
// forward declarations
namespace edm {
class ActivityRegistry;
class ParameterSet;
namespace serviceregistry {
template <typename T, typename TConcrete>
struct MakerBase {
typedef T interface_t;
typedef TConcrete concrete_t;
};
template <typename T, typename TConcrete = T>
struct AllArgsMaker : public MakerBase<T, TConcrete> {
std::unique_ptr<T> make(ParameterSet const& iPS, ActivityRegistry& iAR) const {
return std::make_unique<TConcrete>(iPS, iAR);
}
};
template <typename T, typename TConcrete = T>
struct ParameterSetMaker : public MakerBase<T, TConcrete> {
std::unique_ptr<T> make(ParameterSet const& iPS, ActivityRegistry& /* iAR */) const {
return std::make_unique<TConcrete>(iPS);
}
};
template <typename T, typename TConcrete = T>
struct NoArgsMaker : public MakerBase<T, TConcrete> {
std::unique_ptr<T> make(ParameterSet const& /* iPS */, ActivityRegistry& /* iAR */) const {
return std::make_unique<TConcrete>();
}
};
template <typename T, typename TMaker = AllArgsMaker<T> >
class ServiceMaker : public ServiceMakerBase {
public:
ServiceMaker() {}
ServiceMaker(ServiceMaker const&) = delete;
ServiceMaker const& operator=(ServiceMaker const&) = delete;
// ---------- const member functions ---------------------
std::type_info const& serviceType() const override { return typeid(T); }
bool make(ParameterSet const& iPS, ActivityRegistry& iAR, ServicesManager& oSM) const override {
TMaker maker;
std::unique_ptr<T> pService(maker.make(iPS, iAR));
auto ptr = std::make_shared<ServiceWrapper<T> >(std::move(pService));
return oSM.put(ptr);
}
bool saveConfiguration() const override {
return ServiceMakerBase::testSaveConfiguration(static_cast<typename TMaker::concrete_t const*>(nullptr));
}
bool processWideService() const override {
return service::isProcessWideService(static_cast<typename TMaker::concrete_t const*>(nullptr));
}
};
} // namespace serviceregistry
} // namespace edm
#define DEFINE_FWK_SERVICE(type) \
DEFINE_EDM_PLUGIN( \
edm::serviceregistry::ServicePluginFactory, edm::serviceregistry::ServiceMaker<type>, EDM_STRINGIZE(type)); \
DEFINE_DESC_FILLER_FOR_SERVICES(type, type)
#define DEFINE_FWK_SERVICE_MAKER(concrete, maker) \
typedef edm::serviceregistry::ServiceMaker<maker::interface_t, maker> concrete##__t; \
DEFINE_EDM_PLUGIN(edm::serviceregistry::ServicePluginFactory, concrete##__t, #concrete); \
typedef maker::concrete_t concrete##___t; \
DEFINE_DESC_FILLER_FOR_SERVICES(concrete, concrete##___t)
#endif
|