Horizon
Loading...
Searching...
No Matches
lut.hpp
1#pragma once
2#include <string>
3#include <map>
4#include <optional>
5#include "nlohmann/json_fwd.hpp"
6
7namespace horizon {
8
14namespace detail {
15std::string string_from_json(const nlohmann::json &j);
16}
17
18template <typename T> class LutEnumStr {
19 static_assert(std::is_enum<T>::value, "Must be an enum type");
20
21public:
22 LutEnumStr(std::initializer_list<std::pair<const std::string, const T>> s)
23 {
24 for (auto it : s) {
25 fwd.insert(it);
26 rev.insert(std::make_pair(it.second, it.first));
27 }
28 }
32 const T lookup(const std::string &s) const
33 {
34 return fwd.at(s);
35 }
36 const T lookup(const nlohmann::json &j) const
37 {
38 return lookup(detail::string_from_json(j));
39 }
40
41 const std::optional<T> lookup_opt(const std::string &s) const
42 {
43 if (fwd.count(s))
44 return fwd.at(s);
45 else
46 return {};
47 }
48
49 const T lookup(const std::string &s, T def) const
50 {
51 if (fwd.count(s))
52 return fwd.at(s);
53 else
54 return def;
55 }
56 const T lookup(const nlohmann::json &j, T def) const
57 {
58 return lookup(detail::string_from_json(j), def);
59 }
60
64 const std::string &lookup_reverse(const T s) const
65 {
66 return rev.at(s);
67 }
68
69private:
70 std::map<std::string, T> fwd;
71 std::map<T, std::string> rev;
72};
73} // namespace horizon
Definition lut.hpp:18
const std::string & lookup_reverse(const T s) const
Definition lut.hpp:64
const T lookup(const std::string &s) const
Definition lut.hpp:32
a class to store JSON values
Definition json.hpp:177