5 #ifndef JLM_UTIL_WORKLIST_HPP
6 #define JLM_UTIL_WORKLIST_HPP
15 #include <unordered_map>
47 [[nodiscard]]
virtual bool
55 [[nodiscard]] virtual T
84 return !WorkItems_.empty();
91 T item = WorkItems_.top();
100 if (OnList_.insert(item))
101 WorkItems_.push(item);
129 return !WorkItems_.empty();
136 T item = WorkItems_.front();
138 OnList_.Remove(item);
145 if (OnList_.insert(item))
146 WorkItems_.push(item);
179 return !WorkItems_.empty();
186 auto [_, item] = WorkItems_.top();
189 LastFire_[item] = ++FireCounter_;
196 size_t & lastFire = LastFire_[item];
197 if (lastFire == InQueueSentinelValue)
201 WorkItems_.push({ lastFire, item });
202 lastFire = InQueueSentinelValue;
207 static inline const size_t InQueueSentinelValue = std::numeric_limits<size_t>::max();
217 size_t FireCounter_ = 0;
246 return !Current_.empty() || !Next_.empty();
252 if (Current_.empty())
255 std::swap(Current_, Next_);
256 std::sort(Current_.rbegin(), Current_.rend());
259 auto [_, item] = Current_.back();
262 LastFire_[item] = ++FireCounter_;
269 size_t & lastFire = LastFire_[item];
270 if (lastFire == InQueueSentinelValue)
274 Next_.push_back({ lastFire, item });
275 lastFire = InQueueSentinelValue;
280 static inline const size_t InQueueSentinelValue = std::numeric_limits<size_t>::max();
287 std::vector<std::pair<size_t, T>>
Next_;
290 size_t FireCounter_ = 0;
316 return !PushedItems_.IsEmpty();
328 PushedItems_.insert(item);
334 return PushedItems_.Contains(item);
340 PushedItems_.Remove(item);
void PushWorkItem(T item) override
bool HasMoreWorkItems() const noexcept override
util::HashSet< T > OnList_
std::queue< T > WorkItems_
~FifoWorklist() override=default
bool HasMoreWorkItems() const noexcept override
util::HashSet< T > OnList_
~LifoWorklist() override=default
void PushWorkItem(T item) override
std::stack< T > WorkItems_
MinPriorityQueue< std::pair< size_t, T > > WorkItems_
bool HasMoreWorkItems() const noexcept override
std::unordered_map< T, size_t > LastFire_
std::priority_queue< U, std::vector< U >, std::greater< U > > MinPriorityQueue
~LrfWorklist() override=default
void PushWorkItem(T item) override
TwoPhaseLrfWorklist()=default
std::vector< std::pair< size_t, T > > Current_
void PushWorkItem(T item) override
bool HasMoreWorkItems() const noexcept override
~TwoPhaseLrfWorklist() override=default
std::unordered_map< T, size_t > LastFire_
std::vector< std::pair< size_t, T > > Next_
virtual ~Worklist()=default
virtual T PopWorkItem()=0
virtual bool HasMoreWorkItems() const noexcept=0
Worklist(const Worklist &other)=delete
Worklist(Worklist &&other)=default
Worklist & operator=(Worklist &&other)=default
Worklist & operator=(const Worklist &other)=delete
virtual void PushWorkItem(T item)=0
util::HashSet< T > PushedItems_
~Workset() override=default
bool HasWorkItem(T item) const noexcept
bool HasMoreWorkItems() const noexcept override
void RemoveWorkItem(T item)
void PushWorkItem(T item) override
#define JLM_UNREACHABLE(msg)