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;
25 std::array<Value, Size> mContainer{};
28 constexpr DenseEnumMap() =
default;
30 constexpr DenseEnumMap(std::initializer_list<Value> init) : mContainer{} {
31 std::copy_n(init.begin(), std::min(init.size(), Size), mContainer.begin());
34 constexpr reference operator[](Key key)
noexcept {
35 return mContainer[
static_cast<size_type
>(key)];
38 constexpr const_reference operator[](Key key)
const noexcept {
39 return mContainer[
static_cast<size_type
>(key)];
42 constexpr reference at(Key key) {
43 return mContainer.at(
static_cast<size_type
>(key));
46 constexpr const_reference at(Key key)
const {
47 return mContainer.at(
static_cast<size_type
>(key));
50 constexpr pointer data()
noexcept {
return mContainer.data(); }
51 constexpr const_pointer data()
const noexcept {
return mContainer.data(); }
53 constexpr iterator begin()
noexcept {
return mContainer.begin(); }
54 constexpr iterator end()
noexcept {
return mContainer.end(); }
56 constexpr const_iterator begin()
const noexcept {
return mContainer.begin(); }
57 constexpr const_iterator end()
const noexcept {
return mContainer.end(); }
59 constexpr const_iterator cbegin()
const noexcept {
return mContainer.cbegin(); }
60 constexpr const_iterator cend()
const noexcept {
return mContainer.cend(); }
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(); }
67 [[nodiscard]]
constexpr std::size_t size()
const noexcept {
return Size; }
68 [[nodiscard]]
constexpr bool empty()
const noexcept {
return Size == 0; }
70 constexpr void fill(
const Value& value) {
71 mContainer.fill(value);