Ariles
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
defaults.h
Go to the documentation of this file.
1 /**
2  @file
3  @author Alexander Sherikov
4 
5  @copyright 2017-2020 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 #include <limits>
14 #include "common.h"
15 
16 /**
17 @defgroup defaults Defaults (PreRead)
18 
19 @brief Initializes entries to their default values.
20 */
21 
22 namespace ariles2
23 {
24  /// @ingroup defaults
25  namespace defaults
26  {
28  {
29  public:
32 
33  public:
34  explicit Parameters(const bool override_parameters = true) : visitor::Parameters(override_parameters)
35  {
36 #ifdef ARILES2_DEFAULT_DOUBLE_VALUE
37  default_double_value_ = ARILES2_DEFAULT_DOUBLE_VALUE;
38 #else
39  default_double_value_ = std::numeric_limits<double>::signaling_NaN();
40 #endif
41 
42 #ifdef ARILES2_DEFAULT_FLOAT_VALUE
43  default_float_value_ = ARILES2_DEFAULT_FLOAT_VALUE;
44 #else
45  default_float_value_ = std::numeric_limits<float>::signaling_NaN();
46 #endif
47  }
48 
49  template <typename t_Scalar>
50  inline t_Scalar getDefault() const
51  {
52  if constexpr (std::is_same_v<double, t_Scalar>)
53  {
54  return default_double_value_;
55  }
56  if constexpr (std::is_same_v<float, t_Scalar>)
57  {
58  return default_float_value_;
59  }
60  if constexpr (std::is_same_v<bool, t_Scalar>)
61  {
62  return false;
63  }
64  if constexpr (std::is_same_v<std::string, t_Scalar>)
65  {
66  return "";
67  }
68  return 0;
69  }
70  };
71 
72 
73  class Visitor : public ariles2::visitor::Base<Visitor, defaults::Parameters>
74  {
75  public:
77 
78 
79  public:
80  template <class t_Entry>
81  void visit(t_Entry &entry, const std::string &name, const Parameters &param) const
82  {
84  this->visitMapEntry(entry, name, param);
85  }
86 
87  template <class t_Entry>
88  void visit(t_Entry &entry, const std::vector<std::string> &subtree, const Parameters &param) const
89  {
90  visit(entry, subtree.empty() ? "" : subtree.back(), param);
91  }
92 
93 
94  template <class t_Entry>
95  void visitMapEntry(t_Entry &entry, const std::string &name, const Parameters &param) const
96  {
97  CPPUT_UNUSED_ARG(name);
99  CPPUT_TRACE_VALUE(name);
100  CPPUT_TRACE_TYPE(entry);
101  apply_defaults(*this, entry, param);
102  }
103  };
104 
105 
107 
108 
109 #define ARILES2_NAMED_ENTRY_defaults(v, entry, name) visitor.visitMapEntry(entry, #name, parameters);
110 #define ARILES2_PARENT_defaults(v, entry)
111 #define ARILES2_VISIT_defaults \
112  template <class t_Visitor> /* cppcheck-suppress duplInheritedMember */ \
113  void arilesVisit( \
114  const t_Visitor &visitor, \
115  const typename t_Visitor::Parameters &parameters, \
116  ARILES2_IS_BASE_ENABLER(ariles2::defaults::Visitor, t_Visitor)) \
117  { \
118  CPPUT_TRACE_FUNCTION; \
119  CPPUT_UNUSED_ARG(visitor); \
120  CPPUT_UNUSED_ARG(parameters); \
121  arilesVisitParents(visitor, parameters); \
122  ARILES2_ENTRIES(defaults) \
123  }
124 
125 #define ARILES2_METHODS_defaults ARILES2_METHODS(defaults, const, ARILES2_EMPTY_MACRO)
126 #define ARILES2_BASE_METHODS_defaults ARILES2_BASE_METHODS(defaults)
127  } // namespace defaults
128 
129  /**
130  * @ingroup defaults
131  * @{
132  */
134  /// @}
135 } // namespace ariles2
Parameters(const bool override_parameters=true)
Definition: defaults.h:34
t_Scalar getDefault() const
Definition: defaults.h:50
void visit(t_Entry &entry, const std::vector< std::string > &subtree, const Parameters &param) const
Definition: defaults.h:88
void visitMapEntry(t_Entry &entry, const std::string &name, const Parameters &param) const
Definition: defaults.h:95
void visit(t_Entry &entry, const std::string &name, const Parameters &param) const
Definition: defaults.h:81
#define CPPUT_UNUSED_ARG(parameter)
Definition: misc.h:19
visitor::Parameters Parameters
Definition: count.h:26
void apply_defaults(const t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::defaults::Base, t_Entry))
Definition: basic.h:232
Definition: basic.h:17
#define CPPUT_TRACE_FUNCTION
Definition: trace.h:126
#define CPPUT_TRACE_TYPE(type)
Definition: trace.h:128
#define CPPUT_TRACE_VALUE(value)
Definition: trace.h:127