24#include <unordered_map>
27#include "iceberg/util/macros.h"
28#include "iceberg/util/string_util.h"
34std::string DefaultToString(
const U& val) {
35 if constexpr ((std::is_signed_v<U> && std::is_integral_v<U>) ||
36 std::is_floating_point_v<U>) {
37 return std::to_string(val);
38 }
else if constexpr (std::is_same_v<U, bool>) {
39 return val ?
"true" :
"false";
40 }
else if constexpr (std::is_same_v<U, std::string> ||
41 std::is_same_v<U, std::string_view>) {
45 std::format(
"Explicit to_str() is required for {}",
typeid(U).name()));
50U DefaultFromString(
const std::string& val) {
51 if constexpr (std::is_same_v<U, std::string>) {
53 }
else if constexpr (std::is_same_v<U, bool>) {
55 }
else if constexpr ((std::is_signed_v<U> && std::is_integral_v<U>) ||
56 std::is_floating_point_v<U>) {
57 ICEBERG_ASSIGN_OR_THROW(
auto res, StringUtils::ParseNumber<U>(val));
61 std::format(
"Explicit from_str() is required for {}",
typeid(U).name()));
66template <
class ConcreteConfig>
72 Entry(std::string key, T val,
73 std::function<std::string(
const T&)> to_str = internal::DefaultToString<T>,
74 std::function<T(
const std::string&)> from_str = internal::DefaultFromString<T>)
75 : key_{std::move(key)},
76 default_{std::move(val)},
77 to_str_{std::move(to_str)},
78 from_str_{std::move(from_str)} {}
81 const std::string key_;
83 const std::function<std::string(
const T&)> to_str_;
84 const std::function<T(
const std::string&)> from_str_;
87 friend ConcreteConfig;
90 const std::string& key()
const {
return key_; }
92 const T& value()
const {
return default_; }
96 ConfigBase& Set(
const Entry<T>& entry,
const T& val) {
97 configs_[entry.key_] = entry.to_str_(val);
101 template <
typename T>
103 configs_.erase(entry.key_);
107 ConfigBase& Reset() {
112 template <
typename T>
113 T Get(
const Entry<T>& entry)
const {
114 auto iter = configs_.find(entry.key_);
115 return iter != configs_.cend() ? entry.from_str_(iter->second) : entry.default_;
118 const std::unordered_map<std::string, std::string>& configs()
const {
return configs_; }
120 std::unordered_map<std::string, std::string>& mutable_configs() {
return configs_; }
125 std::unordered_map<std::string, std::string>
Extract(std::string_view prefix)
const {
126 std::unordered_map<std::string, std::string> extracted;
127 for (
const auto& [key, value] : configs_) {
128 if (key.starts_with(prefix)) {
129 extracted[key.substr(prefix.length())] = value;
136 std::unordered_map<std::string, std::string> configs_;
std::unordered_map< std::string, std::string > Extract(std::string_view prefix) const
Extracts the prefix from the configuration.
Definition config.h:125