diff options
Diffstat (limited to 'lib/configuration/configuration.h')
-rw-r--r-- | lib/configuration/configuration.h | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/lib/configuration/configuration.h b/lib/configuration/configuration.h index 30f258c..f2de92f 100644 --- a/lib/configuration/configuration.h +++ b/lib/configuration/configuration.h @@ -12,6 +12,8 @@ #include <initializer_list> #include <memory> #include <optional> +#include <source_location> +#include <spdlog/spdlog.h> #include <string> #include <type_traits> #include <unordered_map> @@ -44,10 +46,10 @@ public: void read(std::basic_istream<char> &input); template <typename T> - [[nodiscard]] std::optional<T> value(const char *path) const + [[nodiscard]] std::optional<T> value(const char *path, const std::source_location location = std::source_location::current()) const { if(use_global) { - return instance()->value<T>(path); + return instance()->value<T>(path, location); } if(count(path) == 0) { @@ -58,13 +60,14 @@ public: } template <concept_value_t T> - [[nodiscard]] std::optional<T> value(const char *p_path) const + [[nodiscard]] std::optional<T> value(const char *p_path, const std::source_location location = std::source_location::current()) const { if(use_global) { - return instance()->value<T>(p_path); + return instance()->value<T>(p_path, location); } if(this->count(p_path) == 0) { + spdlog::warn("requested non-existent configuration value {} at {}:{}", p_path, location.file_name(), location.line()); return std::nullopt; } @@ -79,11 +82,11 @@ public: } } else if(std::holds_alternative<bool>(value)) { - if constexpr(std::is_constructible<T, bool>::value) { + if constexpr(std::is_constructible_v<T, bool> || std::is_same_v<T, bool>) { return std::get<bool>(value); } else if constexpr(std::is_arithmetic_v<T>) { return static_cast<T>(std::get<bool>(value)); - } else if constexpr(std::is_constructible<T, const char *>::value) { + } else if constexpr(std::is_constructible_v<T, const char *>) { return std::get<bool>(value) ? T{ "true" } : T{ "false" }; } @@ -115,11 +118,12 @@ public: } template <typename T> - T &shortcut(T & /* unused */, const char * /* unused */) const + T &shortcut(T & /* unused */, const char * /* unused */, const std::source_location location = std::source_location::current()) const { return T{}; } + static std::string init_global(const std::string &p_path); static void move_global(std::unique_ptr<Configuration> && conf); protected: |