/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once #include "storage/cache/storage_cache_database.h" #include "base/binary_guard.h" namespace Storage { namespace Cache { namespace details { struct Settings; } // namespace details class Database; } // namespace Cache class Databases; class DatabasePointer { public: DatabasePointer(const DatabasePointer &other) = delete; DatabasePointer(DatabasePointer &&other); DatabasePointer &operator=(const DatabasePointer &other) = delete; DatabasePointer &operator=(DatabasePointer &&other); ~DatabasePointer(); Cache::Database *get() const; Cache::Database &operator*() const; Cache::Database *operator->() const; explicit operator bool() const; private: friend class Databases; DatabasePointer( not_null owner, const std::unique_ptr &value); void destroy(); Cache::Database *_value = nullptr; not_null _owner; }; class Databases { public: DatabasePointer get( const QString &path, const Cache::details::Settings &settings); private: friend class DatabasePointer; struct Kept { Kept(std::unique_ptr &&database); std::unique_ptr database; base::binary_guard destroying; }; void destroy(Cache::Database *database); std::map _map; }; } // namespace Storage