| // Copyright (C) 2004-2006 The Trustees of Indiana University. |
| |
| // Use, modification and distribution is subject to the Boost Software |
| // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
| // http://www.boost.org/LICENSE_1_0.txt) |
| |
| // Authors: Douglas Gregor |
| // Andrew Lumsdaine |
| #ifndef BOOST_FILTERED_QUEUE_HPP |
| #define BOOST_FILTERED_QUEUE_HPP |
| |
| #ifndef BOOST_GRAPH_USE_MPI |
| #error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included" |
| #endif |
| |
| #include <algorithm> |
| |
| namespace boost { |
| |
| /** Queue adaptor that filters elements pushed into the queue |
| * according to some predicate. |
| */ |
| template<typename Buffer, typename Predicate> |
| class filtered_queue |
| { |
| public: |
| typedef Buffer buffer_type; |
| typedef Predicate predicate_type; |
| typedef typename Buffer::value_type value_type; |
| typedef typename Buffer::size_type size_type; |
| |
| /** |
| * Constructs a new filtered queue with an initial buffer and a |
| * predicate. |
| * |
| * @param buffer the initial buffer |
| * @param pred the predicate |
| */ |
| explicit |
| filtered_queue(const buffer_type& buffer = buffer_type(), |
| const predicate_type& pred = predicate_type()) |
| : buffer(buffer), pred(pred) {} |
| |
| /** Push a value into the queue. |
| * |
| * If the predicate returns @c true for @p x, pushes @p x into the |
| * buffer. |
| */ |
| void push(const value_type& x) { if (pred(x)) buffer.push(x); } |
| |
| /** Pop the front element off the buffer. |
| * |
| * @pre @c !empty() |
| */ |
| void pop() { buffer.pop(); } |
| |
| /** Retrieve the front (top) element in the buffer. |
| * |
| * @pre @c !empty() |
| */ |
| value_type& top() { return buffer.top(); } |
| |
| /** |
| * \overload |
| */ |
| const value_type& top() const { return buffer.top(); } |
| |
| /** Determine the number of elements in the buffer. */ |
| size_type size() const { return buffer.size(); } |
| |
| /** Determine if the buffer is empty. */ |
| bool empty() const { return buffer.empty(); } |
| |
| /** Get a reference to the underlying buffer. */ |
| buffer_type& base() { return buffer; } |
| const buffer_type& base() const { return buffer; } |
| |
| /** Swap the contents of this with @p other. */ |
| void swap(filtered_queue& other) |
| { |
| using std::swap; |
| swap(buffer, other.buffer); |
| swap(pred, other.pred); |
| } |
| |
| private: |
| buffer_type buffer; |
| predicate_type pred; |
| }; |
| |
| /** Create a filtered queue. */ |
| template<typename Buffer, typename Predicate> |
| inline filtered_queue<Buffer, Predicate> |
| make_filtered_queue(const Buffer& buffer, const Predicate& pred) |
| { return filtered_queue<Buffer, Predicate>(buffer, pred); } |
| |
| /** Swap a filtered_queue. */ |
| template<typename Buffer, typename Predicate> |
| inline void |
| swap(filtered_queue<Buffer, Predicate>& x, |
| filtered_queue<Buffer, Predicate>& y) |
| { |
| x.swap(y); |
| } |
| |
| } // end namespace boost |
| |
| #endif // BOOST_FILTERED_QUEUE_HPP |