// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - Core module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_CORE_RESOURCELOADER_HPP #define NAZARA_CORE_RESOURCELOADER_HPP #include #include #include #include #include #include #include #include namespace Nz { class Stream; template class ResourceLoader { static_assert(std::is_base_of::value, "ResourceParameters must be a base of Parameters"); friend Type; public: struct Entry; using ExtensionSupport = std::function; using FileLoader = std::function(const std::filesystem::path& filePath, const Parameters& parameters)>; using MemoryLoader = std::function(const void* data, std::size_t size, const Parameters& parameters)>; using StreamChecker = std::function; using StreamLoader = std::function(Stream& stream, const Parameters& parameters)>; ResourceLoader() = default; ResourceLoader(const ResourceLoader&) = delete; ResourceLoader(ResourceLoader&&) noexcept = default; ~ResourceLoader() = default; void Clear(); bool IsExtensionSupported(const std::string_view& extension) const; std::shared_ptr LoadFromFile(const std::filesystem::path& filePath, const Parameters& parameters = Parameters()) const; std::shared_ptr LoadFromMemory(const void* data, std::size_t size, const Parameters& parameters = Parameters()) const; std::shared_ptr LoadFromStream(Stream& stream, const Parameters& parameters = Parameters()) const; const Entry* RegisterLoader(Entry loader); void UnregisterLoader(const Entry* loader); ResourceLoader& operator=(const ResourceLoader&) = delete; ResourceLoader& operator=(ResourceLoader&&) noexcept = default; struct Entry { ExtensionSupport extensionSupport; FileLoader fileLoader; MemoryLoader memoryLoader; StreamChecker streamChecker; StreamLoader streamLoader; }; private: std::vector> m_loaders; }; } #include #endif // NAZARA_CORE_RESOURCELOADER_HPP