src/simulator/scheduler-list.cc
changeset 122 6b8f1eda5c57
parent 110 9ac6d63bfe33
child 131 f4fb87e77034
equal deleted inserted replaced
121:f8bc1a370b82 122:6b8f1eda5c57
    36  * with pretty much any implementation of a std::list.
    36  * with pretty much any implementation of a std::list.
    37  * it relies on the fact that a std::list<>::iterator has a single
    37  * it relies on the fact that a std::list<>::iterator has a single
    38  * member variable, a pointer.
    38  * member variable, a pointer.
    39  */
    39  */
    40 EventId
    40 EventId
    41 SchedulerList::getEventId (Scheduler::EventKey key, EventsI i)
    41 SchedulerList::GetEventId (Scheduler::EventKey key, EventsI i)
    42 {
    42 {
    43     assert (sizeof (i) <= sizeof (void *));
    43     assert (sizeof (i) <= sizeof (void *));
    44     void *internalIterator;
    44     void *internalIterator;
    45     memcpy ((char *)&(internalIterator), (char *)&i, sizeof (void *));
    45     memcpy ((char *)&(internalIterator), (char *)&i, sizeof (void *));
    46     EventImpl *ev = i->first;
    46     EventImpl *ev = i->first;
    47     ev->setInternalIterator (internalIterator);
    47     ev->SetInternalIterator (internalIterator);
    48     return EventId (ev, key.m_ns, key.m_uid);
    48     return EventId (ev, key.m_ns, key.m_uid);
    49 }
    49 }
    50 SchedulerList::EventsI 
    50 SchedulerList::EventsI 
    51 SchedulerList::getIterator (EventId id)
    51 SchedulerList::GetIterator (EventId id)
    52 {
    52 {
    53     SchedulerList::EventsI i;
    53     SchedulerList::EventsI i;
    54     assert (sizeof (i) <= sizeof (void *));
    54     assert (sizeof (i) <= sizeof (void *));
    55     EventImpl *ev = id.getEventImpl ();
    55     EventImpl *ev = id.GetEventImpl ();
    56     void *internalIterator = ev->getInternalIterator ();
    56     void *internalIterator = ev->GetInternalIterator ();
    57     memcpy ((char *)&i, (char *)&(internalIterator), sizeof (void *));
    57     memcpy ((char *)&i, (char *)&(internalIterator), sizeof (void *));
    58     return i;
    58     return i;
    59 }
    59 }
    60 
    60 
    61 
    61 
    62 EventId
    62 EventId
    63 SchedulerList::realInsert (EventImpl *event, Scheduler::EventKey key)
    63 SchedulerList::RealInsert (EventImpl *event, Scheduler::EventKey key)
    64 {
    64 {
    65     Scheduler::EventKeyCompare compare;
    65     Scheduler::EventKeyCompare compare;
    66     for (EventsI i = m_events.begin (); i != m_events.end (); i++) {
    66     for (EventsI i = m_events.begin (); i != m_events.end (); i++) {
    67         if (compare (key, i->second)) {
    67         if (compare (key, i->second)) {
    68             m_events.insert (i, std::make_pair (event, key));
    68             m_events.insert (i, std::make_pair (event, key));
    69             return getEventId (key, i);
    69             return GetEventId (key, i);
    70         }
    70         }
    71     }
    71     }
    72     m_events.push_back (std::make_pair (event, key));
    72     m_events.push_back (std::make_pair (event, key));
    73     return getEventId (key, --(m_events.end ()));
    73     return GetEventId (key, --(m_events.end ()));
    74 }
    74 }
    75 bool 
    75 bool 
    76 SchedulerList::realIsEmpty (void) const
    76 SchedulerList::RealIsEmpty (void) const
    77 {
    77 {
    78     return m_events.empty ();
    78     return m_events.empty ();
    79 }
    79 }
    80 EventImpl *
    80 EventImpl *
    81 SchedulerList::realPeekNext (void) const
    81 SchedulerList::RealPeekNext (void) const
    82 {
    82 {
    83     return m_events.front ().first;
    83     return m_events.front ().first;
    84 }
    84 }
    85 Scheduler::EventKey
    85 Scheduler::EventKey
    86 SchedulerList::realPeekNextKey (void) const
    86 SchedulerList::RealPeekNextKey (void) const
    87 {
    87 {
    88     return m_events.front ().second;
    88     return m_events.front ().second;
    89 }
    89 }
    90 
    90 
    91 void
    91 void
    92 SchedulerList::realRemoveNext (void)
    92 SchedulerList::RealRemoveNext (void)
    93 {
    93 {
    94     m_events.pop_front ();
    94     m_events.pop_front ();
    95 }
    95 }
    96 
    96 
    97 EventImpl *
    97 EventImpl *
    98 SchedulerList::realRemove (EventId id, Scheduler::EventKey *key)
    98 SchedulerList::RealRemove (EventId id, Scheduler::EventKey *key)
    99 {
    99 {
   100     EventsI i = getIterator (id);
   100     EventsI i = GetIterator (id);
   101     *key = i->second;
   101     *key = i->second;
   102     assert (key->m_ns == id.getNs () &&
   102     assert (key->m_ns == id.GetNs () &&
   103         key->m_uid == id.getUid ());
   103             key->m_uid == id.GetUid ());
   104     EventImpl *ev = i->first;
   104     EventImpl *ev = i->first;
   105     m_events.erase (i);
   105     m_events.erase (i);
   106     return ev;
   106     return ev;
   107 }
   107 }
   108 
   108 
   109 bool 
   109 bool 
   110 SchedulerList::realIsValid (EventId id)
   110 SchedulerList::RealIsValid (EventId id)
   111 {
   111 {
   112     EventsI i = getIterator (id);
   112     EventsI i = GetIterator (id);
   113     Scheduler::EventKey key = i->second;
   113     Scheduler::EventKey key = i->second;
   114     return (key.m_ns == id.getNs () &&
   114     return (key.m_ns == id.GetNs () &&
   115         key.m_uid == id.getUid ());
   115             key.m_uid == id.GetUid ());
   116     
   116     
   117 }
   117 }
   118 
   118 
   119 }; // namespace ns3
   119 }; // namespace ns3