summaryrefslogtreecommitdiff
path: root/src/register_manager.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2015-11-25 21:08:33 +0000
committerMaxime Coste <frrrwww@gmail.com>2015-11-25 21:48:17 +0000
commit3644f2a056e4339d032c4806f7781f941159c963 (patch)
treee64c9eb44e3de2e2f9cc7597df24ea820776513d /src/register_manager.cc
parentec91ea17fe07827e73bb5527724e47b33f2a334e (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.cc70
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);
}
}