A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Use functions from ActorImpl when available.
[simgrid.git]
/
src
/
xbt
/
config.cpp
diff --git
a/src/xbt/config.cpp
b/src/xbt/config.cpp
index e3b4f9a385634db0ee9d621a34f05235b7a842a5..f213bb112c735b4c4a4a79fb9dd8b5e737f794c1 100644
(file)
--- a/
src/xbt/config.cpp
+++ b/
src/xbt/config.cpp
@@
-1,4
+1,4
@@
-/* Copyright (c) 2004-202
0
. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2004-202
1
. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
@@
-38,25
+38,18
@@
namespace config {
namespace {
namespace {
-const char* true_values[] = {
- "yes", "on", "true", "1"
-};
-const char* false_values[] = {
- "no", "off", "false", "0"
-};
-
-static bool parse_bool(const char* value)
+bool parse_bool(const char* value)
{
{
- for (const char*
const& true_value : true_values
)
+ for (const char*
true_value : {"yes", "on", "true", "1"}
)
if (std::strcmp(true_value, value) == 0)
return true;
if (std::strcmp(true_value, value) == 0)
return true;
- for (const char*
const& false_value : false_values
)
+ for (const char*
false_value : {"no", "off", "false", "0"}
)
if (std::strcmp(false_value, value) == 0)
return false;
throw std::range_error("not a boolean");
}
if (std::strcmp(false_value, value) == 0)
return false;
throw std::range_error("not a boolean");
}
-
static
double parse_double(const char* value)
+double parse_double(const char* value)
{
char* end;
errno = 0;
{
char* end;
errno = 0;
@@
-71,7
+64,7
@@
static double parse_double(const char* value)
return res;
}
return res;
}
-
static
long int parse_long(const char* value)
+long int parse_long(const char* value)
{
char* end;
errno = 0;
{
char* end;
errno = 0;
@@
-99,7
+92,12
@@
public:
static constexpr const char* type_name = "int";
static inline int parse(const char* value)
{
static constexpr const char* type_name = "int";
static inline int parse(const char* value)
{
- return parse_long(value);
+ long val = parse_long(value);
+ if (val < INT_MIN)
+ throw std::range_error("underflow");
+ if (val > INT_MAX)
+ throw std::range_error("overflow");
+ return static_cast<int>(val);
}
};
template <> class ConfigType<double> {
}
};
template <> class ConfigType<double> {
@@
-184,7
+182,6
@@
public:
TypedConfigurationElement(const std::string& key, const std::string& desc, T value, std::function<void(T&)> callback)
: ConfigurationElement(key, desc), content(std::move(value)), callback(std::move(callback))
{}
TypedConfigurationElement(const std::string& key, const std::string& desc, T value, std::function<void(T&)> callback)
: ConfigurationElement(key, desc), content(std::move(value)), callback(std::move(callback))
{}
- ~TypedConfigurationElement() = default;
std::string get_string_value() override;
const char* get_type_name() override;
std::string get_string_value() override;
const char* get_type_name() override;
@@
-212,7
+209,7
@@
public:
this->update();
} else {
XBT_DEBUG("Do not override configuration variable '%s' with value '%s' because it was already set.",
this->update();
} else {
XBT_DEBUG("Do not override configuration variable '%s' with value '%s' because it was already set.",
- get_key().c_str(),
to_string(value
).c_str());
+ get_key().c_str(),
get_string_value(
).c_str());
}
}
};
}
}
};
@@
-222,6
+219,12
@@
template <class T> std::string TypedConfigurationElement<T>::get_string_value()
return to_string(content);
}
return to_string(content);
}
+template <> std::string TypedConfigurationElement<double>::get_string_value() // override
+{
+ // don't want std::to_string which uses %f, and formats very small values as 0.000000
+ return xbt::string_printf("%g", content);
+}
+
template <class T> void TypedConfigurationElement<T>::set_string_value(const char* value) // override
{
this->content = ConfigType<T>::parse(value);
template <class T> void TypedConfigurationElement<T>::set_string_value(const char* value) // override
{
this->content = ConfigType<T>::parse(value);
@@
-241,9
+244,9
@@
template <class T> const char* TypedConfigurationElement<T>::get_type_name() //
class Config {
private:
// name -> ConfigElement:
class Config {
private:
// name -> ConfigElement:
- std::map<std::string, std::unique_ptr<ConfigurationElement>> options;
+ std::map<std::string, std::unique_ptr<ConfigurationElement>
, std::less<>
> options;
// alias -> ConfigElement from options:
// alias -> ConfigElement from options:
- std::map<std::string, ConfigurationElement*> aliases;
+ std::map<std::string, ConfigurationElement*
, std::less<>
> aliases;
bool warn_for_aliases = true;
public:
bool warn_for_aliases = true;
public:
@@
-260,7
+263,7
@@
public:
{
xbt_assert(options.find(name) == options.end(), "Refusing to register the config element '%s' twice.",
name.c_str());
{
xbt_assert(options.find(name) == options.end(), "Refusing to register the config element '%s' twice.",
name.c_str());
-
TypedConfigurationElement<T>
* variable = new TypedConfigurationElement<T>(name, std::forward<A>(a)...);
+
auto
* variable = new TypedConfigurationElement<T>(name, std::forward<A>(a)...);
XBT_DEBUG("Register cfg elm %s (%s) of type %s @%p in set %p)", name.c_str(), variable->get_description().c_str(),
variable->get_type_name(), variable, this);
options[name].reset(variable);
XBT_DEBUG("Register cfg elm %s (%s) of type %s @%p in set %p)", name.c_str(), variable->get_description().c_str(),
variable->get_type_name(), variable, this);
options[name].reset(variable);
@@
-269,9
+272,9
@@
public:
}
// Debug:
}
// Debug:
- void dump(const char
*name, const char *indent)
;
- void show_aliases();
- void help();
+ void dump(const char
* name, const char* indent) const
;
+ void show_aliases()
const
;
+ void help()
const
;
protected:
ConfigurationElement* get_dict_element(const std::string& name);
protected:
ConfigurationElement* get_dict_element(const std::string& name);
@@
-321,7
+324,7
@@
void Config::alias(const std::string& realname, const std::string& aliasname)
* @param name The name to give to this config set
* @param indent what to write at the beginning of each line (right number of spaces)
*/
* @param name The name to give to this config set
* @param indent what to write at the beginning of each line (right number of spaces)
*/
-void Config::dump(const char
*name, const char *indent)
+void Config::dump(const char
* name, const char* indent) const
{
if (name)
XBT_CVERB(xbt_help, "%s>> Dumping of the config set '%s':", indent, name);
{
if (name)
XBT_CVERB(xbt_help, "%s>> Dumping of the config set '%s':", indent, name);
@@
-335,14
+338,14
@@
void Config::dump(const char *name, const char *indent)
}
/** @brief Displays the declared aliases and their replacement */
}
/** @brief Displays the declared aliases and their replacement */
-void Config::show_aliases()
+void Config::show_aliases()
const
{
for (auto const& elm : aliases)
XBT_HELP(" %-40s %s", elm.first.c_str(), elm.second->get_key().c_str());
}
/** @brief Displays the declared options and their description */
{
for (auto const& elm : aliases)
XBT_HELP(" %-40s %s", elm.first.c_str(), elm.second->get_key().c_str());
}
/** @brief Displays the declared options and their description */
-void Config::help()
+void Config::help()
const
{
for (auto const& elm : options) {
simgrid::config::ConfigurationElement* variable = elm.second.get();
{
for (auto const& elm : options) {
simgrid::config::ConfigurationElement* variable = elm.second.get();