Core/Misc: EventMap will no longer inherit from std::map

This commit is contained in:
Spp
2013-01-02 08:34:11 +01:00
parent 423fb04270
commit c85dc26584

View File

@@ -311,8 +311,10 @@ const T& RAND(const T& v1, const T& v2, const T& v3, const T& v4, const T& v5, c
}
}
class EventMap : private std::map<uint32, uint32>
class EventMap
{
typedef std::map<uint32, uint32> StorageType;
public:
EventMap() : _time(0), _phase(0) {}
@@ -320,13 +322,16 @@ class EventMap : private std::map<uint32, uint32>
uint32 GetTimer() const { return _time; }
// Removes all events and clears phase
void Reset() { clear(); _time = 0; _phase = 0; }
void Reset()
{
_eventMap.clear(); _time = 0; _phase = 0;
}
void Update(uint32 time) { _time += time; }
uint32 GetPhaseMask() const { return (_phase >> 24) & 0xFF; }
bool Empty() const { return empty(); }
bool Empty() const { return _eventMap.empty(); }
// Sets event phase, must be in range 1 - 8
void SetPhase(uint32 phase)
@@ -346,14 +351,14 @@ class EventMap : private std::map<uint32, uint32>
eventId |= (1 << (groupId + 16));
if (phase && phase < 8)
eventId |= (1 << (phase + 24));
const_iterator itr = find(time);
while (itr != end())
StorageType::const_iterator itr = _eventMap.find(time);
while (itr != _eventMap.end())
{
++time;
itr = find(time);
itr = _eventMap.find(time);
}
insert(std::make_pair(time, eventId));
_eventMap.insert(StorageType::value_type(time, eventId));
}
// Removes event with specified id and creates new entry for it
@@ -366,41 +371,43 @@ class EventMap : private std::map<uint32, uint32>
// Reschedules closest event
void RepeatEvent(uint32 time)
{
if (empty())
if (_eventMap.empty())
return;
uint32 eventId = begin()->second;
erase(begin());
uint32 eventId = _eventMap.begin()->second;
_eventMap.erase(_eventMap.begin());
time += _time;
const_iterator itr = find(time);
while (itr != end())
StorageType::const_iterator itr = _eventMap.find(time);
while (itr != _eventMap.end())
{
++time;
itr = find(time);
itr = _eventMap.find(time);
}
insert(std::make_pair(time, eventId));
_eventMap.insert(StorageType::value_type(time, eventId));
}
// Removes first event
void PopEvent()
{
erase(begin());
if (!_eventMap.empty())
_eventMap.erase(_eventMap.begin());
}
// Gets next event id to execute and removes it from map
uint32 ExecuteEvent()
{
while (!empty())
while (!_eventMap.empty())
{
if (begin()->first > _time)
StorageType::iterator itr = _eventMap.begin();
if (itr->first > _time)
return 0;
else if (_phase && (begin()->second & 0xFF000000) && !(begin()->second & _phase))
erase(begin());
else if (_phase && (itr->second & 0xFF000000) && !(itr->second & _phase))
_eventMap.erase(itr);
else
{
uint32 eventId = (begin()->second & 0x0000FFFF);
erase(begin());
uint32 eventId = (itr->second & 0x0000FFFF);
_eventMap.erase(itr);
return eventId;
}
}
@@ -410,14 +417,15 @@ class EventMap : private std::map<uint32, uint32>
// Gets next event id to execute
uint32 GetEvent()
{
while (!empty())
while (!_eventMap.empty())
{
if (begin()->first > _time)
StorageType::iterator itr = _eventMap.begin();
if (itr->first > _time)
return 0;
else if (_phase && (begin()->second & 0xFF000000) && !(begin()->second & _phase))
erase(begin());
else if (_phase && (itr->second & 0xFF000000) && !(itr->second & _phase))
_eventMap.erase(itr);
else
return (begin()->second & 0x0000FFFF);
return (itr->second & 0x0000FFFF);
}
return 0;
@@ -437,13 +445,13 @@ class EventMap : private std::map<uint32, uint32>
{
uint32 nextTime = _time + delay;
uint32 groupMask = (1 << (groupId + 16));
for (iterator itr = begin(); itr != end() && itr->first < nextTime;)
for (StorageType::iterator itr = _eventMap.begin(); itr != _eventMap.end() && itr->first < nextTime;)
{
if (itr->second & groupMask)
{
ScheduleEvent(itr->second, itr->first - _time + delay);
erase(itr);
itr = begin();
_eventMap.erase(itr);
itr = _eventMap.begin();
}
else
++itr;
@@ -453,12 +461,12 @@ class EventMap : private std::map<uint32, uint32>
// Cancel events with specified id
void CancelEvent(uint32 eventId)
{
for (iterator itr = begin(); itr != end();)
for (StorageType::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
{
if (eventId == (itr->second & 0x0000FFFF))
{
erase(itr);
itr = begin();
_eventMap.erase(itr);
itr = _eventMap.begin();
}
else
++itr;
@@ -470,12 +478,12 @@ class EventMap : private std::map<uint32, uint32>
{
uint32 groupMask = (1 << (groupId + 16));
for (iterator itr = begin(); itr != end();)
for (StorageType::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
{
if (itr->second & groupMask)
{
erase(itr);
itr = begin();
_eventMap.erase(itr);
itr = _eventMap.begin();
}
else
++itr;
@@ -486,7 +494,7 @@ class EventMap : private std::map<uint32, uint32>
// To get how much time remains substract _time
uint32 GetNextEventTime(uint32 eventId) const
{
for (const_iterator itr = begin(); itr != end(); ++itr)
for (StorageType::const_iterator itr = _eventMap.begin(); itr != _eventMap.end(); ++itr)
if (eventId == (itr->second & 0x0000FFFF))
return itr->first;
@@ -496,6 +504,8 @@ class EventMap : private std::map<uint32, uint32>
private:
uint32 _time;
uint32 _phase;
StorageType _eventMap;
};
enum AITarget