Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge pull request #259 from simgrid/configfix
authorMartin Quinson <martin.quinson@ens-rennes.fr>
Fri, 30 Mar 2018 22:13:35 +0000 (00:13 +0200)
committerGitHub <noreply@github.com>
Fri, 30 Mar 2018 22:13:35 +0000 (00:13 +0200)
config: fix declareFlag template

1  2 
include/xbt/config.hpp

diff --combined include/xbt/config.hpp
@@@ -1,4 -1,4 +1,4 @@@
 -/* Copyright (c) 2016-2017. The SimGrid Team. All rights reserved.          */
 +/* Copyright (c) 2016-2018. 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. */
@@@ -23,7 -23,7 +23,7 @@@
  namespace simgrid {
  namespace config {
  
 -XBT_PUBLIC_CLASS missing_key_error : public std::runtime_error {
 +class XBT_PUBLIC missing_key_error : public std::runtime_error {
  public:
    explicit missing_key_error(const std::string& what)
      : std::runtime_error(what) {}
@@@ -52,12 -52,13 +52,12 @@@ inline std::string to_string(std::strin
  
  // Get config
  
 -template<class T>
 -XBT_PUBLIC(T const&) getConfig(const char* name);
 +template <class T> XBT_PUBLIC T const& getConfig(const char* name);
  
 -extern template XBT_PUBLIC(int const&) getConfig<int>(const char* name);
 -extern template XBT_PUBLIC(double const&) getConfig<double>(const char* name);
 -extern template XBT_PUBLIC(bool const&) getConfig<bool>(const char* name);
 -extern template XBT_PUBLIC(std::string const&) getConfig<std::string>(const char* name);
 +extern template XBT_PUBLIC int const& getConfig<int>(const char* name);
 +extern template XBT_PUBLIC double const& getConfig<double>(const char* name);
 +extern template XBT_PUBLIC bool const& getConfig<bool>(const char* name);
 +extern template XBT_PUBLIC std::string const& getConfig<std::string>(const char* name);
  
  // Register:
  
   *  @param value       Initial/default value
   *  @param callback    called with the option value
   */
 -template<class T>
 -XBT_PUBLIC(void) declareFlag(const char* name, const char* description,
 -  T value, std::function<void(const T&)> callback = std::function<void(const T&)>());
 -
 -extern template XBT_PUBLIC(void) declareFlag(const char* name,
 -  const char* description, int value, std::function<void(int const &)> callback);
 -extern template XBT_PUBLIC(void) declareFlag(const char* name,
 -  const char* description, double value, std::function<void(double const &)> callback);
 -extern template XBT_PUBLIC(void) declareFlag(const char* name,
 -  const char* description, bool value, std::function<void(bool const &)> callback);
 -extern template XBT_PUBLIC(void) declareFlag(const char* name,
 -  const char* description, std::string value, std::function<void(std::string const &)> callback);
 +template <class T>
 +XBT_PUBLIC void declareFlag(const char* name, const char* description, T value,
 +                            std::function<void(const T&)> callback = std::function<void(const T&)>());
 +
 +extern template XBT_PUBLIC void declareFlag(const char* name, const char* description, int value,
 +                                            std::function<void(int const&)> callback);
 +extern template XBT_PUBLIC void declareFlag(const char* name, const char* description, double value,
 +                                            std::function<void(double const&)> callback);
 +extern template XBT_PUBLIC void declareFlag(const char* name, const char* description, bool value,
 +                                            std::function<void(bool const&)> callback);
 +extern template XBT_PUBLIC void declareFlag(const char* name, const char* description, std::string value,
 +                                            std::function<void(std::string const&)> callback);
  
  // ***** alias *****
  
 -XBT_PUBLIC(void) alias(const char* realname, const char* aliasname);
 +XBT_PUBLIC void alias(const char* realname, const char* aliasname);
  
  inline
  void alias(std::initializer_list<const char*> names)
@@@ -145,10 -146,12 +145,12 @@@ typename std::enable_if<std::is_same
  bindFlag(T& value, const char* name, const char* description,
    F callback)
  {
-   declareFlag(name, description, value, [&value,callback](const T& val) {
-     callback(val);
-     value = std::move(val);
-   });
+   declareFlag(name, description, value,
+     std::function<void(const T&)>([&value,callback](const T& val) {
+       callback(val);
+       value = std::move(val);
+     }
+   ));
  }
  
  /** Bind a variable to configuration flag
@@@ -167,11 -170,13 +169,13 @@@ typename std::enable_if<std::is_same
  bindFlag(T& value, const char* name, const char* description,
    F callback)
  {
-   declareFlag(name, description, value, [&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
@@@ -237,6 -242,6 +241,6 @@@ public
  
  }
  }
 -XBT_PUBLIC(std::string) xbt_cfg_get_string(const char* name);
 +XBT_PUBLIC std::string xbt_cfg_get_string(const char* name);
  
  #endif