#include "InMemoryBackend.h" #include #include namespace nt { std::string InMemoryBackend::PathKey(const std::vector& path) { return std::accumulate( std::next(path.begin()), path.end(), path.front(), [](std::string a, const std::string& b) { return std::move(a) + "/" + b; }); } std::string InMemoryBackend::Put(std::vector value) { const std::string hash = picosha2::hash256_hex_string(value.begin(), value.end()); kv_.emplace(hash, std::move(value)); return hash; } std::optional> InMemoryBackend::Get(const std::string& hash) { auto it = kv_.find(hash); if (it == kv_.end()) return std::nullopt; return it->second; } void InMemoryBackend::LinkTuple(const std::vector& relation_path, const std::string& tuple_hash) { auto& hashes = index_[PathKey(relation_path)]; for (const auto& h : hashes) if (h == tuple_hash) return; hashes.push_back(tuple_hash); } std::vector InMemoryBackend::TupleHashes( const std::vector& relation_path, std::size_t offset, std::size_t limit) { auto it = index_.find(PathKey(relation_path)); if (it == index_.end() || offset >= it->second.size()) return {}; const auto& all = it->second; auto begin = all.begin() + static_cast(offset); auto end = (offset + limit <= all.size()) ? begin + static_cast(limit) : all.end(); return { begin, end }; } }