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.
This commit is contained in:
parent
6e09f677f4
commit
034e726068
|
@ -18,17 +18,13 @@ class Register
|
||||||
public:
|
public:
|
||||||
virtual ~Register() = default;
|
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 ConstArrayView<String> get(const Context& context) = 0;
|
||||||
virtual const String& get_main(const Context& context, size_t main_index) = 0;
|
virtual const String& get_main(const Context& context, size_t main_index) = 0;
|
||||||
|
|
||||||
struct RestoreInfo
|
using RestoreInfo = Vector<String, MemoryDomain::Registers>;
|
||||||
{
|
RestoreInfo save(const Context& context) { return get(context) | gather<RestoreInfo>(); }
|
||||||
std::vector<String> data;
|
void restore(Context& context, const RestoreInfo& info) { set(context, info, true); }
|
||||||
size_t size;
|
|
||||||
};
|
|
||||||
virtual RestoreInfo save(const Context&) = 0;
|
|
||||||
virtual void restore(Context&, const RestoreInfo&) = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// static value register, which can be modified
|
// static value register, which can be modified
|
||||||
|
@ -36,7 +32,7 @@ public:
|
||||||
class StaticRegister : public Register
|
class StaticRegister : public Register
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void set(Context&, ConstArrayView<String> values) override
|
void set(Context&, ConstArrayView<String> values, bool) override
|
||||||
{
|
{
|
||||||
m_content.assign(values.begin(), values.end());
|
m_content.assign(values.begin(), values.end());
|
||||||
}
|
}
|
||||||
|
@ -54,19 +50,6 @@ public:
|
||||||
return get(context)[std::min(main_index, m_content.size() - 1)];
|
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:
|
protected:
|
||||||
Vector<String, MemoryDomain::Registers> m_content;
|
Vector<String, MemoryDomain::Registers> m_content;
|
||||||
};
|
};
|
||||||
|
@ -80,7 +63,7 @@ public:
|
||||||
DynamicRegister(Getter getter, Setter setter)
|
DynamicRegister(Getter getter, Setter setter)
|
||||||
: m_getter(std::move(getter)), m_setter(std::move(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);
|
m_setter(context, values);
|
||||||
}
|
}
|
||||||
|
@ -91,11 +74,6 @@ public:
|
||||||
return StaticRegister::get(context);
|
return StaticRegister::get(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
void restore(Context& context, const RestoreInfo& info) override
|
|
||||||
{
|
|
||||||
set(context, info.data);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Getter m_getter;
|
Getter m_getter;
|
||||||
Setter m_setter;
|
Setter m_setter;
|
||||||
|
@ -105,8 +83,11 @@ private:
|
||||||
class HistoryRegister : public StaticRegister
|
class HistoryRegister : public StaticRegister
|
||||||
{
|
{
|
||||||
public:
|
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)
|
for (auto& entry : values)
|
||||||
{
|
{
|
||||||
m_content.erase(std::remove(m_content.begin(), m_content.end(), entry),
|
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();
|
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>
|
template<typename Func>
|
||||||
|
@ -151,7 +121,7 @@ std::unique_ptr<Register> make_dyn_reg(Getter getter, Setter setter)
|
||||||
class NullRegister : public Register
|
class NullRegister : public Register
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void set(Context&, ConstArrayView<String>) override {}
|
void set(Context&, ConstArrayView<String>, bool) override {}
|
||||||
|
|
||||||
ConstArrayView<String> get(const Context&) override
|
ConstArrayView<String> get(const Context&) override
|
||||||
{
|
{
|
||||||
|
@ -162,9 +132,6 @@ public:
|
||||||
{
|
{
|
||||||
return String::ms_empty;
|
return String::ms_empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
RestoreInfo save(const Context&) override { return {}; }
|
|
||||||
void restore(Context&, const RestoreInfo& info) override {}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class RegisterManager : public Singleton<RegisterManager>
|
class RegisterManager : public Singleton<RegisterManager>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user