aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/Time
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin/Time')
-rw-r--r--src/libjin/Time/je_timer.cpp78
-rw-r--r--src/libjin/Time/je_timer.h73
2 files changed, 84 insertions, 67 deletions
diff --git a/src/libjin/Time/je_timer.cpp b/src/libjin/Time/je_timer.cpp
index a2f2486..94ab747 100644
--- a/src/libjin/Time/je_timer.cpp
+++ b/src/libjin/Time/je_timer.cpp
@@ -9,52 +9,55 @@ namespace JinEngine
{
- Timers::Timers()
- : timers()
+ Timer::Timer()
+ : mHandlers()
{
}
- Timers::~Timers()
+ Timer::~Timer()
{
- for (int i = 0; i < timers.size(); ++i)
- delete timers[i];
+ for (int i = 0; i < mHandlers.size(); ++i)
+ delete mHandlers[i];
}
- void Timers::update(int ms)
+ void Timer::update(int ms)
{
- std::vector<Timer*>::iterator it = timers.begin();
- for (; it != timers.end(); )
- {
- if (!(*it)->process(ms))
- {
- Timer* t = *it;
- timers.erase(it);
- delete t;
- return;
- }
- ++it;
- }
+ // Process handler.
+ std::vector<Handler*>::iterator it = mHandlers.begin();
+ for (; it != mHandlers.end(); ++it)
+ (*it)->process(ms);
+ // Erase canceled handler.
+ for (it = mHandlers.begin(); it != mHandlers.end();)
+ {
+ if ((*it)->canceled)
+ it = mHandlers.erase(it);
+ else
+ ++it;
+ }
}
- void Timers::every(int ms, timer_callback callback, void* p)
+ Timer::Handler* Timer::every(int ms, TimerCallback callback, void* p)
{
- Timer* t = new Timer(Timer::EVERY, ms, 0, callback, p);
- timers.push_back(t);
+ Handler* t = new Handler(Handler::EVERY, ms, 0, callback, p);
+ mHandlers.push_back(t);
+ return t;
}
- void Timers::after(int ms, timer_callback callback, void* p)
+ Timer::Handler* Timer::after(int ms, TimerCallback callback, void* p)
{
- Timer* t = new Timer(Timer::AFTER, ms, 0, callback, p);
- timers.push_back(t);
+ Handler* t = new Handler(Handler::AFTER, ms, 0, callback, p);
+ mHandlers.push_back(t);
+ return t;
}
- void Timers::repeat(int ms, int count, timer_callback callback, void* p)
+ Timer::Handler* Timer::repeat(int ms, int count, TimerCallback callback, void* p)
{
- Timer* t = new Timer(Timer::REPEAT, ms, count, callback, p);
- timers.push_back(t);
+ Handler* t = new Handler(Handler::REPEAT, ms, count, callback, p);
+ mHandlers.push_back(t);
+ return t;
}
- Timers::Timer::Timer(Type t, int d, int c, timer_callback f, void* p)
+ Timer::Handler::Handler(Type t, int d, int c, TimerCallback f, void* p)
: type(t)
, duration(d)
, count(c)
@@ -62,14 +65,15 @@ namespace JinEngine
, countdown(c)
, callback(f)
, paramters(p)
+ , canceled(false)
{
}
- Timers::Timer::~Timer()
+ Timer::Handler::~Handler()
{
}
- bool Timers::Timer::process(int ms)
+ void Timer::Handler::process(int ms)
{
tickdown -= ms;
if (tickdown <= 0)
@@ -82,19 +86,23 @@ namespace JinEngine
}
else if (type == AFTER)
{
- return false;
+ canceled = true;
}
else if (type == REPEAT)
{
--countdown;
- if (countdown <= 0)
- return false;
+ if (countdown <= 0)
+ canceled = true;
}
}
- return true;
}
+ void Timer::cancel(Handler* handler)
+ {
+ handler->canceled = true;
+ }
+
} // namespace Time
} // namespace JinEngine
-#endif // defined(jin_time)
+#endif // defined(jin_time) \ No newline at end of file
diff --git a/src/libjin/Time/je_timer.h b/src/libjin/Time/je_timer.h
index b558a55..d0e5513 100644
--- a/src/libjin/Time/je_timer.h
+++ b/src/libjin/Time/je_timer.h
@@ -14,68 +14,77 @@ namespace JinEngine
///
///
///
- class Timers
+ class Timer
{
public:
- typedef void(*timer_callback)(void* prameters);
+
+ typedef void(*TimerCallback)(void* prameters);
///
///
///
- Timers();
+ class Handler
+ {
+ private:
+ friend class Timer;
+ enum Type
+ {
+ EVERY,
+ AFTER,
+ REPEAT,
+ };
+ Handler(Type type, int duration, int count = 0, TimerCallback callback = nullptr, void* paramters = nullptr);
+ virtual ~Handler();
+ void process(int ms);
+
+ int duration;
+ int count;
+ int tickdown;
+ int countdown;
+ Type type;
+ TimerCallback callback;
+ void* paramters;
+ bool canceled;
+ };
///
///
///
- ~Timers();
+ Timer();
///
///
///
- void update(int ms);
+ ~Timer();
///
///
///
- void every(int ms, timer_callback callback, void* paramters);
+ void update(int ms);
///
///
///
- void after(int ms, timer_callback callback, void* paramters);
+ Handler* every(int ms, TimerCallback callback, void* paramters);
///
///
///
- void repeat(int ms, int count, timer_callback callback, void* paramters);
+ Handler* after(int ms, TimerCallback callback, void* paramters);
- private:
+ ///
+ ///
+ ///
+ Handler* repeat(int ms, int count, TimerCallback callback, void* paramters);
///
///
///
- class Timer
- {
- public:
- enum Type
- {
- EVERY,
- AFTER,
- REPEAT,
- };
- Timer(Type type, int duration, int count = 0, timer_callback callback = nullptr, void* paramters = nullptr);
- virtual ~Timer();
- bool process(int ms);
- private:
- int duration;
- int count;
- int tickdown;
- int countdown;
- Type type;
- timer_callback callback;
- void* paramters;
- };
- std::vector<Timer*> timers;
+ void cancel(Handler* handler = nullptr);
+
+ private:
+
+ std::vector<Handler*> mHandlers;
};
@@ -114,4 +123,4 @@ namespace JinEngine
#endif // defined(jin_time)
-#endif // __JE_TIMER_H__
+#endif // __JE_TIMER_H__ \ No newline at end of file