parametersystem.hpp
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3/*
4 This file is part of the Open Porous Media project (OPM).
5
6 OPM is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 2 of the License, or
9 (at your option) any later version.
10
11 OPM is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with OPM. If not, see <http://www.gnu.org/licenses/>.
18
19 Consult the COPYING file in the top-level source directory of this
20 module for the precise wording of the license and the list of
21 copyright holders.
22*/
32#ifndef OPM_PARAMETER_SYSTEM_HPP
33#define OPM_PARAMETER_SYSTEM_HPP
34
35#include <dune/common/classname.hh>
36
37#include <cstring>
38#include <functional>
39#include <limits>
40#include <set>
41#include <sstream>
42#include <string>
43#include <type_traits>
44#include <vector>
45
46namespace Opm::Parameters {
47
48namespace detail {
49
50template <typename, class = void>
51struct has_name : public std::false_type {};
52
53template <typename T>
54struct has_name<T, std::void_t<decltype(std::declval<T>().name)>>
55: public std::true_type {};
56
58template<class Parameter>
60{
61 if constexpr (has_name<Parameter>::value) {
62 return Parameter::name;
63 } else {
64 std::string paramName = Dune::className<Parameter>();
65 paramName.replace(0, std::strlen("Opm::Parameters::"), "");
66 const auto pos = paramName.find_first_of('<');
67 if (pos != std::string::npos) {
68 paramName.erase(pos);
69 }
70 return paramName;
71 }
72}
73
75template<class ParamType>
76ParamType Get_(const std::string& paramName, ParamType defaultValue,
77 bool errorIfNotRegistered);
78
80void Hide_(const std::string& paramName);
81
83bool HideIfRegistered_(const std::string& paramName);
84
86bool IsSet_(const std::string& paramName, bool errorIfNotRegistered);
87
89void Register_(const std::string& paramName,
90 const std::string& paramTypeName,
91 const std::string& defaultValue,
92 const char* usageString);
93
95void SetDefault_(const std::string& paramName,
96 const std::string& paramValue);
97
98}
99
101
112void printUsage(const std::string& helpPreamble,
113 std::ostream& os,
114 const std::string& errorMsg = "",
115 const bool showAll = false);
116
118using PositionalArgumentCallback = std::function<int(std::function<void(const std::string&,
119 const std::string&)>,
120 std::set<std::string>&,
121 std::string&,
122 int,
123 const char**,
124 int,
125 int)>;
143std::string
145 const char **argv,
146 const PositionalArgumentCallback& posArgCallback,
147 const std::string& helpPreamble = "");
148
155bool parseParameterFile(const std::string& fileName, bool overwrite = true);
156
163void printValues(std::ostream& os);
164
173bool printUnused(std::ostream& os);
174
190template <class Param>
191auto Get(bool errorIfNotRegistered = true)
192{
193 using ParamType = std::conditional_t<std::is_same_v<decltype(Param::value),
194 const char* const>, std::string,
195 std::remove_const_t<decltype(Param::value)>>;
196 ParamType defaultValue = Param::value;
197 return detail::Get_(detail::getParamName<Param>(),
198 defaultValue, errorIfNotRegistered);
199}
200
215template <class Param>
216void SetDefault(decltype(Param::value) new_value)
217{
218 const std::string paramName = detail::getParamName<Param>();
219 std::ostringstream oss;
220 // full precision: the default stream setting of 6 significant digits
221 // silently corrupts values on the text round trip
222 if constexpr (std::is_floating_point_v<decltype(Param::value)>) {
223 oss.precision(std::numeric_limits<decltype(Param::value)>::max_digits10);
224 }
225 oss << new_value;
226 detail::SetDefault_(paramName, oss.str());
227}
228
233{
234 Parameter(const std::string& k, const std::string& v)
235 : key(k), value(v)
236 {}
237
238 friend std::ostream& operator<<(std::ostream& os, const Parameter& param)
239 {
240 os << param.key << "=\"" << param.value << '"';
241 return os;
242 }
243
244 bool operator==(const Parameter& setting) const
245 {
246 return setting.key == key
247 && setting.value == value;
248 }
249
250 bool operator !=(const Parameter& setting) const
251 {
252 return !(*this == setting);
253 }
254
255 std::string key, value;
256};
257
264void getLists(std::vector<Parameter>& usedParams,
265 std::vector<Parameter>& unusedParams);
266
270void reset();
271
278template <class Param>
279bool IsSet(bool errorIfNotRegistered = true)
280{
281 return detail::IsSet_(detail::getParamName<Param>(), errorIfNotRegistered);
282}
283
300template <class Param>
301void Register(const char* usageString)
302{
303 const std::string paramName = detail::getParamName<Param>();
304 const auto defaultValue = Param::value;
305 using ParamType = std::conditional_t<std::is_same_v<decltype(defaultValue),
306 const char* const>, std::string,
307 std::remove_const_t<decltype(defaultValue)>>;
308
309 std::ostringstream oss;
310 oss << defaultValue;
311 detail::Register_(paramName, Dune::className<ParamType>(), oss.str(), usageString);
312}
313
319template <class Param>
320void Hide()
321{
322 detail::Hide_(detail::getParamName<Param>());
323}
324
330template <class Param>
332{
333 return detail::HideIfRegistered_(detail::getParamName<Param>());
334}
335
341
351
352} // namespace Opm::Parameters
353
354#endif // OPM_PARAMETER_SYSTEM_HPP
bool IsSet_(const std::string &paramName, bool errorIfNotRegistered)
Private implementation.
bool HideIfRegistered_(const std::string &paramName)
Private implementation.
ParamType Get_(const std::string &paramName, ParamType defaultValue, bool errorIfNotRegistered)
Private implementation.
auto getParamName()
get the name data member of a parameter
Definition: parametersystem.hpp:59
void Register_(const std::string &paramName, const std::string &paramTypeName, const std::string &defaultValue, const char *usageString)
Private implementation.
void SetDefault_(const std::string &paramName, const std::string &paramValue)
Private implementation.
void Hide_(const std::string &paramName)
Private implementation.
Definition: blackoilnewtonmethodparams.hpp:31
std::function< int(std::function< void(const std::string &, const std::string &)>, std::set< std::string > &, std::string &, int, const char **, int, int)> PositionalArgumentCallback
Callback function for command line parsing.
Definition: parametersystem.hpp:125
std::string parseCommandLineOptions(int argc, const char **argv, const PositionalArgumentCallback &posArgCallback, const std::string &helpPreamble="")
Parse the parameters provided on the command line.
void printValues(std::ostream &os)
Print values of the run-time parameters.
void SetDefault(decltype(Param::value) new_value)
Set a runtime parameter.
Definition: parametersystem.hpp:216
bool IsSet(bool errorIfNotRegistered=true)
Returns true if a parameter has been specified at runtime, false otherwise.
Definition: parametersystem.hpp:279
bool HideIfRegistered()
Indicate that a given parameter should not be mentioned in the help message if present.
Definition: parametersystem.hpp:331
void Register(const char *usageString)
Register a run-time parameter.
Definition: parametersystem.hpp:301
bool IsRegistrationOpen()
Query whether parameter registration is open or not.
void endRegistration()
Indicate that all parameters are registered for a given type tag.
bool parseParameterFile(const std::string &fileName, bool overwrite=true)
Read the parameters from an INI-style file.
void getLists(std::vector< Parameter > &usedParams, std::vector< Parameter > &unusedParams)
Retrieves the lists of parameters specified at runtime and their values.
void printUsage(const std::string &helpPreamble, std::ostream &os, const std::string &errorMsg="", const bool showAll=false)
Print a usage message for all run-time parameters.
void reset()
Reset parameter system.
void Hide()
Indicate that a given parameter should not be mentioned in the help message.
Definition: parametersystem.hpp:320
bool printUnused(std::ostream &os)
Print the list of unused run-time parameters.
auto Get(bool errorIfNotRegistered=true)
Retrieve a runtime parameter.
Definition: parametersystem.hpp:191
A struct holding the key-value pair for a parameter.
Definition: parametersystem.hpp:233
bool operator==(const Parameter &setting) const
Definition: parametersystem.hpp:244
std::string key
Definition: parametersystem.hpp:255
std::string value
Definition: parametersystem.hpp:255
Parameter(const std::string &k, const std::string &v)
Definition: parametersystem.hpp:234
bool operator!=(const Parameter &setting) const
Definition: parametersystem.hpp:250
friend std::ostream & operator<<(std::ostream &os, const Parameter &param)
Definition: parametersystem.hpp:238
Definition: parametersystem.hpp:51