123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- // 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
|