111 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma once
 | |
| 
 | |
| #include <chrono>
 | |
| 
 | |
| namespace lt::app {
 | |
| 
 | |
| /** Information required to tick a system.
 | |
|  * @note May be used across an entire application-frame (consisting of multiple systems ticking)
 | |
|  */
 | |
| struct TickInfo
 | |
| {
 | |
| 	using Timepoint_T = std::chrono::time_point<std::chrono::steady_clock>;
 | |
| 
 | |
| 	using Duration_T = std::chrono::duration<double>;
 | |
| 
 | |
| 	/** Duration since previous tick's end_time to current tick's start_time. */
 | |
| 	Duration_T delta_time {};
 | |
| 
 | |
| 	/** Maximum duration the system is expected to finish ticking in.
 | |
| 	 *
 | |
| 	 * if end_time - start_time > budget -> the system exceeded its ticking budget.
 | |
| 	 * else end_time - start_time < budget -> the system ticked properly.
 | |
| 	 *
 | |
| 	 * In other words, end_time is expected to be less than start_time + budget.
 | |
| 	 */
 | |
| 	Duration_T budget {};
 | |
| 
 | |
| 	/** Exact time which ticking started. */
 | |
| 	Timepoint_T start_time;
 | |
| };
 | |
| 
 | |
| /** Information about how a system's tick performed */
 | |
| struct TickResult
 | |
| {
 | |
| 	using Timepoint_T = std::chrono::time_point<std::chrono::steady_clock>;
 | |
| 
 | |
| 	using Duration_T = std::chrono::duration<double>;
 | |
| 
 | |
| 	/** The info supplied to the system for ticking. */
 | |
| 	TickInfo info;
 | |
| 
 | |
| 	/** Equivalent to end_time - info.start_time. */
 | |
| 	Duration_T duration {};
 | |
| 
 | |
| 	/** Exact time which ticking ended. */
 | |
| 	Timepoint_T end_time;
 | |
| };
 | |
| 
 | |
| 
 | |
| struct SystemDiagnosis
 | |
| {
 | |
| 	enum class Severity : uint8_t
 | |
| 	{
 | |
| 		verbose,
 | |
| 		info,
 | |
| 		warning,
 | |
| 		error,
 | |
| 		fatal,
 | |
| 	};
 | |
| 
 | |
| 	std::string message;
 | |
| 
 | |
| 	std::string code;
 | |
| 
 | |
| 	Severity severity;
 | |
| };
 | |
| 
 | |
| class SystemStats
 | |
| {
 | |
| public:
 | |
| 	void push_diagnosis(SystemDiagnosis &&diagnosis)
 | |
| 	{
 | |
| 		auto diag = m_diagnosis.emplace_back(std::move(diagnosis));
 | |
| 
 | |
| 		log_dbg("message: {}", diag.message);
 | |
| 	}
 | |
| 
 | |
| 	[[nodiscard]] auto empty_diagnosis() const -> bool
 | |
| 	{
 | |
| 		return m_diagnosis.empty();
 | |
| 	}
 | |
| 
 | |
| private:
 | |
| 	std::vector<SystemDiagnosis> m_diagnosis;
 | |
| };
 | |
| 
 | |
| class ISystem
 | |
| {
 | |
| public:
 | |
| 	ISystem() = default;
 | |
| 
 | |
| 	virtual ~ISystem() = default;
 | |
| 
 | |
| 	ISystem(ISystem &&) = default;
 | |
| 
 | |
| 	ISystem(const ISystem &) = delete;
 | |
| 
 | |
| 	auto operator=(ISystem &&) -> ISystem & = default;
 | |
| 
 | |
| 	auto operator=(const ISystem &) -> ISystem & = delete;
 | |
| 
 | |
| 	virtual void on_register() = 0;
 | |
| 
 | |
| 	virtual void on_unregister() = 0;
 | |
| 
 | |
| 	virtual void tick(TickInfo tick) = 0;
 | |
| 
 | |
| 	[[nodiscard]] virtual auto get_last_tick_result() const -> const TickResult & = 0;
 | |
| };
 | |
| 
 | |
| } // namespace lt::app
 |