LeviLamina
Loading...
Searching...
No Matches
DenseEnumMap.h
1#pragma once
2
3#include "mc/_HeaderOutputPredefine.h"
4
5namespace Bedrock {
6
7template <typename Key, typename Value, std::size_t Size>
8 requires std::is_enum_v<Key>
9class DenseEnumMap {
10public:
11 using key_type = Key;
12 using mapped_type = Value;
13 using value_type = Value;
14 using size_type = std::size_t;
15 using reference = Value&;
16 using const_reference = const Value&;
17 using pointer = Value*;
18 using const_pointer = const Value*;
19 using iterator = typename std::array<Value, Size>::iterator;
20 using const_iterator = typename std::array<Value, Size>::const_iterator;
21 using reverse_iterator = typename std::array<Value, Size>::reverse_iterator;
22 using const_reverse_iterator = typename std::array<Value, Size>::const_reverse_iterator;
23
24private:
25 std::array<Value, Size> mContainer{};
26
27public:
28 constexpr DenseEnumMap() = default;
29
30 constexpr DenseEnumMap(std::initializer_list<Value> init) : mContainer{} {
31 std::copy_n(init.begin(), std::min(init.size(), Size), mContainer.begin());
32 }
33
34 constexpr reference operator[](Key key) noexcept {
35 return mContainer[static_cast<size_type>(key)];
36 }
37
38 constexpr const_reference operator[](Key key) const noexcept {
39 return mContainer[static_cast<size_type>(key)];
40 }
41
42 constexpr reference at(Key key) {
43 return mContainer.at(static_cast<size_type>(key));
44 }
45
46 constexpr const_reference at(Key key) const {
47 return mContainer.at(static_cast<size_type>(key));
48 }
49
50 constexpr pointer data() noexcept { return mContainer.data(); }
51 constexpr const_pointer data() const noexcept { return mContainer.data(); }
52
53 constexpr iterator begin() noexcept { return mContainer.begin(); }
54 constexpr iterator end() noexcept { return mContainer.end(); }
55
56 constexpr const_iterator begin() const noexcept { return mContainer.begin(); }
57 constexpr const_iterator end() const noexcept { return mContainer.end(); }
58
59 constexpr const_iterator cbegin() const noexcept { return mContainer.cbegin(); }
60 constexpr const_iterator cend() const noexcept { return mContainer.cend(); }
61
62 constexpr reverse_iterator rbegin() noexcept { return mContainer.rbegin(); }
63 constexpr reverse_iterator rend() noexcept { return mContainer.rend(); }
64 constexpr const_reverse_iterator crbegin() const noexcept { return mContainer.crbegin(); }
65 constexpr const_reverse_iterator crend() const noexcept { return mContainer.crend(); }
66
67 [[nodiscard]] constexpr std::size_t size() const noexcept { return Size; }
68 [[nodiscard]] constexpr bool empty() const noexcept { return Size == 0; }
69
70 constexpr void fill(const Value& value) {
71 mContainer.fill(value);
72 }
73};
74
75} // namespace Bedrock