fix(Core/Util): EventMap::RepeatEvent when eventId is retrieved by ExecuteEvent() call (#3426)

This commit is contained in:
Andrius Peleckas
2020-10-17 15:59:22 +03:00
committed by GitHub
parent 32da0eeb9e
commit ab5933effa
131 changed files with 558 additions and 1012 deletions

View File

@@ -18,7 +18,7 @@
#include <map>
#include <ace/INET_Addr.h>
// Searcher for map of structs
// Searcher for map of structs
template<typename T, class S> struct Finder
{
T val_;
@@ -440,7 +440,7 @@ public:
part[0] == right.part[0] &&
part[1] == right.part[1] &&
part[2] == right.part[2]
);
);
}
inline bool operator!=(flag96 const& right) const
@@ -541,20 +541,20 @@ bool CompareValues(ComparisionType type, T val1, T val2)
{
switch (type)
{
case COMP_TYPE_EQ:
return val1 == val2;
case COMP_TYPE_HIGH:
return val1 > val2;
case COMP_TYPE_LOW:
return val1 < val2;
case COMP_TYPE_HIGH_EQ:
return val1 >= val2;
case COMP_TYPE_LOW_EQ:
return val1 <= val2;
default:
// incorrect parameter
ABORT();
return false;
case COMP_TYPE_EQ:
return val1 == val2;
case COMP_TYPE_HIGH:
return val1 > val2;
case COMP_TYPE_LOW:
return val1 < val2;
case COMP_TYPE_HIGH_EQ:
return val1 >= val2;
case COMP_TYPE_LOW_EQ:
return val1 <= val2;
default:
// incorrect parameter
ABORT();
return false;
}
}
@@ -578,7 +578,7 @@ class EventMap
typedef std::multimap<uint32, uint32> EventStore;
public:
EventMap() : _time(0), _phase(0) { }
EventMap() : _time(0), _phase(0), _lastEvent(0) { }
/**
* @name Reset
@@ -641,9 +641,13 @@ public:
void SetPhase(uint8 phase)
{
if (!phase)
{
_phase = 0;
}
else if (phase <= 8)
{
_phase = (1 << (phase - 1));
}
}
/**
@@ -654,7 +658,9 @@ public:
void AddPhase(uint8 phase)
{
if (phase && phase <= 8)
{
_phase |= (1 << (phase - 1));
}
}
/**
@@ -665,7 +671,9 @@ public:
void RemovePhase(uint8 phase)
{
if (phase && phase <= 8)
{
_phase &= ~(1 << (phase - 1));
}
}
/**
@@ -679,10 +687,14 @@ public:
void ScheduleEvent(uint32 eventId, uint32 time, uint32 group = 0, uint32 phase = 0)
{
if (group && group <= 8)
{
eventId |= (1 << (group + 15));
}
if (phase && phase <= 8)
{
eventId |= (1 << (phase + 23));
}
_eventMap.insert(EventStore::value_type(_time + time, eventId));
}
@@ -711,22 +723,7 @@ public:
*/
void RepeatEvent(uint32 time)
{
if (Empty())
return;
uint32 eventId = _eventMap.begin()->second;
_eventMap.erase(_eventMap.begin());
ScheduleEvent(eventId, time);
}
/**
* @name PopEvent
* @brief Remove the first event in the map.
*/
void PopEvent()
{
if (!Empty())
_eventMap.erase(_eventMap.begin());
_eventMap.insert(EventStore::value_type(_time + time, _lastEvent));
}
/**
@@ -741,12 +738,17 @@ public:
EventStore::iterator itr = _eventMap.begin();
if (itr->first > _time)
{
return 0;
}
else if (_phase && (itr->second & 0xFF000000) && !((itr->second >> 24) & _phase))
{
_eventMap.erase(itr);
}
else
{
uint32 eventId = (itr->second & 0x0000FFFF);
_lastEvent = itr->second;
_eventMap.erase(itr);
return eventId;
}
@@ -755,28 +757,6 @@ public:
return 0;
}
/**
* @name GetEvent
* @brief Returns the next event to execute.
* @return Id of the event to execute.
*/
uint32 GetEvent()
{
while (!Empty())
{
EventStore::iterator itr = _eventMap.begin();
if (itr->first > _time)
return 0;
else if (_phase && (itr->second & 0xFF000000) && !(itr->second & (_phase << 24)))
_eventMap.erase(itr);
else
return (itr->second & 0x0000FFFF);
}
return 0;
}
/**
* @name DelayEvents
* @brief Delays all events in the map. If delay is greater than or equal internal timer, delay will be 0.
@@ -796,9 +776,10 @@ public:
ScheduleEvent(itr->second, delay);
_eventMap.erase(itr);
itr = _eventMap.begin();
continue;
}
else
++itr;
++itr;
}
}
@@ -811,7 +792,9 @@ public:
void DelayEvents(uint32 delay, uint32 group)
{
if (group > 8 || Empty())
{
return;
}
EventStore delayed;
@@ -820,10 +803,11 @@ public:
if (!group || (itr->second & (1 << (group + 15))))
{
delayed.insert(EventStore::value_type(itr->first + delay, itr->second));
_eventMap.erase(itr++);
itr = _eventMap.erase(itr);
continue;
}
else
++itr;
++itr;
}
_eventMap.insert(delayed.begin(), delayed.end());
@@ -837,14 +821,19 @@ public:
void CancelEvent(uint32 eventId)
{
if (Empty())
{
return;
}
for (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
{
if (eventId == (itr->second & 0x0000FFFF))
_eventMap.erase(itr++);
else
++itr;
{
itr = _eventMap.erase(itr);
continue;
}
++itr;
}
}
@@ -856,7 +845,9 @@ public:
void CancelEventGroup(uint32 group)
{
if (!group || group > 8 || Empty())
{
return;
}
uint32 groupMask = (1 << (group + 15));
for (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
@@ -865,9 +856,10 @@ public:
{
_eventMap.erase(itr);
itr = _eventMap.begin();
continue;
}
else
++itr;
++itr;
}
}
@@ -880,11 +872,17 @@ public:
uint32 GetNextEventTime(uint32 eventId) const
{
if (Empty())
{
return 0;
}
for (EventStore::const_iterator itr = _eventMap.begin(); itr != _eventMap.end(); ++itr)
if (eventId == (itr->second & 0x0000FFFF))
return itr->first;
for (auto const& itr : _eventMap)
{
if (eventId == (itr.second & 0x0000FFFF))
{
return itr.first;
}
}
return 0;
}
@@ -912,6 +910,7 @@ public:
private:
uint32 _time;
uint32 _phase;
uint32 _lastEvent;
EventStore _eventMap;
};