77 void notify(TYPE
const& entry,
const sc_core::sc_time& t) {
78 insert_entry(entry, t + sc_core::sc_time_stamp());
79 m_event.notify(m_scheduled_events.begin()->first - sc_core::sc_time_stamp());
90 void notify(TYPE&& entry,
const sc_core::sc_time& t) {
91 insert_entry(std::move(entry), t + sc_core::sc_time_stamp());
92 m_event.notify(m_scheduled_events.begin()->first - sc_core::sc_time_stamp());
102 void notify(TYPE&& entry) {
103 insert_entry(std::move(entry), sc_core::sc_time_stamp());
115 insert_entry(entry, sc_core::sc_time_stamp());
125 if(m_scheduled_events.empty())
127 sc_core::sc_time now = sc_core::sc_time_stamp();
128 if(!m_scheduled_events.size() || m_scheduled_events.begin()->first > now) {
129 if(m_scheduled_events.size())
130 m_event.notify(m_scheduled_events.begin()->first - now);
143 sc_core::wait(
event());
153 sc_core::sc_event&
event() {
return m_event; }
160 m_scheduled_events.clear();
169 bool has_next() {
return !(m_scheduled_events.empty() || m_scheduled_events.begin()->first > sc_core::sc_time_stamp()); }
172 while(!m_scheduled_events.empty()) {
173 auto queue = m_scheduled_events.begin()->second;
175 free_pool.push_back(queue);
176 m_scheduled_events.erase(m_scheduled_events.begin());
180 size_t size()
const {
return m_scheduled_events.size(); }
183 map_type m_scheduled_events;
184 std::deque<std::deque<TYPE>*> free_pool;
185 sc_core::sc_event m_event;
187 void insert_entry(
const TYPE& entry, sc_core::sc_time abs_time) {
188 auto it = m_scheduled_events.find(abs_time);
189 if(it == m_scheduled_events.end()) {
190 if(free_pool.size()) {
191 auto r = m_scheduled_events.insert(std::make_pair(abs_time, free_pool.front()));
192 free_pool.pop_front();
193 r.first->second->push_back(entry);
195 auto r = m_scheduled_events.insert(std::make_pair(abs_time,
new std::deque<TYPE>()));
196 r.first->second->push_back(entry);
199 it->second->push_back(entry);
202 void insert_entry(TYPE&& entry, sc_core::sc_time abs_time) {
203 auto it = m_scheduled_events.find(abs_time);
204 if(it == m_scheduled_events.end()) {
205 if(free_pool.size()) {
206 auto r = m_scheduled_events.insert(std::make_pair(abs_time, free_pool.front()));
207 free_pool.pop_front();
208 r.first->second->push_back(std::move(entry));
210 auto r = m_scheduled_events.insert(std::make_pair(abs_time,
new std::deque<TYPE>()));
211 r.first->second->push_back(std::move(entry));
214 it->second->push_back(std::move(entry));
218 auto entry = m_scheduled_events.begin()->second;
219 auto ret = std::move(entry->front());
222 free_pool.push_back(entry);
223 m_scheduled_events.erase(m_scheduled_events.begin());
225 if(m_scheduled_events.size())
226 m_event.notify(m_scheduled_events.begin()->first - sc_core::sc_time_stamp());
232 while(m_scheduled_events.size()) {
233 free_pool.push_back(m_scheduled_events.begin()->second);
234 m_scheduled_events.erase(m_scheduled_events.begin());
236 for(
auto* p : free_pool)