Squashed 'third_party/boostorg/iterator/' content from commit b2adecb
Change-Id: I284a73816f9cc846742923879275b84c6e0c915c
git-subtree-dir: third_party/boostorg/iterator
git-subtree-split: b2adecb951af025698618f19a3c838bd314966dc
diff --git a/doc/permutation_iterator_ref.rst b/doc/permutation_iterator_ref.rst
new file mode 100644
index 0000000..d51864f
--- /dev/null
+++ b/doc/permutation_iterator_ref.rst
@@ -0,0 +1,130 @@
+.. 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)
+
+.. parsed-literal::
+
+ template< class ElementIterator
+ , class IndexIterator
+ , class ValueT = use_default
+ , class CategoryT = use_default
+ , 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
+ );
+ reference operator*() const;
+ permutation_iterator& operator++();
+ ElementIterator const& base() const;
+ private:
+ ElementIterator m_elt; // exposition only
+ IndexIterator m_order; // exposition only
+ };
+
+ template <class ElementIterator, class IndexIterator>
+ permutation_iterator<ElementIterator, IndexIterator>
+ make_permutation_iterator( ElementIterator e, IndexIterator i);
+
+
+
+``permutation_iterator`` requirements
+-------------------------------------
+
+``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``.
+
+
+``permutation_iterator`` models
+-------------------------------
+
+``permutation_iterator`` models the same iterator traversal concepts
+as ``IndexIterator`` and the same iterator access concepts as
+``ElementIterator``.
+
+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.
+
+``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``.
+
+
+``permutation_iterator`` operations
+-----------------------------------
+
+In addition to those operations required by the concepts that
+``permutation_iterator`` models, ``permutation_iterator`` provides the
+following operations.
+
+``permutation_iterator();``
+
+:Effects: Default constructs ``m_elt`` and ``m_order``.
+
+
+``explicit permutation_iterator(ElementIterator x, IndexIterator y);``
+
+:Effects: Constructs ``m_elt`` from ``x`` and ``m_order`` from ``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
+ );
+
+:Effects: Constructs ``m_elt`` from ``r.m_elt`` and
+ ``m_order`` from ``y.m_order``.
+
+
+``reference operator*() const;``
+
+:Returns: ``*(m_elt + *m_order)``
+
+
+``permutation_iterator& operator++();``
+
+:Effects: ``++m_order``
+:Returns: ``*this``
+
+
+``ElementIterator const& base() const;``
+
+:Returns: ``m_order``
+
+
+::
+
+ template <class ElementIterator, class IndexIterator>
+ permutation_iterator<ElementIterator, IndexIterator>
+ make_permutation_iterator(ElementIterator e, IndexIterator i);
+
+:Returns: ``permutation_iterator<ElementIterator, IndexIterator>(e, i)``
+