#pragma once #include #include #include #include "leveldb/cache.h" #include "leveldb/db.h" #include "leveldb/iterator.h" #include "result.hpp" namespace database { class Iterator; class Database { public: enum DatabaseError { FAILED_TO_OPEN, }; static auto Open() -> cpp::result; ~Database(); auto Initialise() -> void; auto ByTitle() -> Iterator; Database(const Database&) = delete; Database& operator=(const Database&) = delete; private: std::unique_ptr db_; std::unique_ptr cache_; Database(leveldb::DB* db, leveldb::Cache* cache); }; class Iterator { public: explicit Iterator(leveldb::Iterator *it) : it_(it) {} auto Next() -> std::optional; Iterator(const Iterator&) = delete; Iterator& operator=(const Iterator&) = delete; private: std::unique_ptr it_; }; } // namespace database