//========= 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