Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add new entry in Release_Notes.
[simgrid.git] / src / xbt / config.cpp
index 3d7c730..3cebd1e 100644 (file)
@@ -1,8 +1,17 @@
-/* Copyright (c) 2004-2021. The SimGrid Team. All rights reserved.     */
+/* Copyright (c) 2004-2023. 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. */
 
+#include "simgrid/Exception.hpp"
+#include "src/simgrid/sg_config.hpp"
+#include "xbt/dynar.h"
+#include "xbt/log.h"
+#include "xbt/misc.h"
+#include "xbt/sysdep.h"
+#include <xbt/config.h>
+#include <xbt/config.hpp>
+
 #include <cstdio>
 
 #include <algorithm>
 #include <string>
 #include <vector>
 
-#include "simgrid/Exception.hpp"
-#include "simgrid/sg_config.hpp"
-#include "xbt/dynar.h"
-#include "xbt/log.h"
-#include "xbt/misc.h"
-#include "xbt/sysdep.h"
-#include <xbt/config.h>
-#include <xbt/config.hpp>
-
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_cfg, xbt, "configuration support");
 
-XBT_EXPORT_NO_IMPORT xbt_cfg_t simgrid_config = nullptr;
+xbt_cfg_t simgrid_config = nullptr;
 
-namespace simgrid {
-namespace config {
+namespace simgrid::config {
 
 namespace {
 
@@ -102,10 +101,7 @@ public:
 template <> class ConfigType<std::string> {
 public:
   static constexpr const char* type_name = "string";
-  static inline std::string parse(const char* value)
-  {
-    return std::string(value);
-  }
+  static inline std::string parse(const char* value) { return value; }
 };
 template <> class ConfigType<bool> {
 public:
@@ -262,8 +258,6 @@ public:
     return variable;
   }
 
-  // Debug:
-  void dump(const char* name, const char* indent) const;
   void show_aliases() const;
   void help() const;
 
@@ -278,23 +272,25 @@ Config::Config()
 
 inline ConfigurationElement* Config::get_dict_element(const std::string& name)
 {
-  auto opt = options.find(name);
-  if (opt != options.end()) {
+  if (auto opt = options.find(name); opt != options.end())
     return opt->second.get();
-  } else {
-    auto als = aliases.find(name);
-    if (als != aliases.end()) {
-      ConfigurationElement* res = als->second;
-      if (warn_for_aliases)
-        XBT_INFO("Option %s has been renamed to %s. Consider switching.", name.c_str(), res->get_key().c_str());
-      return res;
-    } else {
-      std::string msg = "Bad config key: " + name + "\nExisting config keys:\n";
-      for (auto const& elm : options)
-        msg += "  " + elm.first + ": (" + elm.second->get_type_name() + ")" + elm.second->get_string_value() + "\n";
-      throw std::out_of_range(msg);
-    }
+
+  if (auto als = aliases.find(name); als != aliases.end()) {
+    ConfigurationElement* res = als->second;
+    if (warn_for_aliases)
+      XBT_INFO("Option %s has been renamed to %s. Consider switching.", name.c_str(), res->get_key().c_str());
+    return res;
   }
+
+  std::string msg   = "Bad config key: " + name + "\n";
+  std::string kebab = name;
+  std::replace(begin(kebab), end(kebab), '_', '-'); // convert from snake_case to kebab-case
+  if (options.count(kebab) > 0)
+    msg += "Did you mean '" + kebab + "'?\n";
+  msg += "Existing config keys:\n";
+  for (auto const& [opt_name, opt] : options)
+    msg += "  " + opt_name + ": (" + opt->get_type_name() + ")" + opt->get_string_value() + "\n";
+  throw std::out_of_range(msg);
 }
 
 inline ConfigurationElement& Config::operator[](const std::string& name)
@@ -307,41 +303,22 @@ void Config::alias(const std::string& realname, const std::string& aliasname)
   xbt_assert(aliases.find(aliasname) == aliases.end(), "Alias '%s' already.", aliasname.c_str());
   ConfigurationElement* element = this->get_dict_element(realname);
   xbt_assert(element, "Cannot define an alias to the non-existing option '%s'.", realname.c_str());
-  this->aliases.insert({aliasname, element});
-}
-
-/** @brief Dump a config set for debugging purpose
- *
- * @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) const
-{
-  if (name)
-    XBT_CVERB(xbt_help, "%s>> Dumping of the config set '%s':", indent, name);
-
-  for (auto const& elm : options)
-    XBT_CVERB(xbt_help, "%s  %s: ()%s) %s", indent, elm.first.c_str(), elm.second->get_type_name(),
-              elm.second->get_string_value().c_str());
-
-  if (name)
-    XBT_CVERB(xbt_help, "%s<< End of the config set '%s'", indent, name);
+  this->aliases.try_emplace(aliasname, element);
 }
 
 /** @brief Displays the declared aliases and their replacement */
 void Config::show_aliases() const
 {
-  for (auto const& elm : aliases)
-    XBT_HELP("   %-40s %s", elm.first.c_str(), elm.second->get_key().c_str());
+  for (auto const& [name, alias] : aliases)
+    XBT_HELP("   %-40s %s", name.c_str(), alias->get_key().c_str());
 }
 
 /** @brief Displays the declared options and their description */
 void Config::help() const
 {
-  for (auto const& elm : options) {
-    simgrid::config::ConfigurationElement* variable = elm.second.get();
-    XBT_HELP("   %s: %s", elm.first.c_str(), variable->get_description().c_str());
-    XBT_HELP("       Type: %s; Current value: %s", variable->get_type_name(), variable->get_string_value().c_str());
+  for (auto const& [name, opt] : options) {
+    XBT_HELP("   %s: %s", name.c_str(), opt->get_description().c_str());
+    XBT_HELP("       Type: %s; Current value: %s", opt->get_type_name(), opt->get_string_value().c_str());
   }
 }
 
@@ -405,8 +382,7 @@ void set_parse(const std::string& opt)
     std::string val = name.substr(pos + 1);
     name.erase(pos);
 
-    const std::string path("path");
-    if (name.compare(0, path.length(), path) != 0)
+    if (name.rfind("path", 0) != 0)
       XBT_INFO("Configuration change: Set '%s' to '%s'", name.c_str(), val.c_str());
 
     set_as_string(name.c_str(), val);
@@ -468,8 +444,7 @@ void help()
 {
   simgrid_config->help();
 }
-}
-}
+} // namespace simgrid::config
 
 /*----[ Setting ]---------------------------------------------------------*/