diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2015-11-25 21:08:33 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2015-11-25 21:48:17 +0000 |
| commit | 3644f2a056e4339d032c4806f7781f941159c963 (patch) | |
| tree | e64c9eb44e3de2e2f9cc7597df24ea820776513d /src/register_manager.cc | |
| parent | ec91ea17fe07827e73bb5527724e47b33f2a334e (diff) | |
Refactor registers to initialize all of them at startup and add null register
Fixes #497
Diffstat (limited to 'src/register_manager.cc')
| -rw-r--r-- | src/register_manager.cc | 70 |
1 files changed, 9 insertions, 61 deletions
diff --git a/src/register_manager.cc b/src/register_manager.cc index 64e56926..c026f3fc 100644 --- a/src/register_manager.cc +++ b/src/register_manager.cc @@ -1,62 +1,12 @@ #include "register_manager.hh" #include "assert.hh" -#include "exception.hh" #include "id_map.hh" namespace Kakoune { -// static value register, which can be modified -// using operator=, so should be user modifiable -class StaticRegister : public Register -{ -public: - Register& operator=(ConstArrayView<String> values) override - { - m_content = Vector<String, MemoryDomain::Registers>(values.begin(), values.end()); - return *this; - } - - ConstArrayView<String> values(const Context&) override - { - if (m_content.empty()) - return ConstArrayView<String>(ms_empty); - else - return ConstArrayView<String>(m_content); - } -protected: - Vector<String, MemoryDomain::Registers> m_content; - - static const String ms_empty; -}; - -const String StaticRegister::ms_empty; - -// Dynamic value register, use it's RegisterRetriever -// to get it's value when needed. -class DynamicRegister : public StaticRegister -{ -public: - DynamicRegister(RegisterRetriever function) - : m_function(std::move(function)) {} - - Register& operator=(ConstArrayView<String> values) override - { - throw runtime_error("this register is not assignable"); - } - - ConstArrayView<String> values(const Context& context) override - { - m_content = m_function(context); - return StaticRegister::values(context); - } - -private: - RegisterRetriever m_function; -}; - -Register& RegisterManager::operator[](StringView reg) +Register& RegisterManager::operator[](StringView reg) const { if (reg.length() == 1) return (*this)[reg[0_byte]]; @@ -74,23 +24,21 @@ Register& RegisterManager::operator[](StringView reg) return (*this)[it->value]; } -Register& RegisterManager::operator[](Codepoint c) +Register& RegisterManager::operator[](Codepoint c) const { c = to_lower(c); - if (c < 32 or c > 127) - throw runtime_error(format("invalid register name: '{}'", c)); + auto it = m_registers.find(c); + if (it == m_registers.end()) + throw runtime_error(format("no such register: '{}'", c)); - auto& reg_ptr = m_registers[c]; - if (not reg_ptr) - reg_ptr.reset(new StaticRegister()); - return *reg_ptr; + return *(it->second); } -void RegisterManager::register_dynamic_register(char reg, RegisterRetriever function) +void RegisterManager::add_register(char c, std::unique_ptr<Register> reg) { - auto& reg_ptr = m_registers[reg]; + auto& reg_ptr = m_registers[c]; kak_assert(not reg_ptr); - reg_ptr.reset(new DynamicRegister(std::move(function))); + reg_ptr = std::move(reg); } } |
