Skip to content

src/storage/trie/serialization/trie_serializer_impl.hpp

Namespaces

Name
sgns
sgns::storage
sgns::storage::trie

Classes

Name
class sgns::storage::trie::TrieSerializerImpl

Source code

#ifndef SUPERGENIUS_STORAGE_TRIE_SERIALIZER_IMPL
#define SUPERGENIUS_STORAGE_TRIE_SERIALIZER_IMPL

#include "storage/trie/serialization/trie_serializer.hpp"

#include "storage/trie/codec.hpp"
#include "storage/trie/supergenius_trie/supergenius_trie_factory.hpp"
#include "storage/trie/trie_storage_backend.hpp"

namespace sgns::storage::trie {

  class TrieSerializerImpl : public TrieSerializer {
   public:
    TrieSerializerImpl(std::shared_ptr<SuperGeniusTrieFactory> factory,
                       std::shared_ptr<Codec> codec,
                       std::shared_ptr<TrieStorageBackend> backend);
    ~TrieSerializerImpl() override = default;

    base::Buffer getEmptyRootHash() const override;

    outcome::result<base::Buffer> storeTrie(SuperGeniusTrie &trie) override;

    outcome::result<std::unique_ptr<SuperGeniusTrie>> retrieveTrie(
        const base::Buffer &db_key) const override;

    std::string GetName() override
    {
      return "TrieSerializerImpl";
    }

   private:
    outcome::result<base::Buffer> storeRootNode(SuperGeniusNode &node);
    outcome::result<base::Buffer> storeNode(SuperGeniusNode &node,
                                              BufferBatch &batch);
    outcome::result<void> storeChildren(BranchNode &branch, BufferBatch &batch);
    outcome::result<SuperGeniusTrie::NodePtr> retrieveNode(
        const base::Buffer &db_key) const;
    outcome::result<SuperGeniusTrie::NodePtr> retrieveChild(
        const SuperGeniusTrie::BranchPtr &parent, uint8_t idx) const;

    std::shared_ptr<SuperGeniusTrieFactory> trie_factory_;
    std::shared_ptr<Codec> codec_;
    std::shared_ptr<TrieStorageBackend> backend_;
  };
}  // namespace sgns::storage::trie

#endif // SUPERGENIUS_STORAGE_TRIE_SERIALIZER_IMPL

Updated on 2026-03-04 at 13:10:45 -0800