diff options
Diffstat (limited to 'include/erebos/storage.h')
-rw-r--r-- | include/erebos/storage.h | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/include/erebos/storage.h b/include/erebos/storage.h index ea0e894..3777572 100644 --- a/include/erebos/storage.h +++ b/include/erebos/storage.h @@ -23,9 +23,21 @@ public: Storage & operator=(const Storage &) = delete; static std::optional<Storage> open(std::filesystem::path path); + + bool operator==(const Storage &) const; + bool operator!=(const Storage &) const; + std::optional<Ref> ref(const Digest &) const; - std::optional<Object> load(const Digest &) const; - Ref store(const Object &) const; + + std::optional<Object> loadObject(const Digest &) const; + Ref storeObject(const Object &) const; + Ref storeObject(const class Record &) const; + Ref storeObject(const class Blob &) const; + + template<typename T> Stored<T> store(const T &) const; + + void storeKey(Ref pubref, const std::vector<uint8_t> &) const; + std::optional<std::vector<uint8_t>> loadKey(Ref pubref) const; private: friend class Ref; @@ -71,6 +83,8 @@ public: const Object & operator*() const; const Object * operator->() const; + const Storage & storage() const; + private: friend class Storage; struct Priv; @@ -94,6 +108,10 @@ public: Item(name, std::monostate()) {} Item(const std::string & name, Variant value): name(name), value(value) {} + template<typename T> + Item(const std::string & name, const Stored<T> & value): + Item(name, value.ref) {} + Item(const Item &) = default; Item & operator=(const Item &) = delete; @@ -118,6 +136,7 @@ private: public: Record(const std::vector<Item> &); + Record(std::vector<Item> &&); std::vector<uint8_t> encode() const; const std::vector<Item> & items() const; @@ -192,8 +211,10 @@ template<typename T> class Stored { Stored(Ref ref, std::shared_ptr<T> val): ref(ref), val(val) {} + friend class Storage; public: static std::optional<Stored<T>> load(const Ref &); + Ref store(const Storage &) const; bool operator==(const Stored<T> & other) const { return ref.digest() == other.ref.digest(); } @@ -219,6 +240,12 @@ public: }; template<typename T> +Stored<T> Storage::store(const T & val) const +{ + return Stored(val.store(*this), std::make_shared<T>(val)); +} + +template<typename T> std::optional<Stored<T>> Stored<T>::load(const Ref & ref) { if (auto val = T::load(ref)) @@ -227,6 +254,14 @@ std::optional<Stored<T>> Stored<T>::load(const Ref & ref) } template<typename T> +Ref Stored<T>::store(const Storage & st) const +{ + if (st == ref.storage()) + return ref; + return st.storeObject(*ref); +} + +template<typename T> std::vector<Stored<T>> Stored<T>::previous() const { auto rec = ref->asRecord(); |