diff --git a/src/jtk/package.d b/src/jtk/package.d index 6acfb83..8878e11 100644 --- a/src/jtk/package.d +++ b/src/jtk/package.d @@ -3,4 +3,5 @@ module jtk; public import jtk.event; public import jtk.init; public import jtk.time; +public import jtk.timer; public import jtk.window; diff --git a/src/jtk/timer.d b/src/jtk/timer.d new file mode 100644 index 0000000..14085ac --- /dev/null +++ b/src/jtk/timer.d @@ -0,0 +1,69 @@ +module jtk.timer; + +import jtk.time; +import std.algorithm; + +class Timer +{ + private static Timer[Timer] timers; + + ulong next; + + ulong interval; + + void * user; + + this(ulong delay, ulong interval, void * user) + { + ulong current_time = ms_time(); + this.next = current_time + delay; + this.interval = interval; + this.user = user; + timers[this] = this; + } + + void remove() + { + timers.remove(this); + } + + void service() + { + if (this.interval == 0u) + { + remove(); + } + else + { + this.next += this.interval; + } + } + + static Timer get_expired_timer() + { + ulong current_time = ms_time(); + foreach (Timer timer; timers) + { + if (timer.next <= current_time) + { + return timer; + } + } + return null; + } + + static ulong time_to_next_timer_expiration() + { + ulong rv = cast(ulong)-1; + ulong current_time = ms_time(); + foreach (Timer timer; timers) + { + if (timer.next <= current_time) + { + return 0u; + } + rv = min(rv, timer.next - current_time); + } + return rv; + } +}