OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
enum_map.hpp
1#pragma once
2#include <cassert>
3#include <cinttypes>
4#include <optional>
5#include <type_traits>
6#include <utility>
7
8namespace ossia
9{
13template <typename T1, typename T2>
14struct pair
15{
16 T1 key;
17 T2 value;
18};
19
24template <typename K, typename V, std::size_t N>
26{
27 static_assert(std::is_enum_v<K>);
28
29public:
30 constexpr enum_map() = default;
31 constexpr enum_map(const enum_map&) = default;
32 constexpr enum_map(enum_map&&) noexcept = default;
33 constexpr enum_map& operator=(const enum_map&) = default;
34 constexpr enum_map& operator=(enum_map&&) noexcept = default;
35
36 constexpr explicit enum_map(std::initializer_list<pair<K, V>> i)
37 {
38 for(auto& [k, v] : i)
39 {
40 auto idx = static_cast<std::underlying_type_t<K>>(k);
41 assert(idx >= 0 && idx < int64_t(N));
42
43 m_map[idx] = std::move(v);
44 }
45 }
46
47 constexpr const V& operator[](K k) const noexcept
48 {
49 auto idx = static_cast<std::underlying_type_t<K>>(k);
50 assert(idx >= 0 && idx < int64_t(N));
51
52 return m_map[idx];
53 }
54
55 constexpr const V& operator[](int64_t idx) const noexcept
56 {
57 assert(idx >= 0 && idx < int64_t(N));
58
59 return m_map[idx];
60 }
61
62 constexpr K key(const V& v) const noexcept
63 {
64 for(std::size_t i = 0; i < N; i++)
65 {
66 if(m_map[i] == v)
67 {
68 return static_cast<K>(i);
69 }
70 }
71
72 assert(false); // key not found, hard error
73 return {};
74 }
75
76 constexpr std::optional<K> find_key(const V& v) const noexcept
77 {
78 for(std::size_t i = 0; i < N; i++)
79 {
80 if(m_map[i] == v)
81 {
82 return static_cast<K>(i);
83 }
84 }
85
86 return {};
87 }
88
89 pair<K, const V&> get(int64_t i) const noexcept
90 {
91 assert(i >= 0 && i < int64_t(N));
92 return {static_cast<K>(i), m_map[i]};
93 }
94
95 [[nodiscard]] constexpr std::size_t size() const noexcept { return N; }
96
97private:
98 V m_map[N];
99};
100}
A container useful for mapping contiguous enums to strings without using too much memory.
Definition enum_map.hpp:26
The value class.
Definition value.hpp:173
Definition git_info.h:7
A most simple pair type, to reduce binary bloat.
Definition enum_map.hpp:15