// 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_APPLICATIONBASE_HPP #define NAZARA_CORE_APPLICATIONBASE_HPP #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() = default; 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(); template T& GetComponent(); template const T& GetComponent() const; int Run(); inline void Quit(); bool Update(Time elapsedTime); ApplicationBase& operator=(const ApplicationBase&) = delete; ApplicationBase& operator=(ApplicationBase&&) = delete; 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; HighPrecisionClock m_clock; Time m_currentTime; }; } #include #endif // NAZARA_CORE_APPLICATIONBASE_HPP