summaryrefslogtreecommitdiff
path: root/include/erebos
diff options
context:
space:
mode:
Diffstat (limited to 'include/erebos')
-rw-r--r--include/erebos/identity.h10
-rw-r--r--include/erebos/state.h55
2 files changed, 64 insertions, 1 deletions
diff --git a/include/erebos/identity.h b/include/erebos/identity.h
index 7ba3f29..66a4afb 100644
--- a/include/erebos/identity.h
+++ b/include/erebos/identity.h
@@ -7,8 +7,14 @@ namespace erebos {
class Identity
{
public:
+ Identity(const Identity &) = default;
+ Identity(Identity &&) = default;
+ Identity & operator=(const Identity &) = default;
+ Identity & operator=(Identity &&) = default;
+
static std::optional<Identity> load(const Ref &);
static std::optional<Identity> load(const std::vector<Ref> &);
+ std::vector<Ref> store(const Storage & st) const;
std::optional<std::string> name() const;
std::optional<Identity> owner() const;
@@ -38,9 +44,11 @@ public:
static Builder create(const Storage &);
Builder modify() const;
+ static const UUID sharedTypeId;
+
private:
struct Priv;
- const std::shared_ptr<const Priv> p;
+ std::shared_ptr<const Priv> p;
Identity(const Priv * p);
Identity(std::shared_ptr<const Priv> && p);
};
diff --git a/include/erebos/state.h b/include/erebos/state.h
new file mode 100644
index 0000000..543e03c
--- /dev/null
+++ b/include/erebos/state.h
@@ -0,0 +1,55 @@
+#pragma once
+
+#include <erebos/identity.h>
+#include <erebos/uuid.h>
+
+#include <optional>
+
+namespace erebos {
+
+using std::optional;
+using std::vector;
+
+class LocalState
+{
+public:
+ LocalState();
+ explicit LocalState(const Ref &);
+ static LocalState load(const Ref & ref) { return LocalState(ref); }
+ Ref store(const Storage &) const;
+
+ static const UUID headTypeId;
+
+ const optional<Identity> & identity() const;
+ LocalState identity(const Identity &) const;
+
+ template<class T> optional<T> shared() const;
+ template<class T> LocalState shared(const vector<Stored<T>> &) const;
+ template<class T> LocalState shared(const Stored<T> & x) const { return shared({ x }); };
+ template<class T> LocalState shared(const Storage & st, const T & x)
+ { return updateShared(T::sharedTypeId, x.store(st)); }
+
+private:
+ vector<Ref> lookupShared(UUID) const;
+ LocalState updateShared(UUID, const vector<Ref> &) const;
+
+ struct Priv;
+ std::shared_ptr<Priv> p;
+};
+
+template<class T>
+optional<T> LocalState::shared() const
+{
+ return T::load(lookupShared(T::sharedTypeId));
+}
+
+template<class T>
+LocalState LocalState::shared(const vector<Stored<T>> & v) const
+{
+ vector<Ref> refs;
+ for (const auto x : v)
+ refs.push_back(x.ref());
+ return updateShared(T::sharedTypeId, refs);
+}
+
+}