// Copyright (C) 2023 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_MODULES_HPP #define NAZARA_CORE_MODULES_HPP #include namespace Nz { namespace Detail { template struct ModuleTuple : ModuleTuple, ModuleTuple { template ModuleTuple(ModuleConfig&&... configs); template T& Get(); }; template struct ModuleTuple { template ModuleTuple(ModuleConfig&&... configs); template T& Get(); Module m; }; } template struct OrderedModuleDependencyList; template using OrderedModuleDependencies = TypeListUnique::Result>; template class Modules { public: template Modules(ModuleConfig&&... configs); ~Modules() = default; template T& Get(); using ModuleTypeList = OrderedModuleDependencies>; private: using Tuple = TypeListInstantiate; Tuple m_modules; }; template<> struct OrderedModuleDependencyList> { using Result = TypeList<>; }; template struct OrderedModuleDependencyList> { using ModuleDependencies = typename OrderedModuleDependencyList::Result; using ModuleDependenciesIncModule = TypeListAppend; using RestDependencies = typename OrderedModuleDependencyList>::Result; using Result = TypeListConcat; }; } #include #endif // NAZARA_CORE_MODULES_HPP