| 
									
										
										
										
											2006-09-11 22:27:29 +00:00
										 |  |  | .. 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-11-24 05:02:46 +00:00
										 |  |  | .. Version 1.4 of this ReStructuredText document corresponds to
 | 
					
						
							|  |  |  |    n1530_, the paper accepted by the LWG for TR1.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-01 21:23:47 +00:00
										 |  |  | .. Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. 
 | 
					
						
							| 
									
										
										
										
											2003-11-24 05:02:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-05 18:19:55 +00:00
										 |  |  | .. parsed-literal::
 | 
					
						
							|  |  |  |   
 | 
					
						
							|  |  |  |   template <
 | 
					
						
							|  |  |  |       class Derived
 | 
					
						
							|  |  |  |     , class Base
 | 
					
						
							| 
									
										
										
										
											2004-01-12 18:03:04 +00:00
										 |  |  |     , class Value               = use_default
 | 
					
						
							|  |  |  |     , class CategoryOrTraversal = use_default
 | 
					
						
							|  |  |  |     , class Reference           = use_default
 | 
					
						
							| 
									
										
										
										
											2003-08-05 18:19:55 +00:00
										 |  |  |     , class Difference = use_default
 | 
					
						
							|  |  |  |   >
 | 
					
						
							|  |  |  |   class iterator_adaptor 
 | 
					
						
							| 
									
										
										
										
											2004-01-18 20:54:59 +00:00
										 |  |  |     : public iterator_facade<Derived, *V'*, *C'*, *R'*, *D'*> // see details__
 | 
					
						
							| 
									
										
										
										
											2003-08-05 18:19:55 +00:00
										 |  |  |   {
 | 
					
						
							|  |  |  |       friend class iterator_core_access;
 | 
					
						
							|  |  |  |    public:
 | 
					
						
							|  |  |  |       iterator_adaptor();
 | 
					
						
							| 
									
										
										
										
											2005-01-23 15:40:15 +00:00
										 |  |  |       explicit iterator_adaptor(Base const& iter);
 | 
					
						
							|  |  |  |       typedef Base base_type;
 | 
					
						
							| 
									
										
										
										
											2004-01-19 18:52:48 +00:00
										 |  |  |       Base const& base() const;
 | 
					
						
							| 
									
										
										
										
											2003-08-05 18:19:55 +00:00
										 |  |  |    protected:
 | 
					
						
							| 
									
										
										
										
											2004-07-16 19:58:03 +00:00
										 |  |  |       typedef iterator_adaptor iterator_adaptor\_;
 | 
					
						
							| 
									
										
										
										
											2003-08-05 18:19:55 +00:00
										 |  |  |       Base const& base_reference() const;
 | 
					
						
							|  |  |  |       Base& base_reference();
 | 
					
						
							|  |  |  |    private: // Core iterator interface for iterator_facade.  
 | 
					
						
							|  |  |  |       typename iterator_adaptor::reference dereference() const;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       template <
 | 
					
						
							|  |  |  |       class OtherDerived, class OtherIterator, class V, class C, class R, class D
 | 
					
						
							|  |  |  |       >   
 | 
					
						
							|  |  |  |       bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
 | 
					
						
							|  |  |  |   
 | 
					
						
							|  |  |  |       void advance(typename iterator_adaptor::difference_type n);
 | 
					
						
							|  |  |  |       void increment();
 | 
					
						
							|  |  |  |       void decrement();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       template <
 | 
					
						
							|  |  |  |           class OtherDerived, class OtherIterator, class V, class C, class R, class D
 | 
					
						
							|  |  |  |       >   
 | 
					
						
							|  |  |  |       typename iterator_adaptor::difference_type distance_to(
 | 
					
						
							|  |  |  |           iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    private:
 | 
					
						
							| 
									
										
										
										
											2003-11-24 05:02:46 +00:00
										 |  |  |       Base m_iterator; // exposition only
 | 
					
						
							| 
									
										
										
										
											2003-08-05 18:19:55 +00:00
										 |  |  |   };
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-18 20:54:59 +00:00
										 |  |  | __ base_parameters_
 | 
					
						
							| 
									
										
										
										
											2004-01-12 18:03:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. _requirements:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``iterator_adaptor`` requirements
 | 
					
						
							|  |  |  | ---------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-18 20:54:59 +00:00
										 |  |  | ``static_cast<Derived*>(iterator_adaptor*)`` shall be well-formed.
 | 
					
						
							| 
									
										
										
										
											2004-01-19 18:52:48 +00:00
										 |  |  | The ``Base`` argument shall be Assignable and Copy Constructible.
 | 
					
						
							| 
									
										
										
										
											2004-01-12 18:03:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-11-24 05:13:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. _base_parameters:
 | 
					
						
							| 
									
										
										
										
											2003-11-24 05:02:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ``iterator_adaptor`` base class parameters
 | 
					
						
							|  |  |  | ------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-18 20:54:59 +00:00
										 |  |  | The *V'*, *C'*, *R'*, and *D'* parameters of the ``iterator_facade``
 | 
					
						
							| 
									
										
										
										
											2003-11-24 05:02:46 +00:00
										 |  |  | used as a base class in the summary of ``iterator_adaptor``
 | 
					
						
							|  |  |  | above are defined as follows:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. parsed-literal::
 | 
					
						
							| 
									
										
										
										
											2003-08-05 18:19:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-18 20:54:59 +00:00
										 |  |  |    *V'* = if (Value is use_default)
 | 
					
						
							| 
									
										
										
										
											2003-11-24 05:02:46 +00:00
										 |  |  |              return iterator_traits<Base>::value_type
 | 
					
						
							|  |  |  |          else
 | 
					
						
							|  |  |  |              return Value
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-18 20:54:59 +00:00
										 |  |  |    *C'* = if (CategoryOrTraversal is use_default)
 | 
					
						
							| 
									
										
										
										
											2003-11-24 05:02:46 +00:00
										 |  |  |              return iterator_traversal<Base>::type
 | 
					
						
							|  |  |  |          else
 | 
					
						
							|  |  |  |              return CategoryOrTraversal
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-18 20:54:59 +00:00
										 |  |  |    *R'* = if (Reference is use_default)
 | 
					
						
							| 
									
										
										
										
											2003-11-24 05:02:46 +00:00
										 |  |  |              if (Value is use_default)
 | 
					
						
							|  |  |  |                  return iterator_traits<Base>::reference
 | 
					
						
							|  |  |  |              else
 | 
					
						
							|  |  |  |                  return Value&
 | 
					
						
							|  |  |  |          else
 | 
					
						
							|  |  |  |              return Reference
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-18 20:54:59 +00:00
										 |  |  |    *D'* = if (Difference is use_default)
 | 
					
						
							| 
									
										
										
										
											2003-11-24 05:02:46 +00:00
										 |  |  |              return iterator_traits<Base>::difference_type
 | 
					
						
							|  |  |  |          else
 | 
					
						
							|  |  |  |              return Difference
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-19 18:52:48 +00:00
										 |  |  | .. ``iterator_adaptor`` models
 | 
					
						
							|  |  |  |    ---------------------------
 | 
					
						
							| 
									
										
										
										
											2004-01-12 18:03:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-19 18:52:48 +00:00
										 |  |  |    In order for ``Derived`` to model the iterator concepts corresponding
 | 
					
						
							|  |  |  |    to ``iterator_traits<Derived>::iterator_category``, the expressions
 | 
					
						
							|  |  |  |    involving ``m_iterator`` in the specifications of those private member
 | 
					
						
							|  |  |  |    functions of ``iterator_adaptor`` that may be called by
 | 
					
						
							|  |  |  |    ``iterator_facade<Derived, V, C, R, D>`` in evaluating any valid
 | 
					
						
							|  |  |  |    expression involving ``Derived`` in those concepts' requirements.
 | 
					
						
							| 
									
										
										
										
											2004-01-12 18:03:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. The above is confusing and needs a rewrite. -JGS
 | 
					
						
							| 
									
										
										
										
											2004-01-19 18:52:48 +00:00
										 |  |  | .. That's why it's removed.  We're embracing inheritance, remember?
 | 
					
						
							| 
									
										
										
										
											2003-08-05 18:19:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ``iterator_adaptor`` public operations
 | 
					
						
							|  |  |  | --------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``iterator_adaptor();``
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :Requires: The ``Base`` type must be Default Constructible.
 | 
					
						
							|  |  |  | :Returns: An instance of ``iterator_adaptor`` with 
 | 
					
						
							|  |  |  |     ``m_iterator`` default constructed.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-01-23 15:40:15 +00:00
										 |  |  | ``explicit iterator_adaptor(Base const& iter);``
 | 
					
						
							| 
									
										
										
										
											2003-08-05 18:19:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | :Returns: An instance of ``iterator_adaptor`` with
 | 
					
						
							|  |  |  |     ``m_iterator`` copy constructed from ``iter``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-18 20:54:59 +00:00
										 |  |  | ``Base const& base() const;``
 | 
					
						
							| 
									
										
										
										
											2003-08-05 18:19:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | :Returns: ``m_iterator``
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``iterator_adaptor`` protected member functions
 | 
					
						
							|  |  |  | -----------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``Base const& base_reference() const;``
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :Returns: A const reference to ``m_iterator``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``Base& base_reference();``
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :Returns: A non-const reference to ``m_iterator``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``iterator_adaptor`` private member functions
 | 
					
						
							|  |  |  | ---------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``typename iterator_adaptor::reference dereference() const;``
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :Returns: ``*m_iterator``
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <
 | 
					
						
							|  |  |  |   class OtherDerived, class OtherIterator, class V, class C, class R, class D
 | 
					
						
							|  |  |  |   >   
 | 
					
						
							|  |  |  |   bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :Returns: ``m_iterator == x.base()``
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``void advance(typename iterator_adaptor::difference_type n);``
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :Effects: ``m_iterator += n;``
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``void increment();``
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :Effects: ``++m_iterator;``
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``void decrement();``
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :Effects: ``--m_iterator;``
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <
 | 
					
						
							|  |  |  |       class OtherDerived, class OtherIterator, class V, class C, class R, class D
 | 
					
						
							|  |  |  |   >   
 | 
					
						
							|  |  |  |   typename iterator_adaptor::difference_type distance_to(
 | 
					
						
							|  |  |  |       iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :Returns: ``y.base() - m_iterator``
 |