# HG changeset patch # User Mathieu Lacage # Date 1165860445 -3600 # Node ID 0e292b31f5328ed9df88380fae221f537e8781f9 # Parent 006158ef00f1d902fdf21192c430c2075737d0a5 do not use internal iterator void * pointer in SchedulerList diff -r 006158ef00f1 -r 0e292b31f532 src/simulator/scheduler-list.cc --- a/src/simulator/scheduler-list.cc Mon Dec 11 18:56:11 2006 +0100 +++ b/src/simulator/scheduler-list.cc Mon Dec 11 19:07:25 2006 +0100 @@ -31,33 +31,6 @@ SchedulerList::~SchedulerList () {} -/* !! WARNING !! - * This is a very nasty piece of code but it really should work - * with pretty much any implementation of a std::list. - * it relies on the fact that a std::list<>::iterator has a single - * member variable, a pointer. - */ -EventId -SchedulerList::GetEventId (Scheduler::EventKey key, EventsI i) -{ - assert (sizeof (i) <= sizeof (void *)); - void *internalIterator; - memcpy ((char *)&(internalIterator), (char *)&i, sizeof (void *)); - EventImpl *ev = i->first; - ev->SetInternalIterator (internalIterator); - return EventId (ev, key.m_ns, key.m_uid); -} -SchedulerList::EventsI -SchedulerList::GetIterator (EventId id) -{ - SchedulerList::EventsI i; - assert (sizeof (i) <= sizeof (void *)); - EventImpl *ev = id.GetEventImpl (); - void *internalIterator = ev->GetInternalIterator (); - memcpy ((char *)&i, (char *)&(internalIterator), sizeof (void *)); - return i; -} - EventId SchedulerList::RealInsert (EventImpl *event, Scheduler::EventKey key) @@ -68,11 +41,11 @@ if (compare (key, i->second)) { m_events.insert (i, std::make_pair (event, key)); - return GetEventId (key, i); + return EventId (event, key.m_ns, key.m_uid); } } m_events.push_back (std::make_pair (event, key)); - return GetEventId (key, --(m_events.end ())); + return EventId (event, key.m_ns, key.m_uid); } bool SchedulerList::RealIsEmpty (void) const @@ -99,23 +72,24 @@ EventImpl * SchedulerList::RealRemove (EventId id, Scheduler::EventKey *key) { - EventsI i = GetIterator (id); - *key = i->second; - assert (key->m_ns == id.GetNs () && - key->m_uid == id.GetUid ()); - EventImpl *ev = i->first; - m_events.erase (i); - return ev; + for (EventsI i = m_events.begin (); i != m_events.end (); i++) + { + if (i->second.m_uid == id.GetUid ()) + { + EventImpl *retval = i->first; + assert (id.GetEventImpl () == retval); + m_events.erase (i); + return retval; + } + } + assert (false); + return 0; } bool SchedulerList::RealIsValid (EventId id) { - EventsI i = GetIterator (id); - Scheduler::EventKey key = i->second; - return (key.m_ns == id.GetNs () && - key.m_uid == id.GetUid ()); - + return true; } }; // namespace ns3 diff -r 006158ef00f1 -r 0e292b31f532 src/simulator/scheduler-list.h --- a/src/simulator/scheduler-list.h Mon Dec 11 18:56:11 2006 +0100 +++ b/src/simulator/scheduler-list.h Mon Dec 11 19:07:25 2006 +0100 @@ -48,8 +48,6 @@ typedef std::list > Events; typedef std::list >::iterator EventsI; - EventId GetEventId (Scheduler::EventKey key, EventsI i); - EventsI GetIterator (EventId id); Events m_events; };