Horizon
lut.hpp
1 #pragma once
2 #include <string>
3 #include <map>
4 #include <optional>
5 #include "nlohmann/json_fwd.hpp"
6 
7 namespace horizon {
8 
14 namespace detail {
15 std::string string_from_json(const nlohmann::json &j);
16 }
17 
18 template <typename T> class LutEnumStr {
19  static_assert(std::is_enum<T>::value, "Must be an enum type");
20 
21 public:
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 
69 private:
70  std::map<std::string, T> fwd;
71  std::map<T, std::string> rev;
72 };
73 } // namespace horizon
Definition: lut.hpp:18
const T lookup(const std::string &s) const
Definition: lut.hpp:32
const std::string & lookup_reverse(const T s) const
Definition: lut.hpp:64
a class to store JSON values
Definition: json.hpp:177