summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/persistence.h17
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/persistence.h b/lib/persistence.h
index 01b2a7e..d55062a 100644
--- a/lib/persistence.h
+++ b/lib/persistence.h
@@ -256,6 +256,23 @@ namespace Persistence {
}
};
+ template<typename Map, typename Type = typename Map::mapped_type, auto Key = &Type::id>
+ struct MapByMember : public Persistence::SelectionT<std::shared_ptr<Type>> {
+ MapByMember(Map & m) : Persistence::SelectionT<std::shared_ptr<Type>> {s}, map {m} { }
+
+ using Persistence::SelectionT<std::shared_ptr<Type>>::SelectionT;
+ void
+ endObject(Persistence::Stack & stk) override
+ {
+ map.emplace(std::invoke(Key, s), s);
+ stk.pop();
+ }
+
+ private:
+ std::shared_ptr<Type> s;
+ Map & map;
+ };
+
struct Persistable {
Persistable() = default;
virtual ~Persistable() = default;