Ariles
types.h
Go to the documentation of this file.
1 /**
2  @file
3  @author Alexander Sherikov
4 
5  @copyright 2019 Alexander Sherikov, Licensed under the Apache License, Version 2.0.
6  (see @ref LICENSE or http://www.apache.org/licenses/LICENSE-2.0)
7 
8  @brief
9 */
10 
11 #pragma once
12 
13 namespace ariles2
14 {
15  template <template <class> class t_Pointer, class t_Base, class t_Instantiator>
17  {
18 #define ARILES2_ENTRIES(v) \
19  ARILES2_TYPED_ENTRY_(v, id, std::string) \
20  ARILES2_TYPED_ENTRY_(v, value, t_Pointer<t_Base>)
21 #include ARILES2_INITIALIZE
22 
23  protected:
24  bool isConsistent() const
25  {
26  if (("" != id_) && (NULL != value_.get()))
27  {
28  return (true);
29  }
30 
31  if (("" == id_) && (NULL == value_.get()))
32  {
33  return (true);
34  }
35 
36  return (false);
37  }
38 
39 
40  public:
41  Any()
42  {
43  ariles2::apply<ariles2::Defaults>(*this);
44  }
45 
46 
47  explicit Any(const std::string &id)
48  {
49  build(id);
50  }
51 
52 
53  void build(const std::string &id)
54  {
55  id_ = id;
56  value_ = t_Instantiator::instantiate(id_);
57  ARILES2_ASSERT(NULL != value_.get(), "Could not instantiate class.");
58  }
59 
60 
61  bool isInitialized() const
62  {
63  return ("" != id_ && NULL != value_.get());
64  }
65 
66 
67  /// @{
68  /**
69  * @brief Cast methods are potentially dangerous, no id checks are
70  * performed. If value is not initialized the returned pointer may
71  * be NULL.
72  */
73  template <class t_Derived>
74  t_Derived *cast()
75  {
76  return (dynamic_cast<t_Derived *>(value_.get()));
77  }
78 
79 
80  template <class t_Derived>
81  const t_Derived *cast() const
82  {
83  return (dynamic_cast<const t_Derived *>(value_.get()));
84  }
85  /// @}
86 
87 
88  /// @{
89  /**
90  * @brief These casts succeed if the Ariles config section id
91  * matches the given string.
92  */
93  template <class t_Derived>
94  t_Derived *cast(const std::string &config_section_id)
95  {
96  if (true == isInitialized())
97  {
98  if (config_section_id == value_->arilesDefaultID())
99  {
100  return (dynamic_cast<t_Derived *>(value_.get()));
101  }
102  }
103  return (NULL);
104  }
105 
106 
107  template <class t_Derived>
108  const t_Derived *cast(const std::string &config_section_id) const
109  {
110  if (true == isInitialized())
111  {
112  if (config_section_id == value_->arilesDefaultID())
113  {
114  return (dynamic_cast<t_Derived *>(value_.get()));
115  }
116  }
117  return (NULL);
118  }
119  /// @}
120 
121 
122  t_Base *operator->()
123  {
124  ARILES2_ASSERT(true == isInitialized(), "Not initialized");
125  return (value_.get());
126  }
127 
128 
129  const t_Base *operator->() const
130  {
131  ARILES2_ASSERT(true == isInitialized(), "Not initialized");
132  return (value_.get());
133  }
134 
135 
136  t_Base &operator*()
137  {
138  ARILES2_ASSERT(true == isInitialized(), "Not initialized");
139  return (*value_);
140  }
141 
142 
143  const t_Base &operator*() const
144  {
145  ARILES2_ASSERT(true == isInitialized(), "Not initialized");
146  return (*value_);
147  }
148 
149 
150  // Ariles methods
151 
152  void arilesVisit(ariles2::Write &visitor, const ariles2::Write::Parameters &param) const
153  {
154  ARILES2_TRACE_FUNCTION;
155  ARILES2_ASSERT(
156  true == isConsistent(),
157  "Could not write config: entry is in an inconsistent (partially initialized) state.");
158 
159  visitor.visitMapEntry(id_, "id", param);
160  if (true == isInitialized())
161  {
162  visitor.visitMapEntry(*value_, "value", param);
163  }
164  }
165 
166 
167  void arilesVisit(ariles2::Read &visitor, const ariles2::Read::Parameters &parameters)
168  {
169  ARILES2_TRACE_FUNCTION;
170 
171  if (true == visitor.visitMapEntry(id_, "id", parameters))
172  {
173  if ("" == id_)
174  {
175  ARILES2_ASSERT(true == parameters.allow_missing_entries_, "Id is empty, value cannot be read.");
176  }
177  else
178  {
179  build(id_);
180  visitor.visitMapEntry(*value_, "value", parameters, true);
181  }
182  }
183  }
184 
185 
187  {
188  ARILES2_TRACE_FUNCTION;
189  if (true == isInitialized())
190  {
191  value_->arilesVirtualVisit(visitor, param);
192  }
193  }
194 
195 
197  {
198  ARILES2_TRACE_FUNCTION;
199  if (true == isInitialized())
200  {
201  value_->arilesVirtualVisit(visitor, param);
202  }
203  }
204 
205 
207  {
208  ARILES2_TRACE_FUNCTION;
209  if (true == isInitialized())
210  {
211  value_->arilesVirtualVisit(visitor, param);
212  }
213  }
214  };
215 } // namespace ariles2
216 
217 
218 namespace ariles2
219 {
220  template <class t_Pointer>
222  {
223 #include ARILES2_INITIALIZE
224 
225  public:
226  typedef t_Pointer BasePointer;
227  typedef PointerHandler<t_Pointer> Handler;
228 
229 
230  public:
231  t_Pointer value_;
232 
233 
234  public:
236  {
237  ariles2::apply<ariles2::Defaults>(*this);
238  }
239 
240  NonNullPointer(const t_Pointer &value)
241  {
242  value_ = value;
243  }
244 
245  NonNullPointer(const typename Handler::Value &value)
246  {
247  Handler::allocate(value_);
248  *value_ = value;
249  }
250 
251  virtual ~NonNullPointer()
252  {
253  }
254 
255 
256 
257  NonNullPointer &operator=(const t_Pointer &value)
258  {
259  value_ = value;
260  return (*this);
261  }
262 
263  operator BasePointer &()
264  {
265  return (value_);
266  }
267 
268  operator const BasePointer &() const
269  {
270  return (value_);
271  }
272 
273 
274  typename Handler::Value *operator->() const
275  {
276  ARILES2_ASSERT(false == isNull(), "Not initialized");
277  return (value_.get());
278  }
279 
280 
281  typename Handler::Value &operator*() const
282  {
283  ARILES2_ASSERT(false == isNull(), "Not initialized");
284  return (*value_);
285  }
286 
287 
288  const typename Handler::Value *get() const
289  {
290  return (value_.get());
291  }
292 
293  typename Handler::Value *get()
294  {
295  return (value_.get());
296  }
297 
298 
299  void arilesVisit(ariles2::Write &writer, const ariles2::Write::Parameters &parameters) const
300  {
301  ARILES2_TRACE_FUNCTION;
302  ARILES2_ASSERT(false == isNull(), "Could not write config: entry is not initialized");
303  value_->arilesVirtualVisit(writer, parameters);
304  }
305 
306 
307  void arilesVisit(ariles2::Read &reader, const ariles2::Read::Parameters &parameters)
308  {
309  ARILES2_TRACE_FUNCTION;
310  ARILES2_ASSERT(false == isNull(), "Not initialized");
311  value_->arilesVirtualVisit(reader, parameters);
312  }
313 
314 
316  {
317  ARILES2_TRACE_FUNCTION;
318  ARILES2_ASSERT(false == isNull(), "Not initialized");
319  value_->arilesVirtualVisit(visitor, param);
320  }
321 
323  {
324  ARILES2_TRACE_FUNCTION;
325  if (false == isNull())
326  {
327  value_->arilesVirtualVisit(visitor, param);
328  }
329  }
330 
332  {
333  ARILES2_TRACE_FUNCTION;
334  Handler::allocate(value_);
335  value_->arilesVirtualVisit(visitor, param);
336  }
337 
338 
339  std::size_t arilesVisit(const ariles2::Count &visitor, const ariles2::Count::Parameters &param) const
340  {
341  ARILES2_TRACE_FUNCTION;
342  ARILES2_ASSERT(false == isNull(), "Not initialized");
343  return (value_->arilesVirtualVisit(visitor, param));
344  }
345 
346 
347  bool isNull() const
348  {
349  return (Handler::isNull(value_));
350  }
351 
352 
353 #ifdef ARILES2_METHODS_compare
354  template <class t_Other>
355  void arilesVisit(ariles2::Compare &visitor, const t_Other &other, const ariles2::Compare::Parameters &param)
356  const
357  {
358  ARILES2_TRACE_FUNCTION;
359  value_->arilesVisit(visitor, *other.value_, param);
360  }
361 #endif
362 
363 #ifdef ARILES2_METHODS_copyto
364  template <class t_Other>
365  void arilesVisit(ariles2::CopyTo &visitor, t_Other &other, const ariles2::CopyTo::Parameters &param) const
366  {
367  ARILES2_TRACE_FUNCTION;
368  ariles2::copyto::apply_copyto(visitor, value_, other, param);
369  }
370 #endif
371 
372 #ifdef ARILES2_METHODS_copyfrom
373  template <class t_Other>
374  void arilesVisit(ariles2::CopyFrom &visitor, const t_Other &other, const ariles2::CopyFrom::Parameters &param)
375  {
376  ARILES2_TRACE_FUNCTION;
377  ariles2::copyfrom::apply_copyfrom(visitor, value_, other, param);
378  }
379 #endif
380 
381 #ifdef ARILES2_METHODS_graphviz
382  void arilesVisit(ariles2::Graphviz &writer, const ariles2::Graphviz::Parameters &parameters) const
383  {
384  ARILES2_TRACE_FUNCTION;
385  ARILES2_ASSERT(false == isNull(), "Could not write config: entry is not initialized");
386  value_->arilesVirtualVisit(writer, parameters);
387  }
388 #endif
389  };
390 } // namespace ariles2
ariles2::Any::Any
Any()
Definition: types.h:41
ariles2::copyfrom::apply_copyfrom
void ARILES2_VISIBILITY_ATTRIBUTE apply_copyfrom(t_Visitor &visitor, t_Left &left, const t_Right &right, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::Ariles, t_Left))
Definition: basic.h:323
ariles2
Definition: basic.h:16
ariles2::write::Visitor
Definition: write.h:367
ariles2::compare::Visitor
Definition: compare.h:67
ariles2::Any
Definition: types.h:16
ariles2::defaults::Visitor
Definition: defaults.h:57
ariles2::NonNullPointer::operator*
Handler::Value & operator*() const
Definition: types.h:281
ariles2::NonNullPointer::BasePointer
t_Pointer BasePointer
Definition: types.h:226
ariles2::compare::Parameters
Definition: compare.h:27
ariles2::NonNullPointer::arilesVisit
void arilesVisit(const ariles2::Finalize &visitor, const ariles2::Finalize::Parameters &param)
Definition: types.h:315
ariles2::NonNullPointer::arilesVisit
void arilesVisit(const ariles2::PreWrite &visitor, const ariles2::PreWrite::Parameters &param)
Definition: types.h:322
ariles2::Any::arilesVisit
void arilesVisit(ariles2::Read &visitor, const ariles2::Read::Parameters &parameters)
Definition: types.h:167
ariles2::Any::operator->
t_Base * operator->()
Definition: types.h:122
ariles2::ns_graphviz::Visitor
Definition: graphviz.h:107
ariles2::copyto::Parameters
Definition: copyto.h:26
ariles2::Any::cast
t_Derived * cast()
Cast methods are potentially dangerous, no id checks are performed. If value is not initialized the r...
Definition: types.h:74
ariles2::NonNullPointer::arilesVisit
void arilesVisit(ariles2::Write &writer, const ariles2::Write::Parameters &parameters) const
Definition: types.h:299
ariles2::NonNullPointer::get
Handler::Value * get()
Definition: types.h:293
ariles2::read::Visitor
Definition: read.h:44
ariles2::prewrite::Parameters
Definition: prewrite.h:28
ariles2::Any::isInitialized
bool isInitialized() const
Definition: types.h:61
ariles2::NonNullPointer::isNull
bool isNull() const
Definition: types.h:347
ariles2::serialization::Base< Visitor, Parameters >::Parameters
Parameters Parameters
Definition: serialization.h:144
ariles2::Any::operator->
const t_Base * operator->() const
Definition: types.h:129
ariles2::NonNullPointer::arilesVisit
std::size_t arilesVisit(const ariles2::Count &visitor, const ariles2::Count::Parameters &param) const
Definition: types.h:339
ariles2::Any::cast
const t_Derived * cast() const
Definition: types.h:81
ariles2::prewrite::Visitor
Definition: prewrite.h:37
ariles2::read::Visitor::visitMapEntry
bool visitMapEntry(t_Entry &entry, const std::string &name, const Parameters &param, const bool override_missing_entries_locally=false)
Definition: read.h:455
ariles2::NonNullPointer::get
const Handler::Value * get() const
Definition: types.h:288
ariles2::NonNullPointer
Definition: types.h:221
ariles2::Any::cast
const t_Derived * cast(const std::string &config_section_id) const
Definition: types.h:108
ariles2::finalize::Parameters
Definition: finalize.h:28
ariles2::copyfrom::Parameters
Definition: copyfrom.h:26
ariles2::Any::build
void build(const std::string &id)
Definition: types.h:53
ariles2::DefaultBase
Definition: ariles.h:66
ARILES2_VISIBILITY_ATTRIBUTE
#define ARILES2_VISIBILITY_ATTRIBUTE
Definition: helpers.h:138
ariles2::NonNullPointer::operator->
Handler::Value * operator->() const
Definition: types.h:274
ariles2::NonNullPointer::arilesVisit
void arilesVisit(ariles2::Read &reader, const ariles2::Read::Parameters &parameters)
Definition: types.h:307
ariles2::Any::arilesVisit
void arilesVisit(const ariles2::PreWrite &visitor, const ariles2::PreWrite::Parameters &param)
Definition: types.h:196
ariles2::count::Visitor
Definition: count.h:35
ariles2::copyfrom::Visitor
Definition: copyfrom.h:39
ariles2::NonNullPointer::NonNullPointer
NonNullPointer()
Definition: types.h:235
ariles2::write::VisitorBase::visitMapEntry
void visitMapEntry(const t_Entry &entry, const std::string &entry_name, const t_Parameters &param)
Definition: write.h:323
ariles2::Any::operator*
t_Base & operator*()
Definition: types.h:136
ariles2::finalize::Visitor
Definition: finalize.h:37
ariles2::NonNullPointer::NonNullPointer
NonNullPointer(const typename Handler::Value &value)
Definition: types.h:245
ariles2::Any::arilesVisit
void arilesVisit(ariles2::Write &visitor, const ariles2::Write::Parameters &param) const
Definition: types.h:152
ariles2::Any::cast
t_Derived * cast(const std::string &config_section_id)
These casts succeed if the Ariles config section id matches the given string.
Definition: types.h:94
ariles2::count::Parameters
Definition: count.h:26
ariles2::Any::isConsistent
bool isConsistent() const
Definition: types.h:24
ariles2::NonNullPointer::NonNullPointer
NonNullPointer(const t_Pointer &value)
Definition: types.h:240
ariles2::Any::Any
Any(const std::string &id)
Definition: types.h:47
ariles2::Any::arilesVisit
void arilesVisit(const ariles2::Defaults &visitor, const ariles2::Defaults::Parameters &param)
Definition: types.h:206
ariles2::NonNullPointer::operator=
NonNullPointer & operator=(const t_Pointer &value)
Definition: types.h:257
ariles2::NonNullPointer::~NonNullPointer
virtual ~NonNullPointer()
Definition: types.h:251
ariles2::copyto::Visitor
Definition: copyto.h:39
ariles2::Any::operator*
const t_Base & operator*() const
Definition: types.h:143
ariles2::Any::arilesVisit
void arilesVisit(const ariles2::Finalize &visitor, const ariles2::Finalize::Parameters &param)
Definition: types.h:186
ariles2::NonNullPointer::Handler
PointerHandler< t_Pointer > Handler
Definition: types.h:227
ariles2::NonNullPointer::value_
t_Pointer value_
Definition: types.h:231
ariles2::copyto::apply_copyto
void ARILES2_VISIBILITY_ATTRIBUTE apply_copyto(t_Visitor &visitor, const t_Left &left, t_Right &right, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::Ariles, t_Left))
Definition: basic.h:369
ariles2::NonNullPointer::arilesVisit
void arilesVisit(const ariles2::Defaults &visitor, const ariles2::Defaults::Parameters &param)
Definition: types.h:331
ariles2::defaults::Parameters
Definition: defaults.h:27