From 525684f4dafd680e75b2f5dba6deb72c6b470c21 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Sat, 16 Mar 2019 11:54:56 +1100 Subject: [PATCH] Make keymap fully constexpr --- src/normal.cc | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/normal.cc b/src/normal.cc index 9be1cd4a..1101302b 100644 --- a/src/normal.cc +++ b/src/normal.cc @@ -2159,10 +2159,39 @@ void force_redraw(Context& context, NormalParams) } } -template -using KeymapBackend = Vector; +constexpr size_t keymap_max_size = 512; -static const HashMap keymap = { +template +struct KeymapBackend : private Array +{ + using iterator = const T*; + using const_iterator = const T*; + + constexpr KeymapBackend() = default; + constexpr KeymapBackend(std::initializer_list items) + { + resize(items.size()); + for (size_t i = 0; i < items.size(); ++i) + this->m_data[i] = *(items.begin() + i); + } + + constexpr void resize(size_t s) + { + if (s > keymap_max_size) + throw runtime_error{"cannot resize"}; + m_size = s; + } + constexpr size_t size() const { return m_size; } + + using KeymapBackend::Array::begin; + using KeymapBackend::Array::end; + using KeymapBackend::Array::operator[]; + +private: + size_t m_size = 0; +}; + +static constexpr HashMap keymap = { { {'h'}, {"move left", move_cursor} }, { {'j'}, {"move down", move_cursor} }, { {'k'}, {"move up", move_cursor} },