#pragma once #include "DeerCore/Tools/Memory.h" #include "DeerCore/Tools/TypeDefs.h" #include #include #include namespace Deer { /* class DataSource { public: using DataImporter = [ClassOfTheDataImporter] }; */ using StorageMetadata = std::unordered_map; template concept HasMetadata = requires(const std::string& location) { { T::loadMetadata(location) } -> std::same_as; { T::saveMetadata(StorageMetadata{}, location) }; }; class StorageData { public: StorageData() = default; StorageData(uint32_t dataSize) : size(dataSize), data(MakeScope(dataSize)) {} inline uint8_t* getData() { return data.get(); } inline const uint8_t* getData() const { return data.get(); } inline uint32_t getSize() const { return size; } inline StorageMetadata& getMetadata() { return metadata; } template Scope deserialize(); template static StorageData serialize(const T&); inline explicit operator bool() const { return size != 0; } private: StorageMetadata metadata; Scope data = nullptr; uint32_t size = 0; }; template class StorageBackend { public: static StorageData loadData(const std::string& location); static void saveData(const std::string& location, const StorageData& data); static StorageMetadata loadMetadata(const std::string& location); static void saveMetadata(const StorageMetadata& metadata, const std::string& location); static std::vector indexResources(const std::string& location); }; template class DataManager { public: template static Scope load(const std::string& dataId) { StorageData data = StorageBackend::loadData(dataId); if constexpr (HasMetadata>) { data.getMetadata() = StorageBackend::loadMetadata(dataId); data.getMetadata()["dataId"] = dataId; } return data.deserialize(); } template static void store(const std::string& dataId, T& value) { StorageData data = StorageData::serialize(value); StorageBackend::saveData(dataId, data); if constexpr (HasMetadata>) { StorageBackend::saveMetadata(data.getMetadata(), dataId); } } }; } // namespace Deer