#pragma once #include "IZoneAssetDumperState.h" #include "Obj/Gdt/GdtStream.h" #include "Utils/ClassUtils.h" #include "Zone/Zone.h" #include #include #include #include class AssetDumpingContext { std::unordered_map> m_zone_asset_dumper_states; public: Zone* m_zone; std::string m_base_path; std::unique_ptr m_gdt; AssetDumpingContext(); _NODISCARD std::unique_ptr OpenAssetFile(const std::string& fileName) const; template T* GetZoneAssetDumperState() { static_assert(std::is_base_of_v, "T must inherit IZoneAssetDumperState"); // T must also have a public default constructor const auto foundEntry = m_zone_asset_dumper_states.find(typeid(T)); if (foundEntry != m_zone_asset_dumper_states.end()) return dynamic_cast(foundEntry->second.get()); auto newState = std::make_unique(); newState->SetZone(m_zone); auto* newStatePtr = newState.get(); m_zone_asset_dumper_states.emplace(std::make_pair>(typeid(T), std::move(newState))); return newStatePtr; } };