#pragma once #include #include #include 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() const; LocalState identity(const Identity &) const; template optional shared() const; template LocalState shared(const vector> &) const; template LocalState shared(const Stored & x) const { return shared({ x }); }; template LocalState shared(const Storage & st, const T & x) { return updateShared(T::sharedTypeId, x.store(st)); } private: vector lookupShared(UUID) const; LocalState updateShared(UUID, const vector &) const; struct Priv; std::shared_ptr p; }; template optional LocalState::shared() const { return T::load(lookupShared(T::sharedTypeId)); } template LocalState LocalState::shared(const vector> & v) const { vector refs; for (const auto x : v) refs.push_back(x.ref()); return updateShared(T::sharedTypeId, refs); } }