diff options
| author | Maxime Coste <mawww@kakoune.org> | 2019-06-24 19:08:48 +1000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2019-06-24 19:08:48 +1000 |
| commit | 034e7260680d421d4d90b245ca8b239fa3084557 (patch) | |
| tree | a6181086916b11279a5476935a12a267befbed3a /src | |
| parent | 6e09f677f4d0663e05039f9368b9dbfdb93c28b4 (diff) | |
Unify register saving/restoring to a Vector
The previous "optimized" history register logic was unfortunately
not restoring correctly as the order of entries in the history
register could have been mutated.
Diffstat (limited to 'src')
| -rw-r--r-- | src/register_manager.hh | 55 |
1 files changed, 11 insertions, 44 deletions
diff --git a/src/register_manager.hh b/src/register_manager.hh index c463ad3a..796d1940 100644 --- a/src/register_manager.hh +++ b/src/register_manager.hh @@ -18,17 +18,13 @@ class Register public: virtual ~Register() = default; - virtual void set(Context& context, ConstArrayView<String> values) = 0; + virtual void set(Context& context, ConstArrayView<String> values, bool restoring = false) = 0; virtual ConstArrayView<String> get(const Context& context) = 0; virtual const String& get_main(const Context& context, size_t main_index) = 0; - struct RestoreInfo - { - std::vector<String> data; - size_t size; - }; - virtual RestoreInfo save(const Context&) = 0; - virtual void restore(Context&, const RestoreInfo&) = 0; + using RestoreInfo = Vector<String, MemoryDomain::Registers>; + RestoreInfo save(const Context& context) { return get(context) | gather<RestoreInfo>(); } + void restore(Context& context, const RestoreInfo& info) { set(context, info, true); } }; // static value register, which can be modified @@ -36,7 +32,7 @@ public: class StaticRegister : public Register { public: - void set(Context&, ConstArrayView<String> values) override + void set(Context&, ConstArrayView<String> values, bool) override { m_content.assign(values.begin(), values.end()); } @@ -54,19 +50,6 @@ public: return get(context)[std::min(main_index, m_content.size() - 1)]; } - RestoreInfo save(const Context& context) override - { - //std::unique_ptr<String[]> data{new String[m_content.size()]}; - //std::copy_n(m_content.data(), m_content.size(), data.get()); - auto content = get(context); - std::vector<String> data{content.begin(), content.end()}; - return {std::move(data), content.size()}; - } - - void restore(Context&, const RestoreInfo& info) override - { - m_content.assign(info.data.begin(), info.data.begin() + info.size); - } protected: Vector<String, MemoryDomain::Registers> m_content; }; @@ -80,7 +63,7 @@ public: DynamicRegister(Getter getter, Setter setter) : m_getter(std::move(getter)), m_setter(std::move(setter)) {} - void set(Context& context, ConstArrayView<String> values) override + void set(Context& context, ConstArrayView<String> values, bool) override { m_setter(context, values); } @@ -91,11 +74,6 @@ public: return StaticRegister::get(context); } - void restore(Context& context, const RestoreInfo& info) override - { - set(context, info.data); - } - private: Getter m_getter; Setter m_setter; @@ -105,8 +83,11 @@ private: class HistoryRegister : public StaticRegister { public: - void set(Context&, ConstArrayView<String> values) override + void set(Context& context, ConstArrayView<String> values, bool restoring) override { + if (restoring) + return StaticRegister::set(context, values, true); + for (auto& entry : values) { m_content.erase(std::remove(m_content.begin(), m_content.end(), entry), @@ -119,17 +100,6 @@ public: { return m_content.empty() ? String::ms_empty : m_content.back(); } - - RestoreInfo save(const Context&) override - { - return {{}, m_content.size()}; - } - - void restore(Context&, const RestoreInfo& info) override - { - if (info.size < m_content.size()) - m_content.resize(info.size); - } }; template<typename Func> @@ -151,7 +121,7 @@ std::unique_ptr<Register> make_dyn_reg(Getter getter, Setter setter) class NullRegister : public Register { public: - void set(Context&, ConstArrayView<String>) override {} + void set(Context&, ConstArrayView<String>, bool) override {} ConstArrayView<String> get(const Context&) override { @@ -162,9 +132,6 @@ public: { return String::ms_empty; } - - RestoreInfo save(const Context&) override { return {}; } - void restore(Context&, const RestoreInfo& info) override {} }; class RegisterManager : public Singleton<RegisterManager> |
