#pragma once // // This file is distributed under the MIT License. See LICENSE.md for details. // #include #include #include "revng/Support/Assert.h" /// Queue where an element cannot be re-inserted if it's already in the queue template class QueueImpl { public: void insert(T Element) { if (!Set.contains(Element)) { Set.insert(Element); Queue.push(Element); } } bool empty() const { return Queue.empty(); } T head() const { return Queue.front(); } T pop() { T Result = head(); Queue.pop(); if (!Once) Set.erase(Result); return Result; } size_t size() const { return Queue.size(); } std::set visited() { revng_assert(Once); return std::move(Set); } void clear() { std::set().swap(Set); std::queue().swap(Queue); } private: std::set Set; std::queue Queue; }; template using UniquedQueue = QueueImpl; template using OnceQueue = QueueImpl;