aboutsummaryrefslogtreecommitdiff
path: root/src/common/Utilities/EventMap.cpp
diff options
context:
space:
mode:
authorModoX <moardox@gmail.com>2023-11-10 20:15:37 +0100
committerGitHub <noreply@github.com>2023-11-10 20:15:37 +0100
commitc5735edcc882e0a52a26a8cea5031e4de9a6b328 (patch)
tree0b687a2e3492208ce328ce21b165a0c38b8134bc /src/common/Utilities/EventMap.cpp
parent42c44bd787458a8a0c7a12bbab874388537d61ed (diff)
Core/Utilities: Added timer series queuing to EventMap (#29420)
Diffstat (limited to 'src/common/Utilities/EventMap.cpp')
-rw-r--r--src/common/Utilities/EventMap.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/common/Utilities/EventMap.cpp b/src/common/Utilities/EventMap.cpp
index d2ff65a14c5..dcfe4686f6b 100644
--- a/src/common/Utilities/EventMap.cpp
+++ b/src/common/Utilities/EventMap.cpp
@@ -85,6 +85,7 @@ uint32 EventMap::ExecuteEvent()
uint32 eventId = (itr->second & 0x0000FFFF);
_lastEvent = itr->second; // include phase/group
_eventMap.erase(itr);
+ ScheduleNextFromSeries(_lastEvent);
return eventId;
}
}
@@ -139,6 +140,14 @@ void EventMap::CancelEvent(uint32 eventId)
else
++itr;
}
+
+ for (EventSeriesStore::iterator itr = _timerSeries.begin(); itr != _timerSeries.end();)
+ {
+ if (eventId == (itr->first & 0x0000FFFF))
+ _timerSeries.erase(itr++);
+ else
+ ++itr;
+ }
}
void EventMap::CancelEventGroup(uint32 group)
@@ -153,6 +162,14 @@ void EventMap::CancelEventGroup(uint32 group)
else
++itr;
}
+
+ for (EventSeriesStore::iterator itr = _timerSeries.begin(); itr != _timerSeries.end();)
+ {
+ if (itr->first & (1 << (group + 15)))
+ _timerSeries.erase(itr++);
+ else
+ ++itr;
+ }
}
Milliseconds EventMap::GetTimeUntilEvent(uint32 eventId) const
@@ -163,3 +180,40 @@ Milliseconds EventMap::GetTimeUntilEvent(uint32 eventId) const
return Milliseconds::max();
}
+
+void EventMap::ScheduleNextFromSeries(uint32 eventData)
+{
+ EventSeriesStore::iterator itr = _timerSeries.find(eventData);
+ if (itr == _timerSeries.end())
+ return;
+
+ if (itr->first != eventData)
+ return;
+
+ if (itr->second.size() == 0)
+ return;
+
+ Milliseconds time = itr->second.front();
+ itr->second.pop();
+
+ ScheduleEvent(eventData, time);
+}
+
+void EventMap::ScheduleEventSeries(uint32 eventId, uint8 group, uint8 phase, std::initializer_list<Milliseconds> const& timeSeries)
+{
+ if (group && group <= 8)
+ eventId |= (1 << (group + 15));
+
+ if (phase && phase <= 8)
+ eventId |= (1 << (phase + 23));
+
+ for (Milliseconds const& time : timeSeries)
+ _timerSeries[eventId].push(time);
+
+ ScheduleNextFromSeries(eventId);
+}
+
+void EventMap::ScheduleEventSeries(uint32 eventId, std::initializer_list<Milliseconds> const& timeSeries)
+{
+ ScheduleEventSeries(eventId, 0, 0, timeSeries);
+}