Add support for HashMap options types
This commit is contained in:
parent
420373475e
commit
e9f93f1b2f
|
@ -7,6 +7,7 @@
|
||||||
#include "coord.hh"
|
#include "coord.hh"
|
||||||
#include "array_view.hh"
|
#include "array_view.hh"
|
||||||
#include "id_map.hh"
|
#include "id_map.hh"
|
||||||
|
#include "hash_map.hh"
|
||||||
#include "flags.hh"
|
#include "flags.hh"
|
||||||
#include "enum.hh"
|
#include "enum.hh"
|
||||||
|
|
||||||
|
@ -144,6 +145,46 @@ struct option_type_name<IdMap<T, D>>
|
||||||
static String name() { return format("str-to-{}-map", option_type_name<T>::name()); }
|
static String name() { return format("str-to-{}-map", option_type_name<T>::name()); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename Key, typename Value, MemoryDomain domain>
|
||||||
|
String option_to_string(const HashMap<Key, Value, domain>& opt)
|
||||||
|
{
|
||||||
|
String res;
|
||||||
|
for (auto it = begin(opt); it != end(opt); ++it)
|
||||||
|
{
|
||||||
|
if (it != begin(opt))
|
||||||
|
res += list_separator;
|
||||||
|
String elem = escape(option_to_string(it->key), '=', '\\') + "=" +
|
||||||
|
escape(option_to_string(it->value), '=', '\\');
|
||||||
|
res += escape(elem, list_separator, '\\');
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Key, typename Value, MemoryDomain domain>
|
||||||
|
void option_from_string(StringView str, HashMap<Key, Value, domain>& opt)
|
||||||
|
{
|
||||||
|
opt.clear();
|
||||||
|
for (auto& elem : split(str, list_separator, '\\'))
|
||||||
|
{
|
||||||
|
Vector<String> pair_str = split(elem, '=', '\\');
|
||||||
|
if (pair_str.size() != 2)
|
||||||
|
throw runtime_error("map option expects key=value");
|
||||||
|
Key key;
|
||||||
|
Value value;
|
||||||
|
option_from_string(pair_str[0], key);
|
||||||
|
option_from_string(pair_str[1], value);
|
||||||
|
opt.insert({ std::move(key), std::move(value) });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename K, typename V, MemoryDomain D>
|
||||||
|
struct option_type_name<HashMap<K, V, D>>
|
||||||
|
{
|
||||||
|
static String name() { return format("{}-to-{}-map",
|
||||||
|
option_type_name<K>::name(),
|
||||||
|
option_type_name<V>::name()); }
|
||||||
|
};
|
||||||
|
|
||||||
constexpr char tuple_separator = '|';
|
constexpr char tuple_separator = '|';
|
||||||
|
|
||||||
template<size_t I, typename... Types>
|
template<size_t I, typename... Types>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user