| 295 | } |
| 296 | |
| 297 | ITimer *TimerSystem::CreateTimer(ITimedEvent *pCallbacks, float fInterval, void *pData, int flags) |
| 298 | { |
| 299 | ITimer *pTimer; |
| 300 | TimerIter iter; |
| 301 | float to_exec = GetSimulatedTime() + fInterval; |
| 302 | |
| 303 | if (m_FreeTimers.empty()) |
| 304 | { |
| 305 | pTimer = new ITimer; |
| 306 | } else { |
| 307 | pTimer = m_FreeTimers.front(); |
| 308 | m_FreeTimers.pop(); |
| 309 | } |
| 310 | |
| 311 | pTimer->Initialize(pCallbacks, fInterval, to_exec, pData, flags); |
| 312 | |
| 313 | if (flags & TIMER_FLAG_REPEAT) |
| 314 | { |
| 315 | m_LoopTimers.push_back(pTimer); |
| 316 | goto return_timer; |
| 317 | } |
| 318 | |
| 319 | if (m_SingleTimers.size() >= 1) |
| 320 | { |
| 321 | iter = --m_SingleTimers.end(); |
| 322 | if ((*iter)->m_ToExec <= to_exec) |
| 323 | { |
| 324 | goto normal_insert_end; |
| 325 | } |
| 326 | } |
| 327 | |
| 328 | for (iter=m_SingleTimers.begin(); iter!=m_SingleTimers.end(); iter++) |
| 329 | { |
| 330 | if ((*iter)->m_ToExec >= to_exec) |
| 331 | { |
| 332 | m_SingleTimers.insert(iter, pTimer); |
| 333 | goto return_timer; |
| 334 | } |
| 335 | } |
| 336 | |
| 337 | normal_insert_end: |
| 338 | m_SingleTimers.push_back(pTimer); |
| 339 | |
| 340 | return_timer: |
| 341 | return pTimer; |
| 342 | } |
| 343 | |
| 344 | void TimerSystem::FireTimerOnce(ITimer *pTimer, bool delayExec) |
| 345 | { |
no test coverage detected