#ifndef array_hh_INCLUDED #define array_hh_INCLUDED #include #include #include "array_view.hh" namespace Kakoune { template struct Array { constexpr size_t size() const { return N; } constexpr const T& operator[](int i) const { return m_data[i]; } constexpr const T* begin() const { return m_data; } constexpr const T* end() const { return m_data+N; } constexpr T& operator[](int i) { return m_data[i]; } constexpr T* begin() { return m_data; } constexpr T* end() { return m_data+N; } constexpr operator ArrayView() { return {m_data, N}; } constexpr operator ConstArrayView() const { return {m_data, N}; } T m_data[N]; }; template requires (std::is_same_v and ...) Array(T, U...) -> Array; template constexpr Array make_array(const T (&data)[N], std::index_sequence) { static_assert(sizeof...(Indices) == N, "size mismatch"); return {{data[Indices]...}}; } template constexpr Array make_array(const T (&data)[N]) { return make_array(data, std::make_index_sequence()); } } #endif // array_hh_INCLUDED