historical/toontown-classic.git/panda/include/time_out.h
2024-01-16 11:20:27 -06:00

128 lines
2.6 KiB
C++

#ifndef __TIME_OUT_H__
#define __TIME_OUT_H__
// think of this class as a time based alarm.. would be nice to have a
// template implementation of this class .. could avoud some storage and some
// math .. I would do this but not sure how to represent the duration in the
// template ??
class Time_Out
{
public:
Time_Out()
{
}
Time_Out(const Time_Span & dur) : _alarm_time(Time_Clock::GetCurrentTime() + dur) , _duration(dur)
{
}
/*
Time_Out(const Time_Clock & tm, const Time_Span & dur) : _alarm_time(tm + dur) , _duration(dur)
{
}
*/
void ResetAll(const Time_Clock &tm, const Time_Span &sp);
void ReStart();
void ResetTime(const Time_Clock & tm);
void SetTimeOutSec(int sec);
bool Expired(const Time_Clock &tm, bool reset = false);
bool Expired(bool reset = false);
Time_Span Remaining(const Time_Clock & tm) const;
Time_Span Remaining() const;
void ForceToExpired()
{
_alarm_time.ToCurrentTime();
}
bool operator() (bool reset= false)
{
return Expired(reset);
}
bool operator() (const Time_Clock &tm, bool reset = false)
{
return Expired(tm, reset);
}
Time_Clock GetAlarm(void)
{
return _alarm_time;
}
Time_Span Duration() const { return _duration; };
void NextInStep(Time_Clock &curtime)
{
_alarm_time += _duration;
if(_alarm_time <=curtime) // if we fall way behind.. just ratchet it up ...
_alarm_time = curtime+_duration;
}
private:
Time_Clock _alarm_time;
Time_Span _duration;
};
/**
*
*/
inline void Time_Out::ResetAll(const Time_Clock &tm, const Time_Span &sp)
{
_duration = sp;
_alarm_time = tm + _duration;
}
/**
*
*/
inline void Time_Out::SetTimeOutSec(int sec)
{
_duration.Set(0, 0, 0, sec, 0);
ReStart();
}
/**
*
*/
inline void Time_Out::ReStart()
{
_alarm_time = Time_Clock::GetCurrentTime() + _duration;
}
/**
*
*/
inline void Time_Out::ResetTime(const Time_Clock & tm)
{
_alarm_time = tm + _duration;
}
/**
*
*/
inline bool Time_Out::Expired(const Time_Clock &tm, bool reset)
{
bool answer = (_alarm_time <= tm) ;
if (answer && reset)
ResetTime(tm);
return answer;
}
/**
*
*/
inline bool Time_Out::Expired(bool reset)
{
return Expired(Time_Clock::GetCurrentTime(), reset);
}
/**
*
*/
inline Time_Span Time_Out::Remaining(const Time_Clock & tm) const
{
return _alarm_time - tm;
}
/**
*
*/
inline Time_Span Time_Out::Remaining() const
{
return Remaining(Time_Clock::GetCurrentTime());
}
#endif //__TIME_OUT_H__