summaryrefslogtreecommitdiff
path: root/lib/persistence.h
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2021-05-09 20:08:31 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2021-11-07 16:41:37 +0000
commit44ee58911b3ffbe9e48e5278bdc73edaf618facd (patch)
tree2ffd87c5f522e2b220b0cae551809aaed302816d /lib/persistence.h
parentImplement writing shared objects with @id (diff)
downloadilt-44ee58911b3ffbe9e48e5278bdc73edaf618facd.tar.bz2
ilt-44ee58911b3ffbe9e48e5278bdc73edaf618facd.tar.xz
ilt-44ee58911b3ffbe9e48e5278bdc73edaf618facd.zip
Don't write null value for pointers
Null is a sensible default which can't be defaulted to anything else sane
Diffstat (limited to 'lib/persistence.h')
-rw-r--r--lib/persistence.h18
1 files changed, 13 insertions, 5 deletions
diff --git a/lib/persistence.h b/lib/persistence.h
index 0eba1ab..252afde 100644
--- a/lib/persistence.h
+++ b/lib/persistence.h
@@ -53,6 +53,7 @@ namespace Persistence {
virtual void beforeValue(Stack &);
[[nodiscard]] virtual SelectionPtr select(const std::string &);
+ [[nodiscard]] virtual bool needsWrite() const;
virtual void write(const Writer &) const;
};
@@ -108,9 +109,10 @@ namespace Persistence {
[[nodiscard]] inline bool
persistValue(const std::string_view key, T & value)
{
- const auto act {setName(key)};
+ SelectionT<T> s {value};
+ const auto act {setName(key, s)};
if (act != NameAction::Ignore) {
- sel = SelectionV<T>::make(value);
+ sel = std::make_unique<decltype(s)>(std::move(s));
if (act == NameAction::HandleAndContinue) {
selHandler();
}
@@ -118,7 +120,7 @@ namespace Persistence {
return (act != NameAction::Push);
}
- virtual NameAction setName(const std::string_view key) = 0;
+ virtual NameAction setName(const std::string_view key, const Selection &) = 0;
virtual void selHandler() {};
virtual void setType(const std::string_view, const Persistable *) = 0;
@@ -128,7 +130,7 @@ namespace Persistence {
struct PersistenceSelect : public PersistenceStore {
explicit PersistenceSelect(const std::string & n);
- NameAction setName(const std::string_view key) override;
+ NameAction setName(const std::string_view key, const Selection &) override;
void setType(const std::string_view, const Persistable *) override;
@@ -138,7 +140,7 @@ namespace Persistence {
struct PersistenceWrite : public PersistenceStore {
explicit PersistenceWrite(const Writer & o, bool sh);
- NameAction setName(const std::string_view key) override;
+ NameAction setName(const std::string_view key, const Selection &) override;
void selHandler() override;
@@ -399,6 +401,12 @@ namespace Persistence {
stk.pop();
}
+ [[nodiscard]] bool
+ needsWrite() const override
+ {
+ return this->v != nullptr;
+ }
+
void
write(const Writer & out) const override
{