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 |