namespace simgrid {
namespace config {
-class XBT_PUBLIC missing_key_error : public std::runtime_error {
-public:
- explicit missing_key_error(const std::string& what)
- : std::runtime_error(what) {}
- explicit missing_key_error(const char* what)
- : std::runtime_error(what) {}
- ~missing_key_error() override;
-};
-
template<class T> inline
std::string to_string(T&& value)
{
// ***** alias *****
-XBT_PUBLIC void alias(const char* realname, const char* aliasname);
-
-inline
-void alias(std::initializer_list<const char*> names)
-{
- auto i = names.begin();
- for (++i; i != names.end(); ++i)
- alias(*names.begin(), *i);
-}
+XBT_PUBLIC void alias(const char* realname, std::initializer_list<const char*> aliases);
/** Bind a variable to configuration flag
*
});
}
-template<class T>
-void bindFlag(T& value, std::initializer_list<const char*> names, const char* description)
+template <class T>
+void bindFlag(T& value, const char* name, std::initializer_list<const char*> aliases, const char* description)
{
- bindFlag(value, *names.begin(), description);
- alias(names);
+ bindFlag(value, name, description);
+ alias(name, std::move(aliases));
}
/** Bind a variable to configuration flag
* </code></pre>
*/
// F is a checker, F : T& -> ()
-template<class T, class F>
-typename std::enable_if<std::is_same<
- void,
- decltype( std::declval<F>()(std::declval<const T&>()) )
->::value, void>::type
-bindFlag(T& value, std::initializer_list<const char*> names, const char* description,
- F callback)
+template <class T, class F>
+typename std::enable_if<std::is_same<void, decltype(std::declval<F>()(std::declval<const T&>()))>::value, void>::type
+bindFlag(T& value, const char* name, const char* description, F callback)
{
- bindFlag(value, *names.begin(), description);
- alias(names);
+ declareFlag(name, description, value, std::function<void(const T&)>([&value, callback](const T& val) {
+ callback(val);
+ value = std::move(val);
+ }));
}
-template<class T, class F>
-typename std::enable_if<std::is_same<
- void,
- decltype( std::declval<F>()(std::declval<const T&>()) )
->::value, void>::type
-bindFlag(T& value, const char* name, const char* description,
- F callback)
+template <class T, class F>
+typename std::enable_if<std::is_same<void, decltype(std::declval<F>()(std::declval<const T&>()))>::value, void>::type
+bindFlag(T& value, const char* name, std::initializer_list<const char*> aliases, const char* description, F callback)
{
- declareFlag(name, description, value,
- std::function<void(const T&)>([&value,callback](const T& val) {
- callback(val);
- value = std::move(val);
- }
- ));
+ bindFlag(value, name, description, std::move(callback));
+ alias(name, std::move(aliases));
}
+
template <class T, class F>
typename std::enable_if<std::is_same<void, decltype(std::declval<F>()(std::declval<const T&>()))>::value, void>::type
bindFlag(T& value, const char* name, const char* description, std::map<T, std::string> valid_values, F callback)
bindFlag(T& value, const char* name, const char* description,
F callback)
{
- declareFlag(name, description, value,
- std::function<void(const T&)>([&value, callback](const T& val) {
- if (not callback(val))
- throw std::range_error("invalid value.");
- value = std::move(val);
- })
- );
+ declareFlag(name, description, value, std::function<void(const T&)>([&value, callback](const T& val) {
+ if (not callback(val))
+ throw std::range_error("invalid value.");
+ value = std::move(val);
+ }));
}
/** A variable bound to a CLI option
simgrid::config::bindFlag(value_, name, desc);
}
+ /** Constructor taking also an array of aliases for name */
+ Flag(const char* name, std::initializer_list<const char*> aliases, const char* desc, T value) : value_(value)
+ {
+ simgrid::config::bindFlag(value_, name, std::move(aliases), desc);
+ }
+
/* A constructor accepting a callback that will be passed the parameter.
* It can either return a boolean (informing whether the parameter is valid), or returning void.
*/