cMHN 1.2
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>
19 class Parameter<Context::CompileTime, T, SA, SN, SD>
20 {
21 public:
23 using Type = T;
24
25 public:
26 template<class A, class N, class D>
27 requires IsConstructible<String<SA>, A> &&
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>
76 class Parameter<Context::RunTime, T, SA, SN, SD>
77 {
78 public:
80 using Type = T;
81
82 public:
83 template<class A, class N, class D>
84 requires IsConstructible<String<SA>, A> &&
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>
95 requires IsConstructible<String<SA>, A> &&
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>
109 requires IsConstructible<String<SA>, A> &&
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>
122 requires IsConstructible<String<SA>, A> &&
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>
210 requires(C == Context::CompileTime || C == Context::RunTime) &&
211 requires {
212 String(declval<A>());
213 String(declval<N>());
214 String(declval<D>());
215 }
216 static inline constexpr auto parameter(A &&argument, N &&name,
217 D &&description, T const &defaultValue)
218 {
219 using SA = decltype(String(declval<A>()));
220 using SN = decltype(String(declval<N>()));
221 using SD = decltype(String(declval<D>()));
222
224 forward<A>(argument), forward<N>(name), forward<D>(description),
225 defaultValue);
226 }
227
228 template<Context C, class T, class A, class N, class D>
229 requires(C == Context::CompileTime || C == Context::RunTime) &&
230 requires {
231 String(declval<A>());
232 String(declval<N>());
233 String(declval<D>());
234 }
235 static inline constexpr auto parameter(A &&argument, N &&name,
236 D &&description)
237 {
238 using SA = decltype(String(declval<A>()));
239 using SN = decltype(String(declval<N>()));
240 using SD = decltype(String(declval<D>()));
241
243 forward<A>(argument), forward<N>(name), forward<D>(description));
244 }
245
246 template<Context C, class T, class A, class N, class D>
247 requires(C == Context::RunTime) && requires {
248 String(declval<A>());
249 String(declval<N>());
250 String(declval<D>());
251 }
252 static inline constexpr auto parameter(A &&argument, N &&name,
253 D &&description, T (*convert)(char const *const))
254 {
255 using SA = decltype(String(declval<A>()));
256 using SN = decltype(String(declval<N>()));
257 using SD = decltype(String(declval<D>()));
258
260 forward<A>(argument), forward<N>(name), forward<D>(description),
261 convert);
262 }
263
264 template<Context C, class T, class A, class N, class D>
265 requires(C == Context::RunTime) && requires {
266 String(declval<A>());
267 String(declval<N>());
268 String(declval<D>());
269 }
270 static inline constexpr auto parameter(A &&argument, N &&name,
271 D &&description, T (*convert)(char const *const), T const &defaultValue)
272 {
273 using SA = decltype(String(declval<A>()));
274 using SN = decltype(String(declval<N>()));
275 using SD = decltype(String(declval<D>()));
276
278 forward<A>(argument), forward<N>(name), forward<D>(description),
279 convert, defaultValue);
280 }
281}
282#endif // pRC_CORE_PARAMETER_PARAMETER_H
pRC::Size const D
Definition CalculatePThetaTests.cpp:9
Definition value.hpp:12
Parameter(A &&argument, N &&name, D &&description, T const &value)
Definition parameter.hpp:30
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
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
Parameter(A &&argument, N &&name, D &&description)
Definition parameter.hpp:87
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))
Definition parameter.hpp:112
constexpr auto parseValue(char const *const value)
Definition parameter.hpp:165
Parameter(A &&argument, N &&name, D &&description, T(*convert)(char const *const), T const &defaultValue)
Definition parameter.hpp:125
constexpr auto & argument() const
Definition parameter.hpp:136
Definition parameter.hpp:16
Definition string.hpp:16
Definition concepts.hpp:37
Definition value.hpp:24
pRC::Float<> T
Definition externs_nonTT.hpp:1
int value
Definition gmock-actions_test.cc:1714
static void error(Xs &&...args)
Definition log.hpp:14
Definition cholesky.hpp:10
static constexpr auto parameter(A &&argument, N &&name, D &&description, T const &defaultValue)
Definition parameter.hpp:216
static constexpr auto name()
Definition type_name.hpp:11
std::integral_constant< T, V > Constant
Definition basics.hpp:38
String(char const &) -> String< 1 >
Definition gtest_pred_impl_unittest.cc:54