diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2012-06-29 18:37:17 +0200 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2012-06-29 18:37:17 +0200 |
| commit | dfbda951d38386d992c5ecd005fdf78ae93cb3d3 (patch) | |
| tree | e38684974e32b639550e93e522ce18befadd1d63 /src/register_manager.cc | |
| parent | 5b2ef1da6aecb82cf549e4b17e246149e4ad9968 (diff) | |
support static and dynamic registers, add '%' (filename) and '.' (selection) registers
Diffstat (limited to 'src/register_manager.cc')
| -rw-r--r-- | src/register_manager.cc | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/register_manager.cc b/src/register_manager.cc new file mode 100644 index 00000000..857f7324 --- /dev/null +++ b/src/register_manager.cc @@ -0,0 +1,84 @@ +#include "register_manager.hh" + +#include "utils.hh" +#include "assert.hh" + +namespace Kakoune +{ + +// static value register, which can be modified +// using operator=, so should be user modifiable +class StaticRegister : public Register +{ +public: + Register& operator=(const memoryview<String>& values) + { + m_content = std::vector<String>(values.begin(), values.end()); + return *this; + } + + const String& operator[](size_t index) + { + if (m_content.size() > index) + return m_content[index]; + else + return ms_empty; + } + + operator memoryview<String>() + { + return memoryview<String>(m_content); + } +protected: + std::vector<String> 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=(const memoryview<String>& values) + { + throw runtime_error("this register is not assignable"); + } + + const String& operator[](size_t index) + { + m_content = m_function(); + return StaticRegister::operator[](index); + } + + operator memoryview<String>() + { + m_content = m_function(); + return StaticRegister::operator memoryview<String>(); + } + +private: + RegisterRetriever m_function; +}; + +Register& RegisterManager::operator[](char reg) +{ + auto& reg_ptr = m_registers[reg]; + if (not reg_ptr) + reg_ptr.reset(new StaticRegister()); + return *reg_ptr; +} + +void RegisterManager::register_dynamic_register(char reg, RegisterRetriever function) +{ + auto& reg_ptr = m_registers[reg]; + assert(not reg_ptr); + reg_ptr.reset(new DynamicRegister(std::move(function))); +} + +} |
