diff options
Diffstat (limited to 'src/crepe')
| -rw-r--r-- | src/crepe/manager/Mediator.h | 4 | ||||
| -rw-r--r-- | src/crepe/manager/SaveManager.cpp | 32 | ||||
| -rw-r--r-- | src/crepe/manager/SaveManager.h | 27 | 
3 files changed, 27 insertions, 36 deletions
| diff --git a/src/crepe/manager/Mediator.h b/src/crepe/manager/Mediator.h index 8094d80..6507a74 100644 --- a/src/crepe/manager/Mediator.h +++ b/src/crepe/manager/Mediator.h @@ -5,13 +5,13 @@  // TODO: remove these singletons:  #include "../facade/SDLContext.h"  #include "EventManager.h" -#include "SaveManager.h"  #include "api/LoopTimer.h"  namespace crepe {  class ComponentManager;  class SceneManager; +class SaveManager;  /**   * Struct to pass references to classes that would otherwise need to be singletons down to @@ -28,7 +28,7 @@ class SceneManager;  struct Mediator {  	OptionalRef<ComponentManager> component_manager;  	OptionalRef<SceneManager> scene_manager; -	OptionalRef<SaveManager> save_manager = SaveManager::get_instance(); +	OptionalRef<SaveManager> save_manager;  	OptionalRef<EventManager> event_manager = EventManager::get_instance();  	OptionalRef<SDLContext> sdl_context = SDLContext::get_instance();  	OptionalRef<LoopTimer> timer = LoopTimer::get_instance(); diff --git a/src/crepe/manager/SaveManager.cpp b/src/crepe/manager/SaveManager.cpp index d4ed1c1..292e8fd 100644 --- a/src/crepe/manager/SaveManager.cpp +++ b/src/crepe/manager/SaveManager.cpp @@ -1,13 +1,24 @@  #include "../ValueBroker.h"  #include "../api/Config.h"  #include "../facade/DB.h" -#include "../util/Log.h"  #include "SaveManager.h"  using namespace std;  using namespace crepe; +SaveManager::SaveManager(Mediator & mediator) : Manager(mediator) { +	mediator.save_manager = *this; +} + +DB & SaveManager::get_db() { +	if (this->db == nullptr) { +		Config & cfg = Config::get_instance(); +		this->db = make_unique<DB>(cfg.savemgr.location); +	} +	return *this->db; +} +  template <>  string SaveManager::serialize(const string & value) const noexcept {  	return value; @@ -90,22 +101,6 @@ int32_t SaveManager::deserialize(const string & value) const noexcept {  	return deserialize<int64_t>(value);  } -SaveManager::SaveManager() { dbg_trace(); } - -SaveManager & SaveManager::get_instance() { -	dbg_trace(); -	static SaveManager instance; -	return instance; -} - -DB & SaveManager::get_db() { -	Config & cfg = Config::get_instance(); -	// TODO: make this path relative to XDG_DATA_HOME on Linux and whatever the -	// default equivalent is on Windows using some third party library -	static DB db(cfg.savemgr.location); -	return db; -} -  bool SaveManager::has(const string & key) {  	DB & db = this->get_db();  	return db.has(key); @@ -155,7 +150,8 @@ ValueBroker<T> SaveManager::get(const string & key) {  	return {  		[this, key](const T & target) { this->set<T>(key, target); },  		[this, key, value]() mutable -> const T & { -			value = this->deserialize<T>(this->get_db().get(key)); +			DB & db = this->get_db(); +			value = this->deserialize<T>(db.get(key));  			return value;  		},  	}; diff --git a/src/crepe/manager/SaveManager.h b/src/crepe/manager/SaveManager.h index 3d8c852..d13a97a 100644 --- a/src/crepe/manager/SaveManager.h +++ b/src/crepe/manager/SaveManager.h @@ -4,6 +4,8 @@  #include "../ValueBroker.h" +#include "Manager.h" +  namespace crepe {  class DB; @@ -18,7 +20,7 @@ class DB;   *   * The underlying database is a key-value store.   */ -class SaveManager { +class SaveManager : public Manager {  public:  	/**  	 * \brief Get a read/write reference to a value and initialize it if it does not yet exist @@ -63,8 +65,8 @@ public:  	 */  	bool has(const std::string & key); -private: -	SaveManager(); +public: +	SaveManager(Mediator & mediator);  	virtual ~SaveManager() = default;  private: @@ -90,25 +92,18 @@ private:  	T deserialize(const std::string & value) const noexcept;  public: -	// singleton -	static SaveManager & get_instance();  	SaveManager(const SaveManager &) = delete;  	SaveManager(SaveManager &&) = delete;  	SaveManager & operator=(const SaveManager &) = delete;  	SaveManager & operator=(SaveManager &&) = delete; +protected: +	//! Create or return DB +	virtual DB & get_db(); +  private: -	/** -	 * \brief Create an instance of DB and return its reference -	 * -	 * \returns DB instance -	 * -	 * This function exists because DB is a facade class, which can't directly be used in the API -	 * without workarounds -	 * -	 * TODO: better solution -	 */ -	static DB & get_db(); +	//! Database +	std::unique_ptr<DB> db = nullptr;  };  } // namespace crepe |