#ifndef ISTD_CORE_SYSTEM_H #define ISTD_CORE_SYSTEM_H #include "istd_core/world.h" #include #include #include #include namespace istd { struct System { virtual void tick(World &world) const = 0; virtual std::string_view name() const noexcept = 0; // for debugging // No virtual destructor: static lifetime and no member variables is the // intended use case struct Precedence { // Smaller value means higher precedence or earlier execution enum { Highest = 0, ResetVelocity, DeviceAccumulateVelocity, UpdateKinematics, }; }; }; class SystemRegistry { public: static SystemRegistry &instance() noexcept; void register_system( std::uint32_t precedence, const System *system ) noexcept; void tick(World &world) const noexcept; struct Registar { Registar(std::uint32_t precedence, const System *system); }; private: std::vector> systems_; }; } // namespace istd #endif