X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0a9b604048c4568bb2c2709f3b824da719a7e737..5343203035034c0e4e1b894ca313a072c58d9183:/include/xbt/config.hpp diff --git a/include/xbt/config.hpp b/include/xbt/config.hpp index b5b3e9d7e9..6c61a46bef 100644 --- a/include/xbt/config.hpp +++ b/include/xbt/config.hpp @@ -1,11 +1,10 @@ -/* Copyright (c) 2016. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2016-2017. 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. */ -#ifndef _XBT_CONFIG_HPP_ -#define _XBT_CONFIG_HPP_ +#ifndef XBT_CONFIG_HPP +#define XBT_CONFIG_HPP #include @@ -30,7 +29,7 @@ public: : std::runtime_error(what) {} explicit missing_key_error(const char* what) : std::runtime_error(what) {} - ~missing_key_error(); + ~missing_key_error() override; }; template inline @@ -104,7 +103,6 @@ void alias(std::initializer_list names) template void bindFlag(T& value, const char* name, const char* description) { - using namespace std; declareFlag(name, description, value, [&value](T const& val) { value = val; }); @@ -125,7 +123,7 @@ void bindFlag(T& value, std::initializer_list names, const char* de * if (x < x_min || x => x_max) * throw std::range_error("must be in [x_min, x_max)") * }); - * + * */ // F is a checker, F : T& -> () template @@ -148,10 +146,12 @@ typename std::enable_if([&value,callback](const T& val) { + callback(val); + value = std::move(val); + } + )); } /** Bind a variable to configuration flag @@ -159,7 +159,7 @@ bindFlag(T& value, const char* name, const char* description, *

  *  static int x;
  *  simgrid::config::bindFlag(a, "x", [](int x) { return return x > 0; });
- *  
+ * */ // F is a predicate, F : T const& -> bool template @@ -170,11 +170,13 @@ typename std::enable_if([&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 @@ -220,17 +222,26 @@ public: operator T const&() const{ return value_; } // Basic interop with T: - Flag& operator=(T const& that) { value_ = that; return *this; } - Flag& operator=(T && that) { value_ = that; return *this; } - bool operator==(T const& that) const { return value_ == that; } - bool operator!=(T const& that) const { return value_ != that; } - bool operator<(T const& that) const { return value_ < that; } - bool operator>(T const& that) const { return value_ > that; } - bool operator<=(T const& that) const { return value_ <= that; } - bool operator>=(T const& that) const { return value_ >= that; } + template + Flag& operator=(U const& that) { value_ = that; return *this; } + template + Flag& operator=(U && that) { value_ = that; return *this; } + template + bool operator==(U const& that) const { return value_ == that; } + template + bool operator!=(U const& that) const { return value_ != that; } + template + bool operator<(U const& that) const { return value_ < that; } + template + bool operator>(U const& that) const { return value_ > that; } + template + bool operator<=(U const& that) const { return value_ <= that; } + template + bool operator>=(U const& that) const { return value_ >= that; } }; } } +XBT_PUBLIC(std::string) xbt_cfg_get_string(const char* name); #endif