FairRoot
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
IOPolicy.h
Go to the documentation of this file.
1 #ifndef IOPOLICY_H
2 #define IOPOLICY_H
3 
4 #include <memory>
5 
6 namespace fair {
7 namespace mq {
8 namespace policy {
9 
10 // PassTypes
12 {};
14 {};
15 struct ValueType
16 {};
18 {};
20 {};
21 
22 // PassType
23 template<typename flag, typename T>
25 
26 // PassType
27 template<typename T>
29 {
30  using Type = T*;
31 };
32 
33 // PassType
34 template<typename T>
36 {
37  using Type = T&;
38 };
39 
40 // PassType
41 template<typename T>
43 {
44  using Type = T;
45 };
46 
47 // PassType
48 template<typename T>
50 {
51  using Type = std::unique_ptr<T>;
52 };
53 
54 // PassType
55 template<typename T>
57 {
58  using Type = std::shared_ptr<T>;
59 };
60 
61 // AllocatorType
63 {
64  template<typename T, typename... Args>
65  static void CreateImpl(T*& input, Args&&... args)
66  {
67  input = new T(std::forward<Args>(args)...);
68  }
69 };
70 
71 // AllocatorType
73 {
74  template<typename T, typename... Args>
75  static void CreateImpl(T*& input, [[gnu::unused]] Args&&... args)
76  {
77  input = nullptr;
78  }
79 };
80 
81 // AllocatorType
83 {
84  template<typename... Args>
85  static void CreateImpl([[gnu::unused]] Args&&... args)
86  {}
87 };
88 
89 // AllocatorType
90 template<typename Deleter>
92 {
93  template<typename T, typename... Args>
94  static void CreateImpl(std::unique_ptr<T>& input, Args&&... args)
95  {
96  input = std::unique_ptr<T>(new T(std::forward<Args>(args)...), Deleter());
97  }
98 
99  template<typename T, typename... Args>
100  static void CreateImpl(std::shared_ptr<T>& input, Args&&... args)
101  {
102  input = std::shared_ptr<T>(new T(std::forward<Args>(args)...), Deleter());
103  }
104 };
105 
106 // InitializerType
108 {
109  template<typename T, typename... Args>
110  static void InitializeImpl(T*& input, [[gnu::unused]] Args&&... args)
111  {
112  input = nullptr;
113  }
114  template<typename T, typename... Args>
115  static void InitializeImpl(std::unique_ptr<T>& input, [[gnu::unused]] Args&&... args)
116  {
117  input = nullptr;
118  }
119  template<typename T, typename... Args>
120  static void InitializeImpl(std::shared_ptr<T>& input, [[gnu::unused]] Args&&... args)
121  {
122  input = nullptr;
123  }
124 };
125 
126 // InitializerType
128 {
129  template<typename... Args>
130  static void InitializeImpl([[gnu::unused]] Args&&... args)
131  {}
132 };
133 
134 // DeleterType
136 {
137  template<typename... Args>
138  static void DestroyImpl([[gnu::unused]] Args&&... args)
139  {}
140 };
141 
142 // DeleterType
144 {
145  template<typename T>
146  static void DestroyImpl(T* input)
147  {
148  delete input;
149  input = nullptr;
150  }
151 };
152 
153 // Input Policy
154 template<typename Deserializer,
155  typename Data,
156  typename PassType,
157  typename AllocatorType,
158  typename InitializerType,
159  typename DeleterType>
160 class InputPolicy : public Deserializer
161 {
162  public:
163  InputPolicy(const InputPolicy&) = delete;
164  InputPolicy operator=(const InputPolicy&) = delete;
165 
166  using DeserializerType = Deserializer;
168 
170  : Deserializer()
171  , fInput()
172  {
173  InitializerType::InitializeImpl(fInput);
174  }
175 
176  template<typename... Args>
177  void Create(Args&&... args)
178  {
179  AllocatorType::CreateImpl(fInput, std::forward<Args>(args)...);
180  }
181 
182  protected:
183  virtual ~InputPolicy() { DeleterType::DestroyImpl(fInput); }
184 
186 };
187 
188 // Output Policy
189 template<typename Serializer,
190  typename Data,
191  typename PassType,
192  typename AllocatorType,
193  typename InitializerType,
194  typename DeleterType>
195 class OutputPolicy : public Serializer
196 {
197  public:
198  using SerializerType = Serializer;
200 
202  : Serializer()
203  {
204  InitializerType::InitializeImpl(fOutput);
205  }
206 
207  template<typename... Args>
208  void Create(Args&&... args)
209  {
210  AllocatorType::CreateImpl(fOutput, std::forward<Args>(args)...);
211  }
212 
213  protected:
214  ~OutputPolicy() { DeleterType::DestroyImpl(fOutput); }
215 
217 };
218 
219 } // namespace policy
220 } // namespace mq
221 } // namespace fair
222 
223 #endif // IOPOLICY_H
typename SelectPassType< PassType, Data >::Type DataType
Definition: IOPolicy.h:167
void Create(Args &&...args)
Definition: IOPolicy.h:177
static void InitializeImpl([[gnu::unused]] Args &&...args)
Definition: IOPolicy.h:130
static void DestroyImpl(T *input)
Definition: IOPolicy.h:146
static void CreateImpl(std::unique_ptr< T > &input, Args &&...args)
Definition: IOPolicy.h:94
static void InitializeImpl(std::unique_ptr< T > &input, [[gnu::unused]] Args &&...args)
Definition: IOPolicy.h:115
static void CreateImpl(std::shared_ptr< T > &input, Args &&...args)
Definition: IOPolicy.h:100
static void InitializeImpl(std::shared_ptr< T > &input, [[gnu::unused]] Args &&...args)
Definition: IOPolicy.h:120
void Create(Args &&...args)
Definition: IOPolicy.h:208
typename SelectPassType< PassType, Data >::Type DataType
Definition: IOPolicy.h:199
static void DestroyImpl([[gnu::unused]] Args &&...args)
Definition: IOPolicy.h:138
static void CreateImpl(T *&input, [[gnu::unused]] Args &&...args)
Definition: IOPolicy.h:75
Deserializer DeserializerType
Definition: IOPolicy.h:166
InputPolicy operator=(const InputPolicy &)=delete
static void CreateImpl(T *&input, Args &&...args)
Definition: IOPolicy.h:65
static void CreateImpl([[gnu::unused]] Args &&...args)
Definition: IOPolicy.h:85
static void InitializeImpl(T *&input, [[gnu::unused]] Args &&...args)
Definition: IOPolicy.h:110