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
 | 
