src/simulator/scheduler-map.cc
changeset 25 9b3bb088c560
parent 16 99e833adbb46
child 36 e622fb7a8262
equal deleted inserted replaced
24:706b1d903da9 25:9b3bb088c560
    19  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
    19  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
    20  * The idea to use a std c++ map came from GTNetS
    20  * The idea to use a std c++ map came from GTNetS
    21  */
    21  */
    22 
    22 
    23 #include "scheduler-map.h"
    23 #include "scheduler-map.h"
    24 #include "event.h"
    24 #include "event-impl.h"
    25 #include <cassert>
    25 #include <cassert>
    26 
    26 
    27 #define noTRACE_MAP 1
    27 #define noTRACE_MAP 1
    28 
    28 
    29 #ifdef TRACE_MAP
    29 #ifdef TRACE_MAP
    43 SchedulerMap::~SchedulerMap ()
    43 SchedulerMap::~SchedulerMap ()
    44 {}
    44 {}
    45 
    45 
    46 
    46 
    47 void 
    47 void 
    48 SchedulerMap::store_in_event (Event ev, EventMapI i) const
    48 SchedulerMap::store_in_event (EventImpl *ev, EventMapI i) const
    49 {
    49 {
    50 	void *tag;
    50 	void *tag;
    51 	memcpy (&(tag), &i, sizeof (tag));
    51 	memcpy (&(tag), &i, sizeof (tag));
    52 	ev.set_tag (tag);
    52 	ev->set_internal_iterator (tag);
    53 }
    53 }
    54 SchedulerMap::EventMapI
    54 SchedulerMap::EventMapI
    55 SchedulerMap::get_from_event (Event const ev) const
    55 SchedulerMap::get_from_event (EventImpl *ev) const
    56 {
    56 {
    57 	EventMapI i;
    57 	EventMapI i;
    58 	void *tag = ev.get_tag ();
    58 	void *tag = ev->get_internal_iterator ();
    59 	memcpy (&i, &(tag), sizeof (i));
    59 	memcpy (&i, &(tag), sizeof (i));
    60  	return i;
    60  	return i;
    61 }
    61 }
    62 
    62 
    63 Event  
    63 EventId
    64 SchedulerMap::insert (Event event, Scheduler::EventKey key)
    64 SchedulerMap::insert (EventImpl *event, Scheduler::EventKey key)
    65 {
    65 {
    66 	std::pair<EventMapI,bool> result = m_list.insert (std::make_pair (key, event));
    66 	std::pair<EventMapI,bool> result = m_list.insert (std::make_pair (key, event));
    67 	assert (result.second);
    67 	assert (result.second);
    68 	store_in_event (event, result.first);
    68 	store_in_event (event, result.first);
    69 	return event;
    69 	return EventId (event, key.m_time, key.m_uid);
    70 }
    70 }
    71 
    71 
    72 bool
    72 bool
    73 SchedulerMap::is_empty (void) const
    73 SchedulerMap::is_empty (void) const
    74 {
    74 {
    75 	return m_list.empty ();
    75 	return m_list.empty ();
    76 }
    76 }
    77 
    77 
    78 Event 
    78 EventImpl *
    79 SchedulerMap::peek_next (void) const
    79 SchedulerMap::peek_next (void) const
    80 {
    80 {
    81 	assert (!is_empty ());
    81 	assert (!is_empty ());
    82 	EventMapCI i = m_list.begin ();
    82 	EventMapCI i = m_list.begin ();
    83 	assert (i != m_list.end ());
    83 	assert (i != m_list.end ());
    96 {
    96 {
    97 	assert (!is_empty ());
    97 	assert (!is_empty ());
    98 	m_list.erase (m_list.begin ());
    98 	m_list.erase (m_list.begin ());
    99 }
    99 }
   100 
   100 
   101 Scheduler::EventKey
   101 EventImpl *
   102 SchedulerMap::remove (Event const ev)
   102 SchedulerMap::remove (EventId id, Scheduler::EventKey *key)
   103 {
   103 {
   104 	assert (!is_empty ());
   104 	assert (!is_empty ());
   105 	EventMapI i = get_from_event (ev);
   105 	EventMapI i = get_from_event (id.get_event_impl ());
   106 	EventKey key = (*i).first;
   106 	*key = i->first;
   107 	m_list.erase (i);
   107 	m_list.erase (i);
   108 	return key;
   108 	return i->second;
       
   109 }
       
   110 
       
   111 bool
       
   112 SchedulerMap::is_valid (EventId id)
       
   113 {
       
   114 	EventMapI i = get_from_event (id.get_event_impl ());
       
   115 	Scheduler::EventKey key = i->first;
       
   116 	return (key.m_time == id.get_time () &&
       
   117 		key.m_uid == id.get_uid ());
   109 }
   118 }
   110 
   119 
   111 
   120 
   112 }; // namespace ns3
   121 }; // namespace ns3