summaryrefslogtreecommitdiff
path: root/src/array.hh
diff options
context:
space:
mode:
authorIgor Ramazanov <igor.ramazanov@protonmail.com>2025-01-18 11:43:57 +0000
committerGitHub <noreply@github.com>2025-01-18 11:43:57 +0000
commitce4dc805e375dbd8c0477ad5005c2110f83de2aa (patch)
treeac2ca142a2182eb51ed64ffd029fa4111b4d8f48 /src/array.hh
parentae9758e95f531d26847cfc7e884da3ceb47670f3 (diff)
parent54084900624493033cb24640d864c109cdac40a7 (diff)
Merge branch 'mawww:master' into contrib/gendocs.sh
Diffstat (limited to 'src/array.hh')
-rw-r--r--src/array.hh48
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