#pragma once #include "enchantum.hpp" #include #include namespace enchantum { template class array : public std::array> { private: using base = std::array>; public: using index_type = E; using typename base::const_iterator; using typename base::const_pointer; using typename base::const_reference; using typename base::const_reverse_iterator; using typename base::difference_type; using typename base::iterator; using typename base::pointer; using typename base::reference; using typename base::reverse_iterator; using typename base::size_type; using typename base::value_type; using base::at; using base::operator[]; [[nodiscard]] constexpr reference at(const E index) { if (const auto i = enchantum::enum_to_index(index)) return operator[](*i); ENCHANTUM_THROW(std::out_of_range("enchantum::array::at index out of range"), index); } [[nodiscard]] constexpr const_reference at(const E index) const { if (const auto i = enchantum::enum_to_index(index)) return operator[](*i); ENCHANTUM_THROW(std::out_of_range("enchantum::array::at: index out of range"), index); } [[nodiscard]] constexpr reference operator[](const E index) noexcept { return operator[](*enchantum::enum_to_index(index)); } [[nodiscard]] constexpr const_reference operator[](const E index) const noexcept { return operator[](*enchantum::enum_to_index(index)); } }; } // namespace enchantum