//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #ifndef TIMEDEVENTMGR_H #define TIMEDEVENTMGR_H #ifdef _WIN32 #pragma once #endif #include "utlpriorityqueue.h" // // // These classes provide fast timed event callbacks. To use them, make a CTimedEventMgr // and put CEventRegister objects in your objects that want the timed events. // // class CTimedEventMgr; abstract_class IEventRegisterCallback { public: virtual void FireEvent() = 0; }; class CEventRegister { friend bool TimedEventMgr_LessFunc( CEventRegister* const &a, CEventRegister* const &b ); friend class CTimedEventMgr; public: CEventRegister(); ~CEventRegister(); // Call this before ever calling SetUpdateInterval(). void Init( CTimedEventMgr *pMgr, IEventRegisterCallback *pCallback ); // Use these to start and stop getting updates. void SetUpdateInterval( float interval ); void StopUpdates(); inline bool IsRegistered() const { return m_bRegistered; } private: void Reregister(); // After having an event processed, this is called to have it register for the next one. void Term(); private: CTimedEventMgr *m_pEventMgr; float m_flNextEventTime; float m_flUpdateInterval; IEventRegisterCallback *m_pCallback; bool m_bRegistered; }; class CTimedEventMgr { friend class CEventRegister; public: CTimedEventMgr(); // Call this each frame to fire events. void FireEvents(); private: // Things used by CEventRegister. void RegisterForNextEvent( CEventRegister *pEvent ); void RemoveEvent( CEventRegister *pEvent ); private: // Events, sorted by the time at which they will fire. CUtlPriorityQueue m_Events; }; #endif // TIMEDEVENTMGR_H