Horizon
lut.hpp
1 #pragma once
2 #include <string>
3 #include <map>
4 #include <optional>
5 
6 namespace horizon {
7 
12 template <typename T> class LutEnumStr {
13  static_assert(std::is_enum<T>::value, "Must be an enum type");
14 
15 public:
16  LutEnumStr(std::initializer_list<std::pair<const std::string, const T>> s)
17  {
18  for (auto it : s) {
19  fwd.insert(it);
20  rev.insert(std::make_pair(it.second, it.first));
21  }
22  }
26  const T lookup(const std::string &s) const
27  {
28  return fwd.at(s);
29  }
30 
31  const std::optional<T> lookup_opt(const std::string &s) const
32  {
33  if (fwd.count(s))
34  return fwd.at(s);
35  else
36  return {};
37  }
38 
39  const T lookup(const std::string &s, T def) const
40  {
41  if (fwd.count(s))
42  return fwd.at(s);
43  else
44  return def;
45  }
46 
50  const std::string &lookup_reverse(const T s) const
51  {
52  return rev.at(s);
53  }
54 
55 private:
56  std::map<std::string, T> fwd;
57  std::map<T, std::string> rev;
58 };
59 } // namespace horizon
Trivial bidirectional map for mapping strings to enums.
Definition: lut.hpp:12
const T lookup(const std::string &s) const
Definition: lut.hpp:26
const std::string & lookup_reverse(const T s) const
Definition: lut.hpp:50