diff options
| author | Enrico Borba <enricozb@users.noreply.github.com> | 2024-12-23 09:23:58 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-12-23 09:23:58 +0100 |
| commit | 52125e6336d596aebdd4da91080b3178ddca7449 (patch) | |
| tree | 27d3e5c01660d567f22fee621c97753f294256b0 /src/array.hh | |
| parent | 14cb35f62b36b2f1aa530adb5e31c05ff1347bfc (diff) | |
| parent | 9c458c50661446fc6e7295787b06422137af099d (diff) | |
Merge branch 'master' into enricozb/daemon-stdin
Diffstat (limited to 'src/array.hh')
| -rw-r--r-- | src/array.hh | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/array.hh b/src/array.hh new file mode 100644 index 00000000..ec8b098b --- /dev/null +++ b/src/array.hh @@ -0,0 +1,48 @@ +#ifndef array_hh_INCLUDED +#define array_hh_INCLUDED + +#include <utility> +#include <stddef.h> + +#include "array_view.hh" + +namespace Kakoune +{ + +template<typename T, size_t N> +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<T>() { return {m_data, N}; } + constexpr operator ConstArrayView<T>() const { return {m_data, N}; } + + T m_data[N]; +}; + +template<typename T, typename... U> requires (std::is_same_v<T, U> and ...) +Array(T, U...) -> Array<T, 1 + sizeof...(U)>; + +template<typename T, size_t N, size_t... Indices> +constexpr Array<T, N> make_array(const T (&data)[N], std::index_sequence<Indices...>) +{ + static_assert(sizeof...(Indices) == N, "size mismatch"); + return {{data[Indices]...}}; +} + +template<typename T, size_t N> +constexpr Array<T, N> make_array(const T (&data)[N]) +{ + return make_array(data, std::make_index_sequence<N>()); +} + +} + +#endif // array_hh_INCLUDED |
