void Repeater::trigger(std::list<Repetition>::iterator rep, Clock::time_point invocation) { Repetition& repetition = *rep; DataRequest& request = access_request(repetition.m_request); assert(request.repetition); // reduce remaining interval by one step and occurred triggering delay decrement_by_one(*request.repetition); auto delayed = m_runtime.now() - invocation; request.repetition->maximum -= units::clock_cast(delayed); // reset repetition data if this is the last repetition if (!has_further_repetition(request)) { request.repetition.reset(); } m_repeat_fn(repetition.m_request, std::move(repetition.m_payload)); m_repetitions.erase(rep); }
void Repeater::trigger(Timestamp now) { while (!m_repetitions.empty() && m_repetitions.top().m_next <= now) { // This cast is safe because element is removed afterwards anyway Repetition& repetition = const_cast<Repetition&>(m_repetitions.top()); if (m_repeat_fn) { DataRequest& request = access_request(repetition.m_request); assert(request.repetition); // reduce remaining interval by one step and occurred triggering delay decrement_by_one(*request.repetition); Timestamp::duration_type delayed = now - repetition.m_next; request.repetition->maximum -= units::Duration(delayed); // reset repetition data if this is the last repetition if (!has_further_repetition(request)) { request.repetition.reset(); } m_repeat_fn(repetition.m_request, std::move(repetition.m_payload)); } m_repetitions.pop(); } }