forked from Lephenixnoir/fxos
64 lines
1.6 KiB
C++
64 lines
1.6 KiB
C++
//---------------------------------------------------------------------------//
|
|
// 1100101 |_ mov #0, r4 __ //
|
|
// 11 |_ <0xb380 %5c4> / _|_ _____ ___ //
|
|
// 0110 |_ 3.50 -> 3.60 | _\ \ / _ (_-< //
|
|
// |_ base# + offset |_| /_\_\___/__/ //
|
|
//---------------------------------------------------------------------------//
|
|
// fxos/util/Queue: Simple queue that handles recursion
|
|
//
|
|
// Can be instantiated for any T for which std::set<T> is valid and properly
|
|
// checks objects' identity.
|
|
//---
|
|
|
|
#ifndef FXOS_UTIL_QUEUE_H
|
|
#define FXOS_UTIL_QUEUE_H
|
|
|
|
#include <queue>
|
|
#include <set>
|
|
|
|
template<typename T>
|
|
struct Queue
|
|
{
|
|
Queue(): pending {}, seen {}
|
|
{
|
|
}
|
|
|
|
bool empty() const
|
|
{
|
|
return pending.empty();
|
|
}
|
|
T &pop()
|
|
{
|
|
T &object = pending.front();
|
|
pending.pop();
|
|
return object;
|
|
}
|
|
void clear()
|
|
{
|
|
pending.clear();
|
|
seen.clear();
|
|
}
|
|
|
|
/* Enqueue an object to visit later (if not already visited) */
|
|
void enqueue(T object)
|
|
{
|
|
if(!seen.count(object)) {
|
|
pending.push(object);
|
|
seen.insert(object);
|
|
}
|
|
}
|
|
/* Enqueue an object even for later update, regardless of loops */
|
|
void update(T object)
|
|
{
|
|
pending.push(object);
|
|
seen.insert(object);
|
|
}
|
|
|
|
/* Queue of objects to visit next */
|
|
std::queue<T> pending;
|
|
/* Objects already visited or currently pending */
|
|
std::set<T> seen;
|
|
};
|
|
|
|
#endif /* FXOS_UTIL_QUEUE_H */
|