78 void notify(TYPE
const& entry,
const sc_core::sc_time& t) {
79 insert_entry(entry, t + sc_core::sc_time_stamp());
80 m_event.notify(m_scheduled_events.begin()->first - sc_core::sc_time_stamp());
91 void notify(TYPE&& entry,
const sc_core::sc_time& t) {
92 insert_entry(std::move(entry), t + sc_core::sc_time_stamp());
93 m_event.notify(m_scheduled_events.begin()->first - sc_core::sc_time_stamp());
103 void notify(TYPE&& entry) {
104 insert_entry(std::move(entry), sc_core::sc_time_stamp());
116 insert_entry(entry, sc_core::sc_time_stamp());
126 if(m_scheduled_events.empty())
128 sc_core::sc_time now = sc_core::sc_time_stamp();
129 if(!m_scheduled_events.size() || m_scheduled_events.begin()->first > now) {
130 if(m_scheduled_events.size())
131 m_event.notify(m_scheduled_events.begin()->first - now);
144 sc_core::wait(
event());
154 sc_core::sc_event&
event() {
return m_event; }
161 m_scheduled_events.clear();
170 bool has_next() {
return !(m_scheduled_events.empty() || m_scheduled_events.begin()->first > sc_core::sc_time_stamp()); }
172 sc_core::sc_time get_next_time_stamp() {
173 return m_scheduled_events.empty() ? sc_core::sc_time::from_value(std::numeric_limits<sc_core::sc_time::value_type>::max())
174 : m_scheduled_events.begin()->first;
178 while(!m_scheduled_events.empty()) {
179 auto queue = m_scheduled_events.begin()->second;
181 free_pool.push_back(queue);
182 m_scheduled_events.erase(m_scheduled_events.begin());
186 size_t size()
const {
return m_scheduled_events.size(); }
189 map_type m_scheduled_events;
190 std::deque<std::deque<TYPE>*> free_pool;
191 sc_core::sc_event m_event;
193 void insert_entry(
const TYPE& entry, sc_core::sc_time abs_time) {
194 auto it = m_scheduled_events.find(abs_time);
195 if(it == m_scheduled_events.end()) {
196 if(free_pool.size()) {
197 auto r = m_scheduled_events.insert(std::make_pair(abs_time, free_pool.front()));
198 free_pool.pop_front();
199 r.first->second->push_back(entry);
201 auto r = m_scheduled_events.insert(std::make_pair(abs_time,
new std::deque<TYPE>()));
202 r.first->second->push_back(entry);
205 it->second->push_back(entry);
208 void insert_entry(TYPE&& entry, sc_core::sc_time abs_time) {
209 auto it = m_scheduled_events.find(abs_time);
210 if(it == m_scheduled_events.end()) {
211 if(free_pool.size()) {
212 auto r = m_scheduled_events.insert(std::make_pair(abs_time, free_pool.front()));
213 free_pool.pop_front();
214 r.first->second->push_back(std::move(entry));
216 auto r = m_scheduled_events.insert(std::make_pair(abs_time,
new std::deque<TYPE>()));
217 r.first->second->push_back(std::move(entry));
220 it->second->push_back(std::move(entry));
224 auto entry = m_scheduled_events.begin()->second;
225 auto ret = std::move(entry->front());
228 free_pool.push_back(entry);
229 m_scheduled_events.erase(m_scheduled_events.begin());
231 if(m_scheduled_events.size())
232 m_event.notify(m_scheduled_events.begin()->first - sc_core::sc_time_stamp());
238 while(m_scheduled_events.size()) {
239 free_pool.push_back(m_scheduled_events.begin()->second);
240 m_scheduled_events.erase(m_scheduled_events.begin());
242 for(
auto* p : free_pool)