| 
									
										
										
										
											2006-09-11 22:27:29 +00:00
										 |  |  | .. Copyright David Abrahams 2006. Distributed under 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)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-05 19:42:37 +00:00
										 |  |  | .. parsed-literal::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template< class ElementIterator
 | 
					
						
							|  |  |  | 	  , class IndexIterator
 | 
					
						
							|  |  |  | 	  , class ValueT        = use_default
 | 
					
						
							| 
									
										
										
										
											2004-01-12 03:41:47 +00:00
										 |  |  | 	  , class CategoryT     = use_default
 | 
					
						
							| 
									
										
										
										
											2003-08-05 19:42:37 +00:00
										 |  |  | 	  , class ReferenceT    = use_default
 | 
					
						
							|  |  |  | 	  , class DifferenceT   = use_default >
 | 
					
						
							|  |  |  |   class permutation_iterator
 | 
					
						
							|  |  |  |   {
 | 
					
						
							|  |  |  |   public:
 | 
					
						
							|  |  |  |     permutation_iterator();
 | 
					
						
							|  |  |  |     explicit permutation_iterator(ElementIterator x, IndexIterator y);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template< class OEIter, class OIIter, class V, class C, class R, class D >
 | 
					
						
							|  |  |  |     permutation_iterator(
 | 
					
						
							|  |  |  | 	permutation_iterator<OEIter, OIIter, V, C, R, D> const& r
 | 
					
						
							|  |  |  | 	, typename enable_if_convertible<OEIter, ElementIterator>::type* = 0
 | 
					
						
							|  |  |  | 	, typename enable_if_convertible<OIIter, IndexIterator>::type* = 0
 | 
					
						
							|  |  |  | 	);
 | 
					
						
							| 
									
										
										
										
											2004-01-13 21:00:31 +00:00
										 |  |  |     reference operator*() const;
 | 
					
						
							|  |  |  |     permutation_iterator& operator++();
 | 
					
						
							| 
									
										
										
										
											2004-01-18 20:54:59 +00:00
										 |  |  |     ElementIterator const& base() const;
 | 
					
						
							| 
									
										
										
										
											2004-01-12 04:17:26 +00:00
										 |  |  |   private:
 | 
					
						
							| 
									
										
										
										
											2004-01-15 18:51:59 +00:00
										 |  |  |     ElementIterator m_elt;      // exposition only
 | 
					
						
							| 
									
										
										
										
											2004-01-13 21:00:31 +00:00
										 |  |  |     IndexIterator m_order;      // exposition only
 | 
					
						
							| 
									
										
										
										
											2003-08-05 19:42:37 +00:00
										 |  |  |   };
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-12 03:41:47 +00:00
										 |  |  |   template <class ElementIterator, class IndexIterator>
 | 
					
						
							|  |  |  |   permutation_iterator<ElementIterator, IndexIterator> 
 | 
					
						
							|  |  |  |   make_permutation_iterator( ElementIterator e, IndexIterator i);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-05 19:42:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``permutation_iterator`` requirements
 | 
					
						
							|  |  |  | -------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-13 21:00:31 +00:00
										 |  |  | ``ElementIterator`` shall model Random Access Traversal Iterator.
 | 
					
						
							|  |  |  | ``IndexIterator`` shall model Readable Iterator.  The value type of
 | 
					
						
							|  |  |  | the ``IndexIterator`` must be convertible to the difference type of
 | 
					
						
							|  |  |  | ``ElementIterator``.
 | 
					
						
							| 
									
										
										
										
											2003-08-05 19:42:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-13 21:00:31 +00:00
										 |  |  | ``permutation_iterator`` models
 | 
					
						
							|  |  |  | -------------------------------
 | 
					
						
							| 
									
										
										
										
											2003-08-05 19:42:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-13 21:00:31 +00:00
										 |  |  | ``permutation_iterator`` models the same iterator traversal concepts
 | 
					
						
							|  |  |  | as ``IndexIterator`` and the same iterator access concepts as
 | 
					
						
							|  |  |  | ``ElementIterator``.
 | 
					
						
							| 
									
										
										
										
											2003-08-05 19:42:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-13 21:00:31 +00:00
										 |  |  | If ``IndexIterator`` models Single Pass Iterator and 
 | 
					
						
							|  |  |  | ``ElementIterator`` models Readable Iterator then
 | 
					
						
							|  |  |  | ``permutation_iterator`` models Input Iterator.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If ``IndexIterator`` models Forward Traversal Iterator and 
 | 
					
						
							|  |  |  | ``ElementIterator`` models Readable Lvalue Iterator then
 | 
					
						
							|  |  |  | ``permutation_iterator`` models Forward Iterator.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If ``IndexIterator`` models Bidirectional Traversal Iterator and 
 | 
					
						
							|  |  |  | ``ElementIterator`` models Readable Lvalue Iterator then
 | 
					
						
							|  |  |  | ``permutation_iterator`` models Bidirectional Iterator.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If ``IndexIterator`` models Random Access Traversal Iterator and
 | 
					
						
							|  |  |  | ``ElementIterator`` models Readable Lvalue Iterator then
 | 
					
						
							|  |  |  | ``permutation_iterator`` models Random Access Iterator.
 | 
					
						
							| 
									
										
										
										
											2003-08-05 19:42:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-15 18:50:43 +00:00
										 |  |  | ``permutation_iterator<E1, X, V1, C2, R1, D1>`` is interoperable
 | 
					
						
							|  |  |  | with ``permutation_iterator<E2, Y, V2, C2, R2, D2>`` if and only if
 | 
					
						
							|  |  |  | ``X`` is interoperable with ``Y`` and ``E1`` is convertible
 | 
					
						
							|  |  |  | to ``E2``.
 | 
					
						
							| 
									
										
										
										
											2004-01-13 21:22:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-05 19:42:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ``permutation_iterator`` operations
 | 
					
						
							|  |  |  | -----------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-13 21:00:31 +00:00
										 |  |  | In addition to those operations required by the concepts that
 | 
					
						
							|  |  |  | ``permutation_iterator`` models, ``permutation_iterator`` provides the
 | 
					
						
							|  |  |  | following operations.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``permutation_iterator();``
 | 
					
						
							| 
									
										
										
										
											2003-08-05 19:42:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-15 18:51:59 +00:00
										 |  |  | :Effects: Default constructs ``m_elt`` and ``m_order``.
 | 
					
						
							| 
									
										
										
										
											2004-01-13 21:00:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``explicit permutation_iterator(ElementIterator x, IndexIterator y);``
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-15 18:51:59 +00:00
										 |  |  | :Effects: Constructs ``m_elt`` from ``x`` and ``m_order`` from ``y``.
 | 
					
						
							| 
									
										
										
										
											2004-01-12 03:41:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-13 21:00:31 +00:00
										 |  |  |     template< class OEIter, class OIIter, class V, class C, class R, class D >
 | 
					
						
							|  |  |  |     permutation_iterator(
 | 
					
						
							|  |  |  | 	permutation_iterator<OEIter, OIIter, V, C, R, D> const& r
 | 
					
						
							|  |  |  | 	, typename enable_if_convertible<OEIter, ElementIterator>::type* = 0
 | 
					
						
							|  |  |  | 	, typename enable_if_convertible<OIIter, IndexIterator>::type* = 0
 | 
					
						
							|  |  |  | 	);
 | 
					
						
							| 
									
										
										
										
											2004-01-12 03:41:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-15 18:51:59 +00:00
										 |  |  | :Effects: Constructs ``m_elt`` from ``r.m_elt`` and
 | 
					
						
							| 
									
										
										
										
											2004-01-13 21:00:31 +00:00
										 |  |  |   ``m_order`` from ``y.m_order``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``reference operator*() const;``
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-15 18:51:59 +00:00
										 |  |  | :Returns: ``*(m_elt + *m_order)``
 | 
					
						
							| 
									
										
										
										
											2004-01-13 21:00:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``permutation_iterator& operator++();``
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :Effects: ``++m_order``
 | 
					
						
							|  |  |  | :Returns: ``*this``
 | 
					
						
							| 
									
										
										
										
											2004-01-12 04:17:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-18 20:54:59 +00:00
										 |  |  | ``ElementIterator const& base() const;``
 | 
					
						
							| 
									
										
										
										
											2004-01-12 04:17:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-15 18:51:59 +00:00
										 |  |  | :Returns: ``m_order``
 | 
					
						
							| 
									
										
										
										
											2004-01-13 21:00:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <class ElementIterator, class IndexIterator>
 | 
					
						
							|  |  |  |   permutation_iterator<ElementIterator, IndexIterator> 
 | 
					
						
							|  |  |  |   make_permutation_iterator(ElementIterator e, IndexIterator i);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :Returns: ``permutation_iterator<ElementIterator, IndexIterator>(e, i)``
 | 
					
						
							|  |  |  | 
 |