cMHN 1.1
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
parameter.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_PARAMETER_PARAMETER_H
4#define pRC_CORE_PARAMETER_PARAMETER_H
5
6#include <cstdlib>
7#include <cstring>
8
12
13namespace pRC
14{
15 template<Context C, class T, Size SA, Size SN, Size SD>
16 class Parameter;
17
18 template<class T, Size SA, Size SN, Size SD>
20 {
21 public:
23 using Type = T;
24
25 public:
26 template<class A, class N, class D,
30 Parameter(A &&argument, N &&name, D &&description, T const &value)
31 : mArgument(forward<A>(argument))
32 , mName(forward<N>(name))
33 , mDescription(forward<D>(description))
34 , mValue(value)
35 {
36 }
37
38 constexpr auto &argument() const
39 {
40 return mArgument;
41 }
42
43 constexpr auto &name() const
44 {
45 return mName;
46 }
47
48 constexpr auto &description() const
49 {
50 return mDescription;
51 }
52
53 constexpr auto &value() const
54 {
55 return mValue;
56 }
57
58 constexpr auto operator()() const
59 {
60 return value();
61 }
62
63 constexpr operator T() const
64 {
65 return value();
66 }
67
68 private:
69 String<SA> const mArgument;
70 String<SN> const mName;
71 String<SD> const mDescription;
72 T mValue;
73 };
74
75 template<class T, Size SA, Size SN, Size SD>
77 {
78 public:
80 using Type = T;
81
82 public:
83 template<class A, class N, class D,
87 Parameter(A &&argument, N &&name, D &&description)
88 : mArgument(forward<A>(argument))
89 , mName(forward<N>(name))
90 , mDescription(forward<D>(description))
91 {
92 }
93
94 template<class A, class N, class D,
98 Parameter(A &&argument, N &&name, D &&description,
99 T const &defaultValue)
100 : mArgument(forward<A>(argument))
101 , mName(forward<N>(name))
102 , mDescription(forward<D>(description))
103 , mValue(defaultValue)
104 , mSet(true)
105 {
106 }
107
108 template<class A, class N, class D,
112 Parameter(A &&argument, N &&name, D &&description,
113 T (*convert)(char const *const))
114 : mArgument(forward<A>(argument))
115 , mName(forward<N>(name))
116 , mDescription(forward<D>(description))
117 , mConvert(convert)
118 {
119 }
120
121 template<class A, class N, class D,
125 Parameter(A &&argument, N &&name, D &&description,
126 T (*convert)(char const *const), T const &defaultValue)
127 : mArgument(forward<A>(argument))
128 , mName(forward<N>(name))
129 , mDescription(forward<D>(description))
130 , mValue(defaultValue)
131 , mSet(true)
132 , mConvert(convert)
133 {
134 }
135
136 constexpr auto &argument() const
137 {
138 return mArgument;
139 }
140
141 constexpr auto &name() const
142 {
143 return mName;
144 }
145
146 constexpr auto &description() const
147 {
148 return mDescription;
149 }
150
151 constexpr auto &value() const
152 {
153 if(!mSet)
154 {
155 Logging::error("Accessing non-set value of parameter", name());
156 }
157 return mValue;
158 }
159
160 constexpr auto &isSet() const
161 {
162 return mSet;
163 }
164
165 constexpr auto parseValue(char const *const value)
166 {
167 mValue = mConvert(value);
168 mSet = true;
169 }
170
171 constexpr auto operator()() const
172 {
173 return value();
174 }
175
176 constexpr operator T() const
177 {
178 return value();
179 }
180
181 private:
182 String<SA> const mArgument;
183 String<SN> const mName;
184 String<SD> const mDescription;
185 T mValue;
186 Bool mSet = false;
187
188 T(*mConvert)
189 (char const *const) = [](char const *const value) -> T {
190 if constexpr(IsFloat<T>())
191 {
192 return std::atof(value);
193 }
194 else if constexpr(IsIntegral<T>() || IsInteger<T>())
195 {
196 return std::atoll(value);
197 }
198 else if constexpr(IsBool<T>())
199 {
200 return std::strcmp(value, "true") == 0;
201 }
202 else
203 {
204 return value;
205 }
206 };
207 };
208
209 template<Context C, class T, class A, class N, class D,
214 0>
215 static inline constexpr auto parameter(A &&argument, N &&name,
216 D &&description, T const &defaultValue)
217 {
218 using SA = decltype(String(declval<A>()));
219 using SN = decltype(String(declval<N>()));
220 using SD = decltype(String(declval<D>()));
221
223 forward<A>(argument), forward<N>(name), forward<D>(description),
225 }
226
227 template<Context C, class T, class A, class N, class D,
231 If<IsSatisfied<(C == Context::RunTime)>> = 0>
232 static inline constexpr auto parameter(A &&argument, N &&name,
233 D &&description)
234 {
235 using SA = decltype(String(declval<A>()));
236 using SN = decltype(String(declval<N>()));
237 using SD = decltype(String(declval<D>()));
238
240 forward<A>(argument), forward<N>(name), forward<D>(description));
241 }
242
243 template<Context C, class T, class A, class N, class D,
247 If<IsSatisfied<(C == Context::RunTime)>> = 0>
248 static inline constexpr auto parameter(A &&argument, N &&name,
249 D &&description, T (*convert)(char const *const))
250 {
251 using SA = decltype(String(declval<A>()));
252 using SN = decltype(String(declval<N>()));
253 using SD = decltype(String(declval<D>()));
254
256 forward<A>(argument), forward<N>(name), forward<D>(description),
257 convert);
258 }
259
260 template<Context C, class T, class A, class N, class D,
264 If<IsSatisfied<(C == Context::RunTime)>> = 0>
265 static inline constexpr auto parameter(A &&argument, N &&name,
266 D &&description, T (*convert)(char const *const), T const &defaultValue)
267 {
268 using SA = decltype(String(declval<A>()));
269 using SN = decltype(String(declval<N>()));
270 using SD = decltype(String(declval<D>()));
271
273 forward<A>(argument), forward<N>(name), forward<D>(description),
275 }
276}
277#endif // pRC_CORE_PARAMETER_PARAMETER_H
pRC::Size const D
Definition CalculatePThetaTests.cpp:9
Constant< pRC::Context, pRC::Context::CompileTime > Context
Definition parameter.hpp:22
constexpr auto & name() const
Definition parameter.hpp:43
constexpr auto & description() const
Definition parameter.hpp:48
Parameter(A &&argument, N &&name, D &&description, T const &value)
Definition parameter.hpp:30
constexpr auto & argument() const
Definition parameter.hpp:38
constexpr auto operator()() const
Definition parameter.hpp:58
constexpr auto & value() const
Definition parameter.hpp:53
Parameter(A &&argument, N &&name, D &&description, T const &defaultValue)
Definition parameter.hpp:98
constexpr auto & isSet() const
Definition parameter.hpp:160
constexpr auto & name() const
Definition parameter.hpp:141
constexpr auto & value() const
Definition parameter.hpp:151
Constant< pRC::Context, pRC::Context::RunTime > Context
Definition parameter.hpp:79
constexpr auto & description() const
Definition parameter.hpp:146
constexpr auto operator()() const
Definition parameter.hpp:171
Parameter(A &&argument, N &&name, D &&description, T(*convert)(char const *const), T const &defaultValue)
Definition parameter.hpp:125
constexpr auto parseValue(char const *const value)
Definition parameter.hpp:165
Parameter(A &&argument, N &&name, D &&description)
Definition parameter.hpp:87
Parameter(A &&argument, N &&name, D &&description, T(*convert)(char const *const))
Definition parameter.hpp:112
constexpr auto & argument() const
Definition parameter.hpp:136
Definition parameter.hpp:16
Definition string.hpp:19
pRC::Float<> T
Definition externs_nonTT.hpp:1
static void error(Xs &&...args)
Definition log.hpp:14
Definition cholesky.hpp:18
bool Bool
Definition type_traits.hpp:18
static constexpr auto makeConstantSequence()
Definition sequence.hpp:402
std::enable_if_t< B{}, int > If
Definition type_traits.hpp:68
Constant< Bool, B > IsSatisfied
Definition type_traits.hpp:71
static constexpr auto name()
Definition type_name.hpp:11
Context
Definition context.hpp:9
std::integral_constant< T, V > Constant
Definition type_traits.hpp:34
static constexpr auto parameter(A &&argument, N &&name, D &&description, T const &defaultValue)
Definition parameter.hpp:215
String(char const &) -> String< 1 >
Definition type_traits.hpp:16