// Copyright (C) 2024 Jérôme "SirLynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - Core module" // For conditions of distribution and use, see copyright notice in Export.hpp #pragma once #ifndef NAZARA_CORE_APPLICATIONBASE_HPP #define NAZARA_CORE_APPLICATIONBASE_HPP #include #include #include #include #include #include #include #include namespace Nz { class NAZARA_CORE_API ApplicationBase { public: struct FixedInterval { Time interval; }; struct Interval { Time interval; }; inline ApplicationBase(); inline ApplicationBase(int argc, char** argv); ApplicationBase(int argc, const Pointer* argv); ApplicationBase(const ApplicationBase&) = delete; ApplicationBase(ApplicationBase&&) = delete; ~ApplicationBase(); inline void AddUpdater(std::unique_ptr&& functor); template void AddUpdaterFunc(F&& functor); template void AddUpdaterFunc(FixedInterval fixedInterval, F&& functor); template void AddUpdaterFunc(Interval interval, F&& functor); inline void ClearComponents(); inline const CommandLineParameters& GetCommandLineParameters() const; template T& GetComponent(); template const T& GetComponent() const; template bool HasComponent() const; inline void Quit(); int Run(); template T* TryGetComponent(); template const T* TryGetComponent() const; bool Update(Time elapsedTime); ApplicationBase& operator=(const ApplicationBase&) = delete; ApplicationBase& operator=(ApplicationBase&&) = delete; static inline ApplicationBase* Instance(); protected: template T& AddComponent(Args&&... args); private: template void AddUpdaterFunc(Time interval, F&& functor); struct Updater { std::unique_ptr updater; Time lastUpdate; Time nextUpdate; }; std::atomic_bool m_running; std::vector> m_components; std::vector m_updaters; CommandLineParameters m_commandLineParams; HighPrecisionClock m_clock; Time m_currentTime; static ApplicationBase* s_instance; }; } #include #endif // NAZARA_CORE_APPLICATIONBASE_HPP