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
							 |