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 = Value const&;
17 using pointer = Value*;
18 using const_pointer = Value const*;
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 { return mContainer[static_cast<size_type>(key)]; }
35
36 constexpr const_reference operator[](Key key) const noexcept { return mContainer[static_cast<size_type>(key)]; }
37
38 constexpr reference at(Key key) { return mContainer.at(static_cast<size_type>(key)); }
39
40 constexpr const_reference at(Key key) const { return mContainer.at(static_cast<size_type>(key)); }
41
42 constexpr pointer data() noexcept { return mContainer.data(); }
43 constexpr const_pointer data() const noexcept { return mContainer.data(); }
44
45 constexpr iterator begin() noexcept { return mContainer.begin(); }
46 constexpr iterator end() noexcept { return mContainer.end(); }
47
48 constexpr const_iterator begin() const noexcept { return mContainer.begin(); }
49 constexpr const_iterator end() const noexcept { return mContainer.end(); }
50
51 constexpr const_iterator cbegin() const noexcept { return mContainer.cbegin(); }
52 constexpr const_iterator cend() const noexcept { return mContainer.cend(); }
53
54 constexpr reverse_iterator rbegin() noexcept { return mContainer.rbegin(); }
55 constexpr reverse_iterator rend() noexcept { return mContainer.rend(); }
56 constexpr const_reverse_iterator crbegin() const noexcept { return mContainer.crbegin(); }
57 constexpr const_reverse_iterator crend() const noexcept { return mContainer.crend(); }
58
59 [[nodiscard]] constexpr std::size_t size() const noexcept { return Size; }
60 [[nodiscard]] constexpr bool empty() const noexcept { return Size == 0; }
61
62 constexpr void fill(Value const& value) { mContainer.fill(value); }
63};
64
65} // namespace Bedrock