summaryrefslogtreecommitdiff
path: root/src/meta.hh
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2017-10-20 12:16:58 +0800
committerMaxime Coste <mawww@kakoune.org>2017-10-20 12:21:22 +0800
commit7c06667bdf58d57e36116246084e9197ee5d1407 (patch)
treee1d428556e798c0f4e008a5a73f59430e35a1bf6 /src/meta.hh
parentd486ea84e57bdabec07fe38a0bb4fb5bdf21848f (diff)
Make the normal mode keymap a compile time hash map
This hash map is now fully constexpr, and ends up stored in the read only data segment instead of being recomputed at each startup.
Diffstat (limited to 'src/meta.hh')
-rw-r--r--src/meta.hh44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/meta.hh b/src/meta.hh
index 2126d4f4..aa84b8a4 100644
--- a/src/meta.hh
+++ b/src/meta.hh
@@ -37,6 +37,50 @@ constexpr Array<T, N> make_array(const T (&data)[N])
return make_array(data, std::make_index_sequence<N>());
}
+template<typename T, size_t capacity>
+struct ConstexprVector
+{
+ using iterator = T*;
+ using const_iterator = const T*;
+
+ constexpr ConstexprVector() : m_size{0} {}
+ constexpr ConstexprVector(std::initializer_list<T> items)
+ : m_size{items.size()}
+ {
+ T* ptr = m_data;
+ for (auto& item : items)
+ *ptr++ = std::move(item);
+ }
+
+ constexpr bool empty() const { return m_size == 0; }
+ constexpr size_t size() const { return m_size; }
+
+ constexpr void resize(size_t n, const T& val)
+ {
+ if (n >= capacity)
+ throw "capacity exceeded";
+ if (n > m_size)
+ {
+ for (int i = n; i < m_size; ++i)
+ m_data[i] = val;
+ }
+ m_size = n;
+ kak_assert(this->size() == m_size);
+ }
+
+ constexpr T& operator[](size_t i) { return m_data[i]; }
+ constexpr const T& operator[](size_t i) const { return m_data[i]; }
+
+ constexpr iterator begin() { return m_data; }
+ constexpr iterator end() { return m_data + m_size; }
+
+ constexpr const_iterator begin() const { return m_data; }
+ constexpr const_iterator end() const { return m_data + m_size; }
+
+ size_t m_size;
+ T m_data[capacity] = {};
+};
+
}
#endif // meta_hh_INCLUDED