109 lines
3.0 KiB
Plaintext
109 lines
3.0 KiB
Plaintext
// 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
|