//---------------------------------------------------------------------------// // 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 is valid and properly // checks objects' identity. //--- #ifndef FXOS_UTIL_QUEUE_H #define FXOS_UTIL_QUEUE_H #include #include template 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 pending; /* Objects already visited or currently pending */ std::set seen; }; #endif /* FXOS_UTIL_QUEUE_H */