8#include <unordered_map>
16using OptionValue = std::variant<bool, int64_t, double, std::string>;
20 if constexpr (std::is_same_v<T, bool>) {
22 }
else if constexpr (std::is_same_v<T, int64_t>) {
24 }
else if constexpr (std::is_same_v<T, double>) {
27 static_assert(std::is_same_v<T, std::string>,
"Unsupported option type");
59 values_.insert_or_assign(std::move(key), std::move(value));
67 bool has(std::string_view key)
const {
68 return values_.find(std::string(key)) != values_.end();
73 auto it = values_.find(std::string(key.
key));
74 if (it == values_.end()) {
77 if (
auto* v = std::get_if<T>(&it->second)) {
90 std::unordered_map<std::string, OptionValue> values_;
98 if (!options_.emplace(spec.
key, spec).second) {
99 throw std::runtime_error(
"Duplicate option key: " + spec.
key);
103 const std::unordered_map<std::string, OptionSpec>&
options()
const {
108 auto it = options_.find(std::string(key));
109 return it == options_.end() ? nullptr : &it->second;
113 std::unordered_map<std::string, OptionSpec> options_;
118 if (spec ==
nullptr) {
119 throw std::runtime_error(
"Unknown option: " + key);
121 switch (spec->
type) {
123 if (
const auto* b = std::get_if<bool>(&value)) {
126 throw std::runtime_error(
"Option '" + key +
"' expects a bool value");
130 if (
const auto* i = std::get_if<int64_t>(&value)) {
132 }
else if (
const auto* b = std::get_if<bool>(&value)) {
135 throw std::runtime_error(
"Option '" + key +
"' expects an int value");
139 if (
const auto* d = std::get_if<double>(&value)) {
141 }
else if (
const auto* i = std::get_if<int64_t>(&value)) {
144 throw std::runtime_error(
"Option '" + key +
"' expects a double value");
148 if (
const auto* s = std::get_if<std::string>(&value)) {
151 throw std::runtime_error(
"Option '" + key +
"' expects a string value");
const std::unordered_map< std::string, OptionSpec > & options() const
Definition options.h:103
void register_option(const OptionSpec &spec)
Definition options.h:97
const OptionSpec * find_option(std::string_view key) const
Definition options.h:107
T get(const OptionKey< T > &key, T fallback=T{}) const
Definition options.h:72
bool has(std::string_view key) const
Definition options.h:67
static const Options & empty()
Definition options.h:84
void set(std::string key, OptionValue value)
Definition options.h:58
void set_option(const OptionRegistry ®istry, const std::string &key, const OptionValue &value)
Definition options.h:116
std::variant< bool, int64_t, double, std::string > OptionValue
Definition options.h:16
OptionType
Definition options.h:14
@ Int
Definition options.h:14
@ String
Definition options.h:14
@ Bool
Definition options.h:14
@ Double
Definition options.h:14
constexpr OptionType option_type_of()
Definition options.h:19
OptionSpec spec(T default_value, std::string doc) const
Definition options.h:46
std::string_view key
Definition options.h:41
constexpr OptionKey(std::string_view k)
Definition options.h:42
OptionType type
Definition options.h:34
std::string key
Definition options.h:33
OptionValue default_value
Definition options.h:35
std::string doc
Definition options.h:36