diff --git a/development/boost/iterator_categories.hpp b/development/boost/iterator_categories.hpp deleted file mode 100644 index 138a5be..0000000 --- a/development/boost/iterator_categories.hpp +++ /dev/null @@ -1,159 +0,0 @@ -#ifndef BOOST_ITERATOR_CATEGORIES_HPP -#define BOOST_ITERATOR_CATEGORIES_HPP - -#include -#include -#include -#include -#include - -namespace boost { - - // Return Type Categories - struct readable_iterator_tag { }; - struct writable_iterator_tag { }; - struct swappable_iterator_tag { }; - struct mutable_lvalue_iterator_tag : - virtual public writable_iterator_tag, - virtual public readable_iterator_tag { }; - struct constant_lvalue_iterator_tag : - virtual public readable_iterator_tag { }; - - // Traversal Categories - struct forward_traversal_tag { }; - struct bidirectional_traversal_tag : public forward_traversal_tag { }; - struct random_access_traversal_tag : public bidirectional_traversal_tag { }; - - struct error_iterator_tag { }; - - // Inherit from iterator_base if your iterator defines its own - // return_category and traversal_category. Otherwise, the "old style" - // iterator category will be mapped to the return_category and - // traversal_category. - struct new_iterator_base { }; - - namespace detail { - - struct return_category_from_nested_type { - template struct bind { - typedef typename Iterator::return_category type; - }; - }; - - struct traversal_category_from_nested_type { - template struct bind { - typedef typename Iterator::traversal_category type; - }; - }; - - template - struct choose_lvalue_return { - typedef typename ct_if::value, - boost::constant_lvalue_iterator_tag, - boost::mutable_lvalue_iterator_tag>::type type; - }; - - - template - struct iter_category_to_return { - typedef typename ct_if< - is_convertible::value, - typename choose_lvalue_return::type, - typename ct_if< - is_convertible::value, - boost::readable_iterator_tag, - typename ct_if< - is_convertible::value, - boost::writable_iterator_tag, - boost::error_iterator_tag - >::type - >::type - >::type type; - }; - - template - struct iter_category_to_traversal { - typedef typename ct_if< - is_convertible::value, - random_access_traversal_tag, - typename ct_if< - is_convertible::value, - bidirectional_traversal_tag, - forward_traversal_tag - >::type - >::type type; - }; - - struct return_category_from_old_traits { - template class bind { - typedef boost::detail::iterator_traits OldTraits; - typedef typename OldTraits::iterator_category Cat; - typedef typename OldTraits::value_type value_type; - public: - typedef iter_category_to_return::type type; - }; - }; - - struct traversal_category_from_old_traits { - template class bind { - typedef boost::detail::iterator_traits OldTraits; - typedef typename OldTraits::iterator_category Cat; - public: - typedef iter_category_to_traversal::type type; - }; - }; - - template - class choose_return_category { - typedef typename ct_if::value, - return_category_from_nested_type, - return_category_from_old_traits>::type Choice; - public: - typedef typename Choice:: template bind::type type; - }; - - template - class choose_traversal_category { - typedef typename ct_if::value, - traversal_category_from_nested_type, - traversal_category_from_old_traits>::type Choice; - public: - typedef typename Choice:: template bind::type type; - }; - - } // namespace detail - - template - struct return_category { - typedef typename detail::choose_return_category::type type; - }; - - - template - struct traversal_category { - typedef typename detail::choose_traversal_category::type type; - }; - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - - template - struct return_category - { - typedef typename ct_if::value, - constant_lvalue_iterator_tag, - mutable_lvalue_iterator_tag>::type type; - }; - - template - struct traversal_category - { - typedef random_access_traversal_tag type; - }; - -#endif - -} // namespace boost - -#endif // BOOST_ITERATOR_CATEGORIES_HPP diff --git a/development/boost/iterator_concepts.hpp b/development/boost/iterator_concepts.hpp deleted file mode 100644 index a30ff17..0000000 --- a/development/boost/iterator_concepts.hpp +++ /dev/null @@ -1,172 +0,0 @@ -#ifndef BOOST_ITERATOR_CONCEPTS_HPP -#define BOOST_ITERATOR_CONCEPTS_HPP - -#include -#include -#include -#include - -namespace boost_concepts { - // Used a different namespace here (instead of "boost") so that the - // concept descriptions do not take for granted the names in - // namespace boost. - - - //=========================================================================== - // Iterator Access Concepts - - template - class ReadableIteratorConcept { - public: - typedef typename std::iterator_traits::value_type value_type; - typedef typename std::iterator_traits::reference reference; - typedef typename boost::return_category::type return_category; - - void constraints() { - boost::function_requires< boost::SGIAssignableConcept >(); - boost::function_requires< boost::EqualityComparableConcept >(); - boost::function_requires< - boost::DefaultConstructibleConcept >(); - - BOOST_STATIC_ASSERT((boost::is_convertible::value)); - - reference r = *i; // or perhaps read(x) - value_type v(r); - boost::ignore_unused_variable_warning(v); - } - Iterator i; - }; - - template - class WritableIteratorConcept { - public: - typedef typename boost::return_category::type return_category; - - void constraints() { - boost::function_requires< boost::SGIAssignableConcept >(); - boost::function_requires< boost::EqualityComparableConcept >(); - boost::function_requires< - boost::DefaultConstructibleConcept >(); - - BOOST_STATIC_ASSERT((boost::is_convertible::value)); - - *i = v; // a good alternative could be something like write(x, v) - } - ValueType v; - Iterator i; - }; - - template - class ConstantLvalueIteratorConcept { - public: - typedef typename std::iterator_traits::value_type value_type; - typedef typename std::iterator_traits::reference reference; - typedef typename boost::return_category::type return_category; - - void constraints() { - boost::function_requires< ReadableIteratorConcept >(); - - BOOST_STATIC_ASSERT((boost::is_convertible::value)); - - BOOST_STATIC_ASSERT((boost::is_same::value)); - - reference v = *i; - boost::ignore_unused_variable_warning(v); - } - Iterator i; - }; - - template - class MutableLvalueIteratorConcept { - public: - typedef typename std::iterator_traits::value_type value_type; - typedef typename std::iterator_traits::reference reference; - typedef typename boost::return_category::type return_category; - - void constraints() { - boost::function_requires< ReadableIteratorConcept >(); - boost::function_requires< - WritableIteratorConcept >(); - - BOOST_STATIC_ASSERT((boost::is_convertible::value)); - - BOOST_STATIC_ASSERT((boost::is_same::value)); - - reference v = *i; - boost::ignore_unused_variable_warning(v); - } - Iterator i; - }; - - //=========================================================================== - // Iterator Traversal Concepts - - template - class ForwardIteratorConcept { - public: - typedef typename boost::traversal_category::type traversal_category; - - void constraints() { - boost::function_requires< boost::SGIAssignableConcept >(); - boost::function_requires< boost::EqualityComparableConcept >(); - boost::function_requires< - boost::DefaultConstructibleConcept >(); - - BOOST_STATIC_ASSERT((boost::is_convertible::value)); - ++i; - (void)i++; - } - Iterator i; - }; - - template - class BidirectionalIteratorConcept { - public: - typedef typename boost::traversal_category::type traversal_category; - - void constraints() { - boost::function_requires< ForwardIteratorConcept >(); - - BOOST_STATIC_ASSERT((boost::is_convertible::value)); - - --i; - (void)i--; - } - Iterator i; - }; - - template - class RandomAccessIteratorConcept { - public: - typedef typename boost::traversal_category::type traversal_category; - typedef typename std::iterator_traits::difference_type - difference_type; - - void constraints() { - boost::function_requires< BidirectionalIteratorConcept >(); - - BOOST_STATIC_ASSERT((boost::is_convertible::value)); - - i += n; - i = i + n; - i = n + i; - i -= n; - i = i - n; - n = i - j; - } - difference_type n; - Iterator i, j; - }; - -} // namespace boost_concepts - - -#endif // BOOST_ITERATOR_CONCEPTS_HPP diff --git a/development/libs/iterator/concept_tests.cpp b/development/libs/iterator/concept_tests.cpp deleted file mode 100644 index f75f311..0000000 --- a/development/libs/iterator/concept_tests.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include - -struct new_iterator - : public boost::iterator, - public boost::new_iterator_base -{ - typedef boost::random_access_traversal_tag traversal_category; - typedef boost::mutable_lvalue_iterator_tag return_category; - - int& operator*() const { return *m_x; } - new_iterator& operator++() { return *this; } - new_iterator operator++(int) { return *this; } - new_iterator& operator--() { return *this; } - new_iterator operator--(int) { return *this; } - new_iterator& operator+=(std::ptrdiff_t) { return *this; } - new_iterator operator+(std::ptrdiff_t) { return *this; } - new_iterator& operator-=(std::ptrdiff_t) { return *this; } - std::ptrdiff_t operator-(const new_iterator&) const { return 0; } - new_iterator operator-(std::ptrdiff_t) const { return *this; } - bool operator==(const new_iterator&) const { return false; } - bool operator!=(const new_iterator&) const { return false; } - bool operator<(const new_iterator&) const { return false; } - int* m_x; -}; -new_iterator operator+(std::ptrdiff_t, new_iterator x) { return x; } - -struct old_iterator - : public boost::iterator -{ - int& operator*() const { return *m_x; } - old_iterator& operator++() { return *this; } - old_iterator operator++(int) { return *this; } - old_iterator& operator--() { return *this; } - old_iterator operator--(int) { return *this; } - old_iterator& operator+=(std::ptrdiff_t) { return *this; } - old_iterator operator+(std::ptrdiff_t) { return *this; } - old_iterator& operator-=(std::ptrdiff_t) { return *this; } - old_iterator operator-(std::ptrdiff_t) const { return *this; } - std::ptrdiff_t operator-(const old_iterator&) const { return 0; } - bool operator==(const old_iterator&) const { return false; } - bool operator!=(const old_iterator&) const { return false; } - bool operator<(const old_iterator&) const { return false; } - int* m_x; -}; -old_iterator operator+(std::ptrdiff_t, old_iterator x) { return x; } - -int -main() -{ -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - boost::function_requires< - boost_concepts::MutableLvalueIteratorConcept >(); - boost::function_requires< - boost_concepts::RandomAccessIteratorConcept >(); - - boost::function_requires< - boost_concepts::ConstantLvalueIteratorConcept >(); - boost::function_requires< - boost_concepts::RandomAccessIteratorConcept >(); -#endif - - boost::function_requires< - boost_concepts::MutableLvalueIteratorConcept >(); - boost::function_requires< - boost_concepts::RandomAccessIteratorConcept >(); - - boost::function_requires< - boost_concepts::MutableLvalueIteratorConcept >(); - boost::function_requires< - boost_concepts::RandomAccessIteratorConcept >(); - return 0; -} diff --git a/development/libs/iterator/iterator_categories.htm b/development/libs/iterator/iterator_categories.htm deleted file mode 100644 index 83c29e5..0000000 --- a/development/libs/iterator/iterator_categories.htm +++ /dev/null @@ -1,160 +0,0 @@ - - - - Boost Iterator Traits - - - -C++ Boost -
- -

Boost Iterator Category Traits

-Header boost/iterator_categories.hpp - -

-The boost::traversal_category and -boost::return_category traits classes provides access to the -category tags for iterators that model the Boost Iterator Concepts, which are a -replacement for the iterator requirements in the C++ standard. The -other associated types of the Boost iterator concepts are accessed -through the std::iterator_traits class. - -

    -
  • traversal_category<Iter>::type   Can the iterator go forward, backward, etc.? -
  • return_category<Iter>::type   Is the iterator read or write only? - Is the dereferenced type an lvalue? -
- -

-An important feature of the boost::traversal_category and -boost::return_category classes is that they are backwards -compatible, i.e., they automatically work for iterators for which -there are valid definitions of std::iterator_traits. The old -iterator_category is mapped to the appropriate traversal and -return categories. - -

-When creating a new iterator type that is meant to work with -boost::traversal_category and -boost::return_category, you can either create a -specialization of these classes for your iterator type, or you can -provide all the necessary associated types as nested typedefs. In -this case, your iterator class will need to inherit from -new_iterator_base to let the category traits know -that it will be able to find typedefs for traversal_category -and return_category in you iterator class. - - -Each of the new iterator requirements will need a category tag. - -

-namespace boost {
-
-  // Return Type Categories
-  struct readable_iterator_tag { };
-  struct writable_iterator_tag { };
-  struct swappable_iterator_tag { };
-  struct mutable_lvalue_iterator_tag : virtual public writable_iterator_tag,
-    virtual public readable_iterator_tag { };
-  struct constant_lvalue_iterator_tag : public readable_iterator_tag { };
-
-  // Traversal Categories
-  struct forward_traversal_tag { };
-  struct bidirectional_traversal_tag : public forward_traversal_tag { };
-  struct random_access_traversal_tag : public bidirectional_traversal_tag { };
-
-}
-
- -

-The following is pseudo-code for the iterator category traits classes. - -

-namespace boost {
-
-  // Inherit from iterator_base if your iterator defines its own
-  // return_category and traversal_category. Otherwise, the "old style"
-  // iterator category will be mapped to the return_category and
-  // traversal_category.
-  struct new_iterator_base { };
-
-  template <typename Iterator>
-  struct return_category
-  {
-    // Pseudo-code
-    if (Iterator inherits from new_iterator_base) {
-      typedef typename Iterator::return_category type;
-    } else {
-      typedef std::iterator_traits<Iterator> OldTraits;
-      typedef typename OldTraits::iterator_category Cat;
-      if (Cat inherits from std::forward_iterator_tag)
-	if (is-const(T))
-	  typedef boost::constant_lvalue_iterator_tag type;
-	else
-	  typedef boost::mutable_lvalue_iterator_tag type;
-      else if (Cat inherits from std::input_iterator_tag)
-	typedef boost::readable_iterator_tag type;
-      else if (Cat inherits from std::output_iterator_tag)
-	typedef boost::writable_iterator_tag type;
-    }
-  };
-
-  template <typename T>
-  struct return_category<T*>
-  {
-    // Pseudo-code
-    if (is-const(T))
-      typedef boost::constant_lvalue_iterator_tag type;
-    else
-      typedef boost::mutable_lvalue_iterator_tag type;
-  };
-
-  template <typename Iterator>
-  struct traversal_category
-  {
-    // Pseudo-code
-    if (Iterator inherits from new_iterator_base) {
-      typedef typename Iterator::traversal_category type;
-    } else {
-      typedef std::iterator_traits<Iterator> OldTraits;
-      typedef typename OldTraits::iterator_category Cat;
-
-      if (Cat inherits from std::random_access_iterator_tag)
-	typedef boost::random_access_traversal_tag type;
-      else if (Cat inherits from std::bidirectional_iterator_tag)
-	typedef boost::bidirectional_traversal_tag type;
-      else if (Cat inherits from std::forward_iterator_tag)
-	typedef boost::forward_traversal_tag type;
-    }
-  };
-
-  template <typename T>
-  struct traversal_category<T*>
-  {
-    typedef boost::random_access_traversal_tag type;
-  };
-
-}
-
- -
-
jeremy siek
- - -Last modified: Mon Mar 19 12:59:30 EST 2001 - - - diff --git a/development/libs/iterator/iterator_concepts.fig b/development/libs/iterator/iterator_concepts.fig deleted file mode 100644 index 198205e..0000000 --- a/development/libs/iterator/iterator_concepts.fig +++ /dev/null @@ -1,37 +0,0 @@ -#FIG 3.2 -Landscape -Center -Inches -Letter -100.00 -Single --2 -1200 2 -6 150 2325 4275 4350 -2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 1725 4050 1725 3450 -2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 1725 3150 1725 2550 -4 0 0 100 0 19 18 0.0000 4 210 3180 375 2550 ForwardTraversalIterator\001 -4 0 0 100 0 19 18 0.0000 4 210 3765 225 3450 BidirectionalTraversalIterator\001 -4 0 0 100 0 19 18 0.0000 4 210 4125 150 4350 RandomAccessTraversalIterator\001 --6 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 4800 3600 4800 2400 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6900 3000 5400 2400 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6900 3000 7500 2400 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6900 3000 9075 2475 -4 0 0 100 0 19 18 0.0000 4 210 2040 6600 2400 WritableIterator\001 -4 0 0 100 0 19 18 0.0000 4 210 2145 3900 2400 ReadableIterator\001 -4 0 0 50 0 19 18 0.0000 4 210 2835 5700 3300 MutableLvalueIterator\001 -4 0 0 50 0 19 18 0.0000 4 270 2355 9075 2400 SwappableIterator\001 -4 0 0 50 0 19 18 0.0000 4 210 2970 3825 3900 ConstantLvalueIterator\001 diff --git a/development/libs/iterator/iterator_concepts.gif b/development/libs/iterator/iterator_concepts.gif deleted file mode 100644 index bac35c7..0000000 Binary files a/development/libs/iterator/iterator_concepts.gif and /dev/null differ diff --git a/development/libs/iterator/iterator_concepts.htm b/development/libs/iterator/iterator_concepts.htm deleted file mode 100644 index f2f8dcd..0000000 --- a/development/libs/iterator/iterator_concepts.htm +++ /dev/null @@ -1,663 +0,0 @@ - - - - -Iterator Concepts - -C++ Boost - -
- - -

Iterator Concepts

- -

The standard iterator categories and requirements are flawed because -they use a single hierarchy of requirements to address two orthogonal -issues: iterator traversal and dereference return -type. The current iterator requirement hierarchy is mainly -geared towards iterator traversal (hence the category names), while -requirements that address dereference return type sneak in at various -places. - -

-The iterator requirements should be separated into two hierarchies. -One set of concepts handles the return type semantics: -

- -The other set of concepts handles iterator traversal: - - - -The current Input Iterator and Output Iterator requirements will -continue to be used as is. Note that Input Iterator implies Readable -Iterator and Output Iterator implies Writable Iterator. - -

-Note: we considered defining a Single-Pass Iterator, which could be -combined with Readable or Writable Iterator to replace the Input and -Output Iterator requirements. We rejected this idea because there are -some differences between Input and Output Iterators that make it hard -to merge them: for example Input Iterator requires Equality Comparable -while Output Iterator does not. - - -

-
- - - -
Figure 1: -The iterator concepts and refinement relationships. -
-
-

- - -

Relationship with the standard iterator concepts

- -

-std::Input Iterator implies boost::ReadableIterator. - -

-std::Output Iterator implies boost::Writable Iterator. - -

-std::Forward Iterator refines boost::Forward Iterator and -boost::Constant Lvalue Iterator or boost::Mutable Lvalue Iterator. - -

-std::Bidirectional Iterator refines boost::Bidirectional Iterator and -boost::Constant Lvalue Iterator or boost::Mutable Lvalue Iterator. - -

-std::Random Access Iterator refines boost::Random Access Iterator and -boost::Constant Lvalue Iterator or boost::Mutable Lvalue Iterator. - - -

Notation

- - - - - - - - - - - - - - - - - -
XThe iterator type.
TThe value type of X, i.e., std::iterator_traits<X>::value_type.
x, yAn object of type X.
tAn object of type T.
- -

- -


- - -

-Readable Iterator -

- -A Readable Iterator is an iterator that dereferences to produce an -rvalue that is convertible to the value_type of the -iterator. - -

Associated Types

- - - - - - - - - - - - - - - - - - - - - -
Value typestd::iterator_traits<X>::value_typeThe type of the objects pointed to by the iterator.
Reference typestd::iterator_traits<X>::reference - The return type of dereferencing the iterator. This - type must be convertible to T. -
Return Categorystd::return_category<X>::type - A type convertible to std::readable_iterator_tag -
- -

Refinement of

- -Copy Constructible - -

Valid expressions

- - - - - - - - - - - - - - - -
NameExpressionType requirementsReturn type
Dereference*x std::iterator_traits<X>::reference
Member accessx->mT is a type with a member named m. -If m is a data member, the type of m. -If m is a member function, the return type of m. -
- -

- -


- - -

-Writable Iterator -

- -A Writable Iterator is an iterator that can be used to store a value -using the dereference-assignment expression. - -

Definitions

- -If x is an Writable Iterator of type X, then the -expression *x = a; stores the value a into -x. Note that operator=, like other C++ functions, -may be overloaded; it may, in fact, even be a template function. In -general, then, a may be any of several different types. A -type A belongs to the set of value types of X -if, for an object a of type A, *x = a; is -well-defined and does not require performing any non-trivial -conversions on a. - -

Associated Types

- - - - - - - - - -
Return Categorystd::return_category<X>::type - A type convertible to std::writable_iterator_tag -
- - - -

Refinement of

- -Copy Constructible - -

Valid expressions

- - - - - - - - - - -
NameExpressionReturn type
Dereference assignment*x = aunspecified
- -

- - -


- - -

-Swappable Iterator -

- -A Swappable Iterator is an iterator whose dereferenced values can be -swapped. - -

-Note: the requirements for Swappable Iterator are dependent on the -issues surrounding std::swap() being resolved. Here we assume -that the issue will be resolved by allowing the overload of -std::swap() for user-defined types. - -

-Note: Readable Iterator and Writable Iterator combined implies -Swappable Iterator because of the fully templated -std::swap(). However, Swappable Iterator does not imply -Readable Iterator nor Writable Iterator. - -

Associated Types

- - - - - - - - - -
Return Categorystd::return_category<X>::type - A type convertible to std::swappable_iterator_tag -
- - -

Valid expressions

- -Of the two valid expressions listed below, only one OR the -other is required. If std::iter_swap() is overloaded for -X then std::swap() is not required. If -std::iter_swap() is not overloaded for X then the -default (fully templated) version is used, which will call -std::swap() (this means changing the current requirements for -std::iter_swap()). - -

- - - - - - - - - - - - - - - - - -
NameExpressionReturn type
Iterator Swapstd::iter_swap(x, y)void
Dereference and Swapstd::swap(*x, *y)void
- -

- - -


- - -

-Constant Lvalue Iterator -

- -A Constant Lvalue Iterator is an iterator that dereferences to produce a -const reference to the pointed-to object, i.e., the associated -reference type is const T&. Changing the value -of or destroying an iterator that models Constant Lvalue Iterator does -not invalidate pointers and references previously obtained from that -iterator. - - -

Refinement of

- -Readable Iterator - -

Associated Types

- - - - - - - - - - - - - - - - - -
Reference typestd::iterator_traits<X>::reference - The return type of dereferencing the iterator, which must be - const T&. -
Return Categorystd::return_category<X>::type - A type convertible to std::constant_lvalue_iterator_tag -
- - - -

- -


- - -

-Mutable Lvalue Iterator -

- -A Mutable Lvalue Iterator is an iterator that dereferences to produce a -reference to the pointed-to object. The associated reference -type is T&. Changing the value of or destroying an -iterator that models Mutable Lvalue Iterator does not invalidate -pointers and references previously obtained from that iterator. - -

Refinement of

- -Readable Iterator, -Writable Iterator, -and Swappable Iterator. - - - -

Associated Types

- - - - - - - - - - - - - - - - - -
Reference typestd::iterator_traits<X>::referenceThe return type of dereferencing the iterator, which must be - T&.
Return Categorystd::return_category<X>::type - A type convertible to std::mutable_lvalue_iterator_tag -
- - - -

-


- - -

-Forward Traversal Iterator -

- -The Forward Iterator is an iterator that can be incremented. Also, it -is permissible to make multiple passes through the iterator's range. - -

Refinement of

- -Copy Constructible, -Assignable, -Default Constructible, and -Equality Comparable - - -

Associated types

- - - - - - - - - - - - - - -
Difference Typestd::iterator_traits<X>::difference_type - A signed integral type used for representing distances - between iterators that point into the same range. -
Traversal Categorystd::traversal_category<X>::type - A type convertible to std::forward_traversal_tag -
- -

Valid expressions

- - - - - - - - - - - - - - -
NameExpressionType requirementsReturn type
Preincrement++i X&
Postincrementi++ convertible to const X&
- -

-


- - -

-Bidirectional Traversal Iterator -

- -An iterator that can be incremented and decremented. - -

Refinement of

- -Forward Traversal Iterator - -

Associated types

- - - - - - - -
Traversal Categorystd::traversal_category<X>::type - A type convertible to std::bidirectional_traversal_tag -
- -

Valid expressions

- - - - - - - - - - - - -
NameExpressionType requirementsReturn type
Predecrement--i X&
Postdecrementi-- convertible to const X&
- -

-


- - -

-Random Access Traversal Iterator -

- -An iterator that provides constant-time methods for moving forward and -backward in arbitrary-sized steps. - -

Refinement of

- -Bidirectional Traversal Iterator and -Less Than Comparable where < is a total ordering - -

Associated types

- - - - - - - -
Traversal Categorystd::traversal_category<X>::type - A type convertible to std::random_access_traversal_tag -
- -

Valid expressions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionType requirementsReturn type
Iterator additioni += n X&
Iterator additioni + n or n + i X
Iterator subtractioni -= n X&
Iterator subtractioni - n X
Differencei - j std::iterator_traits<X>::difference_type
Element operatori[n]X must also be a model of - Readable Iterator. std::iterator_traits<X>::reference
Element assignmenti[n] = tX must also be a model of - Writable Iterator.unspecified
- -

- -


- - -
Copyright © 2000 -Jeremy Siek, Univ.of Notre Dame (jsiek@lsc.nd.edu) -
- - - diff --git a/doc/BidirectionalTraversal.html b/doc/BidirectionalTraversal.html deleted file mode 100644 index 0daa77e..0000000 --- a/doc/BidirectionalTraversal.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - -Bidirectional Traversal Concept - - - -
-

Bidirectional Traversal Concept

-

A class or built-in type X models the Bidirectional Traversal -concept if, in addition to X meeting the requirements of Forward -Traversal Iterator, the following expressions are valid and respect -the stated semantics.

- ----- - - - - - - - - - - - - - - - - - - - - - - -
Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal -Iterator)
ExpressionReturn TypeAssertion/Semantics / -Pre-/Post-condition
--rX&pre: there exists -s such that r -== ++s. post: -s is -dereferenceable. ---(++r) == r. ---r == --s -implies r == -s. &r == &--r.
r--convertible to const X&
-{
-  X tmp = r;
-  --r;
-  return tmp;
-}
-
-
iterator_traversal<X>::typeConvertible to -bidirectional_traversal_tag 
-
- - - - diff --git a/doc/BidirectionalTraversal.rst b/doc/BidirectionalTraversal.rst deleted file mode 100755 index 8655c63..0000000 --- a/doc/BidirectionalTraversal.rst +++ /dev/null @@ -1,37 +0,0 @@ -Bidirectional Traversal Concept -............................... - -A class or built-in type ``X`` models the *Bidirectional Traversal* -concept if, in addition to ``X`` meeting the requirements of Forward -Traversal Iterator, the following expressions are valid and respect -the stated semantics. - -+--------------------------------------------------------------------------------------+ -|Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal | -|Iterator) | -+--------------------------------+-------------------------------+---------------------+ -|Expression |Return Type |Assertion/Semantics /| -| | |Pre-/Post-condition | -+================================+===============================+=====================+ -|``--r`` |``X&`` |pre: there exists | -| | |``s`` such that ``r | -| | |== ++s``. post: | -| | |``s`` is | -| | |dereferenceable. | -| | |``--(++r) == r``. | -| | |``--r == --s`` | -| | |implies ``r == | -| | |s``. ``&r == &--r``. | -+--------------------------------+-------------------------------+---------------------+ -|``r--`` |convertible to ``const X&`` |:: | -| | | | -| | | { | -| | | X tmp = r; | -| | | --r; | -| | | return tmp; | -| | | } | -+--------------------------------+-------------------------------+---------------------+ -|``iterator_traversal::type`` |Convertible to | | -| |``bidirectional_traversal_tag``| | -| | | | -+--------------------------------+-------------------------------+---------------------+ diff --git a/doc/ForwardTraversal.html b/doc/ForwardTraversal.html deleted file mode 100644 index abe055f..0000000 --- a/doc/ForwardTraversal.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - -Forward Traversal Concept - - - -
-

Forward Traversal Concept

-

A class or built-in type X models the Forward Traversal -concept if, in addition to X meeting the requirements of Default -Constructible and Single Pass Iterator, the following expressions are -valid and respect the stated semantics.

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator)
ExpressionReturn TypeAssertion/Note
X u;X&note: u may have a -singular value.
++rX&r == s and r is -dereferenceable implies -++r == ++s.
iterator_traits<X>::difference_typeA signed integral type representing -the distance between iterators 
iterator_traversal<X>::typeConvertible to -forward_traversal_tag 
-
- - - - diff --git a/doc/ForwardTraversal.rst b/doc/ForwardTraversal.rst deleted file mode 100755 index c4156d5..0000000 --- a/doc/ForwardTraversal.rst +++ /dev/null @@ -1,27 +0,0 @@ -Forward Traversal Concept -......................... - -A class or built-in type ``X`` models the *Forward Traversal* -concept if, in addition to ``X`` meeting the requirements of Default -Constructible and Single Pass Iterator, the following expressions are -valid and respect the stated semantics. - -+--------------------------------------------------------------------------------------------------------+ -|Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator) | -+---------------------------------------+-----------------------------------+----------------------------+ -|Expression |Return Type |Assertion/Note | -+=======================================+===================================+============================+ -|``X u;`` |``X&`` |note: ``u`` may have a | -| | |singular value. | -+---------------------------------------+-----------------------------------+----------------------------+ -|``++r`` |``X&`` |``r == s`` and ``r`` is | -| | |dereferenceable implies | -| | |``++r == ++s.`` | -+---------------------------------------+-----------------------------------+----------------------------+ -|``iterator_traits::difference_type``|A signed integral type representing| | -| |the distance between iterators | | -| | | | -+---------------------------------------+-----------------------------------+----------------------------+ -|``iterator_traversal::type`` |Convertible to | | -| |``forward_traversal_tag`` | | -+---------------------------------------+-----------------------------------+----------------------------+ diff --git a/doc/GNUmakefile b/doc/GNUmakefile deleted file mode 100755 index ef326cc..0000000 --- a/doc/GNUmakefile +++ /dev/null @@ -1,233 +0,0 @@ -# GNUmakefile for postprocessing PDF files -# -# © 2000 IBM Corporation. -# Licensed under the GNU GPL. - -######################################################################## -# Make sure that the following macros are correct for your setup -######################################################################## -# ... System utilities -RMRF = /bin/rm -rf -MV = /bin/mv -EGREP = /bin/egrep -ECHO = /bin/echo -PERL = /usr/bin/perl -PYTHON = python -CAT = /bin/cat -TOUCH = /bin/touch -ZIP = /usr/bin/zip - -# ... TeX & postprocessors -PPOWER4 = ppower4 -PDFLATEX = pdflatex -METAPOST = mpost -FIG2DEV = fig2dev -BIBTEX = bibtex -FOLIAGECUTTER = foliageCutter --verbose -RST2LATEX = rst2latex -RST2HTML = rst2html - -TEX = latex -export TEX -######################################################################## -# End of user servicable parts; don't fiddle with the remainder of this -# makefile unless you know what you do. -# -# You have been warned ;=) -######################################################################## - -# ... Variables -TEXFILES = $(strip $(wildcard *.tex)) -RSTFILES = $(strip $(wildcard *.rst)) --include GNUmakefile.local -TEXSTEMS = $(strip $(patsubst %.tex,%,${TEXFILES})) -RSTSTEMS = $(strip $(patsubst %.rst,%,${RSTFILES})) -CUTFOILS = $(strip $(patsubst %,%---toc.tex,${TEXSTEMS})) -PDFFILES = $(strip $(patsubst %.tex,%.pdf,${TEXFILES})) -PRINTS = $(patsubst %.pdf,%-print.pdf,${PDFFILES}) -PRINTZIP = prints.zip -SLIDEZIP = slides.zip - -# ... Depend -DEPENDFILES = .depend -GENFILE = .generated - -# ... List of extensions and files generated -texcrap = *.mpx *.log *.aux *.blg *-print.brf *-print.tex *.out - -mpxcrap = mpxerr.tex mpxerr.pdf - -generated = *.out *.[0-9] *.[0-9][0-9] *.bbl *.brf \ - *.mp *.mmp *.pdf *.ps TMP-*.pdf *.ftoc\ - ${PRINTZIP} ${SLIDEZIP} ${GENFILE} ${DEPENDFILES} \ - ${texcrap} ${mpxcrap} ${CUTFOILS} $(strip $(wildcard *---*.tex)) - - -# ... canned command to run PDFLaTeX -define run-pdflatex -@${ECHO} "" -@${ECHO} "---- Running PDFLaTeX on $<" && ${PDFLATEX} $< -@${ECHO} "---- Running PDFLaTeX on $< again" && ${PDFLATEX} $< --@(${EGREP} -qi 'Rerun to get' $*.log && \ - ${ECHO} "---- Rerunning PDFLaTeX on $* to get cross-refs right" && \ - ${PDFLATEX} $<) || \ - ${ECHO} "---- No cross-refs correcting PDFLaTeX rerun required for $*" --@(${EGREP} -qi $*.ftoc $*.log && \ - ${ECHO} "---- Rerunning PDFLaTeX on $* for FTOC" && \ - ${PDFLATEX} $<) || \ - ${ECHO} "---- No FTOC PDFLaTeX run required for $*" --@(${EGREP} -qi 'Warning: Citation' $*.log && \ - ${ECHO} "---- Running BIBTeX on $*" && \ - ${BIBTEX} $* && \ - ${ECHO} "---- Running PDFLaTeX on $<" && \ - ${PDFLATEX} $<) || \ - ${ECHO} "---- No BIBTeX run required for $*" --@(${EGREP} -qi 'Warning: .+undefined references' $*.log && \ - ${ECHO} "---- Running PDFLaTeX on $<" && \ - ${PDFLATEX} $<) || \ - ${ECHO} "---- No further PDFLaTex run required for $<" -@${ECHO} "Generated: $@ {$<}" >> ${GENFILE} -@${RMRF} ${texcrap} -endef - -# ... canned command to run PDFLaTeX for printable versions -define run-pdflatex-for-print -@${ECHO} "" -@${ECHO} "---- Running PDFLaTeX on $*-print.tex" && ${PDFLATEX} $*-print.tex -@${ECHO} "---- Running PDFLaTeX on $< again" && ${PDFLATEX} $< --@(${EGREP} -qi 'Warning: Citation' $*-print.log && \ - ${ECHO} "---- Running BIBTeX on $*-print" && \ - ${BIBTEX} $*-print && \ - ${ECHO} "---- Running PDFLaTeX on $*-print.tex" && \ - ${PDFLATEX} $*-print.tex) || \ - ${ECHO} "---- No BIBTeX run required for $*" --@(${EGREP} -qi 'Warning: .+undefined references' $*-print.log && \ - ${ECHO} "---- Running PDFLaTeX on $*-print" && \ - ${PDFLATEX} $*-print.tex) || \ - ${ECHO} "---- No further PDFLaTex run required for $*-print" -@${ECHO} "Generated: $@ {$<}" >> ${GENFILE} -@${RMRF} ${texcrap} -endef - -# DWA begin modifications -# ... Rule: How to generate TeX from ReST -%.tex: %.txt - @${ECHO} "---- Running rst2latex on $<" - ${RST2LATEX} $< $@ - @${ECHO} "Generated: $@ {$<}" >> ${GENFILE} - -# ... Rule: How to generate TeX from ReST -%.tex: %.rst - @${ECHO} "---- Running rst2latex on $<" - ${RST2LATEX} $< $@ - @${ECHO} "Generated: $@ {$<}" >> ${GENFILE} - -# ... Rule: How to generate HTML from ReST -%.html: %.txt - @${ECHO} "---- Running rst2html on $<" - ${RST2HTML} $< $@ - @${ECHO} "Generated: $@ {$<}" >> ${GENFILE} - -# ... Rule: How to generate HTML from ReST -%.html: %.rst - @${ECHO} "---- Running rst2html on $<" - ${RST2HTML} $< $@ - @${ECHO} "Generated: $@ {$<}" >> ${GENFILE} -# DWA end modifications - -# ... Rule: How to generate PDF from TeX -%.pdf: %.tex - $(run-pdflatex) - @${MV} $@ TMP-$@ - @${ECHO} "---- Running PPower4 on $*" - ${PPOWER4} -v TMP-$@ $@ - @${RMRF} TMP-$@ - @${ECHO} "Postprocessed: $*.pdf {$*.pdf}" >> ${GENFILE} - -# ... Rule: How to generate printable PDF from TeX -%-print.pdf: %.tex - ${PERL} -pe 's/^\\documentclass\[(.*?)\]/\\documentclass\[$$1,prints\]/;' < $< > $*-print.tex - $(run-pdflatex-for-print) - @${ECHO} "Generated: $*-print.pdf {$*.pdf}" >> ${GENFILE} - -# ... Rule: How to generate cut foils from TeX master -%---toc.tex: %.tex - ${FOLIAGECUTTER} --prefix=$* $< - -# ... Rule: How to generate MetaPost from FIG -%.mp: %.fig - @${ECHO} "---- Running Fig2Dev (mp) on $<" - ${FIG2DEV} -L mp $< $@ - @${ECHO} "Generated: $@ {$<}" >> ${GENFILE} - -# ... Rule: How to generate MultiMetaPost from FIG -%.mmp: %.fig - @${ECHO} "---- Running Fig2Dev (mmp) on $<" - ${FIG2DEV} -L mmp $< $@ - @${ECHO} "Generated: $@ {$<}" >> ${GENFILE} - -# ... Rule: How to generate includable PS from FIG via MetaPost -%.mps: %.fig - @${ECHO} "---- Running Fig2Dev (mps) on $<" - ${FIG2DEV} -L mp $< $*.mps.mp - @${RMRF} $*.mps.[0-9] - ${METAPOST} $*.mps.mp - @${MV} $*.mps.0 $@ - @${ECHO} "Generated: $@ {$<}" >> ${GENFILE} - -# ... Rule: How to generate includable PS files from MultiMetaPost -%.0: %.mmp - @${ECHO} "---- Running MetaPost on $<" - @${RMRF} $*.[0-9] $*.[0-9][0-9] - ${METAPOST} $< - @${ECHO} "Generated: $*.0{...} {$<}" >> ${GENFILE} - -cleanup-crap: - @${RMRF} ${mpxcrap} - -# ... Target: all -all: cleanup-crap ${DEPENDFILES} ${PDFFILES} ${PRINTS} ${PRINTZIP} ${SLIDEZIP} - @${ECHO} "" - @${TOUCH} ${GENFILE} - @${CAT} ${GENFILE} - @${RMRF} ${GENFILE} - -# ... Target: ZIP files -zip zips: ${PRINTZIP} ${SLIDEZIP} - -# ... Target: ZIP file containing printable versions of slides -${PRINTZIP}: .depend ${PDFFILES} - @${RMRF} ${PRINTZIP} - ${ZIP} -r ${PRINTZIP} ${PRINTS} - @${ECHO} "Generated: ${PRINTZIP}" >> ${GENFILE} - -# ... Target: ZIP file containing screen versions of slides - ${SLIDEZIP}: .depend ${PDFFILES} - @${RMRF} ${SLIDEZIP} - ${ZIP} -r ${SLIDEZIP} ${PDFFILES} - @${ECHO} "Generated: ${SLIDEZIP}" >> ${GENFILE} - -# ... Target: clean up -clean: - ${RMRF} ${generated} - -# ... Target: create dependencies -depend: .depend - -# ... Target: dependency file (parse TEXFILES for multiinclude and includegraphics) -# .depend: GNUmakefile ${TEXFILES} -# ${RMRF} $@ -# @for t in ${TEXSTEMS} ; do \ -# ${ECHO} "Scanning $$t.tex"; \ -# ${PERL} -e 'my $$target = shift @ARGV;' -e 'while (<>) { /\\multiinclude(\[.*?\])?{(.*?)}/ && print "$$target: $$2.0\n";}' $$t.pdf < $$t.tex >> $@; \ -# ${PERL} -e 'my $$target = shift @ARGV;' -e 'while (<>) { /\\includegraphics(\[.*?\])?{(.*?)\.(.*?)}/ && print "$$target: $$2.$$3\n";}' $$t.pdf < $$t.tex >> $@; \ -# done - -.depend: GNUmakefile ${RSTFILES} - ${RMRF} $@ - ${PYTHON} scanrst.py ${RSTFILES} > $@ - -# ... include dependency files -# -include .depend --include .depend - diff --git a/doc/IncrementableIterator.html b/doc/IncrementableIterator.html deleted file mode 100644 index c3ccfd7..0000000 --- a/doc/IncrementableIterator.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - -Incrementable Iterator Concept - - - -
-

Incrementable Iterator Concept

-

A class or built-in type X models the Incrementable Iterator -concept if, in addition to X being Assignable and Copy -Constructible, the following expressions are valid and respect the -stated semantics.

- ----- - - - - - - - - - - - - - - - - - - - - - - -
Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible)
ExpressionReturn TypeAssertion/Semantics
++rX&&r == &++r
r++X
-{
-   X tmp = r;
-   ++r;
-   return tmp;
-}
-
-
iterator_traversal<X>::typeConvertible to -incrementable_traversal_tag 
-
- - - - diff --git a/doc/IncrementableIterator.rst b/doc/IncrementableIterator.rst deleted file mode 100755 index f14928e..0000000 --- a/doc/IncrementableIterator.rst +++ /dev/null @@ -1,28 +0,0 @@ -Incrementable Iterator Concept -.............................. - -A class or built-in type ``X`` models the *Incrementable Iterator* -concept if, in addition to ``X`` being Assignable and Copy -Constructible, the following expressions are valid and respect the -stated semantics. - - -+-------------------------------------------------------------------------------------+ -|Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible) | -| | -+--------------------------------+-------------------------------+--------------------+ -|Expression |Return Type |Assertion/Semantics | -+================================+===============================+====================+ -|``++r`` |``X&`` |``&r == &++r`` | -+--------------------------------+-------------------------------+--------------------+ -|``r++`` |``X`` |:: | -| | | | -| | | { | -| | | X tmp = r; | -| | | ++r; | -| | | return tmp; | -| | | } | -+--------------------------------+-------------------------------+--------------------+ -|``iterator_traversal::type`` |Convertible to | | -| |``incrementable_traversal_tag``| | -+--------------------------------+-------------------------------+--------------------+ diff --git a/doc/InteroperableIterator.rst b/doc/InteroperableIterator.rst deleted file mode 100644 index 0cb751e..0000000 --- a/doc/InteroperableIterator.rst +++ /dev/null @@ -1,57 +0,0 @@ -Interoperable Iterator Concept -.............................. - -A class or built-in type ``X`` that models Single Pass Iterator is -*interoperable with* a class or built-in type ``Y`` that also models -Single Pass Iterator if the following expressions are valid and -respect the stated semantics. In the tables below, ``x`` is an object -of type ``X``, ``y`` is an object of type ``Y``, ``Distance`` is -``iterator_traits::difference_type``, and ``n`` represents a -constant object of type ``Distance``. - -+-----------+-----------------------+---------------------------------------------------+ -|Expression |Return Type |Assertion/Precondition/Postcondition | -+===========+=======================+===================================================+ -|``y = x`` |``Y`` |post: ``y == x`` | -+-----------+-----------------------+---------------------------------------------------+ -|``Y(x)`` |``Y`` |post: ``Y(x) == x`` | -+-----------+-----------------------+---------------------------------------------------+ -|``x == y`` |convertible to ``bool``|``==`` is an equivalence relation over its domain. | -+-----------+-----------------------+---------------------------------------------------+ -|``y == x`` |convertible to ``bool``|``==`` is an equivalence relation over its domain. | -+-----------+-----------------------+---------------------------------------------------+ -|``x != y`` |convertible to ``bool``|``bool(a==b) != bool(a!=b)`` over its domain. | -+-----------+-----------------------+---------------------------------------------------+ -|``y != x`` |convertible to ``bool``|``bool(a==b) != bool(a!=b)`` over its domain. | -+-----------+-----------------------+---------------------------------------------------+ - -If ``X`` and ``Y`` both model Random Access Traversal Iterator then -the following additional requirements must be met. - -+-----------+-----------------------+---------------------+--------------------------------------+ -|Expression |Return Type |Operational Semantics|Assertion/ Precondition | -+===========+=======================+=====================+======================================+ -|``x < y`` |convertible to ``bool``|``y - x > 0`` |``<`` is a total ordering relation | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y < x`` |convertible to ``bool``|``x - y > 0`` |``<`` is a total ordering relation | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``x > y`` |convertible to ``bool``|``y < x`` |``>`` is a total ordering relation | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y > x`` |convertible to ``bool``|``x < y`` |``>`` is a total ordering relation | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``x >= y`` |convertible to ``bool``|``!(x < y)`` | | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y >= x`` |convertible to ``bool``|``!(y < x)`` | | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``x <= y`` |convertible to ``bool``|``!(x > y)`` | | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y <= x`` |convertible to ``bool``|``!(y > x)`` | | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y - x`` |``Distance`` |``distance(Y(x),y)`` |pre: there exists a value ``n`` of | -| | | |``Distance`` such that ``x + n == y``.| -| | | |``y == x + (y - x)``. | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``x - y`` |``Distance`` |``distance(y,Y(x))`` |pre: there exists a value ``n`` of | -| | | |``Distance`` such that ``y + n == x``.| -| | | |``x == y + (x - y)``. | -+-----------+-----------------------+---------------------+--------------------------------------+ diff --git a/doc/LvalueIterator.html b/doc/LvalueIterator.html deleted file mode 100644 index 3e3f97a..0000000 --- a/doc/LvalueIterator.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - -Lvalue Iterator Concept - - - -
-

Lvalue Iterator Concept

-

The Lvalue Iterator concept adds the requirement that the return -type of operator* type be a reference to the value type of the -iterator.

- ----- - - - - - - - - - - - - - - -
Lvalue Iterator Requirements
ExpressionReturn TypeNote/Assertion
*aT&T is cv -iterator_traits<X>::value_type -where cv is an optional -cv-qualification. -pre: a is -dereferenceable. If a -== b then *a is -equivalent to *b.
-
- - - - diff --git a/doc/LvalueIterator.rst b/doc/LvalueIterator.rst deleted file mode 100755 index 46c61b1..0000000 --- a/doc/LvalueIterator.rst +++ /dev/null @@ -1,21 +0,0 @@ -Lvalue Iterator Concept -....................... - -The *Lvalue Iterator* concept adds the requirement that the return -type of ``operator*`` type be a reference to the value type of the -iterator. - -+-------------------------------------------------------------+ -| Lvalue Iterator Requirements | -+-------------+-----------+-----------------------------------+ -|Expression |Return Type|Note/Assertion | -+=============+===========+===================================+ -|``*a`` | ``T&`` |``T`` is *cv* | -| | |``iterator_traits::value_type`` | -| | |where *cv* is an optional | -| | |cv-qualification. | -| | |pre: ``a`` is | -| | |dereferenceable. If ``a | -| | |== b`` then ``*a`` is | -| | |equivalent to ``*b``. | -+-------------+-----------+-----------------------------------+ diff --git a/doc/RandomAccessTraversal.html b/doc/RandomAccessTraversal.html deleted file mode 100644 index 4f7f40e..0000000 --- a/doc/RandomAccessTraversal.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - -Random Access Traversal Concept - - - -
-

Random Access Traversal Concept

-

A class or built-in type X models the Random Access Traversal -concept if the following expressions are valid and respect the stated -semantics. In the table below, Distance is -iterator_traits<X>::difference_type and n represents a -constant object of type Distance.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal)
ExpressionReturn TypeOperational SemanticsAssertion/ -Precondition
r += nX&
-{
-  Distance m = n;
-  if (m >= 0)
-    while (m--)
-      ++r;
-  else
-    while (m++)
-      --r;
-  return r;
-}
-
-
 
a + n, n + aX{ X tmp = a; return tmp -+= n; } 
r -= nX&return r += -n 
a - nX{ X tmp = a; return tmp --= n; } 
b - aDistancea < b ?  distance(a,b) -: -distance(b,a)pre: there exists a -value n of -Distance such that -a + n == b. b -== a + (b - a).
a[n]convertible to T*(a + n)pre: a is a Readable -Iterator
a[n] = vconvertible to T*(a + n) = vpre: a is a Writable -iterator
a < bconvertible to boolb - a > 0< is a total -ordering relation
a > bconvertible to boolb < a> is a total -ordering relation
a >= bconvertible to bool!(a < b) 
a <= bconvertible to bool!(a > b) 
iterator_traversal<X>::typeConvertible to -random_access_traversal_tag  
-
- - - - diff --git a/doc/RandomAccessTraversal.rst b/doc/RandomAccessTraversal.rst deleted file mode 100644 index 97b0f3d..0000000 --- a/doc/RandomAccessTraversal.rst +++ /dev/null @@ -1,63 +0,0 @@ -Random Access Traversal Concept -............................... - -A class or built-in type ``X`` models the *Random Access Traversal* -concept if the following expressions are valid and respect the stated -semantics. In the table below, ``Distance`` is -``iterator_traits::difference_type`` and ``n`` represents a -constant object of type ``Distance``. - -+------------------------------------------------------------------------------------------------------------------+ -|Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal) | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|Expression |Return Type |Operational Semantics |Assertion/ | -| | | |Precondition | -+===============================+=================================+=========================+======================+ -|``r += n`` |``X&`` |:: | | -| | | | | -| | | { | | -| | | Distance m = n; | | -| | | if (m >= 0) | | -| | | while (m--) | | -| | | ++r; | | -| | | else | | -| | | while (m++) | | -| | | --r; | | -| | | return r; | | -| | | } | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a + n``, ``n + a`` |``X`` |``{ X tmp = a; return tmp| | -| | |+= n; }`` | | -| | | | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``r -= n`` |``X&`` |``return r += -n`` | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a - n`` |``X`` |``{ X tmp = a; return tmp| | -| | |-= n; }`` | | -| | | | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``b - a`` |``Distance`` |``a < b ? distance(a,b) |pre: there exists a | -| | |: -distance(b,a)`` |value ``n`` of | -| | | |``Distance`` such that| -| | | |``a + n == b``. ``b | -| | | |== a + (b - a)``. | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a[n]`` |convertible to T |``*(a + n)`` |pre: a is a *Readable | -| | | |Iterator* | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a[n] = v`` |convertible to T |``*(a + n) = v`` |pre: a is a *Writable | -| | | |iterator* | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a < b`` |convertible to ``bool`` |``b - a > 0`` |``<`` is a total | -| | | |ordering relation | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a > b`` |convertible to ``bool`` |``b < a`` |``>`` is a total | -| | | |ordering relation | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a >= b`` |convertible to ``bool`` |``!(a < b)`` | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a <= b`` |convertible to ``bool`` |``!(a > b)`` | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``iterator_traversal::type``|Convertible to | | | -| |``random_access_traversal_tag`` | | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ diff --git a/doc/ReadableIterator.html b/doc/ReadableIterator.html deleted file mode 100644 index 57edb8f..0000000 --- a/doc/ReadableIterator.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - -Readable Iterator Concept - - - -
-

Readable Iterator Concept

-

A class or built-in type X models the Readable Iterator concept -for value type T if, in addition to X being Assignable and -Copy Constructible, the following expressions are valid and respect -the stated semantics. U is the type of any specified member of -type T.

- ----- - - - - - - - - - - - - - - - - - - - - - - -
Readable Iterator Requirements (in addition to Assignable and Copy Constructible)
ExpressionReturn TypeNote/Precondition
iterator_traits<X>::value_typeTAny non-reference, -non-cv-qualified type
*aConvertible to T
-
pre: a is dereferenceable. If a == b then *a
-
is equivalent to *b.
-
-
a->mU&pre: pre: (*a).m is well-defined. Equivalent to (*a).m.
-
- - - - diff --git a/doc/ReadableIterator.rst b/doc/ReadableIterator.rst deleted file mode 100755 index d38dad5..0000000 --- a/doc/ReadableIterator.rst +++ /dev/null @@ -1,23 +0,0 @@ - -Readable Iterator Concept -......................... - -A class or built-in type ``X`` models the *Readable Iterator* concept -for value type ``T`` if, in addition to ``X`` being Assignable and -Copy Constructible, the following expressions are valid and respect -the stated semantics. ``U`` is the type of any specified member of -type ``T``. - -+-----------------------------------------------------------------------------------------------------------------------------+ -|Readable Iterator Requirements (in addition to Assignable and Copy Constructible) | -+-----------------------------------+------------------------+----------------------------------------------------------------+ -|Expression |Return Type |Note/Precondition | -+===================================+========================+================================================================+ -|``iterator_traits::value_type`` |``T`` |Any non-reference, | -| | |non-cv-qualified type | -+-----------------------------------+------------------------+----------------------------------------------------------------+ -|``*a`` | Convertible to ``T`` |pre: ``a`` is dereferenceable. If ``a == b`` then ``*a`` | -| | | is equivalent to ``*b``. | -+-----------------------------------+------------------------+----------------------------------------------------------------+ -|``a->m`` |``U&`` |pre: ``pre: (*a).m`` is well-defined. Equivalent to ``(*a).m``. | -+-----------------------------------+------------------------+----------------------------------------------------------------+ diff --git a/doc/SinglePassIterator.html b/doc/SinglePassIterator.html deleted file mode 100644 index a6091c7..0000000 --- a/doc/SinglePassIterator.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - -Single Pass Iterator Concept - - - -
-

Single Pass Iterator Concept

-

A class or built-in type X models the Single Pass Iterator -concept if the following expressions are valid and respect the stated -semantics.

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality -Comparable)
ExpressionReturn TypeAssertion/Semantics / -Pre-/Post-condition
++rX&pre: r is -dereferenceable; post: -r is dereferenceable or -r is past-the-end
a == bconvertible to bool== is an equivalence -relation over its domain
a != bconvertible to bool!(a == b)
iterator_traversal<X>::typeConvertible to -single_pass_traversal_tag 
-
- - - - diff --git a/doc/SinglePassIterator.rst b/doc/SinglePassIterator.rst deleted file mode 100755 index 2754d97..0000000 --- a/doc/SinglePassIterator.rst +++ /dev/null @@ -1,28 +0,0 @@ -Single Pass Iterator Concept -............................ - -A class or built-in type ``X`` models the *Single Pass Iterator* -concept if the following expressions are valid and respect the stated -semantics. - - -+------------------------------------------------------------------------------------------+ -|Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality | -|Comparable) | -+--------------------------------+-----------------------------+---------------------------+ -|Expression |Return Type |Assertion/Semantics / | -| | |Pre-/Post-condition | -+================================+=============================+===========================+ -|``++r`` |``X&`` |pre: ``r`` is | -| | |dereferenceable; post: | -| | |``r`` is dereferenceable or| -| | |``r`` is past-the-end | -+--------------------------------+-----------------------------+---------------------------+ -|``a == b`` |convertible to ``bool`` |``==`` is an equivalence | -| | |relation over its domain | -+--------------------------------+-----------------------------+---------------------------+ -|``a != b`` |convertible to ``bool`` |``!(a == b)`` | -+--------------------------------+-----------------------------+---------------------------+ -|``iterator_traversal::type`` |Convertible to | | -| |``single_pass_traversal_tag``| | -+--------------------------------+-----------------------------+---------------------------+ diff --git a/doc/SwappableIterator.html b/doc/SwappableIterator.html deleted file mode 100644 index faf0347..0000000 --- a/doc/SwappableIterator.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - -Swappable Iterator Concept - - - -
-

Swappable Iterator Concept

-

A class or built-in type X models the Swappable Iterator concept -if, in addition to X being Copy Constructible, the following -expressions are valid and respect the stated semantics.

- ----- - - - - - - - - - - - - - - -
Swappable Iterator Requirements (in addition to Copy Constructible)
ExpressionReturn TypePostcondition
iter_swap(a, b)voidthe pointed to values are -exchanged
-
-
[Note: An iterator that is a model of the Readable and Writable Iterator concepts
-
is also a model of Swappable Iterator. --end note]
-
-
- - - - diff --git a/doc/SwappableIterator.rst b/doc/SwappableIterator.rst deleted file mode 100755 index ec94d32..0000000 --- a/doc/SwappableIterator.rst +++ /dev/null @@ -1,19 +0,0 @@ -Swappable Iterator Concept -.......................... - -A class or built-in type ``X`` models the *Swappable Iterator* concept -if, in addition to ``X`` being Copy Constructible, the following -expressions are valid and respect the stated semantics. - -+---------------------------------------------------------------------+ -|Swappable Iterator Requirements (in addition to Copy Constructible) | -+-------------------------+-------------+-----------------------------+ -|Expression |Return Type |Postcondition | -+=========================+=============+=============================+ -|``iter_swap(a, b)`` |``void`` |the pointed to values are | -| | |exchanged | -+-------------------------+-------------+-----------------------------+ - -[*Note:* An iterator that is a model of the *Readable* and *Writable Iterator* concepts - is also a model of *Swappable Iterator*. *--end note*] - diff --git a/doc/WritableIterator.html b/doc/WritableIterator.html deleted file mode 100644 index dafee1c..0000000 --- a/doc/WritableIterator.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - -Writable Iterator Concept - - - -
-

Writable Iterator Concept

-

A class or built-in type X models the Writable Iterator concept -if, in addition to X being Copy Constructible, the following -expressions are valid and respect the stated semantics. Writable -Iterators have an associated set of value types.

- ----- - - - - - - - - - - - - - - -
Writable Iterator Requirements (in addition to Copy Constructible)
ExpressionReturn TypePrecondition
*a = o pre: The type of o -is in the set of -value types of X
-
- - - - diff --git a/doc/WritableIterator.rst b/doc/WritableIterator.rst deleted file mode 100755 index 7b854cc..0000000 --- a/doc/WritableIterator.rst +++ /dev/null @@ -1,17 +0,0 @@ -Writable Iterator Concept -......................... - -A class or built-in type ``X`` models the *Writable Iterator* concept -if, in addition to ``X`` being Copy Constructible, the following -expressions are valid and respect the stated semantics. Writable -Iterators have an associated *set of value types*. - -+---------------------------------------------------------------------+ -|Writable Iterator Requirements (in addition to Copy Constructible) | -+-------------------------+--------------+----------------------------+ -|Expression |Return Type |Precondition | -+=========================+==============+============================+ -|``*a = o`` | | pre: The type of ``o`` | -| | | is in the set of | -| | | value types of ``X`` | -+-------------------------+--------------+----------------------------+ diff --git a/doc/access.png b/doc/access.png deleted file mode 100644 index 80011dc..0000000 Binary files a/doc/access.png and /dev/null differ diff --git a/doc/access2old.png b/doc/access2old.png deleted file mode 100644 index 8a87b84..0000000 Binary files a/doc/access2old.png and /dev/null differ diff --git a/doc/counting_iterator.html b/doc/counting_iterator.html deleted file mode 100644 index a098422..0000000 --- a/doc/counting_iterator.html +++ /dev/null @@ -1,285 +0,0 @@ - - - - - - -Counting Iterator - - - - - - - -
-

Counting Iterator

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization:Boost Consulting, Indiana University Open Systems -Lab, University of Hanover Institute for Transport -Railway Operation and Construction
Date:2004-01-15
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved
- --- - - - -
abstract:

How would you fill up a vector with the numbers zero -through one hundred using std::copy()? The only iterator -operation missing from builtin integer types is an -operator*() that returns the current value of the integer. -The counting iterator adaptor adds this crucial piece of -functionality to whatever type it wraps. One can use the -counting iterator adaptor not only with integer types, but with -any incrementable type.

-

counting_iterator adapts an object by adding an operator* that -returns the current value of the object. All other iterator operations -are forwarded to the adapted object.

-
- -
-

counting_iterator synopsis

-
-template <
-    class Incrementable
-  , class CategoryOrTraversal = use_default
-  , class Difference = use_default
->
-class counting_iterator
-{
-public:
-    typedef Incrementable value_type;
-    typedef const Incrementable& reference;
-    typedef const Incrementable* pointer;
-    typedef /* see below */ difference_type;
-    typedef /* see below */ iterator_category;
-
-    counting_iterator();
-    counting_iterator(counting_iterator const& rhs);
-    explicit counting_iterator(Incrementable x);
-    Incrementable const& base() const;
-    reference operator*() const;
-    counting_iterator& operator++();
-    counting_iterator& operator--();
-private:
-    Incrementable m_inc; // exposition
-};
-
-

If the Difference argument is use_default then -difference_type is an unspecified signed integral -type. Otherwise difference_type is Difference.

-

iterator_category is determined according to the following -algorithm:

-
-if (CategoryOrTraversal is not use_default)
-    return CategoryOrTraversal
-else if (numeric_limits<Incrementable>::is_specialized)
-    return iterator-category(
-        random_access_traversal_tag, Incrementable, const Incrementable&)
-else
-    return iterator-category(
-         iterator_traversal<Incrementable>::type, 
-         Incrementable, const Incrementable&)
-
-
-
[Note: implementers are encouraged to provide an implementation of
-
operator- and a difference_type that avoids overflows in -the cases where std::numeric_limits<Incrementable>::is_specialized -is true.]
-
-
-
-

counting_iterator requirements

-

The Incrementable argument shall be Copy Constructible and Assignable.

-

If iterator_category is convertible to forward_iterator_tag -or forward_traversal_tag, the following must be well-formed:

-
-Incrementable i, j;
-++i;         // pre-increment
-i == j;      // operator equal
-
-

If iterator_category is convertible to -bidirectional_iterator_tag or bidirectional_traversal_tag, -the following expression must also be well-formed:

-
---i
-
-

If iterator_category is convertible to -random_access_iterator_tag or random_access_traversal_tag, -the following must must also be valid:

-
-counting_iterator::difference_type n;
-i += n;
-n = i - j;
-i < j;
-
-
-
-

counting_iterator models

-

Specializations of counting_iterator model Readable Lvalue -Iterator. In addition, they model the concepts corresponding to the -iterator tags to which their iterator_category is convertible. -Also, if CategoryOrTraversal is not use_default then -counting_iterator models the concept corresponding to the iterator -tag CategoryOrTraversal. Otherwise, if -numeric_limits<Incrementable>::is_specialized, then -counting_iterator models Random Access Traversal Iterator. -Otherwise, counting_iterator models the same iterator traversal -concepts modeled by Incrementable.

-

counting_iterator<X,C1,D1> is interoperable with -counting_iterator<Y,C2,D2> if and only if X is -interoperable with Y.

-
-
-

counting_iterator operations

-

In addition to the operations required by the concepts modeled by -counting_iterator, counting_iterator provides the following -operations.

-

counting_iterator();

- --- - - - - - -
Requires:Incrementable is Default Constructible.
Effects:Default construct the member m_inc.
-

counting_iterator(counting_iterator const& rhs);

- --- - - - -
Effects:Construct member m_inc from rhs.m_inc.
-

explicit counting_iterator(Incrementable x);

- --- - - - -
Effects:Construct member m_inc from x.
-

reference operator*() const;

- --- - - - -
Returns:m_inc
-

counting_iterator& operator++();

- --- - - - - - -
Effects:++m_inc
Returns:*this
-

counting_iterator& operator--();

- --- - - - - - -
Effects:--m_inc
Returns:*this
-

Incrementable const& base() const;

- --- - - - -
Returns:m_inc
-
-template <class Incrementable>
-counting_iterator<Incrementable> make_counting_iterator(Incrementable x);
-
- --- - - - -
Returns:An instance of counting_iterator<Incrementable> -with current constructed from x.
-
-
-

Example

-

This example fills an array with numbers and a second array with -pointers into the first array, using counting_iterator for both -tasks. Finally indirect_iterator is used to print out the numbers -into the first array via indirection through the second array.

-
-int N = 7;
-std::vector<int> numbers;
-typedef std::vector<int>::iterator n_iter;
-std::copy(boost::counting_iterator<int>(0),
-         boost::counting_iterator<int>(N),
-         std::back_inserter(numbers));
-
-std::vector<std::vector<int>::iterator> pointers;
-std::copy(boost::make_counting_iterator(numbers.begin()),
-          boost::make_counting_iterator(numbers.end()),
-          std::back_inserter(pointers));
-
-std::cout << "indirectly printing out the numbers from 0 to " 
-          << N << std::endl;
-std::copy(boost::make_indirect_iterator(pointers.begin()),
-          boost::make_indirect_iterator(pointers.end()),
-          std::ostream_iterator<int>(std::cout, " "));
-std::cout << std::endl;
-
-

The output is:

-
-indirectly printing out the numbers from 0 to 7
-0 1 2 3 4 5 6 
-
-

The source code for this example can be found here.

-
-
- - - - diff --git a/doc/counting_iterator.pdf b/doc/counting_iterator.pdf deleted file mode 100755 index cce54f8..0000000 Binary files a/doc/counting_iterator.pdf and /dev/null differ diff --git a/doc/counting_iterator.rst b/doc/counting_iterator.rst deleted file mode 100644 index 2d2cad9..0000000 --- a/doc/counting_iterator.rst +++ /dev/null @@ -1,39 +0,0 @@ -+++++++++++++++++++ - Counting Iterator -+++++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, University of Hanover `Institute for Transport - Railway Operation and Construction`_ -:date: $Date$ -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de - -:abstract: How would you fill up a vector with the numbers zero - through one hundred using ``std::copy()``? The only iterator - operation missing from builtin integer types is an - ``operator*()`` that returns the current value of the integer. - The counting iterator adaptor adds this crucial piece of - functionality to whatever type it wraps. One can use the - counting iterator adaptor not only with integer types, but with - any incrementable type. - - .. include:: counting_iterator_abstract.rst - -.. contents:: Table of Contents - -``counting_iterator`` synopsis -.............................. - -.. include:: counting_iterator_ref.rst -.. include:: make_counting_iterator.rst - -.. include:: counting_iterator_eg.rst - -.. _iterator-category: iterator_facade.html#iterator-category -.. |iterator-category| replace:: *iterator-category* diff --git a/doc/counting_iterator_abstract.rst b/doc/counting_iterator_abstract.rst deleted file mode 100644 index bdb8491..0000000 --- a/doc/counting_iterator_abstract.rst +++ /dev/null @@ -1,4 +0,0 @@ -``counting_iterator`` adapts an object by adding an ``operator*`` that -returns the current value of the object. All other iterator operations -are forwarded to the adapted object. - diff --git a/doc/counting_iterator_eg.rst b/doc/counting_iterator_eg.rst deleted file mode 100644 index 5f6b3b3..0000000 --- a/doc/counting_iterator_eg.rst +++ /dev/null @@ -1,40 +0,0 @@ - -Example -....... - -This example fills an array with numbers and a second array with -pointers into the first array, using ``counting_iterator`` for both -tasks. Finally ``indirect_iterator`` is used to print out the numbers -into the first array via indirection through the second array. - -:: - - int N = 7; - std::vector numbers; - typedef std::vector::iterator n_iter; - std::copy(boost::counting_iterator(0), - boost::counting_iterator(N), - std::back_inserter(numbers)); - - std::vector::iterator> pointers; - std::copy(boost::make_counting_iterator(numbers.begin()), - boost::make_counting_iterator(numbers.end()), - std::back_inserter(pointers)); - - std::cout << "indirectly printing out the numbers from 0 to " - << N << std::endl; - std::copy(boost::make_indirect_iterator(pointers.begin()), - boost::make_indirect_iterator(pointers.end()), - std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - -The output is:: - - indirectly printing out the numbers from 0 to 7 - 0 1 2 3 4 5 6 - -The source code for this example can be found `here`__. - -__ ../example/counting_iterator_example.cpp - diff --git a/doc/counting_iterator_ref.rst b/doc/counting_iterator_ref.rst deleted file mode 100644 index bc94db7..0000000 --- a/doc/counting_iterator_ref.rst +++ /dev/null @@ -1,145 +0,0 @@ -:: - - template < - class Incrementable - , class CategoryOrTraversal = use_default - , class Difference = use_default - > - class counting_iterator - { - public: - typedef Incrementable value_type; - typedef const Incrementable& reference; - typedef const Incrementable* pointer; - typedef /* see below */ difference_type; - typedef /* see below */ iterator_category; - - counting_iterator(); - counting_iterator(counting_iterator const& rhs); - explicit counting_iterator(Incrementable x); - Incrementable const& base() const; - reference operator*() const; - counting_iterator& operator++(); - counting_iterator& operator--(); - private: - Incrementable m_inc; // exposition - }; - - -If the ``Difference`` argument is ``use_default`` then -``difference_type`` is an unspecified signed integral -type. Otherwise ``difference_type`` is ``Difference``. - -``iterator_category`` is determined according to the following -algorithm: - -.. parsed-literal:: - - if (CategoryOrTraversal is not use_default) - return CategoryOrTraversal - else if (numeric_limits::is_specialized) - return |iterator-category|_\ ( - random_access_traversal_tag, Incrementable, const Incrementable&) - else - return |iterator-category|_\ ( - iterator_traversal::type, - Incrementable, const Incrementable&) - -[*Note:* implementers are encouraged to provide an implementation of - ``operator-`` and a ``difference_type`` that avoids overflows in - the cases where ``std::numeric_limits::is_specialized`` - is true.] - -``counting_iterator`` requirements -.................................. - -The ``Incrementable`` argument shall be Copy Constructible and Assignable. - -If ``iterator_category`` is convertible to ``forward_iterator_tag`` -or ``forward_traversal_tag``, the following must be well-formed:: - - Incrementable i, j; - ++i; // pre-increment - i == j; // operator equal - - -If ``iterator_category`` is convertible to -``bidirectional_iterator_tag`` or ``bidirectional_traversal_tag``, -the following expression must also be well-formed:: - - --i - -If ``iterator_category`` is convertible to -``random_access_iterator_tag`` or ``random_access_traversal_tag``, -the following must must also be valid:: - - counting_iterator::difference_type n; - i += n; - n = i - j; - i < j; - -``counting_iterator`` models -............................ - -Specializations of ``counting_iterator`` model Readable Lvalue -Iterator. In addition, they model the concepts corresponding to the -iterator tags to which their ``iterator_category`` is convertible. -Also, if ``CategoryOrTraversal`` is not ``use_default`` then -``counting_iterator`` models the concept corresponding to the iterator -tag ``CategoryOrTraversal``. Otherwise, if -``numeric_limits::is_specialized``, then -``counting_iterator`` models Random Access Traversal Iterator. -Otherwise, ``counting_iterator`` models the same iterator traversal -concepts modeled by ``Incrementable``. - -``counting_iterator`` is interoperable with -``counting_iterator`` if and only if ``X`` is -interoperable with ``Y``. - - - -``counting_iterator`` operations -................................ - -In addition to the operations required by the concepts modeled by -``counting_iterator``, ``counting_iterator`` provides the following -operations. - - -``counting_iterator();`` - -:Requires: ``Incrementable`` is Default Constructible. -:Effects: Default construct the member ``m_inc``. - - -``counting_iterator(counting_iterator const& rhs);`` - -:Effects: Construct member ``m_inc`` from ``rhs.m_inc``. - - - -``explicit counting_iterator(Incrementable x);`` - -:Effects: Construct member ``m_inc`` from ``x``. - - -``reference operator*() const;`` - -:Returns: ``m_inc`` - - -``counting_iterator& operator++();`` - -:Effects: ``++m_inc`` -:Returns: ``*this`` - - -``counting_iterator& operator--();`` - -:Effects: ``--m_inc`` -:Returns: ``*this`` - - -``Incrementable const& base() const;`` - -:Returns: ``m_inc`` diff --git a/doc/default.css b/doc/default.css deleted file mode 100644 index 0e4226a..0000000 --- a/doc/default.css +++ /dev/null @@ -1,224 +0,0 @@ -/* -:Author: David Goodger -:Contact: goodger@users.sourceforge.net -:date: $Date$ -:version: $Revision$ -:copyright: This stylesheet has been placed in the public domain. - -Default cascading style sheet for the HTML output of Docutils. -*/ - -.first { - margin-top: 0 } - -.last { - margin-bottom: 0 } - -a.toc-backref { - text-decoration: none ; - color: black } - -dd { - margin-bottom: 0.5em } - -div.abstract { - margin: 2em 5em } - -div.abstract p.topic-title { - font-weight: bold ; - text-align: center } - -div.attention, div.caution, div.danger, div.error, div.hint, -div.important, div.note, div.tip, div.warning, div.admonition { - margin: 2em ; - border: medium outset ; - padding: 1em } - -div.attention p.admonition-title, div.caution p.admonition-title, -div.danger p.admonition-title, div.error p.admonition-title, -div.warning p.admonition-title { - color: red ; - font-weight: bold ; - font-family: sans-serif } - -div.hint p.admonition-title, div.important p.admonition-title, -div.note p.admonition-title, div.tip p.admonition-title, -div.admonition p.admonition-title { - font-weight: bold ; - font-family: sans-serif } - -div.dedication { - margin: 2em 5em ; - text-align: center ; - font-style: italic } - -div.dedication p.topic-title { - font-weight: bold ; - font-style: normal } - -div.figure { - margin-left: 2em } - -div.footer, div.header { - font-size: smaller } - -div.sidebar { - margin-left: 1em ; - border: medium outset ; - padding: 0em 1em ; - background-color: #ffffee ; - width: 40% ; - float: right ; - clear: right } - -div.sidebar p.rubric { - font-family: sans-serif ; - font-size: medium } - -div.system-messages { - margin: 5em } - -div.system-messages h1 { - color: red } - -div.system-message { - border: medium outset ; - padding: 1em } - -div.system-message p.system-message-title { - color: red ; - font-weight: bold } - -div.topic { - margin: 2em } - -h1.title { - text-align: center } - -h2.subtitle { - text-align: center } - -hr { - width: 75% } - -ol.simple, ul.simple { - margin-bottom: 1em } - -ol.arabic { - list-style: decimal } - -ol.loweralpha { - list-style: lower-alpha } - -ol.upperalpha { - list-style: upper-alpha } - -ol.lowerroman { - list-style: lower-roman } - -ol.upperroman { - list-style: upper-roman } - -p.attribution { - text-align: right ; - margin-left: 50% } - -p.caption { - font-style: italic } - -p.credits { - font-style: italic ; - font-size: smaller } - -p.label { - white-space: nowrap } - -p.rubric { - font-weight: bold ; - font-size: larger ; - color: maroon ; - text-align: center } - -p.sidebar-title { - font-family: sans-serif ; - font-weight: bold ; - font-size: larger } - -p.sidebar-subtitle { - font-family: sans-serif ; - font-weight: bold } - -p.topic-title { - font-weight: bold } - -pre.address { - margin-bottom: 0 ; - margin-top: 0 ; - font-family: serif ; - font-size: 100% } - -pre.line-block { - font-family: serif ; - font-size: 100% } - -pre.literal-block, pre.doctest-block { - margin-left: 2em ; - margin-right: 2em ; - background-color: #eeeeee } - -span.classifier { - font-family: sans-serif ; - font-style: oblique } - -span.classifier-delimiter { - font-family: sans-serif ; - font-weight: bold } - -span.interpreted { - font-family: sans-serif } - -span.option { - white-space: nowrap } - -span.option-argument { - font-style: italic } - -span.pre { - white-space: pre } - -span.problematic { - color: red } - -table { - margin-top: 0.5em ; - margin-bottom: 0.5em } - -table.citation { - border-left: solid thin gray ; - padding-left: 0.5ex } - -table.docinfo { - margin: 2em 4em } - -table.footnote { - border-left: solid thin black ; - padding-left: 0.5ex } - -td, th { - padding-left: 0.5em ; - padding-right: 0.5em ; - vertical-align: top } - -th.docinfo-name, th.field-name { - font-weight: bold ; - text-align: left ; - white-space: nowrap } - -h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { - font-size: 100% } - -tt { - background-color: #eeeeee } - -ul.auto-toc { - list-style-type: none } diff --git a/doc/docutils.sty b/doc/docutils.sty deleted file mode 100755 index a6fce3f..0000000 --- a/doc/docutils.sty +++ /dev/null @@ -1,54 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%% docutils.sty: A style for docutils latex output %%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% -%% o author: Alexander Schmolck (a.schmolck@gmx.net) -%% o created: 2002-07-07 10:50:31+00:40 -%% o last modified: $Date: 2004/01/29 05:55:26 $ -%% o keywords: -%% o license: -%XXX titlesec -%% XXX geometry -\usepackage{graphicx} -\usepackage{latexsym} % extra symbols -\usepackage{url} % !!!: pay attention when using in other commands!!! -\usepackage{verbatim} % normal verbatim has lenght-limit -\usepackage{enumerate} % easy style choice with e.g: ``\begin{enumerate}[Ex i.]`` -\usepackage{hyperref} %href, htarget and hlink XXX: pdfauthor, pdfcreator etc. -\usepackage{xr} %XXX do we need this? -% need this to have ``fboxes`` in ``enviroments``, as well as ``verbatim``s -\usepackage{fancybox} -\usepackage{mdwtab} % better tables and arrays (fixes spacing and adds - % vertical align and multirows (m)) -\usepackage{ltxtable} % long and autoscaling tables (use X for autoscaled - % columns) -\newcommand{\transition}{\vspace{2em}\par\hrule{}\par\vspace{2em}} -\newcommand{\classifier}[1]{(\textit{#1})} -\newenvironment{topic}[1]% -{\begin{Sbox}% - \begin{minipage}{.8\textwidth}% - \protect{\large{\textbf{#1}}}\par\vspace{.5em}}% -{\end{minipage}\end{Sbox}\fbox{\TheSbox}\par\vspace{.5em}} -%XXX shadow box for warnings? -\newenvironment{admonition}[1]% -{\begin{center}% - \begin{Sbox}% - \begin{minipage}{.9\textwidth}% - \protect{\textsc{#1}}\par\vspace{.2em}}% -{\end{minipage}\end{Sbox}\fbox{\TheSbox}\par\vspace{.5em}\end{center}} - -\newenvironment{doctest}% -{\VerbatimEnvironment - \begin{Verbatim}}% -{\end{Verbatim}} -% {% -% \begin{Sbox}% -% \begin{minipage}{.8\textwidth}% -% \protect{\large{\textsc{#1}}\par\vspace{.5em}}}% -% {\end{minipage}\end{Sbox}\fbox{\TheSbox}\par\vspace{.5em}} -%{\end{minipage}\end{Sbox}\fbox{\TheSbox}} - - -%% just a piece of example code -% \newcommand{\vitem}% -% {\SaveVerb[{\item[\UseVerb{\MyTemp}]}]{\MyTemp}} diff --git a/doc/facade-and-adaptor.diff b/doc/facade-and-adaptor.diff deleted file mode 100755 index 07f0e40..0000000 --- a/doc/facade-and-adaptor.diff +++ /dev/null @@ -1,228 +0,0 @@ -Index: facade-and-adaptor.rst -=================================================================== -RCS file: /cvsroot/boost/boost/libs/iterator/doc/facade-and-adaptor.rst,v -retrieving revision 1.9 -retrieving revision 1.14 -diff -b -d -u -r1.9 -r1.14 ---- facade-and-adaptor.rst 22 Sep 2003 19:55:00 -0000 1.9 -+++ facade-and-adaptor.rst 18 Jan 2004 15:51:06 -0000 1.14 -@@ -3,17 +3,25 @@ None - +++++++++++++++++++++++++++++ - - :Author: David Abrahams, Jeremy Siek, Thomas Witt --:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@acm.org -+:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com - :organization: `Boost Consulting`_, Indiana University `Open Systems -- Lab`_, University of Hanover `Institute for Transport -- Railway Operation and Construction`_ --:date: $Date: 2004/01/18 19:56:39 $ --:Number: N1530=03-0113 -+ Lab`_, `Zephyr Associates, Inc.`_ -+:date: $Date: 2004/01/18 19:56:39 $ -+ -+:Number: This is a revised version of N1530_\ =03-0113, which was -+ accepted for Technical Report 1 by the C++ standard -+ committee's library working group. -+ -+.. Version 1.9 of this ReStructuredText document corresponds to -+ n1530_, the paper accepted by the LWG. -+ -+.. _n1530: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1530.html -+ - :copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved - - .. _`Boost Consulting`: http://www.boost-consulting.com - .. _`Open Systems Lab`: http://www.osl.iu.edu --.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de -+.. _`Zephyr Associates, Inc.`: http://www.styleadvisor.com - - :abstract: We propose a set of class templates that help programmers - build standard-conforming iterators, both from scratch and -@@ -124,15 +132,15 @@ None - ================= - - This proposal is formulated in terms of the new ``iterator concepts`` --as proposed in `n1477`_, since user-defined and especially adapted -+as proposed in n1550_, since user-defined and especially adapted - iterators suffer from the well known categorization problems that are - inherent to the current iterator categories. - --.. _`n1477`: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1477.html -+.. _n1550: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1550.html - --This proposal does not strictly depend on proposal `n1477`_, as there -+This proposal does not strictly depend on proposal n1550_, as there - is a direct mapping between new and old categories. This proposal --could be reformulated using this mapping if `n1477`_ was not accepted. -+could be reformulated using this mapping if n1550_ was not accepted. - - Interoperability - ================ -@@ -141,24 +149,24 @@ None - current standard. There are currently two defect reports that are - concerned with interoperability issues. - --Issue `179`_ concerns the fact that mutable container iterator types -+Issue 179_ concerns the fact that mutable container iterator types - are only required to be convertible to the corresponding constant - iterator types, but objects of these types are not required to - interoperate in comparison or subtraction expressions. This situation - is tedious in practice and out of line with the way built in types - work. This proposal implements the proposed resolution to issue --`179`_, as most standard library implementations do nowadays. In other -+179_, as most standard library implementations do nowadays. In other - words, if an iterator type A has an implicit or user defined - conversion to an iterator type B, the iterator types are interoperable - and the usual set of operators are available. - --Issue `280`_ concerns the current lack of interoperability between -+Issue 280_ concerns the current lack of interoperability between - reverse iterator types. The proposed new reverse_iterator template - fixes the issues raised in 280. It provides the desired - interoperability without introducing unwanted overloads. - --.. _`179`: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#179 --.. _`280`: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#280 -+.. _179: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#179 -+.. _280: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#280 - - - Iterator Facade -@@ -195,7 +203,7 @@ None - * ``filter_iterator``, which provides a view of an iterator range in - which some elements of the underlying range are skipped. - --.. _counting_iterator: -+.. _counting: - - * ``counting_iterator``, which adapts any incrementable type - (e.g. integers, iterators) so that incrementing/decrementing the -@@ -226,15 +234,13 @@ Issue 9.1 et al - :: - - struct use_default; -- const unsigned use_default_access = -1; - - struct iterator_core_access { /* implementation detail */ }; - - template < - class Derived - , class Value -- , unsigned AccessCategory -- , class TraversalCategory -+ , class CategoryOrTraversal - , class Reference = Value& - , class Difference = ptrdiff_t - > -@@ -244,8 +250,7 @@ Issue 9.1 et al. - class Derived - , class Base - , class Value = use_default -- , unsigned Access = use_default_access -- , class Traversal = use_default -+ , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > -@@ -254,10 +259,9 @@ Issue 9.1 et al. - template < - class Iterator - , class Value = use_default -- , unsigned Access = use_default_access -- , class Traversal = use_default -+ , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class indirect_iterator; - -Issue 9.44y - -+ template -+ struct pointee; -+ -+ template -+ struct indirect_reference; -+ - template - class reverse_iterator; - -@@ -277,8 +287,7 @@ Issue 9.1 et al. - - template < - class Incrementable -- , unsigned Access = use_default_access -- , class Traversal = use_default -+ , class CategoryOrTraversal = use_default - , class Difference = use_default - > - class counting_iterator -@@ -312,17 +321,35 @@ Issue 9.8 - Specialized adaptors [lib.iterator.special.adaptors] - ==================================================== - --.. The requirements for all of these need to be written *much* more -- formally -DWA -- - --[*Note:* The ``enable_if_convertible::type`` expression used in -+The ``enable_if_convertible::type`` expression used in - this section is for exposition purposes. The converting constructors - for specialized adaptors should be only be in an overload set provided - that an object of type ``X`` is implicitly convertible to an object of --type ``Y``. The ``enable_if_convertible`` approach uses SFINAE to -+type ``Y``. -+The signatures involving ``enable_if_convertible`` should behave -+*as-if* ``enable_if_convertible`` were defined to be:: -+ -+ template enable_if_convertible_impl -+ {}; -+ -+ template <> enable_if_convertible_impl -+ { struct type; }; -+ -+ template -+ struct enable_if_convertible -+ : enable_if_convertible_impl::value> -+ {}; -+ -+If an expression other than the default argument is used to supply -+the value of a function parameter whose type is written in terms -+of ``enable_if_convertible``, the program is ill-formed, no -+diagnostic required. -+ -+[*Note:* The ``enable_if_convertible`` approach uses SFINAE to - take the constructor out of the overload set when the types are not --implicitly convertible.] -+implicitly convertible. -+] - - - Indirect iterator -@@ -330,6 +357,16 @@ Issue 9.44y - - .. include:: indirect_iterator_abstract.rst - -+Class template ``pointee`` -+.................................... -+ -+.. include:: pointee_ref.rst -+ -+Class template ``indirect_reference`` -+..................................... -+ -+.. include:: indirect_reference_ref.rst -+ - Class template ``indirect_iterator`` - .................................... - -@@ -393,8 +430,7 @@ - - - --.. -- LocalWords: Abrahams Siek Witt istream ostream iter MTL strided interoperate -+.. LocalWords: Abrahams Siek Witt istream ostream iter MTL strided interoperate - LocalWords: CRTP metafunctions inlining lvalue JGS incrementable BGL LEDA cv - LocalWords: GraphBase struct ptrdiff UnaryFunction const int typename bool pp - LocalWords: lhs rhs SFINAE markup iff tmp OtherDerived OtherIterator DWA foo diff --git a/doc/facade-and-adaptor.html b/doc/facade-and-adaptor.html deleted file mode 100755 index 018b502..0000000 --- a/doc/facade-and-adaptor.html +++ /dev/null @@ -1,2632 +0,0 @@ - - - - - - -Iterator Facade and Adaptor - - - - - - -

Iterator Facade and Adaptor

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
Organization:Boost Consulting, Indiana University Open Systems -Lab, Zephyr Associates, Inc.
Date:2004-01-21
Number:This is a revised version of N1530=03-0113, which was -accepted for Technical Report 1 by the C++ standard -committee's library working group.
-
- - --- - - - -
copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved
- --- - - - -
abstract:We propose a set of class templates that help programmers -build standard-conforming iterators, both from scratch and -by adapting other iterators.
-
-

Table of Contents

- -
-
-

Motivation

-

Iterators play an important role in modern C++ programming. The -iterator is the central abstraction of the algorithms of the Standard -Library, allowing algorithms to be re-used in in a wide variety of -contexts. The C++ Standard Library contains a wide variety of useful -iterators. Every one of the standard containers comes with constant -and mutable iterators 2, and also reverse versions of those -same iterators which traverse the container in the opposite direction. -The Standard also supplies istream_iterator and -ostream_iterator for reading from and writing to streams, -insert_iterator, front_insert_iterator and -back_insert_iterator for inserting elements into containers, and -raw_storage_iterator for initializing raw memory [7].

-

Despite the many iterators supplied by the Standard Library, obvious -and useful iterators are missing, and creating new iterator types is -still a common task for C++ programmers. The literature documents -several of these, for example line_iterator [3] and Constant_iterator -[9]. The iterator abstraction is so powerful that we expect -programmers will always need to invent new iterator types.

-

Although it is easy to create iterators that almost conform to the -standard, the iterator requirements contain subtleties which can make -creating an iterator which actually conforms quite difficult. -Further, the iterator interface is rich, containing many operators -that are technically redundant and tedious to implement. To automate -the repetitive work of constructing iterators, we propose -iterator_facade, an iterator base class template which provides -the rich interface of standard iterators and delegates its -implementation to member functions of the derived class. In addition -to reducing the amount of code necessary to create an iterator, the -iterator_facade also provides compile-time error detection. -Iterator implementation mistakes that often go unnoticed are turned -into compile-time errors because the derived class implementation must -match the expectations of the iterator_facade.

-

A common pattern of iterator construction is the adaptation of one -iterator to form a new one. The functionality of an iterator is -composed of four orthogonal aspects: traversal, indirection, equality -comparison and distance measurement. Adapting an old iterator to -create a new one often saves work because one can reuse one aspect of -functionality while redefining the other. For example, the Standard -provides reverse_iterator, which adapts any Bidirectional Iterator -by inverting its direction of traversal. As with plain iterators, -iterator adaptors defined outside the Standard have become commonplace -in the literature:

-
    -
  • Checked iter[13] adds bounds-checking to an existing iterator.
  • -
  • The iterators of the View Template Library[14], which adapts -containers, are themselves adaptors over the underlying iterators.
  • -
  • Smart iterators [5] adapt an iterator's dereferencing behavior by -applying a function object to the object being referenced and -returning the result.
  • -
  • Custom iterators [4], in which a variety of adaptor types are enumerated.
  • -
  • Compound iterators [1], which access a slice out of a container of containers.
  • -
  • Several iterator adaptors from the MTL [12]. The MTL contains a -strided iterator, where each call to operator++() moves the -iterator ahead by some constant factor, and a scaled iterator, which -multiplies the dereferenced value by some constant.
  • -
- - - - - -
[1]We use the term concept to mean a set of requirements -that a type must satisfy to be used with a particular template -parameter.
- - - - - -
[2]The term mutable iterator refers to iterators over objects that -can be changed by assigning to the dereferenced iterator, while -constant iterator refers to iterators over objects that cannot be -modified.
-

To fulfill the need for constructing adaptors, we propose the -iterator_adaptor class template. Instantiations of -iterator_adaptor serve as a base classes for new iterators, -providing the default behavior of forwarding all operations to the -underlying iterator. The user can selectively replace these features -in the derived iterator class. This proposal also includes a number -of more specialized adaptors, such as the transform_iterator that -applies some user-specified function during the dereference of the -iterator.

-
-
-

Impact on the Standard

-

This proposal is purely an addition to the C++ standard library. -However, note that this proposal relies on the proposal for New -Iterator Concepts.

-
-
-

Design

-
-

Iterator Concepts

-

This proposal is formulated in terms of the new iterator concepts -as proposed in n1550, since user-defined and especially adapted -iterators suffer from the well known categorization problems that are -inherent to the current iterator categories.

-

This proposal does not strictly depend on proposal n1550, as there -is a direct mapping between new and old categories. This proposal -could be reformulated using this mapping if n1550 was not accepted.

-
-
-

Interoperability

-

The question of iterator interoperability is poorly addressed in the -current standard. There are currently two defect reports that are -concerned with interoperability issues.

-

Issue 179 concerns the fact that mutable container iterator types -are only required to be convertible to the corresponding constant -iterator types, but objects of these types are not required to -interoperate in comparison or subtraction expressions. This situation -is tedious in practice and out of line with the way built in types -work. This proposal implements the proposed resolution to issue -179, as most standard library implementations do nowadays. In other -words, if an iterator type A has an implicit or user defined -conversion to an iterator type B, the iterator types are interoperable -and the usual set of operators are available.

-

Issue 280 concerns the current lack of interoperability between -reverse iterator types. The proposed new reverse_iterator template -fixes the issues raised in 280. It provides the desired -interoperability without introducing unwanted overloads.

-
-
-

Iterator Facade

- - -

While the iterator interface is rich, there is a core subset of the -interface that is necessary for all the functionality. We have -identified the following core behaviors for iterators:

-
    -
  • dereferencing
  • -
  • incrementing
  • -
  • decrementing
  • -
  • equality comparison
  • -
  • random-access motion
  • -
  • distance measurement
  • -
-

In addition to the behaviors listed above, the core interface elements -include the associated types exposed through iterator traits: -value_type, reference, difference_type, and -iterator_category.

-

Iterator facade uses the Curiously Recurring Template -Pattern (CRTP) [Cop95] so that the user can specify the behavior -of iterator_facade in a derived class. Former designs used -policy objects to specify the behavior, but that approach was -discarded for several reasons:

-
-
    -
  1. the creation and eventual copying of the policy object may create -overhead that can be avoided with the current approach.
  2. -
  3. The policy object approach does not allow for custom constructors -on the created iterator types, an essential feature if -iterator_facade should be used in other library -implementations.
  4. -
  5. Without the use of CRTP, the standard requirement that an -iterator's operator++ returns the iterator type itself -would mean that all iterators built with the library would -have to be specializations of iterator_facade<...>, rather -than something more descriptive like -indirect_iterator<T*>. Cumbersome type generator -metafunctions would be needed to build new parameterized -iterators, and a separate iterator_adaptor layer would be -impossible.
  6. -
-
-
-

Usage

-

The user of iterator_facade derives his iterator class from a -specialization of iterator_facade and passes the derived -iterator class as iterator_facade's first template parameter. -The order of the other template parameters have been carefully -chosen to take advantage of useful defaults. For example, when -defining a constant lvalue iterator, the user can pass a -const-qualified version of the iterator's value_type as -iterator_facade's Value parameter and omit the -Reference parameter which follows.

-

The derived iterator class must define member functions implementing -the iterator's core behaviors. The following table describes -expressions which are required to be valid depending on the category -of the derived iterator type. These member functions are described -briefly below and in more detail in the iterator facade -requirements.

-
- ---- - - - - - - - - - - - - - - - - - - - - - - - - - -
ExpressionEffects
i.dereference()Access the value referred to
i.equal(j)Compare for equality with j
i.increment()Advance by one position
i.decrement()Retreat by one position
i.advance(n)Advance by n positions
i.distance_to(j)Measure the distance to j
-
- -

In addition to implementing the core interface functions, an iterator -derived from iterator_facade typically defines several -constructors. To model any of the standard iterator concepts, the -iterator must at least have a copy constructor. Also, if the iterator -type X is meant to be automatically interoperate with another -iterator type Y (as with constant and mutable iterators) then -there must be an implicit conversion from X to Y or from Y -to X (but not both), typically implemented as a conversion -constructor. Finally, if the iterator is to model Forward Traversal -Iterator or a more-refined iterator concept, a default constructor is -required.

-
-
-

Iterator Core Access

-

iterator_facade and the operator implementations need to be able -to access the core member functions in the derived class. Making the -core member functions public would expose an implementation detail to -the user. The design used here ensures that implementation details do -not appear in the public interface of the derived iterator type.

-

Preventing direct access to the core member functions has two -advantages. First, there is no possibility for the user to accidently -use a member function of the iterator when a member of the value_type -was intended. This has been an issue with smart pointer -implementations in the past. The second and main advantage is that -library implementers can freely exchange a hand-rolled iterator -implementation for one based on iterator_facade without fear of -breaking code that was accessing the public core member functions -directly.

-

In a naive implementation, keeping the derived class' core member -functions private would require it to grant friendship to -iterator_facade and each of the seven operators. In order to -reduce the burden of limiting access, iterator_core_access is -provided, a class that acts as a gateway to the core member functions -in the derived iterator class. The author of the derived class only -needs to grant friendship to iterator_core_access to make his core -member functions available to the library.

- - -

iterator_core_access will be typically implemented as an empty -class containing only private static member functions which invoke the -iterator core member functions. There is, however, no need to -standardize the gateway protocol. Note that even if -iterator_core_access used public member functions it would not -open a safety loophole, as every core member function preserves the -invariants of the iterator.

-
-
-

operator[]

-

The indexing operator for a generalized iterator presents special -challenges. A random access iterator's operator[] is only -required to return something convertible to its value_type. -Requiring that it return an lvalue would rule out currently-legal -random-access iterators which hold the referenced value in a data -member (e.g. counting_iterator), because *(p+n) is a reference -into the temporary iterator p+n, which is destroyed when -operator[] returns.

-

Writable iterators built with iterator_facade implement the -semantics required by the preferred resolution to issue 299 and -adopted by proposal n1550: the result of p[n] is an object -convertible to the iterator's value_type, and p[n] = x is -equivalent to *(p + n) = x (Note: This result object may be -implemented as a proxy containing a copy of p+n). This approach -will work properly for any random-access iterator regardless of the -other details of its implementation. A user who knows more about -the implementation of her iterator is free to implement an -operator[] that returns an lvalue in the derived iterator -class; it will hide the one supplied by iterator_facade from -clients of her iterator.

-
-
-

operator->

-

The reference type of a readable iterator (and today's input -iterator) need not in fact be a reference, so long as it is -convertible to the iterator's value_type. When the value_type -is a class, however, it must still be possible to access members -through operator->. Therefore, an iterator whose reference -type is not in fact a reference must return a proxy containing a copy -of the referenced value from its operator->.

-

The return types for iterator_facade's operator-> and -operator[] are not explicitly specified. Instead, those types -are described in terms of a set of requirements, which must be -satisfied by the iterator_facade implementation.

- - - - - -
[Cop95][Coplien, 1995] Coplien, J., Curiously Recurring Template -Patterns, C++ Report, February 1995, pp. 24-27.
-
-
-
-

Iterator Adaptor

- - -

The iterator_adaptor class template adapts some Base 3 -type to create a new iterator. Instantiations of iterator_adaptor -are derived from a corresponding instantiation of iterator_facade -and implement the core behaviors in terms of the Base type. In -essence, iterator_adaptor merely forwards all operations to an -instance of the Base type, which it stores as a member.

- - - - - -
[3]The term "Base" here does not refer to a base class and is -not meant to imply the use of derivation. We have followed the lead -of the standard library, which provides a base() function to access -the underlying iterator object of a reverse_iterator adaptor.
-

The user of iterator_adaptor creates a class derived from an -instantiation of iterator_adaptor and then selectively -redefines some of the core member functions described in the -iterator_facade core requirements table. The Base type need -not meet the full requirements for an iterator; it need only -support the operations used by the core interface functions of -iterator_adaptor that have not been redefined in the user's -derived class.

-

Several of the template parameters of iterator_adaptor default -to use_default. This allows the -user to make use of a default parameter even when she wants to -specify a parameter later in the parameter list. Also, the -defaults for the corresponding associated types are somewhat -complicated, so metaprogramming is required to compute them, and -use_default can help to simplify the implementation. Finally, -the identity of the use_default type is not left unspecified -because specification helps to highlight that the Reference -template parameter may not always be identical to the iterator's -reference type, and will keep users from making mistakes based on -that assumption.

-
-
-

Specialized Adaptors

-

This proposal also contains several examples of specialized adaptors -which were easily implemented using iterator_adaptor:

-
    -
  • indirect_iterator, which iterates over iterators, pointers, -or smart pointers and applies an extra level of dereferencing.
  • -
  • A new reverse_iterator, which inverts the direction of a Base -iterator's motion, while allowing adapted constant and mutable -iterators to interact in the expected ways (unlike those in most -implementations of C++98).
  • -
  • transform_iterator, which applies a user-defined function object -to the underlying values when dereferenced.
  • -
  • filter_iterator, which provides a view of an iterator range in -which some elements of the underlying range are skipped.
  • -
-
    -
  • counting_iterator, which adapts any incrementable type -(e.g. integers, iterators) so that incrementing/decrementing the -adapted iterator and dereferencing it produces successive values of -the Base type.
  • -
  • function_output_iterator, which makes it easier to create custom -output iterators.
  • -
-

Based on examples in the Boost library, users have generated many new -adaptors, among them a permutation adaptor which applies some -permutation to a random access iterator, and a strided adaptor, which -adapts a random access iterator by multiplying its unit of motion by a -constant factor. In addition, the Boost Graph Library (BGL) uses -iterator adaptors to adapt other graph libraries, such as LEDA [10] -and Stanford GraphBase [8], to the BGL interface (which requires C++ -Standard compliant iterators).

-
-
-
-

Proposed Text

-
-

Header <iterator_helper> synopsis [lib.iterator.helper.synopsis]

-
-struct use_default;
-
-struct iterator_core_access { /* implementation detail */ };
-
-template <
-    class Derived
-  , class Value
-  , class CategoryOrTraversal
-  , class Reference  = Value&
-  , class Difference = ptrdiff_t
->
-class iterator_facade;
-
-template <
-    class Derived
-  , class Base
-  , class Value      = use_default
-  , class CategoryOrTraversal  = use_default
-  , class Reference  = use_default
-  , class Difference = use_default
->
-class iterator_adaptor;
-
-template <
-    class Iterator
-  , class Value = use_default
-  , class CategoryOrTraversal = use_default
-  , class Reference = use_default
-  , class Difference = use_default
->
-class indirect_iterator;
-
-template <class Dereferenceable>
-struct pointee;
-
-template <class Dereferenceable>
-struct indirect_reference;
-
-template <class Iterator>
-class reverse_iterator;
-
-template <
-    class UnaryFunction
-  , class Iterator
-  , class Reference = use_default
-  , class Value = use_default
->
-class transform_iterator;
-
-template <class Predicate, class Iterator>
-class filter_iterator;
-
-template <
-    class Incrementable
-  , class CategoryOrTraversal  = use_default
-  , class Difference = use_default
->
-class counting_iterator;
-
-template <class UnaryFunction>
-class function_output_iterator;
-
-
-
-

Iterator facade [lib.iterator.facade]

-

iterator_facade is a base class template that implements the -interface of standard iterators in terms of a few core functions -and associated types, to be supplied by a derived iterator class.

-
-

Class template iterator_facade

- - -
-template <
-    class Derived
-  , class Value
-  , class CategoryOrTraversal
-  , class Reference  = Value&
-  , class Difference = ptrdiff_t
->
-class iterator_facade {
- public:
-    typedef remove_const<Value>::type value_type;
-    typedef Reference reference;
-    typedef Value* pointer;
-    typedef Difference difference_type;
-    typedef /* see below */ iterator_category;
-
-    reference operator*() const;
-    /* see below */ operator->() const;
-    /* see below */ operator[](difference_type n) const;
-    Derived& operator++();
-    Derived operator++(int);
-    Derived& operator--();
-    Derived operator--(int);
-    Derived& operator+=(difference_type n);
-    Derived& operator-=(difference_type n);
-    Derived operator-(difference_type n) const;
- protected:
-    typedef iterator_facade iterator_facade_;
-};
-
-// Comparison operators
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type // exposition
-operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-// Iterator difference
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-/* see below */
-operator-(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-          iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-// Iterator addition
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (iterator_facade<Dr,V,TC,R,D> const&,
-                   typename Derived::difference_type n);
-
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (typename Derived::difference_type n,
-                   iterator_facade<Dr,V,TC,R,D> const&);
-
-

The iterator_category member of iterator_facade is

-
-iterator-category(CategoryOrTraversal, value_type, reference)
-
-

where iterator-category is defined as follows:

-
-iterator-category(C,R,V) :=
-   if (C is convertible to std::input_iterator_tag
-       || C is convertible to std::output_iterator_tag
-   )
-       return C
-
-   else if (C is not convertible to incrementable_traversal_tag)
-       the program is ill-formed
-
-   else return a type X satisfying the following two constraints:
-
-      1. X is convertible to X1, and not to any more-derived
-         type, where X1 is defined by:
-
-           if (R is a reference type
-               && C is convertible to forward_traversal_tag)
-           {
-               if (C is convertible to random_access_traversal_tag)
-                   X1 = random_access_iterator_tag
-               else if (C is convertible to bidirectional_traversal_tag)
-                   X1 = bidirectional_iterator_tag
-               else
-                   X1 = forward_iterator_tag
-           }
-           else
-           {
-               if (C is convertible to single_pass_traversal_tag
-                   && R is convertible to V)
-                   X1 = input_iterator_tag
-               else
-                   X1 = C
-           }
-
-      2. category-to-traversal(X) is convertible to the most
-         derived traversal tag type to which X is also
-         convertible, and not to any more-derived traversal tag
-         type.
-
-

[Note: the intention is to allow iterator_category to be one of -the five original category tags when convertibility to one of the -traversal tags would add no information]

- - - -

The enable_if_interoperable template used above is for exposition -purposes. The member operators should only be in an overload set -provided the derived types Dr1 and Dr2 are interoperable, -meaning that at least one of the types is convertible to the other. The -enable_if_interoperable approach uses SFINAE to take the operators -out of the overload set when the types are not interoperable. -The operators should behave as-if enable_if_interoperable -were defined to be:

-
-template <bool, typename> enable_if_interoperable_impl
-{};
-
-template <typename T> enable_if_interoperable_impl<true,T>
-{ typedef T type; };
-
-template<typename Dr1, typename Dr2, typename T>
-struct enable_if_interoperable
-  : enable_if_interoperable_impl<
-        is_convertible<Dr1,Dr2>::value || is_convertible<Dr2,Dr1>::value
-      , T
-    >
-{};
-
-
-
-

iterator_facade Requirements

-

The following table describes the typical valid expressions on -iterator_facade's Derived parameter, depending on the -iterator concept(s) it will model. The operations in the first -column must be made accessible to member functions of class -iterator_core_access. In addition, -static_cast<Derived*>(iterator_facade*) shall be well-formed.

-

In the table below, F is iterator_facade<X,V,C,R,D>, a is an -object of type X, b and c are objects of type const X, -n is an object of F::difference_type, y is a constant -object of a single pass iterator type interoperable with X, and z -is a constant object of a random access traversal iterator type -interoperable with X.

-
-

iterator_facade Core Operations

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ExpressionReturn TypeAssertion/NoteUsed to implement Iterator -Concept(s)
c.dereference()F::reference Readable Iterator, Writable -Iterator
c.equal(y)convertible to booltrue iff c and y -refer to the same -position.Single Pass Iterator
a.increment()unused Incrementable Iterator
a.decrement()unused Bidirectional Traversal -Iterator
a.advance(n)unused Random Access Traversal -Iterator
c.distance_to(z)convertible to -F::difference_typeequivalent to -distance(c, X(z)).Random Access Traversal -Iterator
-
-
-
-

iterator_facade operations

-

The operations in this section are described in terms of operations on -the core interface of Derived which may be inaccessible -(i.e. private). The implementation should access these operations -through member functions of class iterator_core_access.

-

reference operator*() const;

- --- - - - -
Returns:static_cast<Derived const*>(this)->dereference()
-

operator->() const; (see below)

- --- - - - -
Returns:

If reference is a reference type, an object -of type pointer equal to:

-
-&static_cast<Derived const*>(this)->dereference()
-
-

Otherwise returns an object of unspecified type such that, -(*static_cast<Derived const*>(this))->m is equivalent to (w = **static_cast<Derived const*>(this), -w.m) for some temporary object w of type value_type.

-
-

unspecified operator[](difference_type n) const;

- --- - - - -
Returns:an object convertible to value_type. For constant -objects v of type value_type, and n of type -difference_type, (*this)[n] = v is equivalent to -*(*this + n) = v, and static_cast<value_type -const&>((*this)[n]) is equivalent to -static_cast<value_type const&>(*(*this + n))
-

Derived& operator++();

- --- - - - -
Effects:
-static_cast<Derived*>(this)->increment();
-return *static_cast<Derived*>(this);
-
-
-

Derived operator++(int);

- --- - - - -
Effects:
-Derived tmp(static_cast<Derived const*>(this));
-++*this;
-return tmp;
-
-
-

Derived& operator--();

- --- - - - -
Effects:
-static_cast<Derived*>(this)->decrement();
-return *static_cast<Derived*>(this);
-
-
-

Derived operator--(int);

- --- - - - -
Effects:
-Derived tmp(static_cast<Derived const*>(this));
---*this;
-return tmp;
-
-
-

Derived& operator+=(difference_type n);

- --- - - - -
Effects:
-static_cast<Derived*>(this)->advance(n);
-return *static_cast<Derived*>(this);
-
-
-

Derived& operator-=(difference_type n);

- --- - - - -
Effects:
-static_cast<Derived*>(this)->advance(-n);
-return *static_cast<Derived*>(this);
-
-
-

Derived operator-(difference_type n) const;

- --- - - - -
Effects:
-Derived tmp(static_cast<Derived const*>(this));
-return tmp -= n;
-
-
-
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (iterator_facade<Dr,V,TC,R,D> const&,
-                   typename Derived::difference_type n);
-
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (typename Derived::difference_type n,
-                   iterator_facade<Dr,V,TC,R,D> const&);
-
- --- - - - -
Effects:
-Derived tmp(static_cast<Derived const*>(this));
-return tmp += n;
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-
((Dr1 const&)lhs).equal((Dr2 const&)rhs).
-
Otherwise,
-
((Dr2 const&)rhs).equal((Dr1 const&)lhs).
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-
!((Dr1 const&)lhs).equal((Dr2 const&)rhs).
-
Otherwise,
-
!((Dr2 const&)rhs).equal((Dr1 const&)lhs).
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-
((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) < 0.
-
Otherwise,
-
((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) > 0.
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-
((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) <= 0.
-
Otherwise,
-
((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) >= 0.
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-
((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) > 0.
-
Otherwise,
-
((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) < 0.
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-
((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) >= 0.
-
Otherwise,
-
((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) <= 0.
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,difference>::type
-operator -(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - - - -
Return Type:

if is_convertible<Dr2,Dr1>::value

-
-
-
then
-
difference shall be -iterator_traits<Dr1>::difference_type.
-
Otherwise
-
difference shall be iterator_traits<Dr2>::difference_type
-
-
-
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-
-((Dr1 const&)lhs).distance_to((Dr2 const&)rhs).
-
Otherwise,
-
((Dr2 const&)rhs).distance_to((Dr1 const&)lhs).
-
-
-
-
-
-

Iterator adaptor [lib.iterator.adaptor]

- - -

Each specialization of the iterator_adaptor class template is derived from -a specialization of iterator_facade. The core interface functions -expected by iterator_facade are implemented in terms of the -iterator_adaptor's Base template parameter. A class derived -from iterator_adaptor typically redefines some of the core -interface functions to adapt the behavior of the Base type. -Whether the derived class models any of the standard iterator concepts -depends on the operations supported by the Base type and which -core interface functions of iterator_facade are redefined in the -Derived class.

-
-

Class template iterator_adaptor

- - -
-template <
-    class Derived
-  , class Base
-  , class Value               = use_default
-  , class CategoryOrTraversal = use_default
-  , class Reference           = use_default
-  , class Difference = use_default
->
-class iterator_adaptor 
-  : public iterator_facade<Derived, V', C', R', D'> // see details
-{
-    friend class iterator_core_access;
- public:
-    iterator_adaptor();
-    explicit iterator_adaptor(Base iter);
-    Base const& base() const;
- protected:
-    typedef iterator_adaptor iterator_adaptor_;
-    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:
-    Base m_iterator; // exposition only
-};
-
-
-
-

iterator_adaptor requirements

-

static_cast<Derived*>(iterator_adaptor*) shall be well-formed. -The Base argument shall be Assignable and Copy Constructible.

-
-
-

iterator_adaptor base class parameters

-

The V', C', R', and D' parameters of the iterator_facade -used as a base class in the summary of iterator_adaptor -above are defined as follows:

-
-V' = if (Value is use_default)
-          return iterator_traits<Base>::value_type
-      else
-          return Value
-
-C' = if (CategoryOrTraversal is use_default)
-          return iterator_traversal<Base>::type
-      else
-          return CategoryOrTraversal
-
-R' = if (Reference is use_default)
-          if (Value is use_default)
-              return iterator_traits<Base>::reference
-          else
-              return Value&
-      else
-          return Reference
-
-D' = if (Difference is use_default)
-          return iterator_traits<Base>::difference_type
-      else
-          return Difference
-
- - - -
-
-

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.
-

explicit iterator_adaptor(Base iter);

- --- - - - -
Returns:An instance of iterator_adaptor with -m_iterator copy constructed from iter.
-

Base const& base() const;

- --- - - - -
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
-
-
-
-

Specialized adaptors [lib.iterator.special.adaptors]

-

The enable_if_convertible<X,Y>::type expression used in -this section is for exposition purposes. The converting constructors -for specialized adaptors should be only be in an overload set provided -that an object of type X is implicitly convertible to an object of -type Y. -The signatures involving enable_if_convertible should behave -as-if enable_if_convertible were defined to be:

-
-template <bool> enable_if_convertible_impl
-{};
-
-template <> enable_if_convertible_impl<true>
-{ struct type; };
-
-template<typename From, typename To>
-struct enable_if_convertible
-  : enable_if_convertible_impl<is_convertible<From,To>::value>
-{};
-
-

If an expression other than the default argument is used to supply -the value of a function parameter whose type is written in terms -of enable_if_convertible, the program is ill-formed, no -diagnostic required.

-

[Note: The enable_if_convertible approach uses SFINAE to -take the constructor out of the overload set when the types are not -implicitly convertible. -]

-
-

Indirect iterator

-

indirect_iterator adapts an iterator by applying an -extra dereference inside of operator*(). For example, this -iterator adaptor makes it possible to view a container of pointers -(e.g. list<foo*>) as if it were a container of the pointed-to type -(e.g. list<foo>). indirect_iterator depends on two -auxiliary traits, pointee and indirect_reference, to -provide support for underlying iterators whose value_type is -not an iterator.

-
-

Class template pointee

- - - -
-template <class Dereferenceable>
-struct pointee
-{
-    typedef /* see below */ type;
-};
-
- --- - - - -
Requires:For an object x of type Dereferenceable, *x -is well-formed. If ++x is ill-formed it shall neither be -ambiguous nor shall it violate access control, and -Dereferenceable::element_type shall be an accessible type. -Otherwise iterator_traits<Dereferenceable>::value_type shall -be well formed. [Note: These requirements need not apply to -explicit or partial specializations of pointee]
-

type is determined according to the following algorithm, where -x is an object of type Dereferenceable:

-
-if ( ++x is ill-formed )
-{
-    return ``Dereferenceable::element_type``
-}
-else if (``*x`` is a mutable reference to
-         std::iterator_traits<Dereferenceable>::value_type)
-{
-    return iterator_traits<Dereferenceable>::value_type
-}
-else
-{
-    return iterator_traits<Dereferenceable>::value_type const
-}
-
-
-
-

Class template indirect_reference

- - - -
-template <class Dereferenceable>
-struct indirect_reference
-{
-    typedef /* see below */ type;
-};
-
- --- - - - -
Requires:For an object x of type Dereferenceable, *x -is well-formed. If ++x is ill-formed it shall neither be -ambiguous nor shall it violate access control, and -pointee<Dereferenceable>::type& shall be well-formed. -Otherwise iterator_traits<Dereferenceable>::reference shall -be well formed. [Note: These requirements need not apply to -explicit or partial specializations of indirect_reference]
-

type is determined according to the following algorithm, where -x is an object of type Dereferenceable:

-
-if ( ++x is ill-formed )
-    return ``pointee<Dereferenceable>::type&``
-else
-    std::iterator_traits<Dereferenceable>::reference
-
-
-
-

Class template indirect_iterator

-
-template <
-    class Iterator
-  , class Value = use_default
-  , class CategoryOrTraversal = use_default
-  , class Reference = use_default
-  , class Difference = use_default
->
-class indirect_iterator
-{
- public:
-    typedef /* see below */ value_type;
-    typedef /* see below */ reference;
-    typedef /* see below */ pointer;
-    typedef /* see below */ difference_type;
-    typedef /* see below */ iterator_category;
-
-    indirect_iterator();
-    indirect_iterator(Iterator x);
-
-    template <
-        class Iterator2, class Value2, class Category2
-      , class Reference2, class Difference2
-    >
-    indirect_iterator(
-        indirect_iterator<
-             Iterator2, Value2, Category2, Reference2, Difference2
-        > const& y
-      , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
-    );
-
-    Iterator const& base() const;
-    reference operator*() const;
-    indirect_iterator& operator++();
-    indirect_iterator& operator--();
-private:
-   Iterator m_iterator; // exposition
-};
-
-

The member types of indirect_iterator are defined according to -the following pseudo-code, where V is -iterator_traits<Iterator>::value_type

-
-if (Value is use_default) then
-    typedef remove_const<pointee<V>::type>::type value_type;
-else
-    typedef remove_const<Value>::type value_type;
-
-if (Reference is use_default) then
-    if (Value is use_default) then
-        typedef indirect_reference<V>::type reference;
-    else
-        typedef Value& reference;
-else
-    typedef Reference reference;
-
-if (Value is use_default) then 
-    typedef pointee<V>::type* pointer;
-else 
-    typedef Value* pointer;
-
-if (Difference is use_default)
-    typedef iterator_traits<Iterator>::difference_type difference_type;
-else
-    typedef Difference difference_type;
-
-if (CategoryOrTraversal is use_default)
-    typedef iterator-category (
-        iterator_traversal<Iterator>::type,``reference``,``value_type``
-    ) iterator_category;
-else
-    typedef iterator-category (
-        CategoryOrTraversal,``reference``,``value_type``
-    ) iterator_category;
-
-
-
-

indirect_iterator requirements

-

The expression *v, where v is an object of -iterator_traits<Iterator>::value_type, shall be valid -expression and convertible to reference. Iterator shall -model the traversal concept indicated by iterator_category. -Value, Reference, and Difference shall be chosen so -that value_type, reference, and difference_type meet -the requirements indicated by iterator_category.

-

[Note: there are further requirements on the -iterator_traits<Iterator>::value_type if the Value -parameter is not use_default, as implied by the algorithm for -deducing the default for the value_type member.]

-
-
-

indirect_iterator models

-

In addition to the concepts indicated by iterator_category -and by iterator_traversal<indirect_iterator>::type, a -specialization of indirect_iterator models the following -concepts, Where v is an object of -iterator_traits<Iterator>::value_type:

-
-
    -
  • Readable Iterator if reference(*v) is convertible to -value_type.
  • -
  • Writable Iterator if reference(*v) = t is a valid -expression (where t is an object of type -indirect_iterator::value_type)
  • -
  • Lvalue Iterator if reference is a reference type.
  • -
-
-

indirect_iterator<X,V1,C1,R1,D1> is interoperable with -indirect_iterator<Y,V2,C2,R2,D2> if and only if X is -interoperable with Y.

-
-
-

indirect_iterator operations

-

In addition to the operations required by the concepts described -above, specializations of indirect_iterator provide the -following operations.

-

indirect_iterator();

- --- - - - - - -
Requires:Iterator must be Default Constructible.
Effects:Constructs an instance of indirect_iterator with -a default-constructed m_iterator.
-

indirect_iterator(Iterator x);

- --- - - - -
Effects:Constructs an instance of indirect_iterator with -m_iterator copy constructed from x.
-
-template <
-    class Iterator2, class Value2, unsigned Access, class Traversal
-  , class Reference2, class Difference2
->
-indirect_iterator(
-    indirect_iterator<
-         Iterator2, Value2, Access, Traversal, Reference2, Difference2
-    > const& y
-  , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
-);
-
- --- - - - - - -
Requires:Iterator2 is implicitly convertible to Iterator.
Effects:Constructs an instance of indirect_iterator whose -m_iterator subobject is constructed from y.base().
-

Iterator const& base() const;

- --- - - - -
Returns:m_iterator
-

reference operator*() const;

- --- - - - -
Returns:**m_iterator
-

indirect_iterator& operator++();

- --- - - - - - -
Effects:++m_iterator
Returns:*this
-

indirect_iterator& operator--();

- --- - - - - - -
Effects:--m_iterator
Returns:*this
-
-
-
-

Reverse iterator

-

The reverse iterator adaptor iterates through the adapted iterator -range in the opposite direction.

-
-

Class template reverse_iterator

-
-template <class Iterator>
-class reverse_iterator
-{
-public:
-  typedef iterator_traits<Iterator>::value_type value_type;
-  typedef iterator_traits<Iterator>::reference reference;
-  typedef iterator_traits<Iterator>::pointer pointer;
-  typedef iterator_traits<Iterator>::difference_type difference_type;
-  typedef /* see below */ iterator_category;
-
-  reverse_iterator() {}
-  explicit reverse_iterator(Iterator x) ;
-
-  template<class OtherIterator>
-  reverse_iterator(
-      reverse_iterator<OtherIterator> const& r
-    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-  );
-  Iterator const& base() const;
-  reference operator*() const;
-  reverse_iterator& operator++();
-  reverse_iterator& operator--();
-private:
-  Iterator m_iterator; // exposition
-};
-
-

If Iterator models Random Access Traversal Iterator and Readable -Lvalue Iterator, then iterator_category is convertible to -random_access_iterator_tag. Otherwise, if -Iterator models Bidirectional Traversal Iterator and Readable -Lvalue Iterator, then iterator_category is convertible to -bidirectional_iterator_tag. Otherwise, iterator_category is -convertible to input_iterator_tag.

-
-
-

reverse_iterator requirements

-

Iterator must be a model of Bidirectional Traversal Iterator. The -type iterator_traits<Iterator>::reference must be the type of -*i, where i is an object of type Iterator.

-
-
-

reverse_iterator models

-

A specialization of reverse_iterator models the same iterator -traversal and iterator access concepts modeled by its Iterator -argument. In addition, it may model old iterator concepts -specified in the following table:

- ---- - - - - - - - - - - - - - - - - - - - -
If I modelsthen reverse_iterator<I> models
Readable Lvalue Iterator, -Bidirectional Traversal IteratorBidirectional Iterator
Writable Lvalue Iterator, -Bidirectional Traversal IteratorMutable Bidirectional Iterator
Readable Lvalue Iterator, -Random Access Traversal IteratorRandom Access Iterator
Writable Lvalue Iterator, -Random Access Traversal IteratorMutable Random Access Iterator
-

reverse_iterator<X> is interoperable with -reverse_iterator<Y> if and only if X is interoperable with -Y.

-
-
-

reverse_iterator operations

-

In addition to the operations required by the concepts modeled by -reverse_iterator, reverse_iterator provides the following -operations.

-

reverse_iterator();

- --- - - - - - -
Requires:Iterator must be Default Constructible.
Effects:Constructs an instance of reverse_iterator with m_iterator -default constructed.
-

explicit reverse_iterator(Iterator x);

- --- - - - -
Effects:Constructs an instance of reverse_iterator with -m_iterator copy constructed from x.
-
-template<class OtherIterator>
-reverse_iterator(
-    reverse_iterator<OtherIterator> const& r
-  , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-);
-
- --- - - - - - -
Requires:OtherIterator is implicitly convertible to Iterator.
Effects:Constructs instance of reverse_iterator whose -m_iterator subobject is constructed from y.base().
-

Iterator const& base() const;

- --- - - - -
Returns:m_iterator
-

reference operator*() const;

- --- - - - -
Effects:
-
-Iterator tmp = m_iterator;
-return *--tmp;
-
-

reverse_iterator& operator++();

- --- - - - - - -
Effects:--m_iterator
Returns:*this
-

reverse_iterator& operator--();

- --- - - - - - -
Effects:++m_iterator
Returns:*this
-
-
-
-

Transform iterator

-

The transform iterator adapts an iterator by modifying the -operator* to apply a function object to the result of -dereferencing the iterator and returning the result.

-
-

Class template transform_iterator

- -
-template <class UnaryFunction,
-          class Iterator, 
-          class Reference = use_default, 
-          class Value = use_default>
-class transform_iterator
-{
-public:
-  typedef /* see below */ value_type;
-  typedef /* see below */ reference;
-  typedef /* see below */ pointer;
-  typedef iterator_traits<Iterator>::difference_type difference_type;
-  typedef /* see below */ iterator_category;
-
-  transform_iterator();
-  transform_iterator(Iterator const& x, UnaryFunction f);
-
-  template<class F2, class I2, class R2, class V2>
-  transform_iterator(
-        transform_iterator<F2, I2, R2, V2> const& t
-      , typename enable_if_convertible<I2, Iterator>::type* = 0      // exposition only
-      , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
-  );
-  UnaryFunction functor() const;
-  Iterator const& base() const;
-  reference operator*() const;
-  transform_iterator& operator++();
-  transform_iterator& operator--();
-private:
-  Iterator m_iterator; // exposition only
-  UnaryFunction m_f;   // exposition only
-};
-
-

If Reference is use_default then the reference member of -transform_iterator is -result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type. -Otherwise, reference is Reference.

-

If Value is use_default then the value_type member is -remove_cv<remove_reference<reference> >::type. Otherwise, -value_type is Value.

-

If Iterator models Readable Lvalue Iterator and if Iterator -models Random Access Traversal Iterator, then iterator_category is -convertible to random_access_iterator_tag. Otherwise, if -Iterator models Bidirectional Traversal Iterator, then -iterator_category is convertible to -bidirectional_iterator_tag. Otherwise iterator_category is -convertible to forward_iterator_tag. If Iterator does not -model Readable Lvalue Iterator then iterator_category is -convertible to input_iterator_tag.

-
-
-

transform_iterator requirements

-

The type UnaryFunction must be Assignable, Copy Constructible, and -the expression f(*i) must be valid where f is an object of -type UnaryFunction, i is an object of type Iterator, and -where the type of f(*i) must be -result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type.

-

The argument Iterator shall model Readable Iterator.

-
-
-

transform_iterator models

-

The resulting transform_iterator models the most refined of the -following that is also modeled by Iterator.

-
-
    -
  • Writable Lvalue Iterator if transform_iterator::reference is a non-const reference.
  • -
  • Readable Lvalue Iterator if transform_iterator::reference is a const reference.
  • -
  • Readable Iterator otherwise.
  • -
-
-

The transform_iterator models the most refined standard traversal -concept that is modeled by the Iterator argument.

-

If transform_iterator is a model of Readable Lvalue Iterator then -it models the following original iterator concepts depending on what -the Iterator argument models.

- ---- - - - - - - - - - - - - - - - - - - - -
If Iterator modelsthen transform_iterator models
Single Pass IteratorInput Iterator
Forward Traversal IteratorForward Iterator
Bidirectional Traversal IteratorBidirectional Iterator
Random Access Traversal IteratorRandom Access Iterator
-

If transform_iterator models Writable Lvalue Iterator then it is a -mutable iterator (as defined in the old iterator requirements).

-

transform_iterator<F1, X, R1, V1> is interoperable with -transform_iterator<F2, Y, R2, V2> if and only if X is -interoperable with Y.

-
-
-

transform_iterator operations

-

In addition to the operations required by the concepts modeled by -transform_iterator, transform_iterator provides the following -operations.

-

transform_iterator();

- --- - - - -
Returns:An instance of transform_iterator with m_f -and m_iterator default constructed.
-

transform_iterator(Iterator const& x, UnaryFunction f);

- --- - - - -
Returns:An instance of transform_iterator with m_f -initialized to f and m_iterator initialized to x.
-
-template<class F2, class I2, class R2, class V2>
-transform_iterator(
-      transform_iterator<F2, I2, R2, V2> const& t
-    , typename enable_if_convertible<I2, Iterator>::type* = 0      // exposition only
-    , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
-);
-
- --- - - - - - -
Returns:An instance of transform_iterator with m_f -initialized to t.functor() and m_iterator initialized to -t.base().
Requires:OtherIterator is implicitly convertible to Iterator.
-

UnaryFunction functor() const;

- --- - - - -
Returns:m_f
-

Iterator const& base() const;

- --- - - - -
Returns:m_iterator
-

reference operator*() const;

- --- - - - -
Returns:m_f(*m_iterator)
-

transform_iterator& operator++();

- --- - - - - - -
Effects:++m_iterator
Returns:*this
-

transform_iterator& operator--();

- --- - - - - - -
Effects:--m_iterator
Returns:*this
-
-
-
-

Filter iterator

-

The filter iterator adaptor creates a view of an iterator range in -which some elements of the range are skipped. A predicate function -object controls which elements are skipped. When the predicate is -applied to an element, if it returns true then the element is -retained and if it returns false then the element is skipped -over. When skipping over elements, it is necessary for the filter -adaptor to know when to stop so as to avoid going past the end of the -underlying range. A filter iterator is therefore constructed with pair -of iterators indicating the range of elements in the unfiltered -sequence to be traversed.

-
-

Class template filter_iterator

- - - - -
-template <class Predicate, class Iterator>
-class filter_iterator
-{
- public:
-    typedef iterator_traits<Iterator>::value_type value_type;
-    typedef iterator_traits<Iterator>::reference reference;
-    typedef iterator_traits<Iterator>::pointer pointer;
-    typedef iterator_traits<Iterator>::difference_type difference_type;
-    typedef /* see below */ iterator_category;
-
-    filter_iterator();
-    filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
-    filter_iterator(Iterator x, Iterator end = Iterator());
-    template<class OtherIterator>
-    filter_iterator(
-        filter_iterator<Predicate, OtherIterator> const& t
-        , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-        );
-    Predicate predicate() const;
-    Iterator end() const;
-    Iterator const& base() const;
-    reference operator*() const;
-    filter_iterator& operator++();
-private:
-    Predicate m_pred; // exposition only
-    Iterator m_iter;  // exposition only
-    Iterator m_end;   // exposition only
-};
-
-

If Iterator models Readable Lvalue Iterator and Forward Traversal -Iterator then iterator_category is convertible to -std::forward_iterator_tag. Otherwise iterator_category is -convertible to std::input_iterator_tag.

-
-
-

filter_iterator requirements

-

The Iterator argument shall meet the requirements of Readable -Iterator and Single Pass Iterator or it shall meet the requirements of -Input Iterator.

-

The Predicate argument must be Assignable, Copy Constructible, and -the expression p(x) must be valid where p is an object of type -Predicate, x is an object of type -iterator_traits<Iterator>::value_type, and where the type of -p(x) must be convertible to bool.

-
-
-

filter_iterator models

-

The concepts that filter_iterator models are dependent on which -concepts the Iterator argument models, as specified in the -following tables.

- ---- - - - - - - - - - - - - - -
If Iterator modelsthen filter_iterator models
Single Pass IteratorSingle Pass Iterator
Forward Traversal IteratorForward Traversal Iterator
- ---- - - - - - - - - - - - - - - - - -
If Iterator modelsthen filter_iterator models
Readable IteratorReadable Iterator
Writable IteratorWritable Iterator
Lvalue IteratorLvalue Iterator
- ---- - - - - - - - - - - - - - - - - -
If Iterator modelsthen filter_iterator models
Readable Iterator, Single Pass IteratorInput Iterator
Readable Lvalue Iterator, Forward Traversal IteratorForward Iterator
Writable Lvalue Iterator, Forward Traversal IteratorMutable Forward Iterator
-

filter_iterator<P1, X> is interoperable with filter_iterator<P2, Y> -if and only if X is interoperable with Y.

-
-
-

filter_iterator operations

-

In addition to those operations required by the concepts that -filter_iterator models, filter_iterator provides the following -operations.

-

filter_iterator();

- --- - - - - - -
Requires:Predicate and Iterator must be Default Constructible.
Effects:Constructs a filter_iterator whose``m_pred``, m_iter, and m_end -members are a default constructed.
-

filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());

- --- - - - -
Effects:Constructs a filter_iterator where m_iter is either -the first position in the range [x,end) such that f(*m_iter) == true -or else``m_iter == end``. The member m_pred is constructed from -f and m_end from end.
-

filter_iterator(Iterator x, Iterator end = Iterator());

- --- - - - - - -
Requires:Predicate must be Default Constructible and -Predicate is a class type (not a function pointer).
Effects:Constructs a filter_iterator where m_iter is either -the first position in the range [x,end) such that m_pred(*m_iter) == true -or else``m_iter == end``. The member m_pred is default constructed.
-
-template <class OtherIterator>
-filter_iterator(
-    filter_iterator<Predicate, OtherIterator> const& t
-    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-    );``
-
- --- - - - - - -
Requires:OtherIterator is implicitly convertible to Iterator.
Effects:Constructs a filter iterator whose members are copied from t.
-

Predicate predicate() const;

- --- - - - -
Returns:m_pred
-

Iterator end() const;

- --- - - - -
Returns:m_end
-

Iterator const& base() const;

- --- - - - -
Returns:m_iterator
-

reference operator*() const;

- --- - - - -
Returns:*m_iter
-

filter_iterator& operator++();

- --- - - - - - -
Effects:Increments m_iter and then continues to -increment m_iter until either m_iter == m_end -or m_pred(*m_iter) == true.
Returns:*this
-
-
-
-

Counting iterator

-

counting_iterator adapts an object by adding an operator* that -returns the current value of the object. All other iterator operations -are forwarded to the adapted object.

-
-

Class template counting_iterator

-
-template <
-    class Incrementable
-  , class CategoryOrTraversal = use_default
-  , class Difference = use_default
->
-class counting_iterator
-{
-public:
-    typedef Incrementable value_type;
-    typedef const Incrementable& reference;
-    typedef const Incrementable* pointer;
-    typedef /* see below */ difference_type;
-    typedef /* see below */ iterator_category;
-
-    counting_iterator();
-    counting_iterator(counting_iterator const& rhs);
-    explicit counting_iterator(Incrementable x);
-    Incrementable const& base() const;
-    reference operator*() const;
-    counting_iterator& operator++();
-    counting_iterator& operator--();
-private:
-    Incrementable m_inc; // exposition
-};
-
-

If the Difference argument is use_default then -difference_type is an unspecified signed integral -type. Otherwise difference_type is Difference.

-

iterator_category is determined according to the following -algorithm:

-
-if (CategoryOrTraversal is not use_default)
-    return CategoryOrTraversal
-else if (numeric_limits<Incrementable>::is_specialized)
-    return iterator-category(
-        random_access_traversal_tag, Incrementable, const Incrementable&)
-else
-    return iterator-category(
-         iterator_traversal<Incrementable>::type, 
-         Incrementable, const Incrementable&)
-
-
-
[Note: implementers are encouraged to provide an implementation of
-
operator- and a difference_type that avoids overflows in -the cases where std::numeric_limits<Incrementable>::is_specialized -is true.]
-
-
-
-

counting_iterator requirements

-

The Incrementable argument shall be Copy Constructible and Assignable.

-

If iterator_category is convertible to forward_iterator_tag -or forward_traversal_tag, the following must be well-formed:

-
-Incrementable i, j;
-++i;         // pre-increment
-i == j;      // operator equal
-
-

If iterator_category is convertible to -bidirectional_iterator_tag or bidirectional_traversal_tag, -the following expression must also be well-formed:

-
---i
-
-

If iterator_category is convertible to -random_access_iterator_tag or random_access_traversal_tag, -the following must must also be valid:

-
-counting_iterator::difference_type n;
-i += n;
-n = i - j;
-i < j;
-
-
-
-

counting_iterator models

-

Specializations of counting_iterator model Readable Lvalue -Iterator. In addition, they model the concepts corresponding to the -iterator tags to which their iterator_category is convertible. -Also, if CategoryOrTraversal is not use_default then -counting_iterator models the concept corresponding to the iterator -tag CategoryOrTraversal. Otherwise, if -numeric_limits<Incrementable>::is_specialized, then -counting_iterator models Random Access Traversal Iterator. -Otherwise, counting_iterator models the same iterator traversal -concepts modeled by Incrementable.

-

counting_iterator<X,C1,D1> is interoperable with -counting_iterator<Y,C2,D2> if and only if X is -interoperable with Y.

-
-
-

counting_iterator operations

-

In addition to the operations required by the concepts modeled by -counting_iterator, counting_iterator provides the following -operations.

-

counting_iterator();

- --- - - - - - -
Requires:Incrementable is Default Constructible.
Effects:Default construct the member m_inc.
-

counting_iterator(counting_iterator const& rhs);

- --- - - - -
Effects:Construct member m_inc from rhs.m_inc.
-

explicit counting_iterator(Incrementable x);

- --- - - - -
Effects:Construct member m_inc from x.
-

reference operator*() const;

- --- - - - -
Returns:m_inc
-

counting_iterator& operator++();

- --- - - - - - -
Effects:++m_inc
Returns:*this
-

counting_iterator& operator--();

- --- - - - - - -
Effects:--m_inc
Returns:*this
-

Incrementable const& base() const;

- --- - - - -
Returns:m_inc
-
-
-
-

Function output iterator

-

The function output iterator adaptor makes it easier to create custom -output iterators. The adaptor takes a unary function and creates a -model of Output Iterator. Each item assigned to the output iterator is -passed as an argument to the unary function. The motivation for this -iterator is that creating a conforming output iterator is non-trivial, -particularly because the proper implementation usually requires a -proxy object.

-
-

Class template function_output_iterator

-
-template <class UnaryFunction>
-class function_output_iterator {
-public:
-  typedef std::output_iterator_tag iterator_category;
-  typedef void                     value_type;
-  typedef void                     difference_type;
-  typedef void                     pointer;
-  typedef void                     reference;
-
-  explicit function_output_iterator();
-
-  explicit function_output_iterator(const UnaryFunction& f);
-
-  /* see below */ operator*();
-  function_output_iterator& operator++();
-  function_output_iterator& operator++(int);
-private:
-  UnaryFunction m_f;     // exposition only
-};
-
-
-
-

function_output_iterator requirements

-

UnaryFunction must be Assignable and Copy Constructible.

-
-
-

function_output_iterator models

-

function_output_iterator is a model of the Writable and -Incrementable Iterator concepts.

-
-
-

function_output_iterator operations

-

explicit function_output_iterator(const UnaryFunction& f = UnaryFunction());

- --- - - - -
Effects:Constructs an instance of function_output_iterator -with m_f constructed from f.
-

operator*();

- --- - - - -
Returns:An object r of unspecified type such that r = t -is equivalent to m_f(t) for all t.
-

function_output_iterator& operator++();

- --- - - - -
Returns:*this
-

function_output_iterator& operator++(int);

- --- - - - -
Returns:*this
- -
-
-
-
-
- - - - diff --git a/doc/facade-and-adaptor.pdf b/doc/facade-and-adaptor.pdf deleted file mode 100755 index 7b052e1..0000000 Binary files a/doc/facade-and-adaptor.pdf and /dev/null differ diff --git a/doc/facade-and-adaptor.rst b/doc/facade-and-adaptor.rst deleted file mode 100644 index 754e08e..0000000 --- a/doc/facade-and-adaptor.rst +++ /dev/null @@ -1,434 +0,0 @@ -+++++++++++++++++++++++++++++ - Iterator Facade and Adaptor -+++++++++++++++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, `Zephyr Associates, Inc.`_ -:date: $Date$ - -:Number: This is a revised version of N1530_\ =03-0113, which was - accepted for Technical Report 1 by the C++ standard - committee's library working group. - -.. Version 1.9 of this ReStructuredText document corresponds to - n1530_, the paper accepted by the LWG. - -.. _n1530: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1530.html - -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Zephyr Associates, Inc.`: http://www.styleadvisor.com - -:abstract: We propose a set of class templates that help programmers - build standard-conforming iterators, both from scratch and - by adapting other iterators. - -.. contents:: Table of Contents - -============ - Motivation -============ - -Iterators play an important role in modern C++ programming. The -iterator is the central abstraction of the algorithms of the Standard -Library, allowing algorithms to be re-used in in a wide variety of -contexts. The C++ Standard Library contains a wide variety of useful -iterators. Every one of the standard containers comes with constant -and mutable iterators [#mutable]_, and also reverse versions of those -same iterators which traverse the container in the opposite direction. -The Standard also supplies ``istream_iterator`` and -``ostream_iterator`` for reading from and writing to streams, -``insert_iterator``, ``front_insert_iterator`` and -``back_insert_iterator`` for inserting elements into containers, and -``raw_storage_iterator`` for initializing raw memory [7]. - -Despite the many iterators supplied by the Standard Library, obvious -and useful iterators are missing, and creating new iterator types is -still a common task for C++ programmers. The literature documents -several of these, for example line_iterator [3] and Constant_iterator -[9]. The iterator abstraction is so powerful that we expect -programmers will always need to invent new iterator types. - -Although it is easy to create iterators that *almost* conform to the -standard, the iterator requirements contain subtleties which can make -creating an iterator which *actually* conforms quite difficult. -Further, the iterator interface is rich, containing many operators -that are technically redundant and tedious to implement. To automate -the repetitive work of constructing iterators, we propose -``iterator_facade``, an iterator base class template which provides -the rich interface of standard iterators and delegates its -implementation to member functions of the derived class. In addition -to reducing the amount of code necessary to create an iterator, the -``iterator_facade`` also provides compile-time error detection. -Iterator implementation mistakes that often go unnoticed are turned -into compile-time errors because the derived class implementation must -match the expectations of the ``iterator_facade``. - -A common pattern of iterator construction is the adaptation of one -iterator to form a new one. The functionality of an iterator is -composed of four orthogonal aspects: traversal, indirection, equality -comparison and distance measurement. Adapting an old iterator to -create a new one often saves work because one can reuse one aspect of -functionality while redefining the other. For example, the Standard -provides ``reverse_iterator``, which adapts any Bidirectional Iterator -by inverting its direction of traversal. As with plain iterators, -iterator adaptors defined outside the Standard have become commonplace -in the literature: - -* Checked iter[13] adds bounds-checking to an existing iterator. - -* The iterators of the View Template Library[14], which adapts - containers, are themselves adaptors over the underlying iterators. - -* Smart iterators [5] adapt an iterator's dereferencing behavior by - applying a function object to the object being referenced and - returning the result. - -* Custom iterators [4], in which a variety of adaptor types are enumerated. - -* Compound iterators [1], which access a slice out of a container of containers. - -* Several iterator adaptors from the MTL [12]. The MTL contains a - strided iterator, where each call to ``operator++()`` moves the - iterator ahead by some constant factor, and a scaled iterator, which - multiplies the dereferenced value by some constant. - -.. [#concept] We use the term concept to mean a set of requirements - that a type must satisfy to be used with a particular template - parameter. - -.. [#mutable] The term mutable iterator refers to iterators over objects that - can be changed by assigning to the dereferenced iterator, while - constant iterator refers to iterators over objects that cannot be - modified. - -To fulfill the need for constructing adaptors, we propose the -``iterator_adaptor`` class template. Instantiations of -``iterator_adaptor`` serve as a base classes for new iterators, -providing the default behavior of forwarding all operations to the -underlying iterator. The user can selectively replace these features -in the derived iterator class. This proposal also includes a number -of more specialized adaptors, such as the ``transform_iterator`` that -applies some user-specified function during the dereference of the -iterator. - -======================== - Impact on the Standard -======================== - -This proposal is purely an addition to the C++ standard library. -However, note that this proposal relies on the proposal for New -Iterator Concepts. - -======== - Design -======== - -Iterator Concepts -================= - -This proposal is formulated in terms of the new ``iterator concepts`` -as proposed in n1550_, since user-defined and especially adapted -iterators suffer from the well known categorization problems that are -inherent to the current iterator categories. - -.. _n1550: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1550.html - -This proposal does not strictly depend on proposal n1550_, as there -is a direct mapping between new and old categories. This proposal -could be reformulated using this mapping if n1550_ was not accepted. - -Interoperability -================ - -The question of iterator interoperability is poorly addressed in the -current standard. There are currently two defect reports that are -concerned with interoperability issues. - -Issue 179_ concerns the fact that mutable container iterator types -are only required to be convertible to the corresponding constant -iterator types, but objects of these types are not required to -interoperate in comparison or subtraction expressions. This situation -is tedious in practice and out of line with the way built in types -work. This proposal implements the proposed resolution to issue -179_, as most standard library implementations do nowadays. In other -words, if an iterator type A has an implicit or user defined -conversion to an iterator type B, the iterator types are interoperable -and the usual set of operators are available. - -Issue 280_ concerns the current lack of interoperability between -reverse iterator types. The proposed new reverse_iterator template -fixes the issues raised in 280. It provides the desired -interoperability without introducing unwanted overloads. - -.. _179: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#179 -.. _280: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#280 - - -Iterator Facade -=============== - -.. include:: iterator_facade_body.rst - -Iterator Adaptor -================ - -.. include:: iterator_adaptor_body.rst - -Specialized Adaptors -==================== - -This proposal also contains several examples of specialized adaptors -which were easily implemented using ``iterator_adaptor``: - -* ``indirect_iterator``, which iterates over iterators, pointers, - or smart pointers and applies an extra level of dereferencing. - -* A new ``reverse_iterator``, which inverts the direction of a Base - iterator's motion, while allowing adapted constant and mutable - iterators to interact in the expected ways (unlike those in most - implementations of C++98). - -* ``transform_iterator``, which applies a user-defined function object - to the underlying values when dereferenced. - -* ``filter_iterator``, which provides a view of an iterator range in - which some elements of the underlying range are skipped. - -.. _counting: - -* ``counting_iterator``, which adapts any incrementable type - (e.g. integers, iterators) so that incrementing/decrementing the - adapted iterator and dereferencing it produces successive values of - the Base type. - -* ``function_output_iterator``, which makes it easier to create custom - output iterators. - -Based on examples in the Boost library, users have generated many new -adaptors, among them a permutation adaptor which applies some -permutation to a random access iterator, and a strided adaptor, which -adapts a random access iterator by multiplying its unit of motion by a -constant factor. In addition, the Boost Graph Library (BGL) uses -iterator adaptors to adapt other graph libraries, such as LEDA [10] -and Stanford GraphBase [8], to the BGL interface (which requires C++ -Standard compliant iterators). - -=============== - Proposed Text -=============== - - -Header ```` synopsis [lib.iterator.helper.synopsis] -======================================================================= - - -:: - - struct use_default; - - struct iterator_core_access { /* implementation detail */ }; - - template < - class Derived - , class Value - , class CategoryOrTraversal - , class Reference = Value& - , class Difference = ptrdiff_t - > - class iterator_facade; - - template < - class Derived - , class Base - , class Value = use_default - , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class iterator_adaptor; - - template < - class Iterator - , class Value = use_default - , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class indirect_iterator; - - template - struct pointee; - - template - struct indirect_reference; - - template - class reverse_iterator; - - template < - class UnaryFunction - , class Iterator - , class Reference = use_default - , class Value = use_default - > - class transform_iterator; - - template - class filter_iterator; - - template < - class Incrementable - , class CategoryOrTraversal = use_default - , class Difference = use_default - > - class counting_iterator; - - template - class function_output_iterator; - - - -Iterator facade [lib.iterator.facade] -===================================== - -.. include:: iterator_facade_abstract.rst - -Class template ``iterator_facade`` ----------------------------------- - -.. include:: iterator_facade_ref.rst - -Iterator adaptor [lib.iterator.adaptor] -======================================= - -.. include:: iterator_adaptor_abstract.rst - -Class template ``iterator_adaptor`` ------------------------------------ - -.. include:: iterator_adaptor_ref.rst - - -Specialized adaptors [lib.iterator.special.adaptors] -==================================================== - - -The ``enable_if_convertible::type`` expression used in -this section is for exposition purposes. The converting constructors -for specialized adaptors should be only be in an overload set provided -that an object of type ``X`` is implicitly convertible to an object of -type ``Y``. -The signatures involving ``enable_if_convertible`` should behave -*as-if* ``enable_if_convertible`` were defined to be:: - - template enable_if_convertible_impl - {}; - - template <> enable_if_convertible_impl - { struct type; }; - - template - struct enable_if_convertible - : enable_if_convertible_impl::value> - {}; - -If an expression other than the default argument is used to supply -the value of a function parameter whose type is written in terms -of ``enable_if_convertible``, the program is ill-formed, no -diagnostic required. - -[*Note:* The ``enable_if_convertible`` approach uses SFINAE to -take the constructor out of the overload set when the types are not -implicitly convertible. -] - - -Indirect iterator ------------------ - -.. include:: indirect_iterator_abstract.rst - -Class template ``pointee`` -.................................... - -.. include:: pointee_ref.rst - -Class template ``indirect_reference`` -..................................... - -.. include:: indirect_reference_ref.rst - -Class template ``indirect_iterator`` -.................................... - -.. include:: indirect_iterator_ref.rst - -Reverse iterator ----------------- - -.. include:: reverse_iterator_abstract.rst - -Class template ``reverse_iterator`` -................................... - -.. include:: reverse_iterator_ref.rst - - -Transform iterator ------------------- - -.. include:: transform_iterator_abstract.rst - -Class template ``transform_iterator`` -..................................... - -.. include:: transform_iterator_ref.rst - - -Filter iterator ---------------- - -.. include:: filter_iterator_abstract.rst - - -Class template ``filter_iterator`` -.................................. - -.. include:: filter_iterator_ref.rst - - -Counting iterator ------------------ - -.. include:: counting_iterator_abstract.rst - -Class template ``counting_iterator`` -.................................... - -.. include:: counting_iterator_ref.rst - - -Function output iterator ------------------------- - -.. include:: function_output_iterator_abstract.rst - -Class template ``function_output_iterator`` -........................................... - -.. include:: function_output_iterator_ref.rst - - - - -.. LocalWords: Abrahams Siek Witt istream ostream iter MTL strided interoperate - LocalWords: CRTP metafunctions inlining lvalue JGS incrementable BGL LEDA cv - LocalWords: GraphBase struct ptrdiff UnaryFunction const int typename bool pp - LocalWords: lhs rhs SFINAE markup iff tmp OtherDerived OtherIterator DWA foo - LocalWords: dereferenceable subobject AdaptableUnaryFunction impl pre ifdef'd - LocalWords: OtherIncrementable Coplien diff --git a/doc/facade_iterator_category.rst b/doc/facade_iterator_category.rst deleted file mode 100755 index 6b60d85..0000000 --- a/doc/facade_iterator_category.rst +++ /dev/null @@ -1,53 +0,0 @@ -.. |iterator-category| replace:: *iterator-category* -.. _iterator-category: - -.. parsed-literal:: - - *iterator-category*\ (C,R,V) := - if (C is convertible to std::input_iterator_tag - || C is convertible to std::output_iterator_tag - ) - return C - - else if (C is not convertible to incrementable_traversal_tag) - *the program is ill-formed* - - else return a type X satisfying the following two constraints: - - 1. X is convertible to X1, and not to any more-derived - type, where X1 is defined by: - - if (R is a reference type - && C is convertible to forward_traversal_tag) - { - if (C is convertible to random_access_traversal_tag) - X1 = random_access_iterator_tag - else if (C is convertible to bidirectional_traversal_tag) - X1 = bidirectional_iterator_tag - else - X1 = forward_iterator_tag - } - else - { - if (C is convertible to single_pass_traversal_tag - && R is convertible to V) - X1 = input_iterator_tag - else - X1 = C - } - - 2. |category-to-traversal|_\ (X) is convertible to the most - derived traversal tag type to which X is also - convertible, and not to any more-derived traversal tag - type. - -.. |category-to-traversal| replace:: *category-to-traversal* -.. _`category-to-traversal`: new-iter-concepts.html#category-to-traversal - -[Note: the intention is to allow ``iterator_category`` to be one of -the five original category tags when convertibility to one of the -traversal tags would add no information] - -.. Copyright David Abrahams 2004. 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) diff --git a/doc/filter_iterator.html b/doc/filter_iterator.html deleted file mode 100644 index d1d90a7..0000000 --- a/doc/filter_iterator.html +++ /dev/null @@ -1,390 +0,0 @@ - - - - - - -Filter Iterator - - - - - - - -
-

Filter Iterator

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization:Boost Consulting, Indiana University Open Systems -Lab, University of Hanover Institute for Transport -Railway Operation and Construction
Date:2004-01-13
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved
- --- - - - -
abstract:The filter iterator adaptor creates a view of an iterator range in -which some elements of the range are skipped. A predicate function -object controls which elements are skipped. When the predicate is -applied to an element, if it returns true then the element is -retained and if it returns false then the element is skipped -over. When skipping over elements, it is necessary for the filter -adaptor to know when to stop so as to avoid going past the end of the -underlying range. A filter iterator is therefore constructed with pair -of iterators indicating the range of elements in the unfiltered -sequence to be traversed.
- -
-

filter_iterator synopsis

- - - - -
-template <class Predicate, class Iterator>
-class filter_iterator
-{
- public:
-    typedef iterator_traits<Iterator>::value_type value_type;
-    typedef iterator_traits<Iterator>::reference reference;
-    typedef iterator_traits<Iterator>::pointer pointer;
-    typedef iterator_traits<Iterator>::difference_type difference_type;
-    typedef /* see below */ iterator_category;
-
-    filter_iterator();
-    filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
-    filter_iterator(Iterator x, Iterator end = Iterator());
-    template<class OtherIterator>
-    filter_iterator(
-        filter_iterator<Predicate, OtherIterator> const& t
-        , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-        );
-    Predicate predicate() const;
-    Iterator end() const;
-    Iterator const& base() const;
-    reference operator*() const;
-    filter_iterator& operator++();
-private:
-    Predicate m_pred; // exposition only
-    Iterator m_iter;  // exposition only
-    Iterator m_end;   // exposition only
-};
-
-

If Iterator models Readable Lvalue Iterator and Forward Traversal -Iterator then iterator_category is convertible to -std::forward_iterator_tag. Otherwise iterator_category is -convertible to std::input_iterator_tag.

-
-
-

filter_iterator requirements

-

The Iterator argument shall meet the requirements of Readable -Iterator and Single Pass Iterator or it shall meet the requirements of -Input Iterator.

-

The Predicate argument must be Assignable, Copy Constructible, and -the expression p(x) must be valid where p is an object of type -Predicate, x is an object of type -iterator_traits<Iterator>::value_type, and where the type of -p(x) must be convertible to bool.

-
-
-

filter_iterator models

-

The concepts that filter_iterator models are dependent on which -concepts the Iterator argument models, as specified in the -following tables.

- ---- - - - - - - - - - - - - - -
If Iterator modelsthen filter_iterator models
Single Pass IteratorSingle Pass Iterator
Forward Traversal IteratorForward Traversal Iterator
- ---- - - - - - - - - - - - - - - - - -
If Iterator modelsthen filter_iterator models
Readable IteratorReadable Iterator
Writable IteratorWritable Iterator
Lvalue IteratorLvalue Iterator
- ---- - - - - - - - - - - - - - - - - -
If Iterator modelsthen filter_iterator models
Readable Iterator, Single Pass IteratorInput Iterator
Readable Lvalue Iterator, Forward Traversal IteratorForward Iterator
Writable Lvalue Iterator, Forward Traversal IteratorMutable Forward Iterator
-

filter_iterator<P1, X> is interoperable with filter_iterator<P2, Y> -if and only if X is interoperable with Y.

-
-
-

filter_iterator operations

-

In addition to those operations required by the concepts that -filter_iterator models, filter_iterator provides the following -operations.

-

filter_iterator();

- --- - - - - - -
Requires:Predicate and Iterator must be Default Constructible.
Effects:Constructs a filter_iterator whose``m_pred``, m_iter, and m_end -members are a default constructed.
-

filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());

- --- - - - -
Effects:Constructs a filter_iterator where m_iter is either -the first position in the range [x,end) such that f(*m_iter) == true -or else``m_iter == end``. The member m_pred is constructed from -f and m_end from end.
-

filter_iterator(Iterator x, Iterator end = Iterator());

- --- - - - - - -
Requires:Predicate must be Default Constructible and -Predicate is a class type (not a function pointer).
Effects:Constructs a filter_iterator where m_iter is either -the first position in the range [x,end) such that m_pred(*m_iter) == true -or else``m_iter == end``. The member m_pred is default constructed.
-
-template <class OtherIterator>
-filter_iterator(
-    filter_iterator<Predicate, OtherIterator> const& t
-    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-    );``
-
- --- - - - - - -
Requires:OtherIterator is implicitly convertible to Iterator.
Effects:Constructs a filter iterator whose members are copied from t.
-

Predicate predicate() const;

- --- - - - -
Returns:m_pred
-

Iterator end() const;

- --- - - - -
Returns:m_end
-

Iterator const& base() const;

- --- - - - -
Returns:m_iterator
-

reference operator*() const;

- --- - - - -
Returns:*m_iter
-

filter_iterator& operator++();

- --- - - - - - -
Effects:Increments m_iter and then continues to -increment m_iter until either m_iter == m_end -or m_pred(*m_iter) == true.
Returns:*this
-
-template <class Predicate, class Iterator>
-filter_iterator<Predicate,Iterator>
-make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
-
- --- - - - -
Returns:filter_iterator<Predicate,Iterator>(f, x, end)
-
-template <class Predicate, class Iterator>
-filter_iterator<Predicate,Iterator>
-make_filter_iterator(Iterator x, Iterator end = Iterator());
-
- --- - - - -
Returns:filter_iterator<Predicate,Iterator>(x, end)
-
-
-

Example

-

This example uses filter_iterator and then -make_filter_iterator to output only the positive integers from an -array of integers. Then make_filter_iterator is is used to output -the integers greater than -2.

-
-struct is_positive_number {
-  bool operator()(int x) { return 0 < x; }
-};
-
-int main()
-{
-  int numbers_[] = { 0, -1, 4, -3, 5, 8, -2 };
-  const int N = sizeof(numbers_)/sizeof(int);
-
-  typedef int* base_iterator;
-  base_iterator numbers(numbers_);
-
-  // Example using filter_iterator
-  typedef boost::filter_iterator<is_positive_number, base_iterator>
-    FilterIter;
-
-  is_positive_number predicate;
-  FilterIter filter_iter_first(predicate, numbers, numbers + N);
-  FilterIter filter_iter_last(predicate, numbers + N, numbers + N);
-
-  std::copy(filter_iter_first, filter_iter_last, std::ostream_iterator<int>(std::cout, " "));
-  std::cout << std::endl;
-
-  // Example using make_filter_iterator()
-  std::copy(boost::make_filter_iterator<is_positive_number>(numbers, numbers + N),
-            boost::make_filter_iterator<is_positive_number>(numbers + N, numbers + N),
-            std::ostream_iterator<int>(std::cout, " "));
-  std::cout << std::endl;
-
-  // Another example using make_filter_iterator()
-  std::copy(
-      boost::make_filter_iterator(
-          std::bind2nd(std::greater<int>(), -2)
-        , numbers, numbers + N)
-
-    , boost::make_filter_iterator(
-          std::bind2nd(std::greater<int>(), -2)
-        , numbers + N, numbers + N)
-
-    , std::ostream_iterator<int>(std::cout, " ")
-  );
-
-  std::cout << std::endl;
-
-  return boost::exit_success;
-}
-
-

The output is:

-
-4 5 8 
-4 5 8 
-0 -1 4 5 8 
-
-

The source code for this example can be found here.

-
-
- - - - diff --git a/doc/filter_iterator.pdf b/doc/filter_iterator.pdf deleted file mode 100755 index 6796256..0000000 Binary files a/doc/filter_iterator.pdf and /dev/null differ diff --git a/doc/filter_iterator.rst b/doc/filter_iterator.rst deleted file mode 100644 index ceb7adc..0000000 --- a/doc/filter_iterator.rst +++ /dev/null @@ -1,29 +0,0 @@ -+++++++++++++++++ - Filter Iterator -+++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, University of Hanover `Institute for Transport - Railway Operation and Construction`_ -:date: $Date$ -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de - -:abstract: - - .. include:: filter_iterator_abstract.rst - -.. contents:: Table of Contents - -``filter_iterator`` synopsis -............................ - -.. include:: filter_iterator_ref.rst -.. include:: make_filter_iterator.rst - -.. include:: filter_iterator_eg.rst diff --git a/doc/filter_iterator_abstract.rst b/doc/filter_iterator_abstract.rst deleted file mode 100644 index 4695478..0000000 --- a/doc/filter_iterator_abstract.rst +++ /dev/null @@ -1,11 +0,0 @@ -The filter iterator adaptor creates a view of an iterator range in -which some elements of the range are skipped. A predicate function -object controls which elements are skipped. When the predicate is -applied to an element, if it returns ``true`` then the element is -retained and if it returns ``false`` then the element is skipped -over. When skipping over elements, it is necessary for the filter -adaptor to know when to stop so as to avoid going past the end of the -underlying range. A filter iterator is therefore constructed with pair -of iterators indicating the range of elements in the unfiltered -sequence to be traversed. - diff --git a/doc/filter_iterator_eg.rst b/doc/filter_iterator_eg.rst deleted file mode 100644 index 36448fe..0000000 --- a/doc/filter_iterator_eg.rst +++ /dev/null @@ -1,69 +0,0 @@ - -Example -....... - -This example uses ``filter_iterator`` and then -``make_filter_iterator`` to output only the positive integers from an -array of integers. Then ``make_filter_iterator`` is is used to output -the integers greater than ``-2``. - -:: - - struct is_positive_number { - bool operator()(int x) { return 0 < x; } - }; - - int main() - { - int numbers_[] = { 0, -1, 4, -3, 5, 8, -2 }; - const int N = sizeof(numbers_)/sizeof(int); - - typedef int* base_iterator; - base_iterator numbers(numbers_); - - // Example using filter_iterator - typedef boost::filter_iterator - FilterIter; - - is_positive_number predicate; - FilterIter filter_iter_first(predicate, numbers, numbers + N); - FilterIter filter_iter_last(predicate, numbers + N, numbers + N); - - std::copy(filter_iter_first, filter_iter_last, std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - // Example using make_filter_iterator() - std::copy(boost::make_filter_iterator(numbers, numbers + N), - boost::make_filter_iterator(numbers + N, numbers + N), - std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - // Another example using make_filter_iterator() - std::copy( - boost::make_filter_iterator( - std::bind2nd(std::greater(), -2) - , numbers, numbers + N) - - , boost::make_filter_iterator( - std::bind2nd(std::greater(), -2) - , numbers + N, numbers + N) - - , std::ostream_iterator(std::cout, " ") - ); - - std::cout << std::endl; - - return boost::exit_success; - } - - -The output is:: - - 4 5 8 - 4 5 8 - 0 -1 4 5 8 - - -The source code for this example can be found `here`__. - -__ ../example/filter_iterator_example.cpp diff --git a/doc/filter_iterator_ref.html b/doc/filter_iterator_ref.html deleted file mode 100755 index 2ca03a0..0000000 --- a/doc/filter_iterator_ref.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - - - - -
-
-template <class Predicate, class Iterator>
-class filter_iterator
-{
- public:
-    typedef iterator_traits<Iterator>::value_type value_type;
-    typedef iterator_traits<Iterator>::reference reference;
-    typedef iterator_traits<Iterator>::pointer pointer;
-    typedef iterator_traits<Iterator>::difference_type difference_type;
-    typedef /* see below */ iterator_category;
-
-    filter_iterator();
-    filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
-    filter_iterator(Iterator x, Iterator end = Iterator());
-    template<class OtherIterator>
-    filter_iterator(
-        filter_iterator<Predicate, OtherIterator> const& t
-        , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-        );
-    Predicate predicate() const;
-    Iterator end() const;
-    Iterator base() const;
-    reference operator*() const;
-    filter_iterator& operator++();
-private:
-    Predicate m_pred; // exposition
-    Iterator m_iter;  // exposition
-    Iterator m_end;   // exposition
-};
-
-

The iterator_category member is a type convertible to the tags -corresponding to each standard concept modeled by filter_iterator, -as described in the models section.

-
-

filter_iterator requirements

-

The Predicate argument must be Assignable, Copy Constructible, and -the expression p(x) must be valid where p is an object of type -Predicate, x is an object of type -iterator_traits<Iterator>::value_type, and where the type of -p(x) must be convertible to bool.

-

The Iterator argument shall meet the requirements of Readable -Iterator and Single Pass Iterator or it shall meet the requirements of -Input Iterator.

-
-
-

filter_iterator models

-

The concepts that filter_iterator models are dependent on which -concepts the Iterator argument models, as specified in the -following tables.

- ---- - - - - - - - - - - - - - -
If Iterator modelsthen filter_iterator models
Single Pass IteratorSingle Pass Iterator
Forward Traversal IteratorForward Traversal Iterator
- ---- - - - - - - - - - - - - - - - - -
If Iterator modelsthen filter_iterator models
Readable IteratorReadable Iterator
Writable IteratorWritable Iterator
Lvalue IteratorLvalue Iterator
- ---- - - - - - - - - - - - - - - - - -
If Iterator modelsthen filter_iterator models
Readable Iterator, Single Pass IteratorInput Iterator
Readable Lvalue Iterator, Forward Traversal IteratorForward Iterator
Writable Lvalue Iterator, Forward Traversal IteratorMutable Forward Iterator
-
-
-

filter_iterator operations

-

In addition to those operations required by the concepts that -filter_iterator models, filter_iterator provides the following -operations.

-

filter_iterator();

- --- - - - - - -
Requires:Predicate and Iterator must be Default Constructible.
Returns:a filter_iterator whose``m_pred``, m_iter, and m_end -members are a default constructed.
-

filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());

- --- - - - -
Returns:A filter_iterator where m_iter is either -the first position in the range [x,end) such that f(*m_iter) == true -or else``m_iter == end``. The member m_pred is constructed from -f and m_end from end.
-

filter_iterator(Iterator x, Iterator end = Iterator());

- --- - - - - - -
Requires:Predicate must be Default Constructible.
Returns:A filter_iterator where m_iter is either -the first position in the range [x,end) such that m_pred(*m_iter) == true -or else``m_iter == end``. The member m_pred is default constructed.
-
-template <class OtherIterator>
-filter_iterator(
-    filter_iterator<Predicate, OtherIterator> const& t
-    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-    );``
-
- --- - - - - - -
Requires:OtherIterator is implicitly convertible to Iterator.
Returns:A filter iterator whose members are copied from t.
-

Predicate predicate() const;

- --- - - - -
Returns:m_pred
-

Iterator end() const;

- --- - - - -
Returns:m_end
-

Iterator base() const;

- --- - - - -
Returns:m_iterator
-

reference operator*() const;

- --- - - - -
Returns:*m_iter
-

filter_iterator& operator++();

- --- - - - - - -
Effects:Increments m_iter and then continues to -increment m_iter until either m_iter == m_end -or m_pred(*m_iter) == true.
Returns:*this
-
-
- - - - diff --git a/doc/filter_iterator_ref.rst b/doc/filter_iterator_ref.rst deleted file mode 100644 index 80c6182..0000000 --- a/doc/filter_iterator_ref.rst +++ /dev/null @@ -1,169 +0,0 @@ -.. Copyright David Abrahams, Jeremy Siek, and Thomas Witt -.. 2004. 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) - -:: - - template - class filter_iterator - { - public: - typedef iterator_traits::value_type value_type; - typedef iterator_traits::reference reference; - typedef iterator_traits::pointer pointer; - typedef iterator_traits::difference_type difference_type; - typedef /* see below */ iterator_category; - - filter_iterator(); - filter_iterator(Predicate f, Iterator x, Iterator end = Iterator()); - filter_iterator(Iterator x, Iterator end = Iterator()); - template - filter_iterator( - filter_iterator const& t - , typename enable_if_convertible::type* = 0 // exposition - ); - Predicate predicate() const; - Iterator end() const; - Iterator const& base() const; - reference operator*() const; - filter_iterator& operator++(); - private: - Predicate m_pred; // exposition only - Iterator m_iter; // exposition only - Iterator m_end; // exposition only - }; - - -If ``Iterator`` models Readable Lvalue Iterator and Forward Traversal -Iterator then ``iterator_category`` is convertible to -``std::forward_iterator_tag``. Otherwise ``iterator_category`` is -convertible to ``std::input_iterator_tag``. - - -``filter_iterator`` requirements -................................ - -The ``Iterator`` argument shall meet the requirements of Readable -Iterator and Single Pass Iterator or it shall meet the requirements of -Input Iterator. - -The ``Predicate`` argument must be Assignable, Copy Constructible, and -the expression ``p(x)`` must be valid where ``p`` is an object of type -``Predicate``, ``x`` is an object of type -``iterator_traits::value_type``, and where the type of -``p(x)`` must be convertible to ``bool``. - - -``filter_iterator`` models -.......................... - -The concepts that ``filter_iterator`` models are dependent on which -concepts the ``Iterator`` argument models, as specified in the -following tables. - -+-----------------------------+----------------------------------------------------------+ -| If ``Iterator`` models | then ``filter_iterator`` models | -+=============================+==========================================================+ -| Single Pass Iterator | Single Pass Iterator | -+-----------------------------+----------------------------------------------------------+ -| Forward Traversal Iterator | Forward Traversal Iterator | -+-----------------------------+----------------------------------------------------------+ - -+--------------------------------+----------------------------------------------+ -| If ``Iterator`` models | then ``filter_iterator`` models | -+================================+==============================================+ -| Readable Iterator | Readable Iterator | -+--------------------------------+----------------------------------------------+ -| Writable Iterator | Writable Iterator | -+--------------------------------+----------------------------------------------+ -| Lvalue Iterator | Lvalue Iterator | -+--------------------------------+----------------------------------------------+ - -+-------------------------------------------------------+---------------------------------+ -| If ``Iterator`` models | then ``filter_iterator`` models | -+=======================================================+=================================+ -| Readable Iterator, Single Pass Iterator | Input Iterator | -+-------------------------------------------------------+---------------------------------+ -| Readable Lvalue Iterator, Forward Traversal Iterator | Forward Iterator | -+-------------------------------------------------------+---------------------------------+ -| Writable Lvalue Iterator, Forward Traversal Iterator | Mutable Forward Iterator | -+-------------------------------------------------------+---------------------------------+ - - -``filter_iterator`` is interoperable with ``filter_iterator`` -if and only if ``X`` is interoperable with ``Y``. - - -``filter_iterator`` operations -.............................. - -In addition to those operations required by the concepts that -``filter_iterator`` models, ``filter_iterator`` provides the following -operations. - - -``filter_iterator();`` - -:Requires: ``Predicate`` and ``Iterator`` must be Default Constructible. -:Effects: Constructs a ``filter_iterator`` whose``m_pred``, ``m_iter``, and ``m_end`` - members are a default constructed. - - -``filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());`` - -:Effects: Constructs a ``filter_iterator`` where ``m_iter`` is either - the first position in the range ``[x,end)`` such that ``f(*m_iter) == true`` - or else``m_iter == end``. The member ``m_pred`` is constructed from - ``f`` and ``m_end`` from ``end``. - - - -``filter_iterator(Iterator x, Iterator end = Iterator());`` - -:Requires: ``Predicate`` must be Default Constructible and - ``Predicate`` is a class type (not a function pointer). -:Effects: Constructs a ``filter_iterator`` where ``m_iter`` is either - the first position in the range ``[x,end)`` such that ``m_pred(*m_iter) == true`` - or else``m_iter == end``. The member ``m_pred`` is default constructed. - - -:: - - template - filter_iterator( - filter_iterator const& t - , typename enable_if_convertible::type* = 0 // exposition - );`` - -:Requires: ``OtherIterator`` is implicitly convertible to ``Iterator``. -:Effects: Constructs a filter iterator whose members are copied from ``t``. - - -``Predicate predicate() const;`` - -:Returns: ``m_pred`` - - -``Iterator end() const;`` - -:Returns: ``m_end`` - - -``Iterator const& base() const;`` - -:Returns: ``m_iterator`` - - - -``reference operator*() const;`` - -:Returns: ``*m_iter`` - - -``filter_iterator& operator++();`` - -:Effects: Increments ``m_iter`` and then continues to - increment ``m_iter`` until either ``m_iter == m_end`` - or ``m_pred(*m_iter) == true``. -:Returns: ``*this`` diff --git a/doc/function_output_iterator.html b/doc/function_output_iterator.html deleted file mode 100644 index e3ea4e8..0000000 --- a/doc/function_output_iterator.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - -Function Output Iterator - - - - - - - -
-

Function Output Iterator

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization:Boost Consulting, Indiana University Open Systems -Lab, University of Hanover Institute for Transport -Railway Operation and Construction
Date:2004-01-13
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved
- --- - - - -
abstract:The function output iterator adaptor makes it easier to create custom -output iterators. The adaptor takes a unary function and creates a -model of Output Iterator. Each item assigned to the output iterator is -passed as an argument to the unary function. The motivation for this -iterator is that creating a conforming output iterator is non-trivial, -particularly because the proper implementation usually requires a -proxy object.
- -
-template <class UnaryFunction>
-class function_output_iterator {
-public:
-  typedef std::output_iterator_tag iterator_category;
-  typedef void                     value_type;
-  typedef void                     difference_type;
-  typedef void                     pointer;
-  typedef void                     reference;
-
-  explicit function_output_iterator();
-
-  explicit function_output_iterator(const UnaryFunction& f);
-
-  /* see below */ operator*();
-  function_output_iterator& operator++();
-  function_output_iterator& operator++(int);
-private:
-  UnaryFunction m_f;     // exposition only
-};
-
-
-

function_output_iterator requirements

-

UnaryFunction must be Assignable and Copy Constructible.

-
-
-

function_output_iterator models

-

function_output_iterator is a model of the Writable and -Incrementable Iterator concepts.

-
-
-

function_output_iterator operations

-

explicit function_output_iterator(const UnaryFunction& f = UnaryFunction());

- --- - - - -
Effects:Constructs an instance of function_output_iterator -with m_f constructed from f.
-

operator*();

- --- - - - -
Returns:An object r of unspecified type such that r = t -is equivalent to m_f(t) for all t.
-

function_output_iterator& operator++();

- --- - - - -
Returns:*this
-

function_output_iterator& operator++(int);

- --- - - - -
Returns:*this
-
-
-

Example

-
-struct string_appender
-{
-    string_appender(std::string& s)
-        : m_str(&s)
-    {}
-
-    void operator()(const std::string& x) const
-    {
-        *m_str += x;
-    }
-
-    std::string* m_str;
-};
-
-int main(int, char*[])
-{
-  std::vector<std::string> x;
-  x.push_back("hello");
-  x.push_back(" ");
-  x.push_back("world");
-  x.push_back("!");
-
-  std::string s = "";
-  std::copy(x.begin(), x.end(), 
-            boost::make_function_output_iterator(string_appender(s)));
-
-  std::cout << s << std::endl;
-
-  return 0;
-}
-
-
-
- - - - diff --git a/doc/function_output_iterator.pdf b/doc/function_output_iterator.pdf deleted file mode 100755 index 9e3910d..0000000 Binary files a/doc/function_output_iterator.pdf and /dev/null differ diff --git a/doc/function_output_iterator.rst b/doc/function_output_iterator.rst deleted file mode 100644 index 01ac022..0000000 --- a/doc/function_output_iterator.rst +++ /dev/null @@ -1,24 +0,0 @@ -++++++++++++++++++++++++++ - Function Output Iterator -++++++++++++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, University of Hanover `Institute for Transport - Railway Operation and Construction`_ -:date: $Date$ -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de - -:abstract: - - .. include:: function_output_iterator_abstract.rst - -.. contents:: Table of Contents - -.. include:: function_output_iterator_ref.rst -.. include:: function_output_iterator_eg.rst \ No newline at end of file diff --git a/doc/function_output_iterator_abstract.rst b/doc/function_output_iterator_abstract.rst deleted file mode 100644 index 11fb4f1..0000000 --- a/doc/function_output_iterator_abstract.rst +++ /dev/null @@ -1,8 +0,0 @@ -The function output iterator adaptor makes it easier to create custom -output iterators. The adaptor takes a unary function and creates a -model of Output Iterator. Each item assigned to the output iterator is -passed as an argument to the unary function. The motivation for this -iterator is that creating a conforming output iterator is non-trivial, -particularly because the proper implementation usually requires a -proxy object. - diff --git a/doc/function_output_iterator_eg.rst b/doc/function_output_iterator_eg.rst deleted file mode 100644 index eb635df..0000000 --- a/doc/function_output_iterator_eg.rst +++ /dev/null @@ -1,35 +0,0 @@ -Example -....... - -:: - - struct string_appender - { - string_appender(std::string& s) - : m_str(&s) - {} - - void operator()(const std::string& x) const - { - *m_str += x; - } - - std::string* m_str; - }; - - int main(int, char*[]) - { - std::vector x; - x.push_back("hello"); - x.push_back(" "); - x.push_back("world"); - x.push_back("!"); - - std::string s = ""; - std::copy(x.begin(), x.end(), - boost::make_function_output_iterator(string_appender(s))); - - std::cout << s << std::endl; - - return 0; - } diff --git a/doc/function_output_iterator_ref.rst b/doc/function_output_iterator_ref.rst deleted file mode 100644 index f46a91c..0000000 --- a/doc/function_output_iterator_ref.rst +++ /dev/null @@ -1,62 +0,0 @@ -:: - - template - class function_output_iterator { - public: - typedef std::output_iterator_tag iterator_category; - typedef void value_type; - typedef void difference_type; - typedef void pointer; - typedef void reference; - - explicit function_output_iterator(); - - explicit function_output_iterator(const UnaryFunction& f); - - /* see below */ operator*(); - function_output_iterator& operator++(); - function_output_iterator& operator++(int); - private: - UnaryFunction m_f; // exposition only - }; - - - -``function_output_iterator`` requirements -......................................... - -``UnaryFunction`` must be Assignable and Copy Constructible. - - - -``function_output_iterator`` models -................................... - -``function_output_iterator`` is a model of the Writable and -Incrementable Iterator concepts. - - - -``function_output_iterator`` operations -....................................... - -``explicit function_output_iterator(const UnaryFunction& f = UnaryFunction());`` - -:Effects: Constructs an instance of ``function_output_iterator`` - with ``m_f`` constructed from ``f``. - - -``operator*();`` - -:Returns: An object ``r`` of unspecified type such that ``r = t`` - is equivalent to ``m_f(t)`` for all ``t``. - - -``function_output_iterator& operator++();`` - -:Returns: ``*this`` - - -``function_output_iterator& operator++(int);`` - -:Returns: ``*this`` diff --git a/doc/generate.py b/doc/generate.py deleted file mode 100644 index f5d0de8..0000000 --- a/doc/generate.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/python -# Copyright David Abrahams 2004. 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) - -# -# Generate html, TeX, and PDF versions of all the source files -# -import os -import sys - -from syscmd import syscmd -from sources import sources - -if 0: - for s in sources: - syscmd('boosthtml %s' % s) -else: - extensions = ('html', 'pdf') - - if len(sys.argv) > 1: - extensions = sys.argv[1:] - - all = [ '%s.%s' % (os.path.splitext(s)[0],ext) - for ext in extensions - for s in sources - ] - - print 'make %s' % ' '.join(all) - syscmd('make %s' % ' '.join(all)) - - diff --git a/doc/index.html b/doc/index.html deleted file mode 100755 index 9297690..0000000 --- a/doc/index.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - -The Boost.Iterator Library Boost - - - -

The Boost.Iterator Library Boost

- - - - - diff --git a/doc/index.rst b/doc/index.rst deleted file mode 100755 index f181ab5..0000000 --- a/doc/index.rst +++ /dev/null @@ -1,319 +0,0 @@ -+++++++++++++++++++++++++++++++++++++++++++++++++ - The Boost.Iterator Library |(logo)|__ -+++++++++++++++++++++++++++++++++++++++++++++++++ - -.. |(logo)| image:: ../../../c++boost.gif - :alt: Boost - -__ ../../../index.htm - - -------------------------------------- - - -:Authors: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com -:organizations: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, `Zephyr Associates, Inc.`_ -:date: $Date$ - -:copyright: Copyright David Abrahams, Jeremy Siek, Thomas Witt 2003. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Zephyr Associates, Inc.`: http://www.styleadvisor.com - -:Abstract: The Boost Iterator Library contains two parts. The first - is a system of concepts_ which extend the C++ standard - iterator requirements. The second is a framework of - components for building iterators based on these - extended concepts and includes several useful iterator - adaptors. The extended iterator concepts have been - carefully designed so that old-style iterators - can fit in the new concepts and so that new-style - iterators will be compatible with old-style algorithms, - though algorithms may need to be updated if they want to - take full advantage of the new-style iterator - capabilities. Several components of this library have - been accepted into the C++ standard technical report. - The components of the Boost Iterator Library replace the - older Boost Iterator Adaptor Library. - -.. _concepts: ../../../more/generic_programming.html#concept - -.. contents:: **Table of Contents** - - -------------------------------------- - - -===================== - New-Style Iterators -===================== - -The iterator categories defined in C++98 are extremely limiting -because they bind together two orthogonal concepts: traversal and -element access. For example, because a random access iterator is -required to return a reference (and not a proxy) when dereferenced, -it is impossible to capture the capabilities of -``vector::iterator`` using the C++98 categories. This is the -infamous "``vector`` is not a container, and its iterators -aren't random access iterators", debacle about which Herb Sutter -wrote two papers for the standards comittee (n1185_ and n1211_), -and a `Guru of the Week`__. New-style iterators go well beyond -patching up ``vector``, though: there are lots of other -iterators already in use which can't be adequately represented by -the existing concepts. For details about the new iterator -concepts, see our - -.. _n1185: http://www.gotw.ca/publications/N1185.pdf -.. _n1211: http://www.gotw.ca/publications/N1211.pdf -__ http://www.gotw.ca/gotw/050.htm - - - `Standard Proposal For New-Style Iterators`__ (PDF__) - -__ new-iter-concepts.html -__ new-iter-concepts.pdf - -============================= - Iterator Facade and Adaptor -============================= - -Writing standard-conforming iterators is tricky, but the need comes -up often. In order to ease the implementation of new iterators, -the Boost.Iterator library provides the |facade| class template, -which implements many useful defaults and compile-time checks -designed to help the iterator author ensure that his iterator is -correct. - -It is also common to define a new iterator that is similar to some -underlying iterator or iterator-like type, but that modifies some -aspect of the underlying type's behavior. For that purpose, the -library supplies the |adaptor| class template, which is specially -designed to take advantage of as much of the underlying type's -behavior as possible. - -The documentation for these two classes can be found at the following -web pages: - -* |facade|_ (PDF__) - -* |adaptor|_ (PDF__) - - -.. |facade| replace:: ``iterator_facade`` -.. _facade: iterator_facade.html -__ iterator_facade.pdf - -.. |adaptor| replace:: ``iterator_adaptor`` -.. _adaptor: iterator_adaptor.html -__ iterator_adaptor.pdf - -Both |facade| and |adaptor| as well as many of the `specialized -adaptors`_ mentioned below have been proposed for standardization, -and accepted into the first C++ technical report; see our - - `Standard Proposal For Iterator Facade and Adaptor`__ (PDF__) - -for more details. - -__ facade-and-adaptor.html -__ facade-and-adaptor.pdf - -====================== - Specialized Adaptors -====================== - -The iterator library supplies a useful suite of standard-conforming -iterator templates based on the Boost `iterator facade and adaptor`_. - -* |counting|_ (PDF__): an iterator over a sequence of consecutive values. - Implements a "lazy sequence" - -* |filter|_ (PDF__): an iterator over the subset of elements of some - sequence which satisfy a given predicate - -* |function|_ (PDF__): an output iterator wrapping a unary function - object; each time an element is written into the dereferenced - iterator, it is passed as a parameter to the function object. - -* |indirect|_ (PDF__): an iterator over the objects *pointed-to* by the - elements of some sequence. - -* |permutation|_ (PDF__): an iterator over the elements of some random-access - sequence, rearranged according to some sequence of integer indices. - -* |reverse|_ (PDF__): an iterator which traverses the elements of some - bidirectional sequence in reverse. Corrects many of the - shortcomings of C++98's ``std::reverse_iterator``. - -* |shared|_: an iterator over elements of a container whose - lifetime is maintained by a |shared_ptr|_ stored in the iterator. - -* |transform|_ (PDF__): an iterator over elements which are the result of - applying some functional transformation to the elements of an - underlying sequence. This component also replaces the old - ``projection_iterator_adaptor``. - -* |zip|_ (PDF__): an iterator over tuples of the elements at corresponding - positions of heterogeneous underlying iterators. - -.. |counting| replace:: ``counting_iterator`` -.. _counting: counting_iterator.html -__ counting_iterator.pdf - -.. |filter| replace:: ``filter_iterator`` -.. _filter: filter_iterator.html -__ filter_iterator.pdf - -.. |function| replace:: ``function_output_iterator`` -.. _function: function_output_iterator.html -__ function_output_iterator.pdf - -.. |indirect| replace:: ``indirect_iterator`` -.. _indirect: indirect_iterator.html -__ indirect_iterator.pdf - -.. |permutation| replace:: ``permutation_iterator`` -.. _permutation: permutation_iterator.html -__ permutation_iterator.pdf - -.. |reverse| replace:: ``reverse_iterator`` -.. _reverse: reverse_iterator.html -__ reverse_iterator.pdf - -.. |shared| replace:: ``shared_container_iterator`` -.. _shared: ../../utility/shared_container_iterator.html - -.. |transform| replace:: ``transform_iterator`` -.. _transform: transform_iterator.html -__ transform_iterator.pdf - -.. |zip| replace:: ``zip_iterator`` -.. _zip: zip_iterator.html -__ zip_iterator.pdf - -.. |shared_ptr| replace:: ``shared_ptr`` -.. _shared_ptr: ../../smart_ptr/shared_ptr.htm - -==================== - Iterator Utilities -==================== - -Traits ------- - -* |pointee|_ (PDF__): Provides the capability to deduce the referent types - of pointers, smart pointers and iterators in generic code. Used - in |indirect|. - -* |iterator_traits|_ (PDF__): Provides MPL_\ -compatible metafunctions which - retrieve an iterator's traits. Also corrects for the deficiencies - of broken implementations of ``std::iterator_traits``. - -.. * |interoperable|_ (PDF__): Provides an MPL_\ -compatible metafunction for - testing iterator interoperability - -.. |pointee| replace:: ``pointee.hpp`` -.. _pointee: pointee.html -__ pointee.pdf - -.. |iterator_traits| replace:: ``iterator_traits.hpp`` -.. _iterator_traits: iterator_traits.html -__ iterator_traits.pdf - -.. |interoperable| replace:: ``interoperable.hpp`` -.. _interoperable: interoperable.html -.. comment! __ interoperable.pdf - -.. _MPL: ../../mpl/doc/index.html - -Testing and Concept Checking ----------------------------- - -* |iterator_concepts|_ (PDF__): Concept checking classes for the new iterator concepts. - -* |iterator_archetypes|_ (PDF__): Concept archetype classes for the new iterators concepts. - -.. |iterator_concepts| replace:: ``iterator_concepts.hpp`` -.. _iterator_concepts: iterator_concepts.html -__ iterator_concepts.pdf - -.. |iterator_archetypes| replace:: ``iterator_archetypes.hpp`` -.. _iterator_archetypes: iterator_archetypes.html -__ iterator_archetypes.pdf - -======================================================= - Upgrading from the old Boost Iterator Adaptor Library -======================================================= - -.. _Upgrading: - -If you have been using the old Boost Iterator Adaptor library to -implement iterators, you probably wrote a ``Policies`` class which -captures the core operations of your iterator. In the new library -design, you'll move those same core operations into the body of the -iterator class itself. If you were writing a family of iterators, -you probably wrote a `type generator`_ to build the -``iterator_adaptor`` specialization you needed; in the new library -design you don't need a type generator (though may want to keep it -around as a compatibility aid for older code) because, due to the -use of the Curiously Recurring Template Pattern (CRTP) [Cop95]_, -you can now define the iterator class yourself and acquire -functionality through inheritance from ``iterator_facade`` or -``iterator_adaptor``. As a result, you also get much finer control -over how your iterator works: you can add additional constructors, -or even override the iterator functionality provided by the -library. - -.. _`type generator`: ../../../more/generic_programming.html#type_generator - -If you're looking for the old ``projection_iterator`` component, -its functionality has been merged into ``transform_iterator``: as -long as the function object's ``result_type`` (or the ``Reference`` -template argument, if explicitly specified) is a true reference -type, ``transform_iterator`` will behave like -``projection_iterator`` used to. - -========= - History -========= - -In 2000 Dave Abrahams was writing an iterator for a container of -pointers, which would access the pointed-to elements when -dereferenced. Naturally, being a library writer, he decided to -generalize the idea and the Boost Iterator Adaptor library was born. -Dave was inspired by some writings of Andrei Alexandrescu and chose a -policy based design (though he probably didn't capture Andrei's idea -very well - there was only one policy class for all the iterator's -orthogonal properties). Soon Jeremy Siek realized he would need the -library and they worked together to produce a "Boostified" version, -which was reviewed and accepted into the library. They wrote a paper -and made several important revisions of the code. - -Eventually, several shortcomings of the older library began to make -the need for a rewrite apparent. Dave and Jeremy started working -at the Santa Cruz C++ committee meeting in 2002, and had quickly -generated a working prototype. At the urging of Mat Marcus, they -decided to use the GenVoca/CRTP pattern approach, and moved the -policies into the iterator class itself. Thomas Witt expressed -interest and became the voice of strict compile-time checking for -the project, adding uses of the SFINAE technique to eliminate false -converting constructors and operators from the overload set. He -also recognized the need for a separate ``iterator_facade``, and -factored it out of ``iterator_adaptor``. Finally, after a -near-complete rewrite of the prototype, they came up with the -library you see today. - -.. [Cop95] [Coplien, 1995] Coplien, J., Curiously Recurring Template - Patterns, C++ Report, February 1995, pp. 24-27. - -.. - LocalWords: Abrahams Siek Witt const bool Sutter's WG int UL LI href Lvalue - LocalWords: ReadableIterator WritableIterator SwappableIterator cv pre iter - LocalWords: ConstantLvalueIterator MutableLvalueIterator CopyConstructible TR - LocalWords: ForwardTraversalIterator BidirectionalTraversalIterator lvalue - LocalWords: RandomAccessTraversalIterator dereferenceable Incrementable tmp - LocalWords: incrementable xxx min prev inplace png oldeqnew AccessTag struct - LocalWords: TraversalTag typename lvalues DWA Hmm JGS diff --git a/doc/indirect_iterator.html b/doc/indirect_iterator.html deleted file mode 100644 index c1fe764..0000000 --- a/doc/indirect_iterator.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - -Indirect Iterator - - - - - - - -
-

Indirect Iterator

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization:Boost Consulting, Indiana University Open Systems -Lab, University of Hanover Institute for Transport -Railway Operation and Construction
Date:2004-01-15
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved
- --- - - - -
abstract:indirect_iterator adapts an iterator by applying an -extra dereference inside of operator*(). For example, this -iterator adaptor makes it possible to view a container of pointers -(e.g. list<foo*>) as if it were a container of the pointed-to type -(e.g. list<foo>). indirect_iterator depends on two -auxiliary traits, pointee and indirect_reference, to -provide support for underlying iterators whose value_type is -not an iterator.
- -
-

indirect_iterator synopsis

-
-template <
-    class Iterator
-  , class Value = use_default
-  , class CategoryOrTraversal = use_default
-  , class Reference = use_default
-  , class Difference = use_default
->
-class indirect_iterator
-{
- public:
-    typedef /* see below */ value_type;
-    typedef /* see below */ reference;
-    typedef /* see below */ pointer;
-    typedef /* see below */ difference_type;
-    typedef /* see below */ iterator_category;
-
-    indirect_iterator();
-    indirect_iterator(Iterator x);
-
-    template <
-        class Iterator2, class Value2, class Category2
-      , class Reference2, class Difference2
-    >
-    indirect_iterator(
-        indirect_iterator<
-             Iterator2, Value2, Category2, Reference2, Difference2
-        > const& y
-      , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
-    );
-
-    Iterator const& base() const;
-    reference operator*() const;
-    indirect_iterator& operator++();
-    indirect_iterator& operator--();
-private:
-   Iterator m_iterator; // exposition
-};
-
-

The member types of indirect_iterator are defined according to -the following pseudo-code, where V is -iterator_traits<Iterator>::value_type

-
-if (Value is use_default) then
-    typedef remove_const<pointee<V>::type>::type value_type;
-else
-    typedef remove_const<Value>::type value_type;
-
-if (Reference is use_default) then
-    if (Value is use_default) then
-        typedef indirect_reference<V>::type reference;
-    else
-        typedef Value& reference;
-else
-    typedef Reference reference;
-
-if (Value is use_default) then 
-    typedef pointee<V>::type* pointer;
-else 
-    typedef Value* pointer;
-
-if (Difference is use_default)
-    typedef iterator_traits<Iterator>::difference_type difference_type;
-else
-    typedef Difference difference_type;
-
-if (CategoryOrTraversal is use_default)
-    typedef iterator-category (
-        iterator_traversal<Iterator>::type,``reference``,``value_type``
-    ) iterator_category;
-else
-    typedef iterator-category (
-        CategoryOrTraversal,``reference``,``value_type``
-    ) iterator_category;
-
-
-
-

indirect_iterator requirements

-

The expression *v, where v is an object of -iterator_traits<Iterator>::value_type, shall be valid -expression and convertible to reference. Iterator shall -model the traversal concept indicated by iterator_category. -Value, Reference, and Difference shall be chosen so -that value_type, reference, and difference_type meet -the requirements indicated by iterator_category.

-

[Note: there are further requirements on the -iterator_traits<Iterator>::value_type if the Value -parameter is not use_default, as implied by the algorithm for -deducing the default for the value_type member.]

-
-
-

indirect_iterator models

-

In addition to the concepts indicated by iterator_category -and by iterator_traversal<indirect_iterator>::type, a -specialization of indirect_iterator models the following -concepts, Where v is an object of -iterator_traits<Iterator>::value_type:

-
-
    -
  • Readable Iterator if reference(*v) is convertible to -value_type.
  • -
  • Writable Iterator if reference(*v) = t is a valid -expression (where t is an object of type -indirect_iterator::value_type)
  • -
  • Lvalue Iterator if reference is a reference type.
  • -
-
-

indirect_iterator<X,V1,C1,R1,D1> is interoperable with -indirect_iterator<Y,V2,C2,R2,D2> if and only if X is -interoperable with Y.

-
-
-

indirect_iterator operations

-

In addition to the operations required by the concepts described -above, specializations of indirect_iterator provide the -following operations.

-

indirect_iterator();

- --- - - - - - -
Requires:Iterator must be Default Constructible.
Effects:Constructs an instance of indirect_iterator with -a default-constructed m_iterator.
-

indirect_iterator(Iterator x);

- --- - - - -
Effects:Constructs an instance of indirect_iterator with -m_iterator copy constructed from x.
-
-template <
-    class Iterator2, class Value2, unsigned Access, class Traversal
-  , class Reference2, class Difference2
->
-indirect_iterator(
-    indirect_iterator<
-         Iterator2, Value2, Access, Traversal, Reference2, Difference2
-    > const& y
-  , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
-);
-
- --- - - - - - -
Requires:Iterator2 is implicitly convertible to Iterator.
Effects:Constructs an instance of indirect_iterator whose -m_iterator subobject is constructed from y.base().
-

Iterator const& base() const;

- --- - - - -
Returns:m_iterator
-

reference operator*() const;

- --- - - - -
Returns:**m_iterator
-

indirect_iterator& operator++();

- --- - - - - - -
Effects:++m_iterator
Returns:*this
-

indirect_iterator& operator--();

- --- - - - - - -
Effects:--m_iterator
Returns:*this
-
-
-

Example

-

This example prints an array of characters, using -indirect_iterator to access the array of characters through an -array of pointers. Next indirect_iterator is used with the -transform algorithm to copy the characters (incremented by one) to -another array. A constant indirect iterator is used for the source and -a mutable indirect iterator is used for the destination. The last part -of the example prints the original array of characters, but this time -using the make_indirect_iterator helper function.

-
-char characters[] = "abcdefg";
-const int N = sizeof(characters)/sizeof(char) - 1; // -1 since characters has a null char
-char* pointers_to_chars[N];                        // at the end.
-for (int i = 0; i < N; ++i)
-  pointers_to_chars[i] = &characters[i];
-
-// Example of using indirect_iterator
-
-boost::indirect_iterator<char**, char>
-  indirect_first(pointers_to_chars), indirect_last(pointers_to_chars + N);
-
-std::copy(indirect_first, indirect_last, std::ostream_iterator<char>(std::cout, ","));
-std::cout << std::endl;
-
-
-// Example of making mutable and constant indirect iterators
-
-char mutable_characters[N];
-char* pointers_to_mutable_chars[N];
-for (int j = 0; j < N; ++j)
-  pointers_to_mutable_chars[j] = &mutable_characters[j];
-
-boost::indirect_iterator<char* const*> mutable_indirect_first(pointers_to_mutable_chars),
-  mutable_indirect_last(pointers_to_mutable_chars + N);
-boost::indirect_iterator<char* const*, char const> const_indirect_first(pointers_to_chars),
-  const_indirect_last(pointers_to_chars + N);
-
-std::transform(const_indirect_first, const_indirect_last,
-               mutable_indirect_first, std::bind1st(std::plus<char>(), 1));
-
-std::copy(mutable_indirect_first, mutable_indirect_last,
-          std::ostream_iterator<char>(std::cout, ","));
-std::cout << std::endl;
-
-
-// Example of using make_indirect_iterator()
-
-std::copy(boost::make_indirect_iterator(pointers_to_chars), 
-          boost::make_indirect_iterator(pointers_to_chars + N),
-          std::ostream_iterator<char>(std::cout, ","));
-std::cout << std::endl;
-
-

The output is:

-
-a,b,c,d,e,f,g,
-b,c,d,e,f,g,h,
-a,b,c,d,e,f,g,
-
-

The source code for this example can be found here.

-
-
- - - - diff --git a/doc/indirect_iterator.pdf b/doc/indirect_iterator.pdf deleted file mode 100755 index 357d91f..0000000 Binary files a/doc/indirect_iterator.pdf and /dev/null differ diff --git a/doc/indirect_iterator.rst b/doc/indirect_iterator.rst deleted file mode 100644 index ad3778d..0000000 --- a/doc/indirect_iterator.rst +++ /dev/null @@ -1,30 +0,0 @@ -+++++++++++++++++++ - Indirect Iterator -+++++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, University of Hanover `Institute for Transport - Railway Operation and Construction`_ -:date: $Date$ -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de - -:abstract: - - .. include:: indirect_iterator_abstract.rst - -.. contents:: Table of Contents - -``indirect_iterator`` synopsis -.............................. - -.. include:: indirect_iterator_ref.rst -.. include:: indirect_iterator_eg.rst - -.. _iterator-category: iterator_facade.html#iterator-category -.. |iterator-category| replace:: *iterator-category* diff --git a/doc/indirect_iterator_abstract.rst b/doc/indirect_iterator_abstract.rst deleted file mode 100644 index 448b734..0000000 --- a/doc/indirect_iterator_abstract.rst +++ /dev/null @@ -1,11 +0,0 @@ -``indirect_iterator`` adapts an iterator by applying an -*extra* dereference inside of ``operator*()``. For example, this -iterator adaptor makes it possible to view a container of pointers -(e.g. ``list``) as if it were a container of the pointed-to type -(e.g. ``list``). ``indirect_iterator`` depends on two -auxiliary traits, ``pointee`` and ``indirect_reference``, to -provide support for underlying iterators whose ``value_type`` is -not an iterator. - - - diff --git a/doc/indirect_iterator_eg.rst b/doc/indirect_iterator_eg.rst deleted file mode 100644 index 356a2dd..0000000 --- a/doc/indirect_iterator_eg.rst +++ /dev/null @@ -1,69 +0,0 @@ -Example -....... - -This example prints an array of characters, using -``indirect_iterator`` to access the array of characters through an -array of pointers. Next ``indirect_iterator`` is used with the -``transform`` algorithm to copy the characters (incremented by one) to -another array. A constant indirect iterator is used for the source and -a mutable indirect iterator is used for the destination. The last part -of the example prints the original array of characters, but this time -using the ``make_indirect_iterator`` helper function. - - -:: - - char characters[] = "abcdefg"; - const int N = sizeof(characters)/sizeof(char) - 1; // -1 since characters has a null char - char* pointers_to_chars[N]; // at the end. - for (int i = 0; i < N; ++i) - pointers_to_chars[i] = &characters[i]; - - // Example of using indirect_iterator - - boost::indirect_iterator - indirect_first(pointers_to_chars), indirect_last(pointers_to_chars + N); - - std::copy(indirect_first, indirect_last, std::ostream_iterator(std::cout, ",")); - std::cout << std::endl; - - - // Example of making mutable and constant indirect iterators - - char mutable_characters[N]; - char* pointers_to_mutable_chars[N]; - for (int j = 0; j < N; ++j) - pointers_to_mutable_chars[j] = &mutable_characters[j]; - - boost::indirect_iterator mutable_indirect_first(pointers_to_mutable_chars), - mutable_indirect_last(pointers_to_mutable_chars + N); - boost::indirect_iterator const_indirect_first(pointers_to_chars), - const_indirect_last(pointers_to_chars + N); - - std::transform(const_indirect_first, const_indirect_last, - mutable_indirect_first, std::bind1st(std::plus(), 1)); - - std::copy(mutable_indirect_first, mutable_indirect_last, - std::ostream_iterator(std::cout, ",")); - std::cout << std::endl; - - - // Example of using make_indirect_iterator() - - std::copy(boost::make_indirect_iterator(pointers_to_chars), - boost::make_indirect_iterator(pointers_to_chars + N), - std::ostream_iterator(std::cout, ",")); - std::cout << std::endl; - - -The output is:: - - a,b,c,d,e,f,g, - b,c,d,e,f,g,h, - a,b,c,d,e,f,g, - - -The source code for this example can be found `here`__. - -__ ../example/indirect_iterator_example.cpp - diff --git a/doc/indirect_iterator_ref.diff b/doc/indirect_iterator_ref.diff deleted file mode 100644 index 0c1bf5c..0000000 --- a/doc/indirect_iterator_ref.diff +++ /dev/null @@ -1,245 +0,0 @@ -Index: indirect_iterator_ref.rst -=================================================================== -RCS file: /cvsroot/boost/boost/libs/iterator/doc/indirect_iterator_ref.rst,v -retrieving revision 1.2 -retrieving revision 1.21 -diff -w -d -u -b -r1.2 -r1.21 ---- indirect_iterator_ref.rst 22 Sep 2003 19:55:00 -0000 1.2 -+++ indirect_iterator_ref.rst 15 Jan 2004 00:01:33 -0000 1.21 - - - -@@ -3,82 +3,139 @@ - template < - class Iterator - , class Value = use_default - -Issue 9.15 - -- , unsigned Access = use_default_access -- , class Traversal = use_default -+ , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class indirect_iterator - -Issue 9.37x - -- : public iterator_adaptor - { -- friend class iterator_core_access; - public: -+ typedef /* see below */ value_type; -+ typedef /* see below */ reference; -+ typedef /* see below */ pointer; -+ typedef /* see below */ difference_type; -+ typedef /* see below */ iterator_category; -+ - indirect_iterator(); - indirect_iterator(Iterator x); -+ - -Issue 9.15 - - template < -- class Iterator2, class Value2, unsigned Access2, class Traversal2 -+ class Iterator2, class Value2, class Category2 - , class Reference2, class Difference2 - > - indirect_iterator( - indirect_iterator< -- Iterator2, Value2, Access2, Traversal2, Reference2, Difference2 -+ Iterator2, Value2, Category2, Reference2, Difference2 - > const& y - , typename enable_if_convertible::type* = 0 // exposition - ); - -Issue 9.37x - -- private: // as-if specification -- typename indirect_iterator::reference dereference() const -- { -- return **this->base(); -- } -+ -+ Iterator const& base() const; -+ reference operator*() const; -+ indirect_iterator& operator++(); -+ indirect_iterator& operator--(); -+ private: -+ Iterator m_iterator; // exposition - }; - -+ -+The member types of ``indirect_iterator`` are defined according to -+the following pseudo-code, where ``V`` is -+``iterator_traits::value_type`` -+ -+.. parsed-literal:: -+ -+ if (Value is use_default) then -+ typedef remove_const::type>::type value_type; -+ else -+ typedef remove_const::type value_type; -+ -+ if (Reference is use_default) then -+ if (Value is use_default) then -+ typedef indirect_reference::type reference; -+ else -+ typedef Value& reference; -+ else -+ typedef Reference reference; -+ -+ if (Value is use_default) then -+ typedef pointee::type\* pointer; -+ else -+ typedef Value\* pointer; -+ -+ if (Difference is use_default) -+ typedef iterator_traits::difference_type difference_type; -+ else -+ typedef Difference difference_type; -+ -+ if (CategoryOrTraversal is use_default) -+ typedef |iterator-category|_\ ( -+ iterator_traversal::type,``reference``,``value_type`` -+ ) iterator_category; -+ else -+ typedef |iterator-category|_\ ( -+ CategoryOrTraversal,``reference``,``value_type`` -+ ) iterator_category; -+ -+ - - ``indirect_iterator`` requirements - .................................. - -Issue 9.40x - --The ``value_type`` of the ``Iterator`` template parameter should --itself be dereferenceable. The return type of the ``operator*`` for --the ``value_type`` must be the same type as the ``Reference`` template --parameter. The ``Value`` template parameter will be the ``value_type`` --for the ``indirect_iterator``, unless ``Value`` is const. If ``Value`` --is ``const X``, then ``value_type`` will be *non-* ``const X``. The --default for ``Value`` is -+The expression ``*v``, where ``v`` is an object of -+``iterator_traits::value_type``, shall be valid -+expression and convertible to ``reference``. ``Iterator`` shall -+model the traversal concept indicated by ``iterator_category``. -+``Value``, ``Reference``, and ``Difference`` shall be chosen so -+that ``value_type``, ``reference``, and ``difference_type`` meet -+the requirements indicated by ``iterator_category``. - --:: -+[Note: there are further requirements on the -+``iterator_traits::value_type`` if the ``Value`` -+parameter is not ``use_default``, as implied by the algorithm for -+deducing the default for the ``value_type`` member.] - -- iterator_traits< iterator_traits::value_type >::value_type - -Issue 9.37x - -+``indirect_iterator`` models -+............................ - --If the default is used for ``Value``, then there must be a valid --specialization of ``iterator_traits`` for the value type of the base --iterator. -+In addition to the concepts indicated by ``iterator_category`` -+and by ``iterator_traversal::type``, a -+specialization of ``indirect_iterator`` models the following -+concepts, Where ``v`` is an object of -+``iterator_traits::value_type``: - --The ``Reference`` parameter will be the ``reference`` type of the --``indirect_iterator``. The default is ``Value&``. -+ * Readable Iterator if ``reference(*v)`` is convertible to -+ ``value_type``. - --The ``Access`` and ``Traversal`` parameters are passed unchanged to --the corresponding parameters of the ``iterator_adaptor`` base --class, and the ``Iterator`` parameter is passed unchanged as the --``Base`` parameter to the ``iterator_adaptor`` base class. -+ * Writable Iterator if ``reference(*v) = t`` is a valid -+ expression (where ``t`` is an object of type -+ ``indirect_iterator::value_type``) - --The indirect iterator will model the most refined standard traversal --concept that is modeled by the ``Iterator`` type. The indirect --iterator will model the most refined standard access concept that is --modeled by the value type of ``Iterator``. -+ * Lvalue Iterator if ``reference`` is a reference type. -+ -+``indirect_iterator`` is interoperable with -+``indirect_iterator`` if and only if ``X`` is -+interoperable with ``Y``. - - - ``indirect_iterator`` operations - ................................ - -Issue 9.37x - -+In addition to the operations required by the concepts described -+above, specializations of ``indirect_iterator`` provide the -+following operations. -+ -+ - -Issue 9.28 and 9.37x - - ``indirect_iterator();`` - - :Requires: ``Iterator`` must be Default Constructible. - :Returns: An instance of ``indirect_iterator`` with -- a default constructed base object. -+ a default-constructed ``m_iterator``. - - -Issue 9.37x - - ``indirect_iterator(Iterator x);`` - - :Returns: An instance of ``indirect_iterator`` with -- the ``iterator_adaptor`` subobject copy constructed from ``x``. -+ ``m_iterator`` copy constructed from ``x``. - - :: - - -Issue 9.29 - -@@ -94,5 +151,27 @@ - ); - - :Requires: ``Iterator2`` is implicitly convertible to ``Iterator``. --:Returns: An instance of ``indirect_iterator`` that is a copy of ``y``. -+:Returns: An instance of ``indirect_iterator`` whose -+ ``m_iterator`` subobject is constructed from ``y.base()``. -+ - -Issue 9.37x - -+``Iterator const& base() const;`` - -+:Returns: ``m_iterator`` -+ -+ -+``reference operator*() const;`` -+ -+:Returns: ``**m_iterator`` -+ -+ -+``indirect_iterator& operator++();`` -+ -+:Effects: ``++m_iterator`` -+:Returns: ``*this`` -+ -+ -+``indirect_iterator& operator--();`` -+ -+:Effects: ``--m_iterator`` -+:Returns: ``*this`` diff --git a/doc/indirect_iterator_ref.html b/doc/indirect_iterator_ref.html deleted file mode 100755 index 08e5018..0000000 --- a/doc/indirect_iterator_ref.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - -
-
-template <
-    class Iterator
-  , class Value = use_default
-  , class CategoryOrTraversal = use_default
-  , class Reference = use_default
-  , class Difference = use_default
->
-class indirect_iterator
-{
- public:
-    typedef /* see below */ value_type;
-    typedef /* see below */ reference;
-    typedef /* see below */ pointer;
-    typedef /* see below */ difference_type;
-    typedef /* see below */ iterator_category;
-
-    indirect_iterator();
-    indirect_iterator(Iterator x);
-
-    template <
-        class Iterator2, class Value2, class Category2
-      , class Reference2, class Difference2
-    >
-    indirect_iterator(
-        indirect_iterator<
-             Iterator2, Value2, Category2, Reference2, Difference2
-        > const& y
-      , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
-    );
-};
-
-

The member types of indirect_iterator are defined according to the -following pseudo-code. We use the abbreviation -V=iterator_traits<Iterator>::value_type and v is an object of -type V.:

-
-if (Value is use_default) then
-    typedef iterator_traits<V>::value_type value_type;
-else
-    typedef remove_const<Value>::type value_type;
-
-if (Reference is use_default) then
-    typedef iterator_traits<V>::reference reference;
-else
-    typedef Reference reference;
-
-typedef Value* pointer;
-
-if (Difference is use_default)
-    typedef iterator_traits<Iterator>::difference_type difference_type;
-else
-    typedef Difference difference_type;
-
-

The member indirect_iterator::iterator_category is a type that -satisfies the requirements of the concepts modeled by the indirect -iterator as specified in the models section.

-
-

indirect_iterator requirements

-

The Iterator argument shall meet the requirements of Readable -Iterator. The CategoryOrTraversal argument shall be one of the -standard iterator tags or use_default. If CategoryOrTraversal -is an iterator tag, the template parameter Iterator argument shall -meet the traversal requirements corresponding to the iterator tag.

-

The expression *v, where v is an object of type -iterator_traits<Iterator>::value_type, must be a valid expression -and must be convertible to indirect_iterator::reference. Also, -there are further requirements on the -iterator_traits<Iterator>::value_type if the Value parameter -is not use_default, as implied by the algorithm for deducing the -default for the value_type member.

-
-
-

indirect_iterator models

-

If CategoryOrTraversal is a standard iterator tag, -indirect_iterator is a model of the iterator concept corresponding -to the tag, otherwise indirect_iterator satisfies the requirements -of the most refined standard traversal concept that is satisfied by -the Iterator argument.

-

indirect_iterator models Readable Iterator. If -indirect_iterator::reference(*v) = t is a valid expression (where -t is an object of type indirect_iterator::value_type) then -indirect_iterator models Writable Iterator. If -indirect_iterator::reference is a reference then -indirect_iterator models Lvalue Iterator.

-
-
-

indirect_iterator operations

-

indirect_iterator();

- --- - - - - - -
Requires:Iterator must be Default Constructible.
Returns:An instance of indirect_iterator with -a default-constructed iterator_adaptor subobject.
-

indirect_iterator(Iterator x);

- --- - - - -
Returns:An instance of indirect_iterator with -the iterator_adaptor subobject copy constructed from x.
-
-template <
-    class Iterator2, class Value2, unsigned Access, class Traversal
-  , class Reference2, class Difference2
->
-indirect_iterator(
-    indirect_iterator<
-         Iterator2, Value2, Access, Traversal, Reference2, Difference2
-    > const& y
-  , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
-);
-
- --- - - - - - -
Requires:Iterator2 is implicitly convertible to Iterator.
Returns:An instance of indirect_iterator whose -iterator_adaptor subobject is constructed from y.base().
-
-
- - diff --git a/doc/indirect_iterator_ref.rst b/doc/indirect_iterator_ref.rst deleted file mode 100644 index 1065659..0000000 --- a/doc/indirect_iterator_ref.rst +++ /dev/null @@ -1,177 +0,0 @@ -:: - - template < - class Iterator - , class Value = use_default - , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class indirect_iterator - { - public: - typedef /* see below */ value_type; - typedef /* see below */ reference; - typedef /* see below */ pointer; - typedef /* see below */ difference_type; - typedef /* see below */ iterator_category; - - indirect_iterator(); - indirect_iterator(Iterator x); - - template < - class Iterator2, class Value2, class Category2 - , class Reference2, class Difference2 - > - indirect_iterator( - indirect_iterator< - Iterator2, Value2, Category2, Reference2, Difference2 - > const& y - , typename enable_if_convertible::type* = 0 // exposition - ); - - Iterator const& base() const; - reference operator*() const; - indirect_iterator& operator++(); - indirect_iterator& operator--(); - private: - Iterator m_iterator; // exposition - }; - - -The member types of ``indirect_iterator`` are defined according to -the following pseudo-code, where ``V`` is -``iterator_traits::value_type`` - -.. parsed-literal:: - - if (Value is use_default) then - typedef remove_const::type>::type value_type; - else - typedef remove_const::type value_type; - - if (Reference is use_default) then - if (Value is use_default) then - typedef indirect_reference::type reference; - else - typedef Value& reference; - else - typedef Reference reference; - - if (Value is use_default) then - typedef pointee::type\* pointer; - else - typedef Value\* pointer; - - if (Difference is use_default) - typedef iterator_traits::difference_type difference_type; - else - typedef Difference difference_type; - - if (CategoryOrTraversal is use_default) - typedef *iterator-category* ( - iterator_traversal::type,``reference``,``value_type`` - ) iterator_category; - else - typedef *iterator-category* ( - CategoryOrTraversal,``reference``,``value_type`` - ) iterator_category; - - -``indirect_iterator`` requirements -.................................. - -The expression ``*v``, where ``v`` is an object of -``iterator_traits::value_type``, shall be valid -expression and convertible to ``reference``. ``Iterator`` shall -model the traversal concept indicated by ``iterator_category``. -``Value``, ``Reference``, and ``Difference`` shall be chosen so -that ``value_type``, ``reference``, and ``difference_type`` meet -the requirements indicated by ``iterator_category``. - -[Note: there are further requirements on the -``iterator_traits::value_type`` if the ``Value`` -parameter is not ``use_default``, as implied by the algorithm for -deducing the default for the ``value_type`` member.] - -``indirect_iterator`` models -............................ - -In addition to the concepts indicated by ``iterator_category`` -and by ``iterator_traversal::type``, a -specialization of ``indirect_iterator`` models the following -concepts, Where ``v`` is an object of -``iterator_traits::value_type``: - - * Readable Iterator if ``reference(*v)`` is convertible to - ``value_type``. - - * Writable Iterator if ``reference(*v) = t`` is a valid - expression (where ``t`` is an object of type - ``indirect_iterator::value_type``) - - * Lvalue Iterator if ``reference`` is a reference type. - -``indirect_iterator`` is interoperable with -``indirect_iterator`` if and only if ``X`` is -interoperable with ``Y``. - - -``indirect_iterator`` operations -................................ - -In addition to the operations required by the concepts described -above, specializations of ``indirect_iterator`` provide the -following operations. - - -``indirect_iterator();`` - -:Requires: ``Iterator`` must be Default Constructible. -:Effects: Constructs an instance of ``indirect_iterator`` with - a default-constructed ``m_iterator``. - - -``indirect_iterator(Iterator x);`` - -:Effects: Constructs an instance of ``indirect_iterator`` with - ``m_iterator`` copy constructed from ``x``. - -:: - - template < - class Iterator2, class Value2, unsigned Access, class Traversal - , class Reference2, class Difference2 - > - indirect_iterator( - indirect_iterator< - Iterator2, Value2, Access, Traversal, Reference2, Difference2 - > const& y - , typename enable_if_convertible::type* = 0 // exposition - ); - -:Requires: ``Iterator2`` is implicitly convertible to ``Iterator``. -:Effects: Constructs an instance of ``indirect_iterator`` whose - ``m_iterator`` subobject is constructed from ``y.base()``. - - -``Iterator const& base() const;`` - -:Returns: ``m_iterator`` - - -``reference operator*() const;`` - -:Returns: ``**m_iterator`` - - -``indirect_iterator& operator++();`` - -:Effects: ``++m_iterator`` -:Returns: ``*this`` - - -``indirect_iterator& operator--();`` - -:Effects: ``--m_iterator`` -:Returns: ``*this`` diff --git a/doc/indirect_reference_ref.rst b/doc/indirect_reference_ref.rst deleted file mode 100755 index f222d7e..0000000 --- a/doc/indirect_reference_ref.rst +++ /dev/null @@ -1,29 +0,0 @@ -.. Copyright David Abrahams 2004. 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) - -:: - - template - struct indirect_reference - { - typedef /* see below */ type; - }; - -:Requires: For an object ``x`` of type ``Dereferenceable``, ``*x`` - is well-formed. If ``++x`` is ill-formed it shall neither be - ambiguous nor shall it violate access control, and - ``pointee::type&`` shall be well-formed. - Otherwise ``iterator_traits::reference`` shall - be well formed. [Note: These requirements need not apply to - explicit or partial specializations of ``indirect_reference``] - -``type`` is determined according to the following algorithm, where -``x`` is an object of type ``Dereferenceable``:: - - if ( ++x is ill-formed ) - return ``pointee::type&`` - else - std::iterator_traits::reference - - \ No newline at end of file diff --git a/doc/interoperability-revisited.rst b/doc/interoperability-revisited.rst deleted file mode 100755 index 6754b9c..0000000 --- a/doc/interoperability-revisited.rst +++ /dev/null @@ -1,232 +0,0 @@ -++++++++++++++++++++++++++++ - Interoperability Revisited -++++++++++++++++++++++++++++ - -:date: $Date$ -:copyright: Copyright Thomas Witt 2004. - - -Problem -======= - -The current iterator_facade specification makes it unneccessarily tedious to -implement interoperable iterators. - -In the following text a simplified example of the current iterator_facade specification is used to -illustrate the problem. - -In the current specification binary operators are implemented in the following way: - -template -struct Facade -{ -}; - -template -struct is_interoperable : - or_< - is_convertible - , is_convertible - > -{}; - -template< - class Derived1 - , class Derived2 -> -enable_if, bool> operator==( - Derived1 const& lhs - , Derived2 const& rhs -) -{ - return static_cast(lhs).equal_to(static_cast -{ - bool equal_to(Mutable const&); -}; - -struct Constant : Facade -{ - Constant(); - Constant(Constant const&); - Constant(Mutable const&); - - ... - - bool equal_to(Constant const&); -}; - -Constant c; -Mutable m; - -c == m; // ok, dispatched to Constant::equal_to -m == c; // !! error, dispatched to Mutable::equal_to - -Instead the following "slightly" more complicated implementation is neccessary - -struct Mutable : Facade -{ - template - enable_if || is_convertible, bool>::type equal_to(T const&); -}; - -struct Constant : Tag -{ - Constant(); - Constant(Constant const&); - Constant(Mutable const&); - - template - enable_if || is_convertible, bool>::type equal_to(T const&); -}; - -Beside the fact that the code is significantly more complex to understand and to teach there is -a major design problem lurking here. Note that in both types equal_to is a function template with -an unconstrained argument T. This is neccessary so that further types can be made interoperable with -Mutable or Constant. Would Mutable be defined as - -struct Mutable : Facade -{ - bool equal_to(Mutable const&); - bool equal_to(Constant const&); -}; - -Constant and Mutable would still be interoperable but no further interoperable could be added -without changing Mutable. Even if this would be considered acceptable the current specification forces -a two way dependency between interoperable types. Note in the templated equal_to case this dependency -is implicitly created when specializing equal_to. - -Solution -======== - -The two way dependency can be avoided by enabling type conversion in the binary operator -implementation. Note that this is the usual way interoperability betwween types is achieved -for binary operators and one reason why binary operators are usually implemented as non-members. - -A simple implementation of this strategy would look like this - -template< - class T1 - , class T2 -> -struct interoperable_base : - if_< - is_convertible< - T2 - , T1 - > - , T1 - , T2> -{}; - - -template< - class Derived1 - , class Derived2 -> -enable_if, bool> operator==( - Derived1 const& lhs - , Derived2 const& rhs -) -{ - typedef interoperable_base< - Derived1 - , Derived2 - >::type Base; - - return static_cast(lhs).equal_to(static_cast -enable_if, bool> operator==( - Derived1 const& lhs - , Derived2 const& rhs -) -{ - return static_cast(lhs).equal_to(static_cast -enable_if, bool> operator==( - Derived1 const& lhs - , Derived2 const& rhs -) -{ - return static_cast(rhs).equal_to(static_cast -{ - Constant(); - Constant(Constant const&); - Constant(Mutable const&); - - ... - - bool equal_to(Constant const&); - bool equal_to(Mutable const&); -}; - -c == m; // ok, dispatched to Constant::equal_to(Mutable const&), no conversion -m == c; // ok, dispatched to Constant::equal_to(Mutable const&), no conversion - -This definition of operator== introduces a possible ambiguity when both types are convertible -to each other. I don't think this is a problem as this behaviour is the same with concrete types. -I.e. - -struct A {}; - -bool operator==(A, A); - -struct B { B(A); }; - -bool operator==(B, B); - -A a; -B b(a); - -a == b; // error, ambiguous overload - -Effect -====== - -Iterator implementations using iterator_facade look exactly as if they were -"hand-implemented" (I am working on better wording). - -a) Less burden for the user - -b) The definition (standardese) of specialized adpters might be easier - (This has to be proved yet) \ No newline at end of file diff --git a/doc/issues.html b/doc/issues.html deleted file mode 100755 index 8087b45..0000000 --- a/doc/issues.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - -Problem with is_writable and is_swappable in N1550 - - - -
-

Problem with is_writable and is_swappable in N1550

- --- - - - - - - - - - - - -
Author:David Abrahams and Jeremy Siek
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu
Organization:Boost Consulting, Indiana University Bloomington
date:$Date$
Copyright:Copyright David Abrahams, Jeremy Siek 2003. 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)
- -
-

Introduction

-

The is_writable and is_swappable traits classes in N1550 -provide a mechanism for determining at compile time if an iterator -type is a model of the new Writable Iterator and Swappable Iterator -concepts, analogous to iterator_traits<X>::iterator_category -for the old iterator concepts. For backward compatibility, -is_writable and is_swappable not only work with new -iterators, but they also are intended to work for old -iterators (iterators that meet the requirements for one of the -iterator concepts in the current standard). In the case of old -iterators, the writability and swapability is deduced based on the -iterator_category and also the reference type. The -specification for this deduction gives false positives for forward -iterators that have non-assignable value types.

-

To review, the part of the is_writable trait definition which -applies to old iterators is:

-
-if (cat is convertible to output_iterator_tag)
-    return true;
-else if (cat is convertible to forward_iterator_tag
-         and iterator_traits<Iterator>::reference is a 
-             mutable reference)
-    return true;
-else
-    return false;
-
-

Suppose the value_type of the iterator It has a private -assignment operator:

-
-class B {
-public:
-  ...
-private:
-  B& operator=(const B&);
-};
-
-

and suppose the reference type of the iterator is B&. In -that case, is_writable<It>::value will be true when in fact -attempting to write into B will cause an error.

-

The same problem applies to is_swappable.

-
-
-

Proposed Resolution

-
    -
  1. Remove the is_writable and is_swappable traits, and remove the -requirements in the Writable Iterator and Swappable Iterator concepts -that require their models to support these traits.

    -
  2. -
  3. Change the is_readable specification to be: -is_readable<X>::type is true_type if the -result type of X::operator* is convertible to -iterator_traits<X>::value_type and is false_type -otherwise. Also, is_readable is required to satisfy -the requirements for the UnaryTypeTrait concept -(defined in the type traits proposal).

    -

    Remove the requirement for support of the is_readable trait from -the Readable Iterator concept.

    -
  4. -
  5. Remove the iterator_tag class.

    -
  6. -
  7. Change the specification of traversal_category to:

    -
    -traversal-category(Iterator) =
    -    let cat = iterator_traits<Iterator>::iterator_category
    -    if (cat is convertible to incrementable_iterator_tag)
    -      return cat; // Iterator is a new iterator
    -    else if (cat is convertible to random_access_iterator_tag)
    -        return random_access_traversal_tag;
    -    else if (cat is convertible to bidirectional_iterator_tag)
    -        return bidirectional_traversal_tag;
    -    else if (cat is convertible to forward_iterator_tag)
    -        return forward_traversal_tag;
    -    else if (cat is convertible to input_iterator_tag)
    -        return single_pass_iterator_tag;
    -    else if (cat is convertible to output_iterator_tag)
    -        return incrementable_iterator_tag;
    -    else
    -        return null_category_tag;
    -
    -
  8. -
-
-
-

Rationale

-
    -
  1. There are two reasons for removing is_writable -and is_swappable. The first is that we do not know of -a way to fix the specification so that it gives the correct -answer for all iterators. Second, there was only a weak -motivation for having is_writable and is_swappable -there in the first place. The main motivation was simply -uniformity: we have tags for the old iterator categories -so we should have tags for the new iterator categories. -While having tags and the capability to dispatch based -on the traversal categories is often used, we see -less of a need for dispatching based on writability -and swappability, since typically algorithms -that need these capabilities have no alternative if -they are not provided.
  2. -
  3. We discovered that the is_readable trait can be implemented -using only the iterator type itself and its value_type. -Therefore we remove the requirement for is_readable from the -Readable Iterator concept, and change the definition of -is_readable so that it works for any iterator type.
  4. -
  5. The purpose of the iterator_tag class was to -bundle the traversal and access category tags -into the iterator_category typedef. -With is_writable and is_swappable gone, and -is_readable no longer in need of special hints, -there is no reason for iterators to provide -information about the access capabilities of an iterator. -Thus there is no need for the iterator_tag. The -traversal tag can be directly used for the -iterator_category. If a new iterator is intended to be backward -compatible with old iterator concepts, a tag type -that is convertible to both one of the new traversal tags -and also to an old iterator tag can be created and use -for the iterator_category.
  6. -
  7. The changes to the specification of traversal_category are a -direct result of the removal of iterator_tag.
  8. -
-
-
- - diff --git a/doc/issues.rst b/doc/issues.rst deleted file mode 100755 index 5ddb61f..0000000 --- a/doc/issues.rst +++ /dev/null @@ -1,152 +0,0 @@ -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - Problem with ``is_writable`` and ``is_swappable`` in N1550_ -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -.. _N1550: http://www.boost-consulting.com/writing/n1550.html -.. _N1530: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1530.html - -:Author: David Abrahams and Jeremy Siek -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu -:Organization: `Boost Consulting`_, Indiana University Bloomington -:date: $Date$ -:Copyright: Copyright David Abrahams, Jeremy Siek 2003. 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) - -.. _`Boost Consulting`: http://www.boost-consulting.com - -.. contents:: Table of Contents - -============== - Introduction -============== - -The ``is_writable`` and ``is_swappable`` traits classes in N1550_ -provide a mechanism for determining at compile time if an iterator -type is a model of the new Writable Iterator and Swappable Iterator -concepts, analogous to ``iterator_traits::iterator_category`` -for the old iterator concepts. For backward compatibility, -``is_writable`` and ``is_swappable`` not only work with new -iterators, but they also are intended to work for old -iterators (iterators that meet the requirements for one of the -iterator concepts in the current standard). In the case of old -iterators, the writability and swapability is deduced based on the -``iterator_category`` and also the ``reference`` type. The -specification for this deduction gives false positives for forward -iterators that have non-assignable value types. - -To review, the part of the ``is_writable`` trait definition which -applies to old iterators is:: - - if (cat is convertible to output_iterator_tag) - return true; - else if (cat is convertible to forward_iterator_tag - and iterator_traits::reference is a - mutable reference) - return true; - else - return false; - -Suppose the ``value_type`` of the iterator ``It`` has a private -assignment operator:: - - class B { - public: - ... - private: - B& operator=(const B&); - }; - -and suppose the ``reference`` type of the iterator is ``B&``. In -that case, ``is_writable::value`` will be true when in fact -attempting to write into ``B`` will cause an error. - -The same problem applies to ``is_swappable``. - - -==================== - Proposed Resolution -==================== - -1. Remove the ``is_writable`` and ``is_swappable`` traits, and remove the - requirements in the Writable Iterator and Swappable Iterator concepts - that require their models to support these traits. - -2. Change the ``is_readable`` specification to be: - ``is_readable::type`` is ``true_type`` if the - result type of ``X::operator*`` is convertible to - ``iterator_traits::value_type`` and is ``false_type`` - otherwise. Also, ``is_readable`` is required to satisfy - the requirements for the UnaryTypeTrait concept - (defined in the type traits proposal). - - Remove the requirement for support of the ``is_readable`` trait from - the Readable Iterator concept. - - -3. Remove the ``iterator_tag`` class. - -4. Change the specification of ``traversal_category`` to:: - - traversal-category(Iterator) = - let cat = iterator_traits::iterator_category - if (cat is convertible to incrementable_iterator_tag) - return cat; // Iterator is a new iterator - else if (cat is convertible to random_access_iterator_tag) - return random_access_traversal_tag; - else if (cat is convertible to bidirectional_iterator_tag) - return bidirectional_traversal_tag; - else if (cat is convertible to forward_iterator_tag) - return forward_traversal_tag; - else if (cat is convertible to input_iterator_tag) - return single_pass_iterator_tag; - else if (cat is convertible to output_iterator_tag) - return incrementable_iterator_tag; - else - return null_category_tag; - - -========== - Rationale -========== - -1. There are two reasons for removing ``is_writable`` - and ``is_swappable``. The first is that we do not know of - a way to fix the specification so that it gives the correct - answer for all iterators. Second, there was only a weak - motivation for having ``is_writable`` and ``is_swappable`` - there in the first place. The main motivation was simply - uniformity: we have tags for the old iterator categories - so we should have tags for the new iterator categories. - While having tags and the capability to dispatch based - on the traversal categories is often used, we see - less of a need for dispatching based on writability - and swappability, since typically algorithms - that need these capabilities have no alternative if - they are not provided. - -2. We discovered that the ``is_readable`` trait can be implemented - using only the iterator type itself and its ``value_type``. - Therefore we remove the requirement for ``is_readable`` from the - Readable Iterator concept, and change the definition of - ``is_readable`` so that it works for any iterator type. - -3. The purpose of the ``iterator_tag`` class was to - bundle the traversal and access category tags - into the ``iterator_category`` typedef. - With ``is_writable`` and ``is_swappable`` gone, and - ``is_readable`` no longer in need of special hints, - there is no reason for iterators to provide - information about the access capabilities of an iterator. - Thus there is no need for the ``iterator_tag``. The - traversal tag can be directly used for the - ``iterator_category``. If a new iterator is intended to be backward - compatible with old iterator concepts, a tag type - that is convertible to both one of the new traversal tags - and also to an old iterator tag can be created and use - for the ``iterator_category``. - -4. The changes to the specification of ``traversal_category`` are a - direct result of the removal of ``iterator_tag``. - diff --git a/doc/iter-issue-list.html b/doc/iter-issue-list.html deleted file mode 100755 index 695b466..0000000 --- a/doc/iter-issue-list.html +++ /dev/null @@ -1,5271 +0,0 @@ - - - - - - -Iterator concept and adapter issues - - - - - -
-

Iterator concept and adapter issues

- --- - - - - - -
Date:2004-01-21
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
-
-

Index

- -
-
-

Issues from Matt's TR issues list

-
-

9.1 iterator_access overspecified?

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

The proposal includes:

-
-enum iterator_access { 
-   readable_iterator = 1, writable_iterator = 2,
-   swappable_iterator = 4, lvalue_iterator = 8
-}; 
-
-

In general, the standard specifies thing like this as a bitmask -type with a list of defined names, and specifies neither the exact -type nor the specific values. Is there a reason for iterator_access -to be more specific?

- --- - - - - -
Proposed resolution:
 The iterator_access enum will be removed, -so this is no longer an issue. See the resolution to 9.15.
-
-
-

9.2 operators of iterator_facade overspecified

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

In general, we've provided operational semantics for things like -operator++. That is, we've said that ++iter must work, without -requiring either a member function or a non-member function. -iterator_facade specifies most operators as member -functions. There's no inherent reason for these to be members, so -we should remove this requirement. Similarly, some operations are -specified as non-member functions but could be implemented as -members. Again, the standard doesn't make either of these choices, -and TR1 shouldn't, either. So: operator*(), operator++(), -operator++(int), operator--(), operator--(int), -operator+=, operator-=, operator-(difference_type), -operator-(iterator_facade instance), and operator+ should -be specified with operational semantics and not explicitly required -to be members or non-members.

- --- - - - - - - -
Proposed resolution:
 Not a defect.
Rationale:The standard uses valid expressions such as ++iter -in requirements tables, such as for input iterator. However, for -classes, such as reverse_iterator, the standard uses function -prototypes, as we have done here for -iterator_facade. Further, the prototype specification does -not prevent the implementor from using members or non-members, -since nothing the user can do in a conforming program can detect -how the function is implemented.
-
-
-

9.3 enable_if_interoperable needs standardese

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

The only discussion of what this means is in a note, so is -non-normative. Further, the note seems to be incorrect. It says -that enable_if_interoperable only works for types that "are -interoperable, by which we mean they are convertible to each -other." This requirement is too strong: it should be that one of -the types is convertible to the other. N1541 48

- --- - - - - -
Proposed resolution:
 

Add normative text. Relax requirements in the -proposed way.

-

Change:

-
-[Note: The enable_if_interoperable template used above is -for exposition purposes. The member operators should be only be -in an overload set provided the derived types Dr1 and -Dr2 are interoperable, by which we mean they are -convertible to each other. The enable_if_interoperable -approach uses SFINAE to take the operators out of the overload -set when the types are not interoperable.]
-

To:

-
-

The enable_if_interoperable template used above is for -exposition purposes. The member operators should only be in an -overload set provided the derived types Dr1 and Dr2 are -interoperable, meaning that at least one of the types is -convertible to the other. The enable_if_interoperable -approach uses SFINAE to take the operators out of the overload -set when the types are not interoperable. The operators should -behave as-if enable_if_interoperable were defined to be:

-
-template <bool, typename> enable_if_interoperable_impl
-{};
-
-template <typename T> enable_if_interoperable_impl<true,T>
-{ typedef T type; };
-
-template<typename Dr1, typename Dr2, typename T>
-struct enable_if_interoperable
-  : enable_if_interoperable_impl<
-        is_convertible<Dr1,Dr2>::value || is_convertible<Dr2,Dr1>::value
-      , T
-    >
-{};
-
-
-
-
-
-

9.4 enable_if_convertible unspecified, conflicts with requires

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

In every place where enable_if_convertible is used it's used like -this (simplified):

-
-template<class T>
-struct C
-{
-  template<class T1>
-  C(T1, enable_if_convertible<T1, T>::type* = 0);
-};
-
-

The idea being that this constructor won't compile if T1 isn't -convertible to T. As a result, the constructor won't be considered -as a possible overload when constructing from an object x where the -type of x isn't convertible to T. In addition, however, each of -these constructors has a requires clause that requires -convertibility, so the behavior of a program that attempts such a -construction is undefined. Seems like the enable_if_convertible -part is irrelevant, and should be removed. There are two -problems. First, enable_if_convertible is never specified, so we -don't know what this is supposed to do. Second: we could reasonably -say that this overload should be disabled in certain cases or we -could reasonably say that behavior is undefined, but we can't say -both.

-

Thomas Witt writes that the goal of putting in -enable_if_convertible here is to make sure that a specific overload -doesn't interfere with the generic case except when that overload -makes sense. He agrees that what we currently have is deficient. -Dave Abrahams writes that there is no conflict with the requires -cause because the requires clause only takes effect when the -function is actually called. The presence of the constructor -signature can/will be detected by is_convertible without violating -the requires clause, and thus it makes a difference to disable -those constructor instantiations that would be disabled by -enable_if_convertible even if calling them invokes undefined -behavior. There was more discussion on the reflector: -c++std-lib-12312, c++std-lib-12325, c++std-lib- 12330, -c++std-lib-12334, c++std-lib-12335, c++std-lib-12336, -c++std-lib-12338, c++std-lib- 12362.

- --- - - - - -
Proposed resolution:
 

Change:

-
-[Note: The enable_if_convertible<X,Y>::type expression -used in this section is for exposition purposes. The converting -constructors for specialized adaptors should be only be in an -overload set provided that an object of type X is -implicitly convertible to an object of type Y. The -enable_if_convertible approach uses SFINAE to take the -constructor out of the overload set when the types are not -implicitly convertible.]
-

To:

-
-

The enable_if_convertible<X,Y>::type expression used in -this section is for exposition purposes. The converting -constructors for specialized adaptors should be only be in an -overload set provided that an object of type X is -implicitly convertible to an object of type Y. The -signatures involving enable_if_convertible should behave -as-if enable_if_convertible were defined to be:

-
-template <bool> enable_if_convertible_impl
-{};
-
-template <> enable_if_convertible_impl<true>
-{ struct type; };
-
-template<typename From, typename To>
-struct enable_if_convertible
-  : enable_if_convertible_impl<is_convertible<From,To>::value>
-{};
-
-

If an expression other than the default argument is used to -supply the value of a function parameter whose type is written -in terms of enable_if_convertible, the program is -ill-formed, no diagnostic required.

-

[Note: The enable_if_convertible approach uses SFINAE to -take the constructor out of the overload set when the types are -not implicitly convertible. ]

-
-
-
-
-

9.5 iterator_adaptor has an extraneous 'bool' at the start of the template definition

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

The title says it all; this is probably just a typo.

- --- - - - - -
Proposed resolution:
 Remove the 'bool'.
-
-
-

9.6 Name of private member shouldn't be normative

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

iterator_adaptor has a private member named m_iterator. Presumably -this is for exposition only, since it's an implementation -detail. It needs to be marked as such.

- --- - - - - -
Proposed resolution:
 
-
Mark the member m_iterator as exposition
-
only. Note/DWA: I think this is NAD because the user can't -detect it, though I'm happy to mark it exposition only.
-
-

In [lib.iterator.adaptor]

-

Change:

-
-Base m_iterator;
-
-

to:

-
-Base m_iterator; // exposition only
-
-
-
-
-

9.7 iterator_adaptor operations specifications are a bit inconsistent

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

iterator_adpator() has a Requires clause, that Base must be default -constructible. iterator_adaptor(Base) has no Requires clause, -although the Returns clause says that the Base member is copy -construced from the argument (this may actually be an oversight in -N1550, which doesn't require iterators to be copy constructible or -assignable).

- --- - - - - -
Proposed resolution:
 

Add a requirements section for the template -parameters of iterator_adaptor, and state that Base must be Copy -Constructible and Assignable.

-

N1550 does in fact include requirements for copy constructible -and assignable in the requirements tables. To clarify, we've also -added the requirements to the text.

-
-
-
-

9.8 Specialized adaptors text should be normative

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

similar to 9.3, "Specialized Adaptors" has a note describing -enable_if_convertible. This should be normative text.

- --- - - - - -
Proposed resolution:
 Changed it to normative -text. See the resolution of 9.4
-
-
-

9.9 Reverse_iterator text is too informal

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

reverse iterator "flips the direction of the base iterator's -motion". This needs to be more formal, as in the current -standard. Something like: "iterates through the controlled sequence -in the opposite direction"

- --- - - - - -
Proposed resolution:
 

Change:

-
-The reverse iterator adaptor flips the direction of a base -iterator's motion. Invoking operator++() moves the base -iterator backward and invoking operator--() moves the base -iterator forward.
-

to:

-
-The reverse iterator adaptor iterates through the adapted iterator -range in the opposite direction.
-
-
-
-

9.10 'prior' is undefined

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

reverse_iterator::dereference is specified as calling a function -named 'prior' which has no specification.

- --- - - - - - - -
Proposed resolution:
 

Change the specification to avoid using prior as follows.

-

Remove:

-
-typename reverse_iterator::reference dereference() const { return *prior(this->base()); }
-
-

And at the end of the operations section add:

-
-

reference operator*() const;

- --- - - - -
Effects:
-
-Iterator tmp = m_iterator;
-return *--tmp;
-
-
-
Rationale:The style of specification has changed because of issue 9.37x.
-
-
-

9.11 "In other words" is bad wording

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

Transform iterator has a two-part specification: it does this, in -other words, it does that. "In other words" always means "I didn't -say it right, so I'll try again." We need to say it once.

- --- - - - - -
Proposed resolution:
 

Change:

-
-The transform iterator adapts an iterator by applying some function -object to the result of dereferencing the iterator. In other words, -the operator* of the transform iterator first dereferences the -base iterator, passes the result of this to the function object, and -then returns the result.
-

to:

-
-The transform iterator adapts an iterator by modifying the -operator* to apply a function object to the result of -dereferencing the iterator and returning the result.
-
-
-
-

9.12 Transform_iterator shouldn't mandate private member

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

transform_iterator has a private member named 'm_f' which should be -marked "exposition only."

- --- - - - - -
Proposed resolution:
 

Mark the member m_f as exposition -only. Note/DWA: I think this is NAD because the user can't -detect it, though I'm happy to mark it exposition only.

-

Change:

-
-UnaryFunction m_f;
-
-

to:

-
-UnaryFunction m_f;   // exposition only
-
-
-
-
-

9.13 Unclear description of counting iterator

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

The description of Counting iterator is unclear. "The counting -iterator adaptor implements dereference by returning a reference to -the base object. The other operations are implemented by the base -m_iterator, as per the inheritance from iterator_adaptor."

- --- - - - - -
Proposed resolution:
 

Change:

-
-The counting iterator adaptor implements dereference by -returning a reference to the base object. The other operations -are implemented by the base m_iterator, as per the -inheritance from iterator_adaptor.
-

to:

-
-counting_iterator adapts an object by adding an -operator* that returns the current value of the object. All -other iterator operations are forwarded to the adapted object.
-
-
-
-

9.14 Counting_iterator's difference type

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

Counting iterator has the following note:

-
-[Note: implementers are encouraged to provide an implementation -of distance_to and a difference_type that avoids overflows in the -cases when the Incrementable type is a numeric type.]
-

I'm not sure what this means. The user provides a template argument -named Difference, but there's no difference_type. I assume this is -just a glitch in the wording. But if implementors are encouraged to -ignore this argument if it won't work right, why is it there?

- --- - - - - -
Proposed resolution:
 The difference_type was inherited from -iterator_adaptor. However, we've removed the explicit -inheritance, so explicit typedefs have been added. See the -resolution of 9.37x.
-
-
-

9.15 How to detect lvalueness?

- --- - - - - - -
Submitter:Dave Abrahams
Status:New
-

Shortly after N1550 was accepted, we discovered that an iterator's -lvalueness can be determined knowing only its value_type. This -predicate can be calculated even for old-style iterators (on whose -reference type the standard places few requirements). A trait in -the Boost iterator library does it by relying on the compiler's -unwillingness to bind an rvalue to a T& function template -parameter. Similarly, it is possible to detect an iterator's -readability knowing only its value_type. Thus, any interface which -asks the user to explicitly describe an iterator's lvalue-ness or -readability seems to introduce needless complexity.

- --- - - - - -
Proposed resolution:
 
    -
  1. Remove the is_writable and is_swappable traits, and -remove the requirements in the Writable Iterator and Swappable -Iterator concepts that require their models to support these -traits.
  2. -
  3. Change the is_readable specification. Remove the -requirement for support of the is_readable trait from the -Readable Iterator concept.
  4. -
  5. Remove the iterator_tag class and transplant the logic for -choosing an iterator category into iterator_facade.
  6. -
  7. Change the specification of traversal_category.
  8. -
  9. Remove Access parameters from N1530
  10. -
-

In N1550:

-

Remove:

-
-

Since the access concepts are not related via refinement, but -instead cover orthogonal issues, we do not use tags for the -access concepts, but instead use the equivalent of a bit field.

-

We provide an access mechanism for mapping iterator types to -the new traversal tags and access bit field. Our design reuses -iterator_traits<Iter>::iterator_category as the access -mechanism. To that end, the access and traversal information is -bundled into a single type using the following iterator_tag -class.

-
-enum iterator_access { readable_iterator = 1, writable_iterator = 2, 
-    swappable_iterator = 4, lvalue_iterator = 8 };
-
-template <unsigned int access_bits, class TraversalTag>
-struct iterator_tag : /* appropriate old category or categories */ {
-  static const iterator_access access =
-    (iterator_access)access_bits & 
-      (readable_iterator | writable_iterator | swappable_iterator);
-  typedef TraversalTag traversal;
-};
-
-

The access_bits argument is declared to be unsigned int -instead of the enum iterator_access for convenience of -use. For example, the expression (readable_iterator | -writable_iterator) produces an unsigned int, not an -iterator_access. The purpose of the lvalue_iterator -part of the iterator_access enum is to communicate to -iterator_tag whether the reference type is an lvalue so -that the appropriate old category can be chosen for the base -class. The lvalue_iterator bit is not recorded in the -iterator_tag::access data member.

-

The iterator_tag class template is derived from the -appropriate iterator tag or tags from the old requirements -based on the access bits and traversal tag passed as template -parameters. The algorithm for determining the old tag or tags -picks the least refined old concepts that include all of the -requirements of the access and traversal concepts (that is, the -closest fit), if any such category exists. For example, the -category tag for a Readable Single Pass Iterator will always be -derived from input_iterator_tag, while the category tag for -a Single Pass Iterator that is both Readable and Writable will -be derived from both input_iterator_tag and -output_iterator_tag.

-

We also provide several helper classes that make it convenient -to obtain the access and traversal characteristics of an -iterator. These helper classes work both for iterators whose -iterator_category is iterator_tag and also for -iterators using the original iterator categories.

-
-template <class Iterator> struct is_readable  { typedef ... type; };
-template <class Iterator> struct is_writable { typedef ... type; };
-template <class Iterator> struct is_swappable { typedef ... type; };
-template <class Iterator> struct traversal_category { typedef ... type; };
-
-
-

After:

-
-Like the old iterator requirements, we provide tags for -purposes of dispatching based on the traversal concepts. The -tags are related via inheritance so that a tag is convertible -to another tag if the concept associated with the first tag is -a refinement of the second tag.
-

Add:

-
-

Our design reuses iterator_traits<Iter>::iterator_category -to indicate an iterator's traversal capability. To specify -capabilities not captured by any old-style iterator category, -an iterator designer can use an iterator_category type that -is convertible to both the the most-derived old iterator -category tag which fits, and the appropriate new iterator -traversal tag.

-

We do not provide tags for the purposes of dispatching based on -the access concepts, in part because we could not find a way to -automatically infer the right access tags for old-style -iterators. An iterator's writability may be dependent on the -assignability of its value_type and there's no known way to -detect whether an arbitrary type is assignable. Fortunately, -the need for dispatching based on access capability is not as -great as the need for dispatching based on traversal -capability.

-
-

From the Readable Iterator Requirements table, remove:

-
- ----- - - - - - - -
is_readable<X>::typetrue_type 
-
-

From the Writable Iterator Requirements table, remove:

-
- ----- - - - - - - -
is_writable<X>::typetrue_type 
-
-

From the Swappable Iterator Requirements table, remove:

-
- ----- - - - - - - -
is_swappable<X>::typetrue_type 
-
-

From [lib.iterator.synopsis] replace:

-
-template <class Iterator> struct is_readable;
-template <class Iterator> struct is_writable;
-template <class Iterator> struct is_swappable;
-template <class Iterator> struct traversal_category;
-
-enum iterator_access { readable_iterator = 1, writable_iterator = 2, 
-    swappable_iterator = 4, lvalue_iterator = 8 };
-
-template <unsigned int access_bits, class TraversalTag>
-struct iterator_tag : /* appropriate old category or categories */ {
-  static const iterator_access access =
-    (iterator_access)access_bits & 
-      (readable_iterator | writable_iterator | swappable_iterator);
-  typedef TraversalTag traversal;
-};
-
-

with:

-
-template <class Iterator> struct is_readable_iterator;
-template <class Iterator> struct iterator_traversal;
-
-

In [lib.iterator.traits], remove:

-
-

The iterator_tag class template is an iterator category tag -that encodes the access enum and traversal tag in addition to -being compatible with the original iterator tags. The -iterator_tag class inherits from one of the original -iterator tags according to the following pseudo-code.

-
-inherit-category(access, traversal-tag) =
-     if ((access & readable_iterator) && (access & lvalue_iterator)) {
-         if (traversal-tag is convertible to random_access_traversal_tag)
-             return random_access_iterator_tag;
-         else if (traversal-tag is convertible to bidirectional_traversal_tag)
-             return bidirectional_iterator_tag;
-         else if (traversal-tag is convertible to forward_traversal_tag)
-             return forward_iterator_tag;
-         else if (traversal-tag is convertible to single_pass_traversal_tag)
-             if (access-tag is convertible to writable_iterator_tag)
-                 return input_output_iterator_tag;
-             else
-                 return input_iterator_tag;
-         else
-             return null_category_tag;
-     } else if ((access & readable_iterator) and (access & writable_iterator)
-                and traversal-tag is convertible to single_pass_iterator_tag)
-         return input_output_iterator_tag;
-     else if (access & readable_iterator
-              and traversal-tag is convertible to single_pass_iterator_tag)
-         return input_iterator_tag;
-     else if (access & writable_iterator
-              and traversal-tag is convertible to incrementable_iterator_tag)
-         return output_iterator_tag;
-     else
-         return null_category_tag;
-
-

If the argument for TraversalTag is not convertible to -incrementable_iterator_tag then the program is ill-formed.

-
-

Change:

-
-

The is_readable, is_writable, is_swappable, and -traversal_category class templates are traits classes. For -iterators whose iterator_traits<Iter>::iterator_category -type is iterator_tag, these traits obtain the access -enum and traversal member type from within -iterator_tag. For iterators whose -iterator_traits<Iter>::iterator_category type is not -iterator_tag and instead is a tag convertible to one of the -original tags, the appropriate traversal tag and access bits -are deduced. The following pseudo-code describes the -algorithm.

-
-is-readable(Iterator) = 
-    cat = iterator_traits<Iterator>::iterator_category;
-    if (cat == iterator_tag<Access,Traversal>)
-        return Access & readable_iterator;
-    else if (cat is convertible to input_iterator_tag)
-        return true;
-    else
-        return false;
-
-is-writable(Iterator) =
-    cat = iterator_traits<Iterator>::iterator_category;
-    if (cat == iterator_tag<Access,Traversal>)
-        return Access & writable_iterator;
-    else if (cat is convertible to output_iterator_tag)
-         return true;
-    else if (
-         cat is convertible to forward_iterator_tag
-         and iterator_traits<Iterator>::reference is a 
-             mutable reference)
-        return true;
-    else
-        return false;
-
-is-swappable(Iterator) =
-    cat = iterator_traits<Iterator>::iterator_category;
-    if (cat == iterator_tag<Access,Traversal>)
-        return Access & swappable_iterator;
-    else if (cat is convertible to forward_iterator_tag) {
-        if (iterator_traits<Iterator>::reference is a const reference)
-            return false;
-        else
-            return true;
-    } else 
-        return false;
-
-traversal-category(Iterator) =
-    cat = iterator_traits<Iterator>::iterator_category;
-    if (cat == iterator_tag<Access,Traversal>)
-        return Traversal;
-    else if (cat is convertible to random_access_iterator_tag)
-        return random_access_traversal_tag;
-    else if (cat is convertible to bidirectional_iterator_tag)
-        return bidirectional_traversal_tag;
-    else if (cat is convertible to forward_iterator_tag)
-        return forward_traversal_tag;
-    else if (cat is convertible to input_iterator_tag)
-        return single_pass_iterator_tag;
-    else if (cat is convertible to output_iterator_tag)
-        return incrementable_iterator_tag;
-    else
-        return null_category_tag;
-
-

The following specializations provide the access and traversal -category tags for pointer types.

-
-template <typename T>
-struct is_readable<const T*> { typedef true_type type; };
-template <typename T>
-struct is_writable<const T*> { typedef false_type type; };
-template <typename T>
-struct is_swappable<const T*> { typedef false_type type; };
-
-template <typename T>
-struct is_readable<T*> { typedef true_type type; };
-template <typename T>
-struct is_writable<T*> { typedef true_type type; };
-template <typename T>
-struct is_swappable<T*> { typedef true_type type; };
-
-template <typename T>
-struct traversal_category<T*>
-{
-  typedef random_access_traversal_tag type;
-};
-
-
-

to:

-
-

The is_readable_iterator class template satisfies the -UnaryTypeTrait requirements.

-

Given an iterator type X, -is_readable_iterator<X>::value yields true if, for an -object a of type X, *a is convertible to -iterator_traits<X>::value_type, and false otherwise.

-

iterator_traversal<X>::type is

-
-category-to-traversal(iterator_traits<X>::iterator_category) 
-
-

where category-to-traversal is defined as follows

-
-category-to-traversal(C) =
-    if (C is convertible to incrementable_traversal_tag)
-        return C;
-    else if (C is convertible to random_access_iterator_tag)
-        return random_access_traversal_tag;
-    else if (C is convertible to bidirectional_iterator_tag)
-        return bidirectional_traversal_tag;
-    else if (C is convertible to forward_iterator_tag)
-        return forward_traversal_tag;
-    else if (C is convertible to input_iterator_tag)
-        return single_pass_traversal_tag;
-    else if (C is convertible to output_iterator_tag)
-        return incrementable_traversal_tag;
-    else
-        the program is ill-formed
-
-
-

In N1530:

-

In [lib.iterator.helper.synopsis]:

-

Change:

-
-const unsigned use_default_access = -1;
-
-struct iterator_core_access { /* implementation detail */ };
-
-template <
-    class Derived
-  , class Value
-  , unsigned AccessCategory
-  , class TraversalCategory
-  , class Reference  = Value&
-  , class Difference = ptrdiff_t
->
-class iterator_facade;
-
-template <
-    class Derived
-  , class Base
-  , class Value      = use_default
-  , unsigned Access  = use_default_access
-  , class Traversal  = use_default
-  , class Reference  = use_default
-  , class Difference = use_default
->
-class iterator_adaptor;
-
-template <
-    class Iterator
-  , class Value = use_default
-  , unsigned Access  = use_default_access
-  , class Traversal  = use_default
-  , class Reference = use_default
-  , class Difference = use_default
->
-class indirect_iterator;
-
-

To:

-
-struct iterator_core_access { /* implementation detail */ };
-
-template <
-    class Derived
-  , class Value
-  , class CategoryOrTraversal
-  , class Reference  = Value&
-  , class Difference = ptrdiff_t
->
-class iterator_facade;
-
-template <
-    class Derived
-  , class Base
-  , class Value      = use_default
-  , class CategoryOrTraversal  = use_default
-  , class Reference  = use_default
-  , class Difference = use_default
->
-class iterator_adaptor;
-
-template <
-    class Iterator
-  , class Value = use_default
-  , class CategoryOrTraversal = use_default
-  , class Reference = use_default
-  , class Difference = use_default
->
-class indirect_iterator;
-
-

Change:

-
-template <
-    class Incrementable
-  , unsigned Access  = use_default_access
-  , class Traversal  = use_default
-  , class Difference = use_default
->
-class counting_iterator
-
-

To:

-
-template <
-    class Incrementable
-  , class CategoryOrTraversal  = use_default
-  , class Difference = use_default
->
-class counting_iterator;
-
-

In [lib.iterator.facade]:

-

Change:

-
-template <
-    class Derived
-  , class Value
-  , unsigned AccessCategory
-  , class TraversalCategory
-  , class Reference  = /* see below */
-  , class Difference = ptrdiff_t
->
-class iterator_facade {
-
-

to:

-
-template <
-    class Derived
-  , class Value
-  , class CategoryOrTraversal
-  , class Reference  = Value&
-  , class Difference = ptrdiff_t
->
-class iterator_facade {
-
-

Change:

-
-typedef iterator_tag<AccessCategory, TraversalCategory> iterator_category;
-
-

to:

-
-typedef /* see below */ iterator_category;
-
-

Change:

-
-// Comparison operators
-template <class Dr1, class V1, class AC1, class TC1, class R1, class D1,
-          class Dr2, class V2, class AC2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1, Dr2, bool>::type // exposition
-operator ==(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs,
-            iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs);
-
-template <class Dr1, class V1, class AC1, class TC1, class R1, class D1,
-          class Dr2, class V2, class AC2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1, Dr2, bool>::type
-operator !=(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs,
-            iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs);
-
-template <class Dr1, class V1, class AC1, class TC1, class R1, class D1,
-          class Dr2, class V2, class AC2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1, Dr2, bool>::type
-operator <(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs,
-           iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs);
-
-template <class Dr1, class V1, class AC1, class TC1, class R1, class D1,
-          class Dr2, class V2, class AC2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1, Dr2, bool>::type
-operator <=(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs,
-            iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs);
-
-template <class Dr1, class V1, class AC1, class TC1, class R1, class D1,
-          class Dr2, class V2, class AC2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1, Dr2, bool>::type
-operator >(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs,
-           iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs);
-
-template <class Dr1, class V1, class AC1, class TC1, class R1, class D1,
-          class Dr2, class V2, class AC2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1, Dr2, bool>::type
-operator >=(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs,
-            iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs);
-
-template <class Dr1, class V1, class AC1, class TC1, class R1, class D1,
-          class Dr2, class V2, class AC2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1, Dr2, bool>::type
-operator >=(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs,
-            iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs);
-
-// Iterator difference
-template <class Dr1, class V1, class AC1, class TC1, class R1, class D1,
-          class Dr2, class V2, class AC2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1, Dr2, bool>::type
-operator -(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs,
-           iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs);
-
-// Iterator addition
-template <class Derived, class V, class AC, class TC, class R, class D>
-Derived operator+ (iterator_facade<Derived, V, AC, TC, R, D> const&,
-                   typename Derived::difference_type n)
-
-

to:

-
-// Comparison operators
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type // exposition
-operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-// Iterator difference
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-/* see below */
-operator-(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-          iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-// Iterator addition
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (iterator_facade<Dr,V,TC,R,D> const&,
-                   typename Derived::difference_type n);
-
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (typename Derived::difference_type n,
-                   iterator_facade<Dr,V,TC,R,D> const&);
-
-

After the iterator_facade synopsis, add:

-

The iterator_category member of iterator_facade is

-
-iterator-category(CategoryOrTraversal, value_type, reference)
-
-

where iterator-category is defined as follows:

-
-iterator-category(C,R,V) :=
-   if (C is convertible to std::input_iterator_tag
-       || C is convertible to std::output_iterator_tag
-   )
-       return C
-
-   else if (C is not convertible to incrementable_traversal_tag)
-       the program is ill-formed
-
-   else return a type X satisfying the following two constraints:
-
-      1. X is convertible to X1, and not to any more-derived
-         type, where X1 is defined by:
-
-           if (R is a reference type
-               && C is convertible to forward_traversal_tag)
-           {
-               if (C is convertible to random_access_traversal_tag)
-                   X1 = random_access_iterator_tag
-               else if (C is convertible to bidirectional_traversal_tag)
-                   X1 = bidirectional_iterator_tag
-               else
-                   X1 = forward_iterator_tag
-           }
-           else
-           {
-               if (C is convertible to single_pass_traversal_tag
-                   && R is convertible to V)
-                   X1 = input_iterator_tag
-               else
-                   X1 = C
-           }
-
-      2. category-to-traversal(X) is convertible to the most
-         derived traversal tag type to which X is also
-         convertible, and not to any more-derived traversal tag
-         type.
-
-
-
-

In [lib.iterator.facade] iterator_facade requirements:

-

Remove:

-
-AccessCategory must be an unsigned value which uses no more -bits than the greatest value of iterator_access.
-

In the Iterator Adaptor section, change:

-
-Several of the template parameters of iterator_adaptor default -to use_default (or use_default_access).
-

to:

-
-Several of the template parameters of iterator_adaptor default -to use_default.
-

In [lib.iterator.special.adaptors]:

-

Change:

-
-template <
-    class Iterator
-  , class Value = use_default
-  , unsigned Access  = use_default_access
-  , class Traversal  = use_default
-  , class Reference = use_default
-  , class Difference = use_default
->
-class indirect_iterator
-
-

to:

-
-template <
-    class Iterator
-  , class Value = use_default
-  , class CategoryOrTraversal = use_default
-  , class Reference = use_default
-  , class Difference = use_default
->
-class indirect_iterator
-
-

Change:

-
-template <
-    class Iterator2, class Value2, unsigned Access2, class Traversal2
-  , class Reference2, class Difference2
->
-indirect_iterator(
-
-

to:

-
-template <
-    class Iterator2, class Value2, class Category2
-  , class Reference2, class Difference2
->
-indirect_iterator(
-
-

Change:

-
-template <
-    class Incrementable
-  , unsigned Access = use_default_access
-  , class Traversal = use_default
-  , class Difference = use_default
->
-class counting_iterator
-
-

to:

-
-template <
-    class Incrementable
-  , class CategoryOrTraversal = use_default
-  , class Difference = use_default
->
-class counting_iterator
-
-

Change:

-
-typedef iterator_tag<
-      writable_iterator
-    , incrementable_traversal_tag
-> iterator_category;
-
-

to:

-
-typedef std::output_iterator_tag iterator_category;
-

In [lib.iterator.adaptor]

-

Change:

-
-template <
-    class Derived
-  , class Base
-  , class Value      = use_default
-  , unsigned Access  = use_default_access
-  , class Traversal  = use_default
-  , class Reference  = use_default
-  , class Difference = use_default
->
-class iterator_adaptor 
-
-

To:

-
-template <
-    class Derived
-  , class Base
-  , class Value               = use_default
-  , class CategoryOrTraversal = use_default
-  , class Reference           = use_default
-  , class Difference = use_default
->
-class iterator_adaptor 
-
-
- --- - - - -
Rationale:
-
    -
  1. There are two reasons for removing is_writable -and is_swappable. The first is that we do not know of -a way to fix the specification so that it gives the correct -answer for all iterators. Second, there was only a weak -motivation for having is_writable and is_swappable -there in the first place. The main motivation was simply -uniformity: we have tags for the old iterator categories -so we should have tags for the new iterator categories. -While having tags and the capability to dispatch based -on the traversal categories is often used, we see -less of a need for dispatching based on writability -and swappability, since typically algorithms -that need these capabilities have no alternative if -they are not provided.
  2. -
  3. We discovered that the is_readable trait can be implemented -using only the iterator type itself and its value_type. -Therefore we remove the requirement for is_readable from the -Readable Iterator concept, and change the definition of -is_readable so that it works for any iterator type.
  4. -
  5. The purpose of the iterator_tag class was to bundle the -traversal and access category tags into the -iterator_category typedef. With is_writable and -is_swappable gone, and is_readable no longer in need of -special hints, there is no reason for iterators to provide -information about the access capabilities of an iterator. Thus -there is no need for the iterator_tag. The traversal tag can -be directly used for the iterator_category. If a new -iterator is intended to be backward compatible with old iterator -concepts, a tag type that is convertible to both one of the new -traversal tags and also to an old iterator tag can be created -and use for the iterator_category.
  6. -
  7. The changes to the specification of traversal_category are a -direct result of the removal of iterator_tag.
  8. -
-
-
-

9.16 is_writable_iterator returns false positives

- --- - - - - - -
Submitter:Dave Abrahams
Status:New
-

is_writable_iterator returns false positives for forward iterators -whose value_type has a private assignment operator, or whose -reference type is not a reference (currently legal).

- --- - - - - -
Proposed Resolution:
 See the resolution to 9.15.
-
-
-

9.17 is_swappable_iterator returns false positives

- --- - - - - - -
Submitter:Dave Abrahams
Status:New
-

is_swappable_iterator has the same problems as -is_writable_iterator. In addition, if we allow users to write their -own iter_swap functions it's easy to imagine old-style iterators -for which is_swappable returns false negatives.

- --- - - - - -
Proposed Resolution:
 See the resolution to 9.15.
-
-
-

9.18 Are is_readable, is_writable, and is_swappable useful?

- --- - - - - - -
Submitter:Dave Abrahams
Status:New
-

I am concerned that there is little use for any of is_readable, -is_writable, or is_swappable, and that not only do they unduly -constrain iterator implementors but they add overhead to -iterator_facade and iterator_adaptor in the form of a template -parameter which would otherwise be unneeded. Since we can't -implement two of them accurately for old-style iterators, I am -having a hard time justifying their impact on the rest of the -proposal(s).

- --- - - - - -
Proposed Resolution:
 See the resolution to 9.15.
-
-
-

9.19 Non-Uniformity of the "lvalue_iterator Bit"

- --- - - - - - -
Submitter:Dave Abrahams
Status:New
-

The proposed iterator_tag class template accepts an "access bits" -parameter which includes a bit to indicate the iterator's -lvalueness (whether its dereference operator returns a reference to -its value_type. The relevant part of N1550 says:

-
-The purpose of the lvalue_iterator part of the iterator_access -enum is to communicate to iterator_tagwhether the reference type -is an lvalue so that the appropriate old category can be chosen -for the base class. The lvalue_iterator bit is not recorded in -the iterator_tag::access data member.
-

The lvalue_iterator bit is not recorded because N1550 aims to -improve orthogonality of the iterator concepts, and a new-style -iterator's lvalueness is detectable by examining its reference -type. This inside/outside difference is awkward and confusing.

- --- - - - - -
Proposed Resolution:
 The iterator_tag class will be removed, so this is no longer an issue. -See the resolution to 9.15.
-
-
-

9.20 Traversal Concepts and Tags

- --- - - - - - -
Submitter:Dave Abrahams
Status:New
-

Howard Hinnant pointed out some inconsistencies with the naming of -these tag types:

-
-incrementable_iterator_tag // ++r, r++ 
-single_pass_iterator_tag // adds a == b, a != b 
-forward_traversal_iterator_tag // adds multi-pass 
-bidirectional_traversal_iterator_tag // adds --r, r--
-random_access_traversal_iterator_tag // adds r+n,n+r,etc. 
-
-

Howard thought that it might be better if all tag names contained -the word "traversal". It's not clear that would result in the best -possible names, though. For example, incrementable iterators can -only make a single pass over their input. What really distinguishes -single pass iterators from incrementable iterators is not that they -can make a single pass, but that they are equality -comparable. Forward traversal iterators really distinguish -themselves by introducing multi-pass capability. Without entering -a "Parkinson's Bicycle Shed" type of discussion, it might be worth -giving the names of these tags (and the associated concepts) some -extra attention.

- --- - - - - -
Proposed resolution:
 

Change the names of the traversal tags to the -following names:

-
-incrementable_traversal_tag
-single_pass_traversal_tag
-forward_traversal_tag
-bidirectional_traversal_tag
-random_access_traversal_tag
-
-

In [lib.iterator.traversal]:

-

Change:

-
- ----- - - - - - - -
traversal_category<X>::typeConvertible to -incrementable_iterator_tag 
-
-

to:

-
- ----- - - - - - - -
iterator_traversal<X>::typeConvertible to -incrementable_traversal_tag 
-
-

Change:

-
- ----- - - - - - - -
traversal_category<X>::typeConvertible to -single_pass_iterator_tag 
-
-

to:

-
- ----- - - - - - - -
iterator_traversal<X>::typeConvertible to -single_pass_traversal_tag 
-
-

Change:

-
- ----- - - - - - - -
traversal_category<X>::typeConvertible to -forward_traversal_iterator_tag 
-
-

to:

-
- ----- - - - - - - -
iterator_traversal<X>::typeConvertible to -forward_traversal_tag 
-
-

Change:

-
- ----- - - - - - - -
traversal_category<X>::typeConvertible to -bidirectional_traversal_iterator_tag 
-
-

to:

-
- ----- - - - - - - -
iterator_traversal<X>::typeConvertible to -bidirectional_traversal_tag 
-
-

Change:

-
- ------ - - - - - - - -
traversal_category<X>::typeConvertible to -random_access_traversal_iterator_tag  
-
-

to:

-
- ------ - - - - - - - -
iterator_traversal<X>::typeConvertible to -random_access_traversal_tag  
-
-

In [lib.iterator.synopsis], change:

-
-struct incrementable_iterator_tag { };
-struct single_pass_iterator_tag : incrementable_iterator_tag { };
-struct forward_traversal_tag : single_pass_iterator_tag { };
-
-

to:

-
-struct incrementable_traversal_tag { };
-struct single_pass_traversal_tag : incrementable_traversal_tag { };
-struct forward_traversal_tag : single_pass_traversal_tag { };
-
-

Remove:

-
-struct null_category_tag { };
-struct input_output_iterator_tag : input_iterator_tag, output_iterator_tag {};
-
-
-
-
-

9.21 iterator_facade Derived template argument underspecified

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

The first template argument to iterator_facade is named Derived, -and the proposal says:

-
-The Derived template parameter must be a class derived from -iterator_facade.
-

First, iterator_facade is a template, so cannot be derived -from. Rather, the class must be derived from a specialization of -iterator_facade. More important, isn't Derived required to be the -class that is being defined? That is, if I understand it right, the -definition of D here this is not valid:

-
-class C : public iterator_facade<C, ... > { ... }; 
-class D : public iterator_facade<C, ...> { ... }; 
-
-

In the definition of D, the Derived argument to iterator_facade is -a class derived from a specialization of iterator_facade, so the -requirement is met. Shouldn't the requirement be more like "when -using iterator_facade to define an iterator class Iter, the class -Iter must be derived from a specialization of iterator_facade whose -first template argument is Iter." That's a bit awkward, but at the -moment I don't see a better way of phrasing it.

- --- - - - - -
Proposed resolution:
 

In [lib.iterator.facade]

-

Remove:

-
-The Derived template parameter must be a class derived from -iterator_facade.
-

Change:

-
-The following table describes the other requirements on the -Derived parameter. Depending on the resulting iterator's -iterator_category, a subset of the expressions listed in the table -are required to be valid. The operations in the first column must be -accessible to member functions of class iterator_core_access.
-

to:

-
-The following table describes the typical valid expressions on -iterator_facade's Derived parameter, depending on the -iterator concept(s) it will model. The operations in the first -column must be made accessible to member functions of class -iterator_core_access. In addition, -static_cast<Derived*>(iterator_facade*) shall be well-formed.
-

In [lib.iterator.adaptor]

-

Change:

-
-The iterator_adaptor is a base class template derived from -an instantiation of iterator_facade.
-

to:

-
-Each specialization of the iterator_adaptor class template -is derived from a specialization of iterator_facade.
-

Change:

-
-The Derived template parameter must be a derived class of -iterator_adaptor.
-

To:

-
-static_cast<Derived*>(iterator_adaptor*) shall be well-formed.
-
-

[Note: The proposed resolution to Issue 9.37 contains related -changes]

-
-
-

9.22 return type of Iterator difference for iterator facade

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

The proposal says:

-
-template <class Dr1, class V1, class AC1, class TC1, class R1, class D1, 
-class Dr2, class V2, class AC2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1, Dr2, bool>::type
-operator -(iterator_facade<Dr1, V1, AC1, TC1, R1, D1> const& lhs, 
-iterator_facade<Dr2, V2, AC2, TC2, R2, D2> const& rhs); 
-
-

Shouldn't the return type be one of the two iterator types? Which -one? The idea is that if one of the iterator types can be converted -to the other type, then the subtraction is okay. Seems like the -return type should then be the type that was converted to. Is that -right?

- --- - - - - -
Proposed resolution:
 See resolution to 9.34.
-
-
-

9.23 Iterator_facade: minor wording Issue

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

In the table that lists the required (sort of) member functions of -iterator types that are based on iterator_facade, the entry for -c.equal(y) says:

-
-true iff c and y refer to the same position. Implements c == y -and c != y. The second sentence is inside out. c.equal(y) does -not implement either of these operations. It is used to implement -them. Same thing in the description of c.distance_to(z).
- --- - - - - -
Proposed resolution:
 remove "implements" descriptions from -table. See resolution to 9.34
-
-
-

9.24 Use of undefined name in iterator_facade table

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

Several of the descriptions use the name X without defining -it. This seems to be a carryover from the table immediately above -this section, but the text preceding that table says "In the table -below, X is the derived iterator type." Looks like the X:: -qualifiers aren't really needed; X::reference can simply be -reference, since that's defined by the iterator_facade -specialization itself.

- --- - - - - -
Proposed resolution:
 

Remove references to X.

-

In [lib.iterator.facade] operations operator->() const;:

-
-

Change:

-
- --- - - - -
Returns:

If X::reference is a reference type, an object -of type X::pointer equal to:

-
-&static_cast<Derived const*>(this)->dereference()
-
-

Otherwise returns an object of unspecified type such that, -given an object a of type X, a->m is equivalent -to (w = *a, w.m) for some temporary object w of type -X::value_type.

-

The type X::pointer is Value* if -is_writable_iterator<X>::value is true, and -Value const* otherwise.

-
-
-

to:

-
- --- - - - -
Returns:

If reference is a reference type, an object -of type pointer equal to:

-
-&static_cast<Derived const*>(this)->dereference()
-
-

Otherwise returns an object of unspecified type such that, -(*static_cast<Derived const*>(this))->m is equivalent -to (w = **static_cast<Derived const*>(this), w.m) for -some temporary object w of type value_type.

-
-
-

Further changes are covered by issue 9.26.

-
-
-
-
-

9.25 Iterator_facade: wrong return type

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

Several of the member functions return a Derived object or a -Derived&. Their Effects clauses end with:

-
-return *this;
-
-

This should be

-
-return *static_cast<Derived*>(this);
-
- --- - - - - -
Proposed resolution:
 

In [lib.iterator.facade], in the effects clause -of the following operations:

-
-Derived& operator++()
-Derived& operator--()
-Derived& operator+=(difference_type n)
-Derived& operator-=(difference_type n)
-
-
-
Change:
-
return *this
-
to:
-
return *static_cast<Derived*>(this);
-
-
-
-
-

9.26 Iterator_facade: unclear returns clause for operator[]

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

The returns clause for operator[](difference_type n) const -says:

-
-Returns: an object convertible to X::reference and holding a copy -p of a+n such that, for a constant object v of type -X::value_type, X::reference(a[n] = v) is equivalent to p = v. -This needs to define 'a', but assuming it's supposed to be -*this (or maybe *(Derived*)this), it still isn't clear -what this says. Presumably, the idea is that you can index off of -an iterator and assign to the result. But why the requirement -that it hold a copy of a+n? Granted, that's probably how it's -implemented, but it seems over-constrained. And the last phrase -seems wrong. p is an iterator; there's no requirement that you -can assign a value_type object to it. Should that be *p = v? -But why the cast in reference(a[n] = v)?
- --- - - - - -
Proposed resolution:
 

In section operator[]:

-
-

Change:

-
-Writable iterators built with iterator_facade implement -the semantics required by the preferred resolution to issue -299 and adopted by proposal n1477: the result of p[n] -is a proxy object containing a copy of p+n, and p[n] = -x is equivalent to *(p + n) = x. This approach will -work properly for any random-access iterator regardless of -the other details of its implementation. A user who knows -more about the implementation of her iterator is free to -implement an operator[] which returns an lvalue in the -derived iterator class; it will hide the one supplied by -iterator_facade from clients of her iterator.
-

to:

-
-Writable iterators built with iterator_facade implement -the semantics required by the preferred resolution to issue -299 and adopted by proposal n1550: the result of p[n] -is an object convertible to the iterator's value_type, -and p[n] = x is equivalent to *(p + n) = x (Note: -This result object may be implemented as a proxy containing a -copy of p+n). This approach will work properly for any -random-access iterator regardless of the other details of its -implementation. A user who knows more about the -implementation of her iterator is free to implement an -operator[] that returns an lvalue in the derived iterator -class; it will hide the one supplied by iterator_facade -from clients of her iterator.
-
-

In [lib.iterator.facade] operations:

-
-

Change:

-
- --- - - - -
Returns:an object convertible to X::reference and -holding a copy p of a+n such that, for a constant -object v of type X::value_type, X::reference(a[n] -= v) is equivalent to p = v.
-
-

to:

-
- --- - - - -
Returns:an object convertible to value_type. For -constant objects v of type value_type, and n of -type difference_type, (*this)[n] = v is equivalent -to *(*this + n) = v, and static_cast<value_type -const&>((*this)[n]) is equivalent to -static_cast<value_type const&>(*(*this + n))
-
-
-
-
-
-

9.27 Iterator_facade: redundant clause

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

operator- has both an effects clause and a returns -clause. Looks like the returns clause should be removed.

- --- - - - - -
Proposed resolution:
 

Remove the returns clause.

-

In [lib.iterator.facade] operations:

-
-
Remove:
-
--- - - - -
Returns:static_cast<Derived const*>(this)->advance(-n);
-
-
-
-
-
-

9.28 indirect_iterator: incorrect specification of default constructor

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

The default constructor returns "An instance of indirect_iterator -with a default constructed base object", but the constructor that -takes an Iterator object returns "An instance of indirect_iterator -with the iterator_adaptor subobject copy constructed from x." The -latter is the correct form, since it does not reach inside the base -class for its semantics. So the default constructor shoudl return -"An instance of indirect_iterator with a default-constructed -iterator_adaptor subobject."

- --- - - - - - - -
Proposed resolution:
 
-
Change:
-
--- - - - -
Returns:An instance of indirect_iterator with -a default constructed base object.
-
-
to:
-
--- - - - -
Returns:An instance of indirect_iterator with -a default-constructed m_iterator.
-
-
-
Rationale:Inheritance from iterator_adaptor has been removed, so we instead -give the semantics in terms of the (exposition only) member -m_iterator.
-
-
-

9.29 indirect_iterator: unclear specification of template constructor

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

The templated constructor that takes an indirect_iterator with a -different set of template arguments says that it returns "An -instance of indirect_iterator that is a copy of [the argument]". -But the type of the argument is different from the type of the -object being constructed, and there is no description of what -a "copy" means. The Iterator template parameter for the argument -must be convertible to the Iterator template parameter for the type -being constructed, which suggests that the argument's contained -Iterator object should be converted to the target type's Iterator -type. Is that what's meant here? -(Pete later writes: In fact, this problem is present in all of the -specialized adaptors that have a constructor like this: the -constructor returns "a copy" of the argument without saying what a -copy is.)

- --- - - - - - - -
Proposed resolution:
 
-
Change:
-
--- - - - -
Returns:An instance of indirect_iterator that is a copy of y.
-
-
to:
-
--- - - - -
Returns:An instance of indirect_iterator whose -m_iterator subobject is constructed from y.base().
-
-
-
Rationale:Inheritance from iterator_adaptor has been removed, so we -instead give the semantics in terms of the member m_iterator.
-
-
-

9.30 transform_iterator argument irregularity

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

The specialized adaptors that take both a Value and a Reference -template argument all take them in that order, i.e. Value precedes -Reference in the template argument list, with the exception of -transform_iterator, where Reference precedes Value. This seems like -a possible source of confusion. Is there a reason why this order is -preferable?

- --- - - - - - - -
Proposed resolution:
 NAD
Rationale:defaults for Value depend on Reference. A sensible -Value can almost always be computed from Reference. The first -parameter is UnaryFunction, so the argument order is already -different from the other adapters.
-
-
-

9.31 function_output_iterator overconstrained

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

function_output_iterator requirements says: "The UnaryFunction must -be Assignable, Copy Constructible, and the expression f(x) must be -valid, where f is an object of type UnaryFunction and x is an -object of a type accepted by f."

-

Everything starting with "and," somewhat reworded, is actually a -constraint on output_proxy::operator=. All that's needed to create -a function_output_iterator object is that the UnaryFunction type be -Assignable and CopyConstructible. That's also sufficient to -dereference and to increment such an object. It's only when you try -to assign through a dereferenced iterator that f(x) has to work, -and then only for the particular function object that the iterator -holds and for the particular value that is being assigned.

-
-
Addition from Jeremy:
-
The constructor for function_output_iterator is also -slightly overconstrained because it requires -the UnaryFunction to have a default constructor -even when the default constructor of function_output_iterator -is not used.
-
- --- - - - - -
Proposed resolution:
 
-
Change:
-
output_proxy operator*();
-
to:
-
/* see below */ operator*();
-
-

After function_output_iterator& operator++(int); add:

-
-private:
-  UnaryFunction m_f;     // exposition only
-
-
-
Change:
-
The UnaryFunction must be Assignable, Copy Constructible, -and the expression f(x) must be valid, where f is an -object of type UnaryFunction and x is an object of a -type accepted by f. The resulting -function_output_iterator is a model of the Writable and -Incrementable Iterator concepts.
-
to:
-
UnaryFunction must be Assignable and Copy Constructible.
-
-

After the requirements section, add:

-
-
-

function_output_iterator models

-
-function_output_iterator is a model of the Writable and -Incrementable Iterator concepts.
-
-
Change:
-
--- - - - -
Returns:An instance of function_output_iterator with -f stored as a data member.
-
-
to:
-
--- - - - -
Effects:Constructs an instance of function_output_iterator -with m_f constructed from f.
-
-
Change:
-

output_proxy operator*();

- --- - - - -
Returns:An instance of output_proxy constructed with -a copy of the unary function f.
-
-
to:
-

operator*();

- --- - - - -
Returns:An object r of unspecified type such that r = t -is equivalent to m_f(t) for all t.
-
-
Remove:
-

function_output_iterator::output_proxy operations

-

output_proxy(UnaryFunction& f);

- --- - - - -
Returns:An instance of output_proxy with f stored as -a data member.
-

template <class T> output_proxy& operator=(const T& value);

- --- - - - -
Effects:
-m_f(value); 
-return *this; 
-
-
-
-
-

Change:

-
-explicit function_output_iterator(const UnaryFunction& f = UnaryFunction());
-
-

to:

-
-explicit function_output_iterator();
-
-explicit function_output_iterator(const UnaryFunction& f);
-
-
-
-
-

9.32 Should output_proxy really be a named type?

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

This means someone can store an output_proxy object for later use, -whatever that means. It also constrains output_proxy to hold a copy -of the function object, rather than a pointer to the iterator -object. Is all this mechanism really necessary?

- --- - - - - -
Proposed resolution:
 See issue 9.31.
-
-
-

9.33 istreambuf_iterator isn't a Readable Iterator

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

c++std-lib-12333:

-
-N1550 requires that for a Readable Iterator a of type X, *a -returns an object of type -iterator_traits<X>::reference. istreambuf_iterator::operator* -returns charT, but istreambuf_iterator::reference is -charT&. So am I overlooking something, or is -istreambuf_iterator not Readable.
- --- - - - - - - -
Proposed resolution:
 

Remove all constraints on -iterator_traits<X>::reference in Readable Iterator and Lvalue -Iterator. Change Lvalue Iterator to refer to T& instead of -iterator_traits<X>::reference.

-
-
Change:
-
A class or built-in type X models the Readable Iterator -concept for the value type T if the following expressions -are valid and respect the stated semantics. U is the type -of any specified member of type T.
-
to:
-
A class or built-in type X models the Readable Iterator -concept for value type T if, in addition to X being -Assignable and Copy Constructible, the following expressions -are valid and respect the stated semantics. U is the type -of any specified member of type T.
-
-

From the Input Iterator Requirements table, remove:

-
- ----- - - - - - - -
iterator_traits<X>::referenceConvertible to -iterator_traits<X>::value_type 
-
-

Change:

-
- ----- - - - - - - -
*aiterator_traits<X>::referencepre: a is -dereferenceable. If a -== b then *a is -equivalent to *b
-
-

to:

-
- ----- - - - - - - -
*aConvertible to T
-
pre: a is dereferenceable. If a == b then *a
-
is equivalent to *b.
-
-
-
-
-
Change:
-
The Lvalue Iterator concept adds the requirement that the -reference type be a reference to the value type of the -iterator.
-
to:
-
The Lvalue Iterator concept adds the requirement that the -return type of operator* type be a reference to the value -type of the iterator.
-
-

Change:

-
- ----- - - - - - - - - - - - - - - -
Lvalue Iterator Requirements
ExpressionReturn TypeAssertion
iterator_traits<X>::referenceT&T is cv -iterator_traits<X>::value_type -where cv is an optional -cv-qualification
-
-

to:

-
- ----- - - - - - - - - - - - - - - -
Lvalue Iterator Requirements
ExpressionReturn TypeNote/Assertion
*aT&T is cv -iterator_traits<X>::value_type -where cv is an optional -cv-qualification. -pre: a is -dereferenceable. If a -== b then *a is -equivalent to *b.
-
-

At the end of the section reverse_iterator models, add: -The type iterator_traits<Iterator>::reference must be the type of -*i, where i is an object of type Iterator.

-
Rationale:

Ideally there should be requirements on the reference -type, however, since Readable Iterator is suppose to correspond -to the current standard iterator requirements (which do not place -requirements on the reference type) we will leave them off for -now. There is a DR in process with respect to the reference type -in the stadard iterator requirements. Once that is resolved we -will revisit this issue for Readable Iterator and Lvalue -Iterator.

-

We added Assignable to the requirements for Readable -Iterator. This is needed to have Readable Iterator coincide with -the capabilities of Input Iterator.

-
-
-
-

9.34 iterator_facade free functions unspecified

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

c++std-lib-12562:

-
-The template functions operator==, operator!=, -operator<, operator<=, operator>, operator>=, and -operator- that take two arguments that are specializations of -iterator_facade have no specification. The template function -operator+ that takes an argument that is a specialization of -iterator_facade and an argument of type difference_type has no -specification.
- --- - - - - -
Proposed resolution:
 

Add the missing specifications.

-
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (iterator_facade<Dr,V,TC,R,D> const&,
-                   typename Derived::difference_type n);
-
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (typename Derived::difference_type n,
-                   iterator_facade<Dr,V,TC,R,D> const&);
-
- --- - - - -
Effects:
-Derived tmp(static_cast<Derived const*>(this));
-return tmp += n;
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:if is_convertible<Dr2,Dr1>::value, then -lhs.equal(rhs). Otherwise, rhs.equal(lhs).
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:if is_convertible<Dr2,Dr1>::value, then -!lhs.equal(rhs). Otherwise, !rhs.equal(lhs).
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:if is_convertible<Dr2,Dr1>::value, then -lhs.distance_to(rhs) < 0. Otherwise, rhs.distance_to(lhs) > -0.
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:if is_convertible<Dr2,Dr1>::value, then -lhs.distance_to(rhs) <= 0. Otherwise, rhs.distance_to(lhs) ->= 0.
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:if is_convertible<Dr2,Dr1>::value, then -lhs.distance_to(rhs) > 0. Otherwise, -rhs.distance_to(lhs) < 0.
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:if is_convertible<Dr2,Dr1>::value, then -lhs.distance_to(rhs) >= 0. Otherwise, -rhs.distance_to(lhs) <= 0.
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,difference>::type
-operator -(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - - - -
Return Type:if is_convertible<Dr2,Dr1>::value, then -difference shall be -iterator_traits<Dr1>::difference_type. Otherwise, -difference shall be -iterator_traits<Dr2>::difference_type.
Returns:if is_convertible<Dr2,Dr1>::value, then --lhs.distance_to(rhs). Otherwise, -rhs.distance_to(lhs).
-
-
-
-

9.35 iterator_facade: too many equals?

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

c++std-lib-12563:

-
-

The table listing the functions required for types derived from -iterator_facade has two functions named equal and two named -distance_to:

-
-c.equal(b)
-c.equal(y)
-c.distance_to(b)
-c.distance_to(z)
-
-

where b and c are const objects of the derived type, y and z are -constant objects of certain iterator types that are interoperable -with the derived type. Seems like the 'b' versions are -redundant: in both cases, the other version will take a 'b'. In -fact, iterator_adaptor is specified to use iterator_facade, but -does not provide the 'b' versions of these functions.

-

Are the 'b' versions needed?

-
- --- - - - - -
Proposed resolution:
 

Remove the 'b' versions.

-

In iterator_facade requirements, remove:

-
- ------ - - - - - - - -
c.equal(b)convertible to booltrue iff b and c are -equivalent.Single Pass Iterator
-
-

and remove:

-
- ------ - - - - - - - -
c.distance_to(b)convertible to -X::difference_typeequivalent to distance(c, b)Random Access Traversal -Iterator
-
-
-
-
-

9.36 iterator_facade function requirements

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

c++std-lib-12636:

-
-

The table that lists required functions for the derived type X -passed to iterator_facade lists, among others:

-

for a single pass iterator:

-
-c.equal(b)
-c.equal(y)
-
-

where b and c are const X objects, and y is a const object of a -single pass iterator that is interoperable with X. Since X is -interoperable with itself, c.equal(b) is redundant. There is a -difference in their descriptions, but its meaning isn't -clear. The first is "true iff b and c are equivalent", and the -second is "true iff c and y refer to the same position." Is there -a difference between the undefined term "equivalent" and "refer -to the same position"?

-

Similarly, for a random access traversal iterator:

-
-c.distance_to(b)
-c.distance_to(z)
-
-

where z is a constant object of a random access traversal -iterator that is interoperable with X. Again, X is interoperable -with itself, so c.distance_to(b) is redundant. Also, the -specification for c.distance_to(z) isn't valid. It's written -as "equivalent to distance(c, z)". The template function distance -takes two arguments of the same type, so distance(c, z) isn't -valid if c and z are different types. Should it be -distance(c, (X)z)?

-
- --- - - - - -
Proposed resolution:
 

Removed the 'b' versions (see 9.35) and added the cast.

-

Change:

-
- ------ - - - - - - - -
c.distance_to(z)convertible to -X::difference_typeequivalent to distance(c, z). -Implements c - z, c < z, c -<= z, c > z, and c >= c.Random Access Traversal -Iterator
-
-

to:

-
- ------ - - - - - - - -
c.distance_to(z)convertible to -F::difference_typeequivalent to -distance(c, X(z)).Random Access Traversal -Iterator
-
-
-
-
-
-

More Issues (not from Matt's list)

-
-

9.37x Inheritance in iterator_adaptor and other adaptors is an overspecification

- --- - - - - - -
Submitter:Pete Becker
Status:New
-

c++std-lib-12696: -The paper requires that iterator_adaptor be derived from an -appropriate instance of iterator_facade, and that most of the specific -forms of adaptors be derived from appropriate instances of -iterator_adaptor. That seems like overspecification, and we ought to -look at specifying these things in terms of what the various templates -provide rather than how they're implemented.

- --- - - - - -
Proposed resolution:
 

Remove the specfication of inheritance, and add explicit -specification of all the functionality that was inherited from the -specialized iterators.

-

In iterator_adaptor, inheritance is retained, sorry NAD. Also, -the Interoperable Iterators concept is added to the new iterator -concepts, and this concept is used in the specification of the -iterator adaptors.

-

In n1550, after [lib.random.access.traversal.iterators], add:

-
-

Interoperable Iterators [lib.interoperable.iterators]

-

A class or built-in type X that models Single Pass Iterator -is interoperable with a class or built-in type Y that -also models Single Pass Iterator if the following expressions -are valid and respect the stated semantics. In the tables -below, x is an object of type X, y is an object of -type Y, Distance is -iterator_traits<Y>::difference_type, and n represents a -constant object of type Distance.

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ExpressionReturn TypeAssertion/Precondition/Postcondition
y = xYpost: y == x
Y(x)Ypost: Y(x) == x
x == yconvertible to bool== is an equivalence relation over its domain.
y == xconvertible to bool== is an equivalence relation over its domain.
x != yconvertible to boolbool(a==b) != bool(a!=b) over its domain.
y != xconvertible to boolbool(a==b) != bool(a!=b) over its domain.
-

If X and Y both model Random Access Traversal Iterator then -the following additional requirements must be met.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ExpressionReturn TypeOperational SemanticsAssertion/ Precondition
x < yconvertible to booly - x > 0< is a total ordering relation
y < xconvertible to boolx - y > 0< is a total ordering relation
x > yconvertible to booly < x> is a total ordering relation
y > xconvertible to boolx < y> is a total ordering relation
x >= yconvertible to bool!(x < y) 
y >= xconvertible to bool!(y < x) 
x <= yconvertible to bool!(x > y) 
y <= xconvertible to bool!(y > x) 
y - xDistancedistance(Y(x),y)pre: there exists a value n of -Distance such that x + n == y. -y == x + (y - x).
x - yDistancedistance(y,Y(x))pre: there exists a value n of -Distance such that y + n == x. -x == y + (x - y).
-
-

In N1530:

-
-

In [lib.iterator.adaptor]

-

Change:

-
-class iterator_adaptor 
-  : public iterator_facade<Derived, /* see details ...*/>
-
-

To:

-
-class iterator_adaptor 
-  : public iterator_facade<Derived, *V'*, *C'*, *R'*, *D'*> // see details
-
-
-
Change the text from:
-
The Base type must implement the expressions involving -m_iterator in the specifications...
-
until the end of the iterator_adaptor requirements section, to:
-
The Base argument shall be Assignable and Copy Constructible.
-
-

Add:

-
-
-
-

iterator_adaptor base class parameters

-
-

The V', C', R', and D' parameters of the iterator_facade -used as a base class in the summary of iterator_adaptor -above are defined as follows:

-
-V' = if (Value is use_default)
-          return iterator_traits<Base>::value_type
-      else
-          return Value
-
-C' = if (CategoryOrTraversal is use_default)
-          return iterator_traversal<Base>::type
-      else
-          return CategoryOrTraversal
-
-R' = if (Reference is use_default)
-          if (Value is use_default)
-              return iterator_traits<Base>::reference
-          else
-              return Value&
-      else
-          return Reference
-
-D' = if (Difference is use_default)
-          return iterator_traits<Base>::difference_type
-      else
-          return Difference
-
-
-

In [lib.iterator.special.adaptors]

-

Change:

-
-class indirect_iterator
-  : public iterator_adaptor</* see discussion */>
-{
-    friend class iterator_core_access;
-
-

to:

-
-class indirect_iterator
-{
- public:
-    typedef /* see below */ value_type;
-    typedef /* see below */ reference;
-    typedef /* see below */ pointer;
-    typedef /* see below */ difference_type;
-    typedef /* see below */ iterator_category;
-
-

Change:

-
-private: // as-if specification
-    typename indirect_iterator::reference dereference() const
-    {
-        return **this->base();
-    }
-
-

to:

-
-    Iterator const& base() const;
-    reference operator*() const;
-    indirect_iterator& operator++();
-    indirect_iterator& operator--();
-private:
-   Iterator m_iterator; // exposition
-
-

After the synopsis add:

-
-

The member types of indirect_iterator are defined -according to the following pseudo-code, where V is -iterator_traits<Iterator>::value_type

-
-if (Value is use_default) then
-    typedef remove_const<pointee<V>::type>::type value_type;
-else
-    typedef remove_const<Value>::type value_type;
-
-if (Reference is use_default) then
-    if (Value is use_default) then
-        typedef indirect_reference<V>::type reference;
-    else
-        typedef Value& reference;
-else
-    typedef Reference reference;
-
-if (Value is use_default) then 
-    typedef pointee<V>::type* pointer;
-else 
-    typedef Value* pointer;
-
-if (Difference is use_default)
-    typedef iterator_traits<Iterator>::difference_type difference_type;
-else
-    typedef Difference difference_type;
-
-if (CategoryOrTraversal is use_default)
-    typedef iterator-category(
-        iterator_traversal<Iterator>::type,``reference``,``value_type``
-    ) iterator_category;
-else
-    typedef iterator-category(
-        CategoryOrTraversal,``reference``,``value_type``
-    ) iterator_category;
-
-
-

[Note: See resolution to 9.44y for a description of pointee and -indirect_reference]

-

After the requirements section, add:

-
-
-

indirect_iterator models

-
-

In addition to the concepts indicated by iterator_category -and by iterator_traversal<indirect_iterator>::type, a -specialization of indirect_iterator models the following -concepts, Where v is an object of -iterator_traits<Iterator>::value_type:

-
-
    -
  • Readable Iterator if reference(*v) is convertible to -value_type.
  • -
  • Writable Iterator if reference(*v) = t is a valid -expression (where t is an object of type -indirect_iterator::value_type)
  • -
  • Lvalue Iterator if reference is a reference type.
  • -
-
-

indirect_iterator<X,V1,C1,R1,D1> is interoperable with -indirect_iterator<Y,V2,C2,R2,D2> if and only if X is -interoperable with Y.

-
-

Before indirect_iterator(); add:

-
-In addition to the operations required by the concepts described -above, specializations of indirect_iterator provide the -following operations.
-
-
Change:
-
--- - - - -
Returns:An instance of indirect_iterator with -the iterator_adaptor subobject copy constructed from x.
-
-
to:
-
--- - - - -
Returns:An instance of indirect_iterator with -m_iterator copy constructed from x.
-
-
-

At the end of the indirect_iterator operations add:

-
-

Iterator const& base() const;

- --- - - - -
Returns:m_iterator
-

reference operator*() const;

- --- - - - -
Returns:**m_iterator
-

indirect_iterator& operator++();

- --- - - - - - -
Effects:++m_iterator
Returns:*this
-

indirect_iterator& operator--();

- --- - - - - - -
Effects:--m_iterator
Returns:*this
-
-

Change:

-
-template <class Iterator>
-class reverse_iterator :
-  public iterator_adaptor< reverse_iterator<Iterator>, Iterator >
-{
-  friend class iterator_core_access;
-
-

to:

-
-template <class Iterator>
-class reverse_iterator
-{
-public:
-  typedef iterator_traits<Iterator>::value_type value_type;
-  typedef iterator_traits<Iterator>::reference reference;
-  typedef iterator_traits<Iterator>::pointer pointer;
-  typedef iterator_traits<Iterator>::difference_type difference_type;
-  typedef /* see below */ iterator_category;
-
-

Change:

-
-private: // as-if specification
-  typename reverse_iterator::reference dereference() const { return *prior(this->base()); }
-
-  void increment() { --this->base_reference(); }
-  void decrement() { ++this->base_reference(); }
-
-  void advance(typename reverse_iterator::difference_type n)
-  {
-      this->base_reference() += -n;
-  }
-
-  template <class OtherIterator>
-  typename reverse_iterator::difference_type
-  distance_to(reverse_iterator<OtherIterator> const& y) const
-  {
-      return this->base_reference() - y.base();
-  }
-
-

to:

-
-  Iterator const& base() const;
-  reference operator*() const;
-  reverse_iterator& operator++();
-  reverse_iterator& operator--();
-private:
-  Iterator m_iterator; // exposition
-
-
-
After the synopsis for reverse_iterator, add:
-
If Iterator models Random Access Traversal Iterator and Readable -Lvalue Iterator, then iterator_category is convertible to -random_access_iterator_tag. Otherwise, if -Iterator models Bidirectional Traversal Iterator and Readable -Lvalue Iterator, then iterator_category is convertible to -bidirectional_iterator_tag. Otherwise, iterator_category is -convertible to input_iterator_tag.
-
Change:
-

reverse_iterator requirements

-

The base Iterator must be a model of Bidirectional Traversal -Iterator. The resulting reverse_iterator will be a model of the -most refined standard traversal and access concepts that are modeled -by Iterator.

-
-
to:
-

reverse_iterator requirements

-

Iterator must be a model of Bidirectional Traversal Iterator.

-
-
-
-
-

reverse_iterator models

-
-

A specialization of reverse_iterator models the same iterator -traversal and iterator access concepts modeled by its Iterator -argument. In addition, it may model old iterator concepts -specified in the following table:

- ---- - - - - - - - - - - - - - - - - - - - -
If I modelsthen reverse_iterator<I> models
Readable Lvalue Iterator, -Bidirectional Traversal IteratorBidirectional Iterator
Writable Lvalue Iterator, -Bidirectional Traversal IteratorMutable Bidirectional Iterator
Readable Lvalue Iterator, -Random Access Traversal IteratorRandom Access Iterator
Writable Lvalue Iterator, -Random Access Traversal IteratorMutable Random Access Iterator
-

reverse_iterator<X> is interoperable with -reverse_iterator<Y> if and only if X is interoperable with -Y.

-
-
-
Change:
-
--- - - - -
Returns:An instance of reverse_iterator with a -default constructed base object.
-
-
to:
-
--- - - - -
Effects:Constructs an instance of reverse_iterator with m_iterator -default constructed.
-
-
Change:
-
--- - - - -
Effects:Constructs an instance of reverse_iterator with a -base object copy constructed from x.
-
-
to:
-
--- - - - -
Effects:Constructs an instance of reverse_iterator with a -m_iterator constructed from x.
-
-
Change:
-
--- - - - -
Returns:An instance of reverse_iterator that is a copy of r.
-
-
to:
-
--- - - - -
Effects:Constructs instance of reverse_iterator whose -m_iterator subobject is constructed from y.base().
-
-
At the end of the operations for reverse_iterator, add:
-

Iterator const& base() const;

- --- - - - -
Returns:m_iterator
-

reference operator*() const;

- --- - - - -
Effects:
-
-Iterator tmp = m_iterator;
-return *--tmp;
-
-

reverse_iterator& operator++();

- --- - - - - - -
Effects:--m_iterator
Returns:*this
-

reverse_iterator& operator--();

- --- - - - - - -
Effects:++m_iterator
Returns:*this
-
-
-

Change:

-
-class transform_iterator
-  : public iterator_adaptor</* see discussion */>
-{
-  friend class iterator_core_access;
-
-

to:

-
-class transform_iterator
-{
-public:
-  typedef /* see below */ value_type;
-  typedef /* see below */ reference;
-  typedef /* see below */ pointer;
-  typedef iterator_traits<Iterator>::difference_type difference_type;
-  typedef /* see below */ iterator_category;
-
-

After UnaryFunction functor() const; add:

-
-Iterator const& base() const;
-reference operator*() const;
-transform_iterator& operator++();
-transform_iterator& operator--();
-
-

Change:

-
-private:
-  typename transform_iterator::value_type dereference() const;
-  UnaryFunction m_f;
-};
-
-

to:

-
-private:
-  Iterator m_iterator; // exposition only
-  UnaryFunction m_f;   // exposition only
-};
-
-
-
After the synopsis, add:
-
If Iterator models Readable Lvalue Iterator and if Iterator -models Random Access Traversal Iterator, then iterator_category is -convertible to random_access_iterator_tag. Otherwise, if -Iterator models Bidirectional Traversal Iterator, then -iterator_category is convertible to -bidirectional_iterator_tag. Otherwise iterator_category is -convertible to forward_iterator_tag. If Iterator does not -model Readable Lvalue Iterator then iterator_category is -convertible to input_iterator_tag.
-
In the requirements section, change:
-

The type Iterator must at least model Readable Iterator. The -resulting transform_iterator models the most refined of the -following that is also modeled by Iterator.

-
-
    -
  • Writable Lvalue Iterator if -result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type -is a non-const reference.
  • -
  • Readable Lvalue Iterator if -result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type -is a const reference.
  • -
  • Readable Iterator otherwise.
  • -
-
-

The transform_iterator models the most refined standard traversal -concept that is modeled by Iterator.

-

The reference type of transform_iterator is -result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type. -The value_type is remove_cv<remove_reference<reference> >::type.

-
-
to:
-
The argument Iterator shall model Readable Iterator.
-
-

After the requirements section, add:

-
-
-

transform_iterator models

-
-

The resulting transform_iterator models the most refined of the -following options that is also modeled by Iterator.

-
-
    -
  • Writable Lvalue Iterator if -transform_iterator::reference is a non-const -reference.
  • -
  • Readable Lvalue Iterator if -transform_iterator::reference is a const reference.
  • -
  • Readable Iterator otherwise.
  • -
-
-

The transform_iterator models the most refined standard traversal -concept that is modeled by the Iterator argument.

-

If transform_iterator is a model of Readable Lvalue Iterator then -it models the following original iterator concepts depending on what -the Iterator argument models.

- ---- - - - - - - - - - - - - - - - - - - - -
If Iterator modelsthen transform_iterator models
Single Pass IteratorInput Iterator
Forward Traversal IteratorForward Iterator
Bidirectional Traversal IteratorBidirectional Iterator
Random Access Traversal IteratorRandom Access Iterator
-

If transform_iterator models Writable Lvalue Iterator then it is a -mutable iterator (as defined in the old iterator requirements).

-

transform_iterator<F1, X, R1, V1> is interoperable with -transform_iterator<F2, Y, R2, V2> if and only if X is -interoperable with Y.

-
-

Remove the private operations section heading and remove:

-
-``typename transform_iterator::value_type dereference() const;``
-
-:Returns: ``m_f(transform_iterator::dereference());``
-
-

After the entry for functor(), add:

-
-``Iterator const& base() const;``
-
-:Returns: ``m_iterator``
-
-
-``reference operator*() const;``
-
-:Returns: ``m_f(*m_iterator)``
-
-
-``transform_iterator& operator++();``
-
-:Effects: ``++m_iterator``
-:Returns: ``*this``
-
-
-``transform_iterator& operator--();``
-
-:Effects: ``--m_iterator``
-:Returns: ``*this``
-
-

Change:

-
-template <class Predicate, class Iterator>
-class filter_iterator
-   : public iterator_adaptor<
-         filter_iterator<Predicate, Iterator>, Iterator
-       , use_default
-       , /* see details */
-     >
-{
- public:
-
-

to:

-
-template <class Predicate, class Iterator>
-class filter_iterator
-{
- public:
-   typedef iterator_traits<Iterator>::value_type value_type;
-   typedef iterator_traits<Iterator>::reference reference;
-   typedef iterator_traits<Iterator>::pointer pointer;
-   typedef iterator_traits<Iterator>::difference_type difference_type;
-   typedef /* see below */ iterator_category;
-
-

Change:

-
-private: // as-if specification
-   void increment()
-   {
-       ++(this->base_reference());
-       satisfy_predicate();
-   }
-
-   void satisfy_predicate()
-   {
-       while (this->base() != this->m_end && !this->m_predicate(*this->base()))
-           ++(this->base_reference());
-   }
-
-   Predicate m_predicate;
-   Iterator m_end;
-
-

to:

-
-    Iterator const& base() const;
-    reference operator*() const;
-    filter_iterator& operator++();
-private:
-    Predicate m_pred; // exposition only
-    Iterator m_iter;  // exposition only
-    Iterator m_end;   // exposition only
-
-
-
Change:
-
The base Iterator parameter must be a model of Readable -Iterator and Single Pass Iterator. The resulting -filter_iterator will be a model of Forward Traversal Iterator -if Iterator is, otherwise the filter_iterator will be a -model of Single Pass Iterator. The access category of the -filter_iterator will be the same as the access category of -Iterator.
-
to:
-
The Iterator argument shall meet the requirements of Readable -Iterator and Single Pass Iterator or it shall meet the requirements of -Input Iterator.
-
-

After the requirements section, add:

-
-
-

filter_iterator models

-
-

The concepts that filter_iterator models are dependent on which -concepts the Iterator argument models, as specified in the -following tables.

- ---- - - - - - - - - - - - - - -
If Iterator modelsthen filter_iterator models
Single Pass IteratorSingle Pass Iterator
Forward Traversal IteratorForward Traversal Iterator
- ---- - - - - - - - - - - - - - - - - -
If Iterator modelsthen filter_iterator models
Readable IteratorReadable Iterator
Writable IteratorWritable Iterator
Lvalue IteratorLvalue Iterator
- ---- - - - - - - - - - - - - - - - - -
If Iterator modelsthen filter_iterator models
Readable Iterator, Single Pass IteratorInput Iterator
Readable Lvalue Iterator, Forward Traversal IteratorForward Iterator
Writable Lvalue Iterator, Forward Traversal IteratorMutable Forward Iterator
-

filter_iterator<P1, X> is interoperable with filter_iterator<P2, Y> -if and only if X is interoperable with Y.

-
-
-
Change:
-
--- - - - -
Returns:a filter_iterator whose -predicate is a default constructed Predicate and -whose end is a default constructed Iterator.
-
-
to:
-
--- - - - -
Effects:Constructs a filter_iterator whose``m_pred``, m_iter, and m_end -members are a default constructed.
-
-
Change:
-
--- - - - -
Returns:A filter_iterator at position x that filters according -to predicate f and that will not increment past end.
-
-
to:
-
--- - - - -
Effects:Constructs a filter_iterator where m_iter is either -the first position in the range [x,end) such that f(*m_iter) == true -or else``m_iter == end``. The member m_pred is constructed from -f and m_end from end.
-
-
Change:
-
--- - - - -
Returns:A filter_iterator at position x that filters -according to a default constructed Predicate -and that will not increment past end.
-
-
to:
-
--- - - - -
Effects:Constructs a filter_iterator where m_iter is either -the first position in the range [x,end) such that m_pred(*m_iter) == true -or else``m_iter == end``. The member m_pred is default constructed.
-
-
Change:
-
--- - - - -
Returns:A copy of iterator t.
-
-
to:
-
--- - - - -
Effects:Constructs a filter iterator whose members are copied from t.
-
-
Change:
-
--- - - - -
Returns:A copy of the predicate object used to construct *this.
-
-
to:
-
--- - - - -
Returns:m_pred
-
-
Change:
-
--- - - - -
Returns:The object end used to construct *this.
-
-
to:
-
--- - - - -
Returns:m_end
-
-
-

At the end of the operations section, add:

-
-

reference operator*() const;

- --- - - - -
Returns:*m_iter
-

filter_iterator& operator++();

- --- - - - - - -
Effects:Increments m_iter and then continues to -increment m_iter until either m_iter == m_end -or m_pred(*m_iter) == true.
Returns:*this
-
-

Change:

-
-class counting_iterator
-  : public iterator_adaptor<
-        counting_iterator<Incrementable, Access, Traversal, Difference>
-      , Incrementable
-      , Incrementable
-      , Access
-      , /* see details for traversal category */
-      , Incrementable const&
-      , Incrementable const*
-      , /* distance = Difference or a signed integral type */>
-{
-    friend class iterator_core_access;
- public:
-
-

to:

-
-class counting_iterator
-{
- public:
-    typedef Incrementable value_type;
-    typedef const Incrementable& reference;
-    typedef const Incrementable* pointer;
-    typedef /* see below */ difference_type;
-    typedef /* see below */ iterator_category;
-
-

Change:

-
-private:
-    typename counting_iterator::reference dereference() const
-    {
-        return this->base_reference();
-    }
-
-

to:

-
-    Incrementable const& base() const;
-    reference operator*() const;
-    counting_iterator& operator++();
-    counting_iterator& operator--();
-private:
-    Incrementable m_inc; // exposition
-
-

After the synopsis, add:

-
-

If the Difference argument is use_default then -difference_type is an unspecified signed integral -type. Otherwise difference_type is Difference.

-

iterator_category is determined according to the following -algorithm:

-
-if (CategoryOrTraversal is not use_default)
-    return CategoryOrTraversal
-else if (numeric_limits<Incrementable>::is_specialized)
-    return iterator-category(
-        random_access_traversal_tag, Incrementable, const Incrementable&)
-else
-    return iterator-category(
-         iterator_traversal<Incrementable>::type, 
-         Incrementable, const Incrementable&)
-
-
-
-
Change:
-
-
[Note: implementers are encouraged to provide an implementation of
-
distance_to and a difference_type that avoids overflows in -the cases when the Incrementable type is a numeric type.]
-
-
-
to:
-
-
[Note: implementers are encouraged to provide an implementation of
-
operator- and a difference_type that avoid overflows in -the cases where std::numeric_limits<Incrementable>::is_specialized -is true.]
-
-
-
Change:
-

The Incrementable type must be Default Constructible, Copy -Constructible, and Assignable. The default distance is -an implementation defined signed integegral type.

-

The resulting counting_iterator models Readable Lvalue Iterator.

-
-
to:
-
The Incrementable argument shall be Copy Constructible and Assignable.
-
Change:
-
Furthermore, if you wish to create a counting iterator that is a Forward -Traversal Iterator, then the following expressions must be valid:
-
to:
-
If iterator_category is convertible to forward_iterator_tag -or forward_traversal_tag, the following must be well-formed:
-
Change:
-
If you wish to create a counting iterator that is a -Bidirectional Traversal Iterator, then pre-decrement is also required:
-
to:
-
If iterator_category is convertible to -bidirectional_iterator_tag or bidirectional_traversal_tag, -the following expression must also be well-formed:
-
Change:
-
If you wish to create a counting iterator that is a Random Access -Traversal Iterator, then these additional expressions are also -required:
-
to:
-
If iterator_category is convertible to -random_access_iterator_tag or random_access_traversal_tag, -the following must must also be valid:
-
-

After the requirements section, add:

-
-
-

counting_iterator models

-
-

Specializations of counting_iterator model Readable Lvalue -Iterator. In addition, they model the concepts corresponding to the -iterator tags to which their iterator_category is convertible. -Also, if CategoryOrTraversal is not use_default then -counting_iterator models the concept corresponding to the iterator -tag CategoryOrTraversal. Otherwise, if -numeric_limits<Incrementable>::is_specialized, then -counting_iterator models Random Access Traversal Iterator. -Otherwise, counting_iterator models the same iterator traversal -concepts modeled by Incrementable.

-

counting_iterator<X,C1,D1> is interoperable with -counting_iterator<Y,C2,D2> if and only if X is -interoperable with Y.

-
-

At the begining of the operations section, add:

-
-In addition to the operations required by the concepts modeled by -counting_iterator, counting_iterator provides the following -operations.
-
-
Change:
-
--- - - - -
Returns:A default constructed instance of counting_iterator.
-
-
to:
-
--- - - - - - -
Requires:Incrementable is Default Constructible.
Effects:Default construct the member m_inc.
-
-
Change:
-
--- - - - -
Returns:An instance of counting_iterator that is a copy of rhs.
-
-
to:
-
--- - - - -
Effects:Construct member m_inc from rhs.m_inc.
-
-
Change:
-
--- - - - -
Returns:An instance of counting_iterator with its base -object copy constructed from x.
-
-
to:
-
--- - - - -
Effects:Construct member m_inc from x.
-
-
-

At the end of the operations section, add:

-
-

reference operator*() const;

- --- - - - -
Returns:m_inc
-

counting_iterator& operator++();

- --- - - - - - -
Effects:++m_inc
Returns:*this
-

counting_iterator& operator--();

- --- - - - - - -
Effects:--m_inc
Returns:*this
-

Incrementable const& base() const;

- --- - - - -
Returns:m_inc
-
-
-
-
-

9.38x Problem with specification of a->m in Readable Iterator

- --- - - - - - -
Submitter:Howard Hinnant
Status:New
-

c++std-lib-12585:

-

Readable Iterator Requirements says:

-
- ----- - - - - - - -
a->mU&pre: (*a).m is well-defined. Equivalent to (*a).m
-
-

Do we mean to outlaw iterators with proxy references from meeting -the readable requirements?

-

Would it be better for the requirements to read static_cast<T>(*a).m -instead of (*a).m ?

- --- - - - - - - -
Proposed resolution:
 NAD.
Rationale:

We think you're misreading "pre:". -If (*a).m is not well defined, then the iterator is not -required to provide a->m. So a proxy iterator is not -required to provide a->m.

-

As an aside, it is possible for proxy iterators to -support ->, so changing the requirements to -read static_cast<T>(*a).m is interesting. -However, such a change to Readable Iterator would -mean that it no longer corresponds to the -input iterator requirements. So old iterators would not -necessarily conform to new iterator requirements.

-
-
-
-

9.39x counting_iterator Traversal argument unspecified

- --- - - - -
Submitter:Pete Becker
-

c++std-lib-12635:

-

counting_iterator takes an argument for its Traversal type, with a -default value of use_default. It is derived from an instance of -iterator_adaptor, where the argument passed for the Traversal type -is described as "/* see details for traversal category -*/". The details for counting_iterator describe constraints on -the Incrementable type imposed by various traversal -categories. There is no description of what the argument to -iterator_adaptor should be.

- --- - - - - -
Proposed resolution:
 We no longer inherit from iterator_adaptor. So instead, -we specify the iterator_category in terms of the Traversal type -(which is now called CategoryOrTraversal). Also the -requirements and models section was reorganized to -match these changes and to make more sense.
-
-
-

9.40x indirect_iterator requirements muddled

- --- - - - -
Submitter:Pete Becker
-

c++std-lib-12640:

-
-
-The value_type of the Iterator template parameter should itself -be dereferenceable. The return type of the operator* for -the value_type must be the same type as the Reference template -parameter.
-

I'd say this a bit differently, to emphasize what's required: -iterator_traits<Iterator>::value_type must be dereferenceable. -The Reference template parameter must be the same type as -*iterator_traits<Iterator>::value_type().

-
-The Value template parameter will be the value_type for the -indirect_iterator, unless Value is const. If Value is const X, then -value_type will be non- const X.
-

Also non-volatile, right? In other words, if Value isn't use_default, it -just gets passed as the Value argument for iterator_adaptor.

-
-

The default for Value is:

-
-iterator_traits< iterator_traits<Iterator>::value_type >::value_type
-
-

If the default is used for Value, then there must be a valid -specialization of iterator_traits for the value type of the -base iterator.

-
-

The earlier requirement is that -iterator_traits<Iterator>::value_type must be -dereferenceable. Now it's being treated as an iterator. Is this -just a pun, or is iterator_traits<Iterator>::value_type -required to be some form of iterator? If it's the former we need -to find a different way to say it. If it's the latter we need to -say so.

-
- --- - - - - - - -
Proposed resolution:
 

Change:

-
-

The value_type of the Iterator template parameter -should itself be dereferenceable. The return type of the -operator* for the value_type must be the same type as -the Reference template parameter. The Value template -parameter will be the value_type for the -indirect_iterator, unless Value is const. If Value -is const X, then value_type will be non- const X. -The default for Value is:

-
-iterator_traits< iterator_traits<Iterator>::value_type >::value_type
-
-

If the default is used for Value, then there must be a -valid specialization of iterator_traits for the value type -of the base iterator.

-

The Reference parameter will be the reference type of the -indirect_iterator. The default is Value&.

-

The Access and Traversal parameters are passed -unchanged to the corresponding parameters of the -iterator_adaptor base class, and the Iterator parameter -is passed unchanged as the Base parameter to the -iterator_adaptor base class.

-
-

to:

-
-
-The expression *v, where v is an object of -iterator_traits<Iterator>::value_type, shall be valid -expression and convertible to reference. Iterator -shall model the traversal concept indicated by -iterator_category. Value, Reference, and -Difference shall be chosen so that value_type, -reference, and difference_type meet the requirements -indicated by iterator_category.
-

[Note: there are further requirements on the -iterator_traits<Iterator>::value_type if the Value -parameter is not use_default, as implied by the algorithm -for deducing the default for the value_type member.]

-
-
Rationale:Not included above is the specification of the -value_type, reference, etc., members, which is handled by -the changes in 9.37x.
-
-
-

9.41x Problem with transform_iterator requirements

- --- - - - -
Submitter:Pete Becker
-

c++std-lib-12641:

-
-The reference type of transform_iterator is result_of< -UnaryFunction(iterator_traits<Iterator>::reference) ->::type. The value_type is -remove_cv<remove_reference<reference> >::type.
-

These are the defaults, right? If the user supplies their own types -that's what gets passed to iterator_adaptor. And again, the -specification should be in terms of the specialization of -iterator_adaptor, and not in terms of the result:

-

Reference argument to iterator_adaptor:

-
-if (Reference != use_default)
-    Reference
-else
-    result_of<
-        UnaryFunction(iterator_traits<Iterator>::reference)
-    >::type
-
-

Value argument to iterator_adaptor:

-
-if (Value != use_default)
-    Value
-else if (Reference != use_default)
-    remove_reference<reference>::type
-else
-    remove_reference<
-        result_of<
-            UnaryFunction(iterator_traits<Iterator>::reference)
-        >::type
-    >::type
-
-

There's probably a better way to specify that last alternative, but -I've been at this too long, and it's all turning into a maze of -twisty passages, all alike.

- --- - - - - -
Proposed resolution:
 

Replace:

-
-The reference type of transform_iterator is result_of< -UnaryFunction(iterator_traits<Iterator>::reference) ->::type. The value_type is -remove_cv<remove_reference<reference> >::type.
-

with:

-
-

If Reference is use_default then the reference -member of transform_iterator is result_of< -UnaryFunction(iterator_traits<Iterator>::reference) ->::type. Otherwise, reference is Reference.

-

If Value is use_default then the value_type -member is remove_cv<remove_reference<reference> >::type. -Otherwise, value_type is Value.

-
-
-
-
-

9.42x filter_iterator details unspecified

- --- - - - -
Submitter:Pete Becker
-

c++std-lib-12642:

-

The paper says:

-
-template<class Predicate, class Iterator>
-class filter_iterator
-     : public iterator_adaptor<
-         filter_iterator<Predicate, Iterator>,
-         Iterator,
-         use_default,
-         /* see details */ >
-
-

That comment covers the Access, Traversal, Reference, and Difference -arguments. The only specification for any of these in the details is:

-
-The access category of the filter_iterator will be the same as -the access category of Iterator.
-

Needs more.

- --- - - - - -
Proposed resolution:
 

Add to the synopsis:

-
-typedef iterator_traits<Iterator>::value_type value_type;
-typedef iterator_traits<Iterator>::reference reference;
-typedef iterator_traits<Iterator>::pointer pointer;
-typedef iterator_traits<Iterator>::difference_type difference_type;
-typedef /* see below */ iterator_category;
-
-

and add just after the synopsis:

-
-If Iterator models Readable Lvalue Iterator and Forward -Traversal Iterator then iterator_category is convertible -to std::forward_iterator_tag. Otherwise -iterator_category is convertible to -std::input_iterator_tag.
-
-
-
-

9.43x transform_iterator interoperability too restrictive

- --- - - - -
Submitter:Jeremy Siek
-

We do not need to require that the function objects have the same -type, just that they be convertible.

- --- - - - - -
Proposed resolution:
 

Change:

-
-template<class OtherIterator, class R2, class V2>
-transform_iterator(
-      transform_iterator<UnaryFunction, OtherIterator, R2, V2> const& t
-    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-);
-
-

to:

-
-template<class F2, class I2, class R2, class V2>
-transform_iterator(
-      transform_iterator<F2, I2, R2, V2> const& t
-    , typename enable_if_convertible<I2, Iterator>::type* = 0      // exposition only
-    , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
-);
-
-
-
-
-

9.44y indirect_iterator and smart pointers

- --- - - - -
Submitter:Dave Abrahams
-

indirect_iterator should be able to iterate over containers of -smart pointers, but the mechanism that allows it was left out of -the specification, even though it's present in the Boost -specification

- --- - - - - -
Proposed resolution:
 

Add pointee and indirect_reference -to deal with this capability.

-

In [lib.iterator.helper.synopsis], add:

-
-template <class Dereferenceable>
-struct pointee;
-
-template <class Dereferenceable>
-struct indirect_reference;
-
-

After indirect_iterator's abstract, add:

-
-
-

Class template pointee

- - - -
-template <class Dereferenceable>
-struct pointee
-{
-    typedef /* see below */ type;
-};
-
- --- - - - -
Requires:For an object x of type Dereferenceable, *x -is well-formed. If ++x is ill-formed it shall neither be -ambiguous nor shall it violate access control, and -Dereferenceable::element_type shall be an accessible type. -Otherwise iterator_traits<Dereferenceable>::value_type shall -be well formed. [Note: These requirements need not apply to -explicit or partial specializations of pointee]
-

type is determined according to the following algorithm, where -x is an object of type Dereferenceable:

-
-if ( ++x is ill-formed )
-{
-    return ``Dereferenceable::element_type``
-}
-else if (``*x`` is a mutable reference to
-         std::iterator_traits<Dereferenceable>::value_type)
-{
-    return iterator_traits<Dereferenceable>::value_type
-}
-else
-{
-    return iterator_traits<Dereferenceable>::value_type const
-}
-
-
-
-

Class template indirect_reference

- - - -
-template <class Dereferenceable>
-struct indirect_reference
-{
-    typedef /* see below */ type;
-};
-
- --- - - - -
Requires:For an object x of type Dereferenceable, *x -is well-formed. If ++x is ill-formed it shall neither be -ambiguous nor shall it violate access control, and -pointee<Dereferenceable>::type& shall be well-formed. -Otherwise iterator_traits<Dereferenceable>::reference shall -be well formed. [Note: These requirements need not apply to -explicit or partial specializations of indirect_reference]
-

type is determined according to the following algorithm, where -x is an object of type Dereferenceable:

-
-if ( ++x is ill-formed )
-    return ``pointee<Dereferenceable>::type&``
-else
-    std::iterator_traits<Dereferenceable>::reference
-
-
-

See proposed resolution to Issue 9.37x for more changes related to -this issue.

-
-
-

9.45y N1530: Typos and editorial changes in proposal text (not standardese)

- --- - - - -
Submitter:Dave Abrahams
-
    -
  1. "because specification helps to highlight that the Reference -template parameter may not always be identical to the iterator's -reference type, and will keep users making mistakes based on -that assumption."

    - --- - - - - -
    Proposed resolution:
     

    add "from" before "making"

    -
    -
  2. -
  3. mention of obsolete projection_iterator

    -
  4. -
-
- --- - - - - - - -
Proposed Resolution:
 

From n1530, in the Specialized Adaptors section, remove:

-
-projection_iterator, which is similar to transform_iterator -except that when dereferenced it returns a reference instead of -a value.
-
Rationale:This iterator was in the original boost library, but the new -iterator concepts allowed this iterator to be -folded into transform_iterator.
-
-
-
-

9.46y N1530: base() return-by-value is costly

- --- - - - -
Submitter:Dave Abrahams
-

We've had some real-life reports that iterators that use -iterator_adaptor's base() function can be inefficient -when the Base iterator is expensive to copy. Iterators, of -all things, should be efficient.

- --- - - - - -
Proposed resolution:
 

In [lib.iterator.adaptor]

-

Change:

-
-Base base() const;
-
-

to:

-
-Base const& base() const;
-
-

twice (once in the synopsis and once in the public -operations section).

-
-
-
-

9.47x Forgot default constructible in Forward Traversal Iterator

- --- - - - -
Submitter:Jeremy Siek
-

We want Forward Traversal Iterator plus Readable Lvalue Iterator to -match the old Foward Iterator requirements, so we need Forward -Traversal Iterator to include Default Constructible.

- --- - - - - -
Proposed resolution:
 

Change:

-
-

A class or built-in type X models the Forward Traversal Iterator -concept if the following expressions are valid and respect the stated -semantics.

- ----- - - - - -
Forward Traversal Iterator Requirements (in addition to Single Pass Iterator)
-
-

to:

-
-

A class or built-in type X models the Forward Traversal Iterator -concept if, in addition to X meeting the requirements of -Default Constructible and Single Pass Iterator, the following -expressions are valid and respect the -stated semantics.

- ----- - - - - -
Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator)
-
-
-
-
-

9.48x Editorial changes (non-normative text)

-
-
Change:
-
Iterator facade uses the Curiously Recurring Template Pattern (CRTP) -[Cop95] so that the user can specify the behavior of -iterator_facade in a derived class. Former designs used policy -objects to specify the behavior. iterator_facade does not use policy -objects for several reasons:
-
to:
-
Iterator facade uses the Curiously Recurring Template -Pattern (CRTP) [Cop95] so that the user can specify the behavior -of iterator_facade in a derived class. Former designs used -policy objects to specify the behavior, but that approach was -discarded for several reasons:
-
Change:
-
iterator's operator++ returns the iterator type itself means -that all iterators generated by iterator_facade would be -instantiations of iterator_facade. Cumbersome type generator
-
to:
-
iterator's operator++ returns the iterator type itself -would mean that all iterators built with the library would -have to be specializations of iterator_facade<...>, rather -than something more descriptive like -indirect_iterator<T*>. Cumbersome type generator
-
Change:
-
The return type for operator-> and operator[] is not -explicitly specified. Instead it requires each iterator_facade -instantiation to meet the requirements of its iterator_category.
-
To:
-
The return types for iterator_facade's operator-> and -operator[] are not explicitly specified. Instead, those types -are described in terms of a set of requirements, which must be -satisfied by the iterator_facade implementation.
-
-
-
-

9.49x Clarification of iterator_facade requirements and type members

-

A general cleanup and simplification of the requirements and -description of type members for iterator_facade.

-

The user is only allowed to add const as a qualifier.

-
-
Change:
-
typedef remove_cv<Value>::type value_type;
-
to:
-
typedef remove_const<Value>::type value_type;
-
-

We use to have an unspecified type for pointer, to match the -return type of operator->, but there's no real reason to make them -match, so we just use the simpler Value* for pointer.

-

Change:

-
-typedef /* see description of operator-> */ pointer;
-
-
To:
-
typedef Value* pointer;
-
Remove:
-
Some of the constraints on template parameters to -iterator_facade are expressed in terms of resulting nested -types and should be viewed in the context of their impact on -iterator_traits<Derived>.
-
Change:
-
The Derived template parameter must be a class derived from -iterator_facade.
-
and:
-
The following table describes the other requirements on the -Derived parameter. Depending on the resulting iterator's -iterator_category, a subset of the expressions listed in the table -are required to be valid. The operations in the first column must be -accessible to member functions of class iterator_core_access.
-
to:
-
The following table describes the typical valid expressions on -iterator_facade's Derived parameter, depending on the -iterator concept(s) it will model. The operations in the first -column must be made accessible to member functions of class -iterator_core_access. In addition, -static_cast<Derived*>(iterator_facade*) shall be well-formed.
-
Remove:
-

The nested ::value_type type will be the same as -remove_cv<Value>::type, so the Value parameter must be -an (optionally const-qualified) non-reference type.

-

The nested ::reference will be the same as the Reference -parameter; it must be a suitable reference type for the resulting -iterator. The default for the Reference parameter is -Value&.

-
-
-

Change:

-
-

In the table below, X is the derived iterator type, a is an -object of type X, b and c are objects of type const X, -n is an object of X::difference_type, y is a constant -object of a single pass iterator type interoperable with X, and z -is a constant object of a random access traversal iterator type -interoperable with X.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ExpressionReturn TypeAssertion/NoteRequired to implement -Iterator Concept(s)
c.dereference()X::reference Readable Iterator, Writable -Iterator
c.equal(b)convertible to booltrue iff b and c are -equivalent.Single Pass Iterator
c.equal(y)convertible to booltrue iff c and y refer to the -same position. Implements c == y -and c != y.Single Pass Iterator
a.advance(n)unused Random Access Traversal -Iterator
a.increment()unused Incrementable Iterator
a.decrement()unused Bidirectional Traversal -Iterator
c.distance_to(b)convertible to -X::difference_typeequivalent to distance(c, b)Random Access Traversal -Iterator
c.distance_to(z)convertible to -X::difference_typeequivalent to distance(c, z). -Implements c - z, c < z, c -<= z, c > z, and c >= c.Random Access Traversal -Iterator
-
-

to:

-
-

In the table below, F is iterator_facade<X,V,C,R,D>, a is an -object of type X, b and c are objects of type const X, -n is an object of F::difference_type, y is a constant -object of a single pass iterator type interoperable with X, and z -is a constant object of a random access traversal iterator type -interoperable with X.

-

iterator_facade Core Operations

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ExpressionReturn TypeAssertion/NoteUsed to implement Iterator -Concept(s)
c.dereference()F::reference Readable Iterator, Writable -Iterator
c.equal(y)convertible to booltrue iff c and y -refer to the same -position.Single Pass Iterator
a.increment()unused Incrementable Iterator
a.decrement()unused Bidirectional Traversal -Iterator
a.advance(n)unused Random Access Traversal -Iterator
c.distance_to(z)convertible to -F::difference_typeequivalent to -distance(c, X(z)).Random Access Traversal -Iterator
-
-
-
-
- - - - diff --git a/doc/iter-issue-list.rst b/doc/iter-issue-list.rst deleted file mode 100644 index 6e1064d..0000000 --- a/doc/iter-issue-list.rst +++ /dev/null @@ -1,3841 +0,0 @@ -+++++++++++++++++++++++++++++++++++++ - Iterator concept and adapter issues -+++++++++++++++++++++++++++++++++++++ - -:date: $Date$ - -.. contents:: Index - -=================================== - Issues from Matt's TR issues list -=================================== - - -9.1 iterator_access overspecified? -================================== - -:Submitter: Pete Becker -:Status: New - -The proposal includes:: - - enum iterator_access { - readable_iterator = 1, writable_iterator = 2, - swappable_iterator = 4, lvalue_iterator = 8 - }; - -In general, the standard specifies thing like this as a bitmask -type with a list of defined names, and specifies neither the exact -type nor the specific values. Is there a reason for iterator_access -to be more specific? - -:Proposed resolution: The ``iterator_access`` enum will be removed, - so this is no longer an issue. See the resolution to 9.15. - - -9.2 operators of iterator_facade overspecified -============================================== - -:Submitter: Pete Becker -:Status: New - -In general, we've provided operational semantics for things like -operator++. That is, we've said that ++iter must work, without -requiring either a member function or a non-member function. -iterator_facade specifies most operators as member -functions. There's no inherent reason for these to be members, so -we should remove this requirement. Similarly, some operations are -specified as non-member functions but could be implemented as -members. Again, the standard doesn't make either of these choices, -and TR1 shouldn't, either. So: ``operator*()``, ``operator++()``, -``operator++(int)``, ``operator--()``, ``operator--(int)``, -``operator+=``, ``operator-=``, ``operator-(difference_type)``, -``operator-(iterator_facade instance)``, and ``operator+`` should -be specified with operational semantics and not explicitly required -to be members or non-members. - -:Proposed resolution: Not a defect. - -:Rationale: The standard uses valid expressions such as ``++iter`` - in requirements tables, such as for input iterator. However, for - classes, such as ``reverse_iterator``, the standard uses function - prototypes, as we have done here for - ``iterator_facade``. Further, the prototype specification does - not prevent the implementor from using members or non-members, - since nothing the user can do in a conforming program can detect - how the function is implemented. - - -9.3 enable_if_interoperable needs standardese -============================================= - -:Submitter: Pete Becker -:Status: New - -The only discussion of what this means is in a note, so is -non-normative. Further, the note seems to be incorrect. It says -that enable_if_interoperable only works for types that "are -interoperable, by which we mean they are convertible to each -other." This requirement is too strong: it should be that one of -the types is convertible to the other. N1541 48 - -:Proposed resolution: Add normative text. Relax requirements in the - proposed way. - - Change: - - [*Note:* The ``enable_if_interoperable`` template used above is - for exposition purposes. The member operators should be only be - in an overload set provided the derived types ``Dr1`` and - ``Dr2`` are interoperable, by which we mean they are - convertible to each other. The ``enable_if_interoperable`` - approach uses SFINAE to take the operators out of the overload - set when the types are not interoperable.] - - To: - - The ``enable_if_interoperable`` template used above is for - exposition purposes. The member operators should only be in an - overload set provided the derived types ``Dr1`` and ``Dr2`` are - interoperable, meaning that at least one of the types is - convertible to the other. The ``enable_if_interoperable`` - approach uses SFINAE to take the operators out of the overload - set when the types are not interoperable. The operators should - behave *as-if* ``enable_if_interoperable`` were defined to be:: - - template enable_if_interoperable_impl - {}; - - template enable_if_interoperable_impl - { typedef T type; }; - - template - struct enable_if_interoperable - : enable_if_interoperable_impl< - is_convertible::value || is_convertible::value - , T - > - {}; - -9.4 enable_if_convertible unspecified, conflicts with requires -============================================================== - -:Submitter: Pete Becker -:Status: New - -In every place where enable_if_convertible is used it's used like -this (simplified):: - - template - struct C - { - template - C(T1, enable_if_convertible::type* = 0); - }; - -The idea being that this constructor won't compile if T1 isn't -convertible to T. As a result, the constructor won't be considered -as a possible overload when constructing from an object x where the -type of x isn't convertible to T. In addition, however, each of -these constructors has a requires clause that requires -convertibility, so the behavior of a program that attempts such a -construction is undefined. Seems like the enable_if_convertible -part is irrelevant, and should be removed. There are two -problems. First, enable_if_convertible is never specified, so we -don't know what this is supposed to do. Second: we could reasonably -say that this overload should be disabled in certain cases or we -could reasonably say that behavior is undefined, but we can't say -both. - -Thomas Witt writes that the goal of putting in -enable_if_convertible here is to make sure that a specific overload -doesn't interfere with the generic case except when that overload -makes sense. He agrees that what we currently have is deficient. -Dave Abrahams writes that there is no conflict with the requires -cause because the requires clause only takes effect when the -function is actually called. The presence of the constructor -signature can/will be detected by is_convertible without violating -the requires clause, and thus it makes a difference to disable -those constructor instantiations that would be disabled by -enable_if_convertible even if calling them invokes undefined -behavior. There was more discussion on the reflector: -c++std-lib-12312, c++std-lib-12325, c++std-lib- 12330, -c++std-lib-12334, c++std-lib-12335, c++std-lib-12336, -c++std-lib-12338, c++std-lib- 12362. - -:Proposed resolution: - Change: - - [*Note:* The ``enable_if_convertible::type`` expression - used in this section is for exposition purposes. The converting - constructors for specialized adaptors should be only be in an - overload set provided that an object of type ``X`` is - implicitly convertible to an object of type ``Y``. The - ``enable_if_convertible`` approach uses SFINAE to take the - constructor out of the overload set when the types are not - implicitly convertible.] - - To: - - The ``enable_if_convertible::type`` expression used in - this section is for exposition purposes. The converting - constructors for specialized adaptors should be only be in an - overload set provided that an object of type ``X`` is - implicitly convertible to an object of type ``Y``. The - signatures involving ``enable_if_convertible`` should behave - *as-if* ``enable_if_convertible`` were defined to be:: - - template enable_if_convertible_impl - {}; - - template <> enable_if_convertible_impl - { struct type; }; - - template - struct enable_if_convertible - : enable_if_convertible_impl::value> - {}; - - If an expression other than the default argument is used to - supply the value of a function parameter whose type is written - in terms of ``enable_if_convertible``, the program is - ill-formed, no diagnostic required. - - [*Note:* The ``enable_if_convertible`` approach uses SFINAE to - take the constructor out of the overload set when the types are - not implicitly convertible. ] - -9.5 iterator_adaptor has an extraneous 'bool' at the start of the template definition -===================================================================================== - -:Submitter: Pete Becker -:Status: New - -The title says it all; this is probably just a typo. - -:Proposed resolution: Remove the 'bool'. - -9.6 Name of private member shouldn't be normative -================================================= - -:Submitter: Pete Becker -:Status: New - -iterator_adaptor has a private member named m_iterator. Presumably -this is for exposition only, since it's an implementation -detail. It needs to be marked as such. - -:Proposed resolution: Mark the member ``m_iterator`` as exposition - only. Note/DWA: I think this is NAD because the user can't - detect it, though I'm happy to mark it exposition only. - - In [lib.iterator.adaptor] - - Change:: - - Base m_iterator; - - to:: - - Base m_iterator; // exposition only - - -9.7 iterator_adaptor operations specifications are a bit inconsistent -===================================================================== - -:Submitter: Pete Becker -:Status: New - -iterator_adpator() has a Requires clause, that Base must be default -constructible. iterator_adaptor(Base) has no Requires clause, -although the Returns clause says that the Base member is copy -construced from the argument (this may actually be an oversight in -N1550, which doesn't require iterators to be copy constructible or -assignable). - -:Proposed resolution: Add a requirements section for the template - parameters of iterator_adaptor, and state that Base must be Copy - Constructible and Assignable. - - N1550 does in fact include requirements for copy constructible - and assignable in the requirements tables. To clarify, we've also - added the requirements to the text. - - -9.8 Specialized adaptors text should be normative -================================================= - -:Submitter: Pete Becker -:Status: New - -similar to 9.3, "Specialized Adaptors" has a note describing -enable_if_convertible. This should be normative text. - -:Proposed resolution: Changed it to normative - text. See the resolution of 9.4 - -9.9 Reverse_iterator text is too informal -========================================= - -:Submitter: Pete Becker -:Status: New - -reverse iterator "flips the direction of the base iterator's -motion". This needs to be more formal, as in the current -standard. Something like: "iterates through the controlled sequence -in the opposite direction" - -:Proposed resolution: - - Change: - - The reverse iterator adaptor flips the direction of a base - iterator's motion. Invoking ``operator++()`` moves the base - iterator backward and invoking ``operator--()`` moves the base - iterator forward. - - to: - - The reverse iterator adaptor iterates through the adapted iterator - range in the opposite direction. - - -9.10 'prior' is undefined -========================= - -:Submitter: Pete Becker -:Status: New - -reverse_iterator::dereference is specified as calling a function -named 'prior' which has no specification. - -:Proposed resolution: - Change the specification to avoid using ``prior`` as follows. - - Remove:: - - typename reverse_iterator::reference dereference() const { return *prior(this->base()); } - - And at the end of the operations section add: - - ``reference operator*() const;`` - - :Effects: - - :: - - Iterator tmp = m_iterator; - return *--tmp; - -:Rationale: - The style of specification has changed because of issue 9.37x. - - - -9.11 "In other words" is bad wording -==================================== - -:Submitter: Pete Becker -:Status: New - -Transform iterator has a two-part specification: it does this, in -other words, it does that. "In other words" always means "I didn't -say it right, so I'll try again." We need to say it once. - -:Proposed resolution: - Change: - - The transform iterator adapts an iterator by applying some function - object to the result of dereferencing the iterator. In other words, - the ``operator*`` of the transform iterator first dereferences the - base iterator, passes the result of this to the function object, and - then returns the result. - - to: - - The transform iterator adapts an iterator by modifying the - ``operator*`` to apply a function object to the result of - dereferencing the iterator and returning the result. - - -9.12 Transform_iterator shouldn't mandate private member -======================================================== - -:Submitter: Pete Becker -:Status: New - -transform_iterator has a private member named 'm_f' which should be -marked "exposition only." - -:Proposed resolution: Mark the member ``m_f`` as exposition - only. Note/DWA: I think this is NAD because the user can't - detect it, though I'm happy to mark it exposition only. - - Change:: - - UnaryFunction m_f; - - to:: - - UnaryFunction m_f; // exposition only - - - -9.13 Unclear description of counting iterator -============================================= - -:Submitter: Pete Becker -:Status: New - -The description of Counting iterator is unclear. "The counting -iterator adaptor implements dereference by returning a reference to -the base object. The other operations are implemented by the base -m_iterator, as per the inheritance from iterator_adaptor." - -:Proposed resolution: - Change: - - The counting iterator adaptor implements dereference by - returning a reference to the base object. The other operations - are implemented by the base ``m_iterator``, as per the - inheritance from ``iterator_adaptor``. - - to: - - ``counting_iterator`` adapts an object by adding an - ``operator*`` that returns the current value of the object. All - other iterator operations are forwarded to the adapted object. - - - -9.14 Counting_iterator's difference type -======================================== - -:Submitter: Pete Becker -:Status: New - -Counting iterator has the following note: - - [Note: implementers are encouraged to provide an implementation - of distance_to and a difference_type that avoids overflows in the - cases when the Incrementable type is a numeric type.] - -I'm not sure what this means. The user provides a template argument -named Difference, but there's no difference_type. I assume this is -just a glitch in the wording. But if implementors are encouraged to -ignore this argument if it won't work right, why is it there? - -:Proposed resolution: The ``difference_type`` was inherited from - ``iterator_adaptor``. However, we've removed the explicit - inheritance, so explicit typedefs have been added. See the - resolution of 9.37x. - - - -9.15 How to detect lvalueness? -============================== - -:Submitter: Dave Abrahams -:Status: New - -Shortly after N1550 was accepted, we discovered that an iterator's -lvalueness can be determined knowing only its value_type. This -predicate can be calculated even for old-style iterators (on whose -reference type the standard places few requirements). A trait in -the Boost iterator library does it by relying on the compiler's -unwillingness to bind an rvalue to a T& function template -parameter. Similarly, it is possible to detect an iterator's -readability knowing only its value_type. Thus, any interface which -asks the user to explicitly describe an iterator's lvalue-ness or -readability seems to introduce needless complexity. - - -:Proposed resolution: - - 1. Remove the ``is_writable`` and ``is_swappable`` traits, and - remove the requirements in the Writable Iterator and Swappable - Iterator concepts that require their models to support these - traits. - - 2. Change the ``is_readable`` specification. Remove the - requirement for support of the ``is_readable`` trait from the - Readable Iterator concept. - - 3. Remove the ``iterator_tag`` class and transplant the logic for - choosing an iterator category into ``iterator_facade``. - - 4. Change the specification of ``traversal_category``. - - 5. Remove Access parameters from N1530 - - In N1550: - - Remove: - - Since the access concepts are not related via refinement, but - instead cover orthogonal issues, we do not use tags for the - access concepts, but instead use the equivalent of a bit field. - - We provide an access mechanism for mapping iterator types to - the new traversal tags and access bit field. Our design reuses - ``iterator_traits::iterator_category`` as the access - mechanism. To that end, the access and traversal information is - bundled into a single type using the following `iterator_tag` - class. - - :: - - enum iterator_access { readable_iterator = 1, writable_iterator = 2, - swappable_iterator = 4, lvalue_iterator = 8 }; - - template - struct iterator_tag : /* appropriate old category or categories */ { - static const iterator_access access = - (iterator_access)access_bits & - (readable_iterator | writable_iterator | swappable_iterator); - typedef TraversalTag traversal; - }; - - The ``access_bits`` argument is declared to be ``unsigned int`` - instead of the enum ``iterator_access`` for convenience of - use. For example, the expression ``(readable_iterator | - writable_iterator)`` produces an unsigned int, not an - ``iterator_access``. The purpose of the ``lvalue_iterator`` - part of the ``iterator_access`` enum is to communicate to - ``iterator_tag`` whether the reference type is an lvalue so - that the appropriate old category can be chosen for the base - class. The ``lvalue_iterator`` bit is not recorded in the - ``iterator_tag::access`` data member. - - The ``iterator_tag`` class template is derived from the - appropriate iterator tag or tags from the old requirements - based on the access bits and traversal tag passed as template - parameters. The algorithm for determining the old tag or tags - picks the least refined old concepts that include all of the - requirements of the access and traversal concepts (that is, the - closest fit), if any such category exists. For example, the - category tag for a Readable Single Pass Iterator will always be - derived from ``input_iterator_tag``, while the category tag for - a Single Pass Iterator that is both Readable and Writable will - be derived from both ``input_iterator_tag`` and - ``output_iterator_tag``. - - We also provide several helper classes that make it convenient - to obtain the access and traversal characteristics of an - iterator. These helper classes work both for iterators whose - ``iterator_category`` is ``iterator_tag`` and also for - iterators using the original iterator categories. - - :: - - template struct is_readable { typedef ... type; }; - template struct is_writable { typedef ... type; }; - template struct is_swappable { typedef ... type; }; - template struct traversal_category { typedef ... type; }; - - - After: - - Like the old iterator requirements, we provide tags for - purposes of dispatching based on the traversal concepts. The - tags are related via inheritance so that a tag is convertible - to another tag if the concept associated with the first tag is - a refinement of the second tag. - - Add: - - Our design reuses ``iterator_traits::iterator_category`` - to indicate an iterator's traversal capability. To specify - capabilities not captured by any old-style iterator category, - an iterator designer can use an ``iterator_category`` type that - is convertible to both the the most-derived old iterator - category tag which fits, and the appropriate new iterator - traversal tag. - - We do not provide tags for the purposes of dispatching based on - the access concepts, in part because we could not find a way to - automatically infer the right access tags for old-style - iterators. An iterator's writability may be dependent on the - assignability of its ``value_type`` and there's no known way to - detect whether an arbitrary type is assignable. Fortunately, - the need for dispatching based on access capability is not as - great as the need for dispatching based on traversal - capability. - - - From the Readable Iterator Requirements table, remove: - - +-----------------------------------+-----------------------------------+-------------------------+ - |``is_readable::type`` |``true_type`` | | - +-----------------------------------+-----------------------------------+-------------------------+ - - From the Writable Iterator Requirements table, remove: - - +-------------------------+--------------+----------------------------+ - |``is_writable::type`` |``true_type`` | | - +-------------------------+--------------+----------------------------+ - - From the Swappable Iterator Requirements table, remove: - - +-------------------------+-------------+-----------------------------+ - |``is_swappable::type``|``true_type``| | - +-------------------------+-------------+-----------------------------+ - - - From [lib.iterator.synopsis] replace:: - - template struct is_readable; - template struct is_writable; - template struct is_swappable; - template struct traversal_category; - - enum iterator_access { readable_iterator = 1, writable_iterator = 2, - swappable_iterator = 4, lvalue_iterator = 8 }; - - template - struct iterator_tag : /* appropriate old category or categories */ { - static const iterator_access access = - (iterator_access)access_bits & - (readable_iterator | writable_iterator | swappable_iterator); - typedef TraversalTag traversal; - }; - - with:: - - template struct is_readable_iterator; - template struct iterator_traversal; - - - In [lib.iterator.traits], remove: - - The ``iterator_tag`` class template is an iterator category tag - that encodes the access enum and traversal tag in addition to - being compatible with the original iterator tags. The - ``iterator_tag`` class inherits from one of the original - iterator tags according to the following pseudo-code. - - :: - - inherit-category(access, traversal-tag) = - if ((access & readable_iterator) && (access & lvalue_iterator)) { - if (traversal-tag is convertible to random_access_traversal_tag) - return random_access_iterator_tag; - else if (traversal-tag is convertible to bidirectional_traversal_tag) - return bidirectional_iterator_tag; - else if (traversal-tag is convertible to forward_traversal_tag) - return forward_iterator_tag; - else if (traversal-tag is convertible to single_pass_traversal_tag) - if (access-tag is convertible to writable_iterator_tag) - return input_output_iterator_tag; - else - return input_iterator_tag; - else - return null_category_tag; - } else if ((access & readable_iterator) and (access & writable_iterator) - and traversal-tag is convertible to single_pass_iterator_tag) - return input_output_iterator_tag; - else if (access & readable_iterator - and traversal-tag is convertible to single_pass_iterator_tag) - return input_iterator_tag; - else if (access & writable_iterator - and traversal-tag is convertible to incrementable_iterator_tag) - return output_iterator_tag; - else - return null_category_tag; - - If the argument for ``TraversalTag`` is not convertible to - ``incrementable_iterator_tag`` then the program is ill-formed. - - Change: - - The ``is_readable``, ``is_writable``, ``is_swappable``, and - ``traversal_category`` class templates are traits classes. For - iterators whose ``iterator_traits::iterator_category`` - type is ``iterator_tag``, these traits obtain the ``access`` - enum and ``traversal`` member type from within - ``iterator_tag``. For iterators whose - ``iterator_traits::iterator_category`` type is not - ``iterator_tag`` and instead is a tag convertible to one of the - original tags, the appropriate traversal tag and access bits - are deduced. The following pseudo-code describes the - algorithm. - - :: - - is-readable(Iterator) = - cat = iterator_traits::iterator_category; - if (cat == iterator_tag) - return Access & readable_iterator; - else if (cat is convertible to input_iterator_tag) - return true; - else - return false; - - is-writable(Iterator) = - cat = iterator_traits::iterator_category; - if (cat == iterator_tag) - return Access & writable_iterator; - else if (cat is convertible to output_iterator_tag) - return true; - else if ( - cat is convertible to forward_iterator_tag - and iterator_traits::reference is a - mutable reference) - return true; - else - return false; - - is-swappable(Iterator) = - cat = iterator_traits::iterator_category; - if (cat == iterator_tag) - return Access & swappable_iterator; - else if (cat is convertible to forward_iterator_tag) { - if (iterator_traits::reference is a const reference) - return false; - else - return true; - } else - return false; - - traversal-category(Iterator) = - cat = iterator_traits::iterator_category; - if (cat == iterator_tag) - return Traversal; - else if (cat is convertible to random_access_iterator_tag) - return random_access_traversal_tag; - else if (cat is convertible to bidirectional_iterator_tag) - return bidirectional_traversal_tag; - else if (cat is convertible to forward_iterator_tag) - return forward_traversal_tag; - else if (cat is convertible to input_iterator_tag) - return single_pass_iterator_tag; - else if (cat is convertible to output_iterator_tag) - return incrementable_iterator_tag; - else - return null_category_tag; - - - The following specializations provide the access and traversal - category tags for pointer types. - - :: - - template - struct is_readable { typedef true_type type; }; - template - struct is_writable { typedef false_type type; }; - template - struct is_swappable { typedef false_type type; }; - - template - struct is_readable { typedef true_type type; }; - template - struct is_writable { typedef true_type type; }; - template - struct is_swappable { typedef true_type type; }; - - template - struct traversal_category - { - typedef random_access_traversal_tag type; - }; - - to: - - The ``is_readable_iterator`` class template satisfies the - UnaryTypeTrait requirements. - - Given an iterator type ``X``, - ``is_readable_iterator::value`` yields ``true`` if, for an - object ``a`` of type ``X``, ``*a`` is convertible to - ``iterator_traits::value_type``, and ``false`` otherwise. - - .. _`category-to-traversal`: - - ``iterator_traversal::type`` is - - .. parsed-literal:: - - *category-to-traversal*\ (iterator_traits::iterator_category) - - where *category-to-traversal* is defined as follows - - .. parsed-literal:: - - *category-to-traversal*\ (C) = - if (C is convertible to incrementable_traversal_tag) - return C; - else if (C is convertible to random_access_iterator_tag) - return random_access_traversal_tag; - else if (C is convertible to bidirectional_iterator_tag) - return bidirectional_traversal_tag; - else if (C is convertible to forward_iterator_tag) - return forward_traversal_tag; - else if (C is convertible to input_iterator_tag) - return single_pass_traversal_tag; - else if (C is convertible to output_iterator_tag) - return incrementable_traversal_tag; - else - *the program is ill-formed* - - In N1530: - - In [lib.iterator.helper.synopsis]: - - Change:: - - const unsigned use_default_access = -1; - - struct iterator_core_access { /* implementation detail */ }; - - template < - class Derived - , class Value - , unsigned AccessCategory - , class TraversalCategory - , class Reference = Value& - , class Difference = ptrdiff_t - > - class iterator_facade; - - template < - class Derived - , class Base - , class Value = use_default - , unsigned Access = use_default_access - , class Traversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class iterator_adaptor; - - template < - class Iterator - , class Value = use_default - , unsigned Access = use_default_access - , class Traversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class indirect_iterator; - - To:: - - struct iterator_core_access { /* implementation detail */ }; - - template < - class Derived - , class Value - , class CategoryOrTraversal - , class Reference = Value& - , class Difference = ptrdiff_t - > - class iterator_facade; - - template < - class Derived - , class Base - , class Value = use_default - , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class iterator_adaptor; - - template < - class Iterator - , class Value = use_default - , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class indirect_iterator; - - Change:: - - template < - class Incrementable - , unsigned Access = use_default_access - , class Traversal = use_default - , class Difference = use_default - > - class counting_iterator - - To:: - - template < - class Incrementable - , class CategoryOrTraversal = use_default - , class Difference = use_default - > - class counting_iterator; - - In [lib.iterator.facade]: - - Change:: - - template < - class Derived - , class Value - , unsigned AccessCategory - , class TraversalCategory - , class Reference = /* see below */ - , class Difference = ptrdiff_t - > - class iterator_facade { - - to:: - - template < - class Derived - , class Value - , class CategoryOrTraversal - , class Reference = Value& - , class Difference = ptrdiff_t - > - class iterator_facade { - - - Change:: - - typedef iterator_tag iterator_category; - - to:: - - typedef /* see below */ iterator_category; - - - Change:: - - // Comparison operators - template - typename enable_if_interoperable::type // exposition - operator ==(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator !=(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator <(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator <=(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator >(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator >=(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator >=(iterator_facade const& lhs, - iterator_facade const& rhs); - - // Iterator difference - template - typename enable_if_interoperable::type - operator -(iterator_facade const& lhs, - iterator_facade const& rhs); - - // Iterator addition - template - Derived operator+ (iterator_facade const&, - typename Derived::difference_type n) - - to:: - - // Comparison operators - template - typename enable_if_interoperable::type // exposition - operator ==(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator !=(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator <(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator <=(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator >(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator >=(iterator_facade const& lhs, - iterator_facade const& rhs); - - // Iterator difference - template - /* see below */ - operator-(iterator_facade const& lhs, - iterator_facade const& rhs); - - // Iterator addition - template - Derived operator+ (iterator_facade const&, - typename Derived::difference_type n); - - template - Derived operator+ (typename Derived::difference_type n, - iterator_facade const&); - - - After the ``iterator_facade`` synopsis, add: - - The ``iterator_category`` member of ``iterator_facade`` is - - .. parsed-literal:: - - *iterator-category*\ (CategoryOrTraversal, value_type, reference) - - where *iterator-category* is defined as follows: - - .. parsed-literal:: - - *iterator-category*\ (C,R,V) := - if (C is convertible to std::input_iterator_tag - || C is convertible to std::output_iterator_tag - ) - return C - - else if (C is not convertible to incrementable_traversal_tag) - *the program is ill-formed* - - else return a type X satisfying the following two constraints: - - 1. X is convertible to X1, and not to any more-derived - type, where X1 is defined by: - - if (R is a reference type - && C is convertible to forward_traversal_tag) - { - if (C is convertible to random_access_traversal_tag) - X1 = random_access_iterator_tag - else if (C is convertible to bidirectional_traversal_tag) - X1 = bidirectional_iterator_tag - else - X1 = forward_iterator_tag - } - else - { - if (C is convertible to single_pass_traversal_tag - && R is convertible to V) - X1 = input_iterator_tag - else - X1 = C - } - - 2. |category-to-traversal|_\ (X) is convertible to the most - derived traversal tag type to which X is also - convertible, and not to any more-derived traversal tag - type. - -.. |category-to-traversal| replace:: *category-to-traversal* - -.. |iterator-category| replace:: *iterator-category* -.. _iterator-category: - - In [lib.iterator.facade] ``iterator_facade`` requirements: - - Remove: - - ``AccessCategory`` must be an unsigned value which uses no more - bits than the greatest value of ``iterator_access``. - - In the **Iterator Adaptor** section, change: - - Several of the template parameters of ``iterator_adaptor`` default - to ``use_default`` (or ``use_default_access``). - - to: - - Several of the template parameters of ``iterator_adaptor`` default - to ``use_default``. - - In [lib.iterator.special.adaptors]: - - Change:: - - template < - class Iterator - , class Value = use_default - , unsigned Access = use_default_access - , class Traversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class indirect_iterator - - to:: - - template < - class Iterator - , class Value = use_default - , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class indirect_iterator - - Change:: - - template < - class Iterator2, class Value2, unsigned Access2, class Traversal2 - , class Reference2, class Difference2 - > - indirect_iterator( - - to:: - - template < - class Iterator2, class Value2, class Category2 - , class Reference2, class Difference2 - > - indirect_iterator( - - Change:: - - template < - class Incrementable - , unsigned Access = use_default_access - , class Traversal = use_default - , class Difference = use_default - > - class counting_iterator - - to:: - - template < - class Incrementable - , class CategoryOrTraversal = use_default - , class Difference = use_default - > - class counting_iterator - - - Change:: - - typedef iterator_tag< - writable_iterator - , incrementable_traversal_tag - > iterator_category; - - to: - - typedef std::output_iterator_tag iterator_category; - - In [lib.iterator.adaptor] - - Change:: - - template < - class Derived - , class Base - , class Value = use_default - , unsigned Access = use_default_access - , class Traversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class iterator_adaptor - - To:: - - template < - class Derived - , class Base - , class Value = use_default - , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class iterator_adaptor - -:Rationale: - -1. There are two reasons for removing ``is_writable`` - and ``is_swappable``. The first is that we do not know of - a way to fix the specification so that it gives the correct - answer for all iterators. Second, there was only a weak - motivation for having ``is_writable`` and ``is_swappable`` - there in the first place. The main motivation was simply - uniformity: we have tags for the old iterator categories - so we should have tags for the new iterator categories. - While having tags and the capability to dispatch based - on the traversal categories is often used, we see - less of a need for dispatching based on writability - and swappability, since typically algorithms - that need these capabilities have no alternative if - they are not provided. - -2. We discovered that the ``is_readable`` trait can be implemented - using only the iterator type itself and its ``value_type``. - Therefore we remove the requirement for ``is_readable`` from the - Readable Iterator concept, and change the definition of - ``is_readable`` so that it works for any iterator type. - -3. The purpose of the ``iterator_tag`` class was to bundle the - traversal and access category tags into the - ``iterator_category`` typedef. With ``is_writable`` and - ``is_swappable`` gone, and ``is_readable`` no longer in need of - special hints, there is no reason for iterators to provide - information about the access capabilities of an iterator. Thus - there is no need for the ``iterator_tag``. The traversal tag can - be directly used for the ``iterator_category``. If a new - iterator is intended to be backward compatible with old iterator - concepts, a tag type that is convertible to both one of the new - traversal tags and also to an old iterator tag can be created - and use for the ``iterator_category``. - -4. The changes to the specification of ``traversal_category`` are a - direct result of the removal of ``iterator_tag``. - - - -9.16 is_writable_iterator returns false positives -================================================= - -:Submitter: Dave Abrahams -:Status: New - -is_writable_iterator returns false positives for forward iterators -whose value_type has a private assignment operator, or whose -reference type is not a reference (currently legal). - -:Proposed Resolution: See the resolution to 9.15. - - -9.17 is_swappable_iterator returns false positives -================================================== - -:Submitter: Dave Abrahams -:Status: New - -is_swappable_iterator has the same problems as -is_writable_iterator. In addition, if we allow users to write their -own iter_swap functions it's easy to imagine old-style iterators -for which is_swappable returns false negatives. - -:Proposed Resolution: See the resolution to 9.15. - - -9.18 Are is_readable, is_writable, and is_swappable useful? -=========================================================== - -:Submitter: Dave Abrahams -:Status: New - -I am concerned that there is little use for any of is_readable, -is_writable, or is_swappable, and that not only do they unduly -constrain iterator implementors but they add overhead to -iterator_facade and iterator_adaptor in the form of a template -parameter which would otherwise be unneeded. Since we can't -implement two of them accurately for old-style iterators, I am -having a hard time justifying their impact on the rest of the -proposal(s). - -:Proposed Resolution: See the resolution to 9.15. - -9.19 Non-Uniformity of the "lvalue_iterator Bit" -================================================ - -:Submitter: Dave Abrahams -:Status: New - -The proposed iterator_tag class template accepts an "access bits" -parameter which includes a bit to indicate the iterator's -lvalueness (whether its dereference operator returns a reference to -its value_type. The relevant part of N1550 says: - - The purpose of the lvalue_iterator part of the iterator_access - enum is to communicate to iterator_tagwhether the reference type - is an lvalue so that the appropriate old category can be chosen - for the base class. The lvalue_iterator bit is not recorded in - the iterator_tag::access data member. - -The lvalue_iterator bit is not recorded because N1550 aims to -improve orthogonality of the iterator concepts, and a new-style -iterator's lvalueness is detectable by examining its reference -type. This inside/outside difference is awkward and confusing. - -:Proposed Resolution: The iterator_tag class will be removed, so this is no longer an issue. - See the resolution to 9.15. - - -9.20 Traversal Concepts and Tags -================================ - -:Submitter: Dave Abrahams -:Status: New - -Howard Hinnant pointed out some inconsistencies with the naming of -these tag types:: - - incrementable_iterator_tag // ++r, r++ - single_pass_iterator_tag // adds a == b, a != b - forward_traversal_iterator_tag // adds multi-pass - bidirectional_traversal_iterator_tag // adds --r, r-- - random_access_traversal_iterator_tag // adds r+n,n+r,etc. - -Howard thought that it might be better if all tag names contained -the word "traversal". It's not clear that would result in the best -possible names, though. For example, incrementable iterators can -only make a single pass over their input. What really distinguishes -single pass iterators from incrementable iterators is not that they -can make a single pass, but that they are equality -comparable. Forward traversal iterators really distinguish -themselves by introducing multi-pass capability. Without entering -a "Parkinson's Bicycle Shed" type of discussion, it might be worth -giving the names of these tags (and the associated concepts) some -extra attention. - -:Proposed resolution: Change the names of the traversal tags to the - following names:: - - incrementable_traversal_tag - single_pass_traversal_tag - forward_traversal_tag - bidirectional_traversal_tag - random_access_traversal_tag - - - In [lib.iterator.traversal]: - - - Change: - - +--------------------------------+-------------------------------+--------------------+ - |``traversal_category::type`` |Convertible to | | - | |``incrementable_iterator_tag`` | | - +--------------------------------+-------------------------------+--------------------+ - - to: - - +--------------------------------+-------------------------------+--------------------+ - |``iterator_traversal::type`` |Convertible to | | - | |``incrementable_traversal_tag``| | - +--------------------------------+-------------------------------+--------------------+ - - Change: - - +--------------------------------+-----------------------------+---------------------------+ - |``traversal_category::type`` |Convertible to | | - | |``single_pass_iterator_tag`` | | - +--------------------------------+-----------------------------+---------------------------+ - - to: - - +--------------------------------+-----------------------------+---------------------------+ - |``iterator_traversal::type`` |Convertible to | | - | |``single_pass_traversal_tag``| | - +--------------------------------+-----------------------------+---------------------------+ - - Change: - - +---------------------------------------+-----------------------------------+---------------+ - |``traversal_category::type`` |Convertible to | | - | |``forward_traversal_iterator_tag`` | | - +---------------------------------------+-----------------------------------+---------------+ - - to: - - +---------------------------------------+-----------------------------------+----------------------------+ - |``iterator_traversal::type`` |Convertible to | | - | |``forward_traversal_tag`` | | - +---------------------------------------+-----------------------------------+----------------------------+ - - Change: - - +------------------------------------+---------------------------------------------+---------------------+ - |``traversal_category::type`` |Convertible to | | - | |``bidirectional_traversal_iterator_tag`` | | - +------------------------------------+---------------------------------------------+---------------------+ - - to: - - +--------------------------------+-------------------------------+---------------------+ - |``iterator_traversal::type`` |Convertible to | | - | |``bidirectional_traversal_tag``| | - +--------------------------------+-------------------------------+---------------------+ - - Change: - - +-------------------------------------------+-------------------------------------------------+-------------------------+----------------------+ - |``traversal_category::type`` |Convertible to | | | - | |``random_access_traversal_iterator_tag`` | | | - +-------------------------------------------+-------------------------------------------------+-------------------------+----------------------+ - - to: - - +-------------------------------+---------------------------------+-------------------------+----------------------+ - |``iterator_traversal::type``|Convertible to | | | - | |``random_access_traversal_tag`` | | | - +-------------------------------+---------------------------------+-------------------------+----------------------+ - - - In [lib.iterator.synopsis], change:: - - struct incrementable_iterator_tag { }; - struct single_pass_iterator_tag : incrementable_iterator_tag { }; - struct forward_traversal_tag : single_pass_iterator_tag { }; - - to:: - - struct incrementable_traversal_tag { }; - struct single_pass_traversal_tag : incrementable_traversal_tag { }; - struct forward_traversal_tag : single_pass_traversal_tag { }; - - Remove:: - - struct null_category_tag { }; - struct input_output_iterator_tag : input_iterator_tag, output_iterator_tag {}; - - -9.21 iterator_facade Derived template argument underspecified -============================================================= - -:Submitter: Pete Becker -:Status: New - -The first template argument to iterator_facade is named Derived, -and the proposal says: - - The Derived template parameter must be a class derived from - iterator_facade. - -First, iterator_facade is a template, so cannot be derived -from. Rather, the class must be derived from a specialization of -iterator_facade. More important, isn't Derived required to be the -class that is being defined? That is, if I understand it right, the -definition of D here this is not valid:: - - class C : public iterator_facade { ... }; - class D : public iterator_facade { ... }; - -In the definition of D, the Derived argument to iterator_facade is -a class derived from a specialization of iterator_facade, so the -requirement is met. Shouldn't the requirement be more like "when -using iterator_facade to define an iterator class Iter, the class -Iter must be derived from a specialization of iterator_facade whose -first template argument is Iter." That's a bit awkward, but at the -moment I don't see a better way of phrasing it. - -:Proposed resolution: - - In [lib.iterator.facade] - - Remove: - - The ``Derived`` template parameter must be a class derived from - ``iterator_facade``. - - Change: - - The following table describes the other requirements on the - ``Derived`` parameter. Depending on the resulting iterator's - ``iterator_category``, a subset of the expressions listed in the table - are required to be valid. The operations in the first column must be - accessible to member functions of class ``iterator_core_access``. - - to: - - The following table describes the typical valid expressions on - ``iterator_facade``\ 's ``Derived`` parameter, depending on the - iterator concept(s) it will model. The operations in the first - column must be made accessible to member functions of class - ``iterator_core_access``. In addition, - ``static_cast(iterator_facade*)`` shall be well-formed. - - In [lib.iterator.adaptor] - - Change: - - The ``iterator_adaptor`` is a base class template derived from - an instantiation of ``iterator_facade``. - - to: - - Each specialization of the ``iterator_adaptor`` class template - is derived from a specialization of ``iterator_facade``. - - Change: - - The ``Derived`` template parameter must be a derived class of - ``iterator_adaptor``. - - To: - - ``static_cast(iterator_adaptor*)`` shall be well-formed. - -[Note: The proposed resolution to Issue 9.37 contains related -changes] - -9.22 return type of Iterator difference for iterator facade -=========================================================== - -:Submitter: Pete Becker -:Status: New - -The proposal says:: - - template - typename enable_if_interoperable::type - operator -(iterator_facade const& lhs, - iterator_facade const& rhs); - -Shouldn't the return type be one of the two iterator types? Which -one? The idea is that if one of the iterator types can be converted -to the other type, then the subtraction is okay. Seems like the -return type should then be the type that was converted to. Is that -right? - -:Proposed resolution: - - See resolution to 9.34. - -9.23 Iterator_facade: minor wording Issue -========================================= - -:Submitter: Pete Becker -:Status: New - -In the table that lists the required (sort of) member functions of -iterator types that are based on iterator_facade, the entry for -c.equal(y) says: - - true iff c and y refer to the same position. Implements c == y - and c != y. The second sentence is inside out. c.equal(y) does - not implement either of these operations. It is used to implement - them. Same thing in the description of c.distance_to(z). - -:Proposed resolution: remove "implements" descriptions from - table. See resolution to 9.34 - - -9.24 Use of undefined name in iterator_facade table -=================================================== - -:Submitter: Pete Becker -:Status: New - -Several of the descriptions use the name X without defining -it. This seems to be a carryover from the table immediately above -this section, but the text preceding that table says "In the table -below, X is the derived iterator type." Looks like the X:: -qualifiers aren't really needed; X::reference can simply be -reference, since that's defined by the iterator_facade -specialization itself. - -:Proposed resolution: - - Remove references to X. - - In [lib.iterator.facade] operations ``operator->() const;``: - - Change: - - :Returns: If ``X::reference`` is a reference type, an object - of type ``X::pointer`` equal to:: - - &static_cast(this)->dereference() - - Otherwise returns an object of unspecified type such that, - given an object ``a`` of type ``X``, ``a->m`` is equivalent - to ``(w = *a, w.m)`` for some temporary object ``w`` of type - ``X::value_type``. - - The type ``X::pointer`` is ``Value*`` if - ``is_writable_iterator::value`` is ``true``, and - ``Value const*`` otherwise. - - to: - - :Returns: If ``reference`` is a reference type, an object - of type ``pointer`` equal to:: - - &static_cast(this)->dereference() - - Otherwise returns an object of unspecified type such that, - ``(*static_cast(this))->m`` is equivalent - to ``(w = **static_cast(this), w.m)`` for - some temporary object ``w`` of type ``value_type``. - - Further changes are covered by issue 9.26. - -9.25 Iterator_facade: wrong return type -======================================= - -:Submitter: Pete Becker -:Status: New - -Several of the member functions return a Derived object or a -Derived&. Their Effects clauses end with:: - - return *this; - -This should be :: - - return *static_cast(this); - -:Proposed resolution: - - In [lib.iterator.facade], in the effects clause - of the following operations:: - - Derived& operator++() - Derived& operator--() - Derived& operator+=(difference_type n) - Derived& operator-=(difference_type n) - - Change: - ``return *this`` - - to: - ``return *static_cast(this);`` - -9.26 Iterator_facade: unclear returns clause for operator[] -=========================================================== - -:Submitter: Pete Becker -:Status: New - -The returns clause for ``operator[](difference_type n)`` const -says: - - Returns: an object convertible to X::reference and holding a copy - p of a+n such that, for a constant object v of type - X::value_type, X::reference(a[n] = v) is equivalent to p = v. - This needs to define 'a', but assuming it's supposed to be - ``*this`` (or maybe ``*(Derived*)this``), it still isn't clear - what this says. Presumably, the idea is that you can index off of - an iterator and assign to the result. But why the requirement - that it hold a copy of a+n? Granted, that's probably how it's - implemented, but it seems over-constrained. And the last phrase - seems wrong. p is an iterator; there's no requirement that you - can assign a value_type object to it. Should that be ``*p = v``? - But why the cast in reference(a[n] = v)? - -:Proposed resolution: - - In section operator[]: - - Change: - - Writable iterators built with ``iterator_facade`` implement - the semantics required by the preferred resolution to `issue - 299` and adopted by proposal `n1477`: the result of ``p[n]`` - is a proxy object containing a copy of ``p+n``, and ``p[n] = - x`` is equivalent to ``*(p + n) = x``. This approach will - work properly for any random-access iterator regardless of - the other details of its implementation. A user who knows - more about the implementation of her iterator is free to - implement an ``operator[]`` which returns an lvalue in the - derived iterator class; it will hide the one supplied by - ``iterator_facade`` from clients of her iterator. - - to: - - Writable iterators built with ``iterator_facade`` implement - the semantics required by the preferred resolution to `issue - 299` and adopted by proposal `n1550`: the result of ``p[n]`` - is an object convertible to the iterator's ``value_type``, - and ``p[n] = x`` is equivalent to ``*(p + n) = x`` (Note: - This result object may be implemented as a proxy containing a - copy of ``p+n``). This approach will work properly for any - random-access iterator regardless of the other details of its - implementation. A user who knows more about the - implementation of her iterator is free to implement an - ``operator[]`` that returns an lvalue in the derived iterator - class; it will hide the one supplied by ``iterator_facade`` - from clients of her iterator. - - In [lib.iterator.facade] operations: - - Change: - - :Returns: an object convertible to ``X::reference`` and - holding a copy *p* of ``a+n`` such that, for a constant - object ``v`` of type ``X::value_type``, ``X::reference(a[n] - = v)`` is equivalent to ``p = v``. - - to: - - :Returns: an object convertible to ``value_type``. For - constant objects ``v`` of type ``value_type``, and ``n`` of - type ``difference_type``, ``(*this)[n] = v`` is equivalent - to ``*(*this + n) = v``, and ``static_cast((*this)[n])`` is equivalent to - ``static_cast(*(*this + n))`` - - -9.27 Iterator_facade: redundant clause -====================================== - -:Submitter: Pete Becker -:Status: New - -``operator-`` has both an effects clause and a returns -clause. Looks like the returns clause should be removed. - -:Proposed resolution: - - Remove the returns clause. - - In [lib.iterator.facade] operations: - - Remove: - :Returns: ``static_cast(this)->advance(-n);`` - - - - -9.28 indirect_iterator: incorrect specification of default constructor -====================================================================== - -:Submitter: Pete Becker -:Status: New - -The default constructor returns "An instance of indirect_iterator -with a default constructed base object", but the constructor that -takes an Iterator object returns "An instance of indirect_iterator -with the iterator_adaptor subobject copy constructed from x." The -latter is the correct form, since it does not reach inside the base -class for its semantics. So the default constructor shoudl return -"An instance of indirect_iterator with a default-constructed -iterator_adaptor subobject." - -:Proposed resolution: - Change: - :Returns: An instance of ``indirect_iterator`` with - a default constructed base object. - - to: - :Returns: An instance of ``indirect_iterator`` with - a default-constructed ``m_iterator``. - -:Rationale: Inheritance from iterator_adaptor has been removed, so we instead - give the semantics in terms of the (exposition only) member - ``m_iterator``. - - -9.29 indirect_iterator: unclear specification of template constructor -===================================================================== - -:Submitter: Pete Becker -:Status: New - -The templated constructor that takes an indirect_iterator with a -different set of template arguments says that it returns "An -instance of indirect_iterator that is a copy of [the argument]". -But the type of the argument is different from the type of the -object being constructed, and there is no description of what -a "copy" means. The Iterator template parameter for the argument -must be convertible to the Iterator template parameter for the type -being constructed, which suggests that the argument's contained -Iterator object should be converted to the target type's Iterator -type. Is that what's meant here? -(Pete later writes: In fact, this problem is present in all of the -specialized adaptors that have a constructor like this: the -constructor returns "a copy" of the argument without saying what a -copy is.) - -:Proposed resolution: - - Change: - :Returns: An instance of ``indirect_iterator`` that is a copy of ``y``. - - to: - :Returns: An instance of ``indirect_iterator`` whose - ``m_iterator`` subobject is constructed from ``y.base()``. - - -:Rationale: Inheritance from iterator_adaptor has been removed, so we - instead give the semantics in terms of the member ``m_iterator``. - - -9.30 transform_iterator argument irregularity -============================================= - -:Submitter: Pete Becker -:Status: New - -The specialized adaptors that take both a Value and a Reference -template argument all take them in that order, i.e. Value precedes -Reference in the template argument list, with the exception of -transform_iterator, where Reference precedes Value. This seems like -a possible source of confusion. Is there a reason why this order is -preferable? - -:Proposed resolution: NAD - -:Rationale: defaults for Value depend on Reference. A sensible - Value can almost always be computed from Reference. The first - parameter is UnaryFunction, so the argument order is already - different from the other adapters. - - -9.31 function_output_iterator overconstrained -============================================= - -:Submitter: Pete Becker -:Status: New - -function_output_iterator requirements says: "The UnaryFunction must -be Assignable, Copy Constructible, and the expression f(x) must be -valid, where f is an object of type UnaryFunction and x is an -object of a type accepted by f." - -Everything starting with "and," somewhat reworded, is actually a -constraint on output_proxy::operator=. All that's needed to create -a function_output_iterator object is that the UnaryFunction type be -Assignable and CopyConstructible. That's also sufficient to -dereference and to increment such an object. It's only when you try -to assign through a dereferenced iterator that f(x) has to work, -and then only for the particular function object that the iterator -holds and for the particular value that is being assigned. - - -Addition from Jeremy: - The constructor for ``function_output_iterator`` is also - slightly overconstrained because it requires - the ``UnaryFunction`` to have a default constructor - even when the default constructor of ``function_output_iterator`` - is not used. - - -:Proposed resolution: - - Change: - ``output_proxy operator*();`` - - to: - ``/* see below */ operator*();`` - - After ``function_output_iterator& operator++(int);`` add:: - - private: - UnaryFunction m_f; // exposition only - - Change: - The ``UnaryFunction`` must be Assignable, Copy Constructible, - and the expression ``f(x)`` must be valid, where ``f`` is an - object of type ``UnaryFunction`` and ``x`` is an object of a - type accepted by ``f``. The resulting - ``function_output_iterator`` is a model of the Writable and - Incrementable Iterator concepts. - - to: - ``UnaryFunction`` must be Assignable and Copy Constructible. - - After the requirements section, add: - -.. topic:: ``function_output_iterator`` models - - ``function_output_iterator`` is a model of the Writable and - Incrementable Iterator concepts. - - Change: - :Returns: An instance of ``function_output_iterator`` with - ``f`` stored as a data member. - - to: - :Effects: Constructs an instance of ``function_output_iterator`` - with ``m_f`` constructed from ``f``. - - Change: - ``output_proxy operator*();`` - - :Returns: An instance of ``output_proxy`` constructed with - a copy of the unary function ``f``. - - to: - ``operator*();`` - - :Returns: An object ``r`` of unspecified type such that ``r = t`` - is equivalent to ``m_f(t)`` for all ``t``. - - - Remove: - ``function_output_iterator::output_proxy`` operations - - ``output_proxy(UnaryFunction& f);`` - - :Returns: An instance of ``output_proxy`` with ``f`` stored as - a data member. - - - ``template output_proxy& operator=(const T& value);`` - - :Effects: - :: - - m_f(value); - return *this; - - - Change:: - - explicit function_output_iterator(const UnaryFunction& f = UnaryFunction()); - - to:: - - explicit function_output_iterator(); - - explicit function_output_iterator(const UnaryFunction& f); - - - -9.32 Should output_proxy really be a named type? -================================================ - -:Submitter: Pete Becker -:Status: New - -This means someone can store an output_proxy object for later use, -whatever that means. It also constrains output_proxy to hold a copy -of the function object, rather than a pointer to the iterator -object. Is all this mechanism really necessary? - -:Proposed resolution: See issue 9.31. - - - -9.33 istreambuf_iterator isn't a Readable Iterator -================================================== - -:Submitter: Pete Becker -:Status: New - -c++std-lib-12333: - - N1550 requires that for a Readable Iterator a of type X, ``*a`` - returns an object of type - ``iterator_traits::reference``. ``istreambuf_iterator::operator*`` - returns ``charT``, but ``istreambuf_iterator::reference`` is - ``charT&``. So am I overlooking something, or is - ``istreambuf_iterator`` not Readable. - -:Proposed resolution: Remove all constraints on - ``iterator_traits::reference`` in Readable Iterator and Lvalue - Iterator. Change Lvalue Iterator to refer to ``T&`` instead of - ``iterator_traits::reference``. - - Change: - A class or built-in type ``X`` models the *Readable Iterator* - concept for the value type ``T`` if the following expressions - are valid and respect the stated semantics. ``U`` is the type - of any specified member of type ``T``. - - to: - A class or built-in type ``X`` models the *Readable Iterator* - concept for value type ``T`` if, in addition to ``X`` being - Assignable and Copy Constructible, the following expressions - are valid and respect the stated semantics. ``U`` is the type - of any specified member of type ``T``. - - From the Input Iterator Requirements table, remove: - - +-----------------------------------+-----------------------------------+-------------------------+ - |``iterator_traits::reference`` |Convertible to | | - | |``iterator_traits::value_type`` | | - +-----------------------------------+-----------------------------------+-------------------------+ - - Change: - - +-----------------------------------+-----------------------------------+-------------------------+ - |``*a`` |``iterator_traits::reference`` |pre: ``a`` is | - | | |dereferenceable. If ``a | - | | |== b`` then ``*a`` is | - | | |equivalent to ``*b`` | - +-----------------------------------+-----------------------------------+-------------------------+ - - to: - - +-----------------------------------+------------------------+----------------------------------------------------------------+ - |``*a`` | Convertible to ``T`` |pre: ``a`` is dereferenceable. If ``a == b`` then ``*a`` | - | | | is equivalent to ``*b``. | - +-----------------------------------+------------------------+----------------------------------------------------------------+ - - Change: - The *Lvalue Iterator* concept adds the requirement that the - ``reference`` type be a reference to the value type of the - iterator. - - to: - The *Lvalue Iterator* concept adds the requirement that the - return type of ``operator*`` type be a reference to the value - type of the iterator. - - Change: - - +---------------------------------------------------------------------------------+ - | Lvalue Iterator Requirements | - +---------------------------------+-----------+-----------------------------------+ - |Expression |Return Type|Assertion | - +=================================+===========+===================================+ - |``iterator_traits::reference``|``T&`` |``T`` is *cv* | - | | |``iterator_traits::value_type`` | - | | |where *cv* is an optional | - | | |cv-qualification | - +---------------------------------+-----------+-----------------------------------+ - - to: - - +-------------------------------------------------------------+ - | Lvalue Iterator Requirements | - +-------------+-----------+-----------------------------------+ - |Expression |Return Type|Note/Assertion | - +=============+===========+===================================+ - |``*a`` | ``T&`` |``T`` is *cv* | - | | |``iterator_traits::value_type`` | - | | |where *cv* is an optional | - | | |cv-qualification. | - | | |pre: ``a`` is | - | | |dereferenceable. If ``a | - | | |== b`` then ``*a`` is | - | | |equivalent to ``*b``. | - +-------------+-----------+-----------------------------------+ - - - At the end of the section reverse_iterator models, add: - The type ``iterator_traits::reference`` must be the type of - ``*i``, where ``i`` is an object of type ``Iterator``. - - -:Rationale: Ideally there should be requirements on the reference - type, however, since Readable Iterator is suppose to correspond - to the current standard iterator requirements (which do not place - requirements on the reference type) we will leave them off for - now. There is a DR in process with respect to the reference type - in the stadard iterator requirements. Once that is resolved we - will revisit this issue for Readable Iterator and Lvalue - Iterator. - - We added Assignable to the requirements for Readable - Iterator. This is needed to have Readable Iterator coincide with - the capabilities of Input Iterator. - - -9.34 iterator_facade free functions unspecified -=============================================== - -:Submitter: Pete Becker -:Status: New - -c++std-lib-12562: - - The template functions ``operator==``, ``operator!=``, - ``operator<``, ``operator<=``, ``operator>``, ``operator>=``, and - ``operator-`` that take two arguments that are specializations of - iterator_facade have no specification. The template function - operator+ that takes an argument that is a specialization of - iterator_facade and an argument of type difference_type has no - specification. - -:Proposed resolution: - Add the missing specifications. - - :: - - template - Derived operator+ (iterator_facade const&, - typename Derived::difference_type n); - - template - Derived operator+ (typename Derived::difference_type n, - iterator_facade const&); - - :Effects: - :: - - Derived tmp(static_cast(this)); - return tmp += n; - - - :: - - template - typename enable_if_interoperable::type - operator ==(iterator_facade const& lhs, - iterator_facade const& rhs); - - :Returns: if ``is_convertible::value``, then - ``lhs.equal(rhs)``. Otherwise, ``rhs.equal(lhs)``. - - :: - - template - typename enable_if_interoperable::type - operator !=(iterator_facade const& lhs, - iterator_facade const& rhs); - - :Returns: if ``is_convertible::value``, then - ``!lhs.equal(rhs)``. Otherwise, ``!rhs.equal(lhs)``. - - :: - - template - typename enable_if_interoperable::type - operator <(iterator_facade const& lhs, - iterator_facade const& rhs); - - :Returns: if ``is_convertible::value``, then - ``lhs.distance_to(rhs) < 0``. Otherwise, ``rhs.distance_to(lhs) > - 0``. - - :: - - template - typename enable_if_interoperable::type - operator <=(iterator_facade const& lhs, - iterator_facade const& rhs); - - :Returns: if ``is_convertible::value``, then - ``lhs.distance_to(rhs) <= 0``. Otherwise, ``rhs.distance_to(lhs) - >= 0``. - - :: - - template - typename enable_if_interoperable::type - operator >(iterator_facade const& lhs, - iterator_facade const& rhs); - - :Returns: if ``is_convertible::value``, then - ``lhs.distance_to(rhs) > 0``. Otherwise, - ``rhs.distance_to(lhs) < 0``. - - - :: - - template - typename enable_if_interoperable::type - operator >=(iterator_facade const& lhs, - iterator_facade const& rhs); - - :Returns: if ``is_convertible::value``, then - ``lhs.distance_to(rhs) >= 0``. Otherwise, - ``rhs.distance_to(lhs) <= 0``. - - :: - - template - typename enable_if_interoperable::type - operator -(iterator_facade const& lhs, - iterator_facade const& rhs); - - :Return Type: if ``is_convertible::value``, then - ``difference`` shall be - ``iterator_traits::difference_type``. Otherwise, - ``difference`` shall be - ``iterator_traits::difference_type``. - - :Returns: if ``is_convertible::value``, then - ``-lhs.distance_to(rhs)``. Otherwise, - ``rhs.distance_to(lhs)``. - - - -9.35 iterator_facade: too many equals? -====================================== - -:Submitter: Pete Becker -:Status: New - -c++std-lib-12563: - - The table listing the functions required for types derived from - iterator_facade has two functions named equal and two named - distance_to:: - - c.equal(b) - c.equal(y) - c.distance_to(b) - c.distance_to(z) - - where b and c are const objects of the derived type, y and z are - constant objects of certain iterator types that are interoperable - with the derived type. Seems like the 'b' versions are - redundant: in both cases, the other version will take a 'b'. In - fact, iterator_adaptor is specified to use iterator_facade, but - does not provide the 'b' versions of these functions. - - Are the 'b' versions needed? - -:Proposed resolution: Remove the 'b' versions. - - In ``iterator_facade`` requirements, remove: - - +--------------------+-------------------+-------------------------------------+---------------------------+ - |``c.equal(b)`` |convertible to bool|true iff ``b`` and ``c`` are |Single Pass Iterator | - | | |equivalent. | | - +--------------------+-------------------+-------------------------------------+---------------------------+ - - and remove: - - +--------------------+-------------------+-------------------------------------+---------------------------+ - |``c.distance_to(b)``|convertible to |equivalent to ``distance(c, b)`` |Random Access Traversal | - | |X::difference_type | |Iterator | - +--------------------+-------------------+-------------------------------------+---------------------------+ - - -9.36 iterator_facade function requirements -========================================== - -:Submitter: Pete Becker -:Status: New - -c++std-lib-12636: - - The table that lists required functions for the derived type X - passed to iterator_facade lists, among others: - - for a single pass iterator:: - - c.equal(b) - c.equal(y) - - where b and c are const X objects, and y is a const object of a - single pass iterator that is interoperable with X. Since X is - interoperable with itself, c.equal(b) is redundant. There is a - difference in their descriptions, but its meaning isn't - clear. The first is "true iff b and c are equivalent", and the - second is "true iff c and y refer to the same position." Is there - a difference between the undefined term "equivalent" and "refer - to the same position"? - - Similarly, for a random access traversal iterator:: - - c.distance_to(b) - c.distance_to(z) - - where z is a constant object of a random access traversal - iterator that is interoperable with X. Again, X is interoperable - with itself, so c.distance_to(b) is redundant. Also, the - specification for c.distance_to(z) isn't valid. It's written - as "equivalent to distance(c, z)". The template function distance - takes two arguments of the same type, so distance(c, z) isn't - valid if c and z are different types. Should it be - distance(c, (X)z)? - -:Proposed resolution: Removed the 'b' versions (see 9.35) and added the cast. - - Change: - - +--------------------+-------------------+-------------------------------------+---------------------------+ - |``c.distance_to(z)``|convertible to |equivalent to ``distance(c, z)``. |Random Access Traversal | - | |X::difference_type |Implements ``c - z``, ``c < z``, ``c |Iterator | - | | |<= z``, ``c > z``, and ``c >= c``. | | - +--------------------+-------------------+-------------------------------------+---------------------------+ - - to: - - +--------------------+----------------------+-------------------------+---------------------------+ - |``c.distance_to(z)``|convertible to |equivalent to |Random Access Traversal | - | |``F::difference_type``|``distance(c, X(z))``. |Iterator | - +--------------------+----------------------+-------------------------+---------------------------+ - - - -==================================== - More Issues (not from Matt's list) -==================================== - - - -9.37x Inheritance in iterator_adaptor and other adaptors is an overspecification -================================================================================ - -:Submitter: Pete Becker -:Status: New - -c++std-lib-12696: -The paper requires that iterator_adaptor be derived from an -appropriate instance of iterator_facade, and that most of the specific -forms of adaptors be derived from appropriate instances of -iterator_adaptor. That seems like overspecification, and we ought to -look at specifying these things in terms of what the various templates -provide rather than how they're implemented. - -:Proposed resolution: - - Remove the specfication of inheritance, and add explicit - specification of all the functionality that was inherited from the - specialized iterators. - - In iterator_adaptor, inheritance is retained, sorry NAD. Also, - the Interoperable Iterators concept is added to the new iterator - concepts, and this concept is used in the specification of the - iterator adaptors. - - - In n1550, after [lib.random.access.traversal.iterators], add: - - Interoperable Iterators [lib.interoperable.iterators] - - A class or built-in type ``X`` that models Single Pass Iterator - is *interoperable with* a class or built-in type ``Y`` that - also models Single Pass Iterator if the following expressions - are valid and respect the stated semantics. In the tables - below, ``x`` is an object of type ``X``, ``y`` is an object of - type ``Y``, ``Distance`` is - ``iterator_traits::difference_type``, and ``n`` represents a - constant object of type ``Distance``. - - +-----------+-----------------------+---------------------------------------------------+ - |Expression |Return Type |Assertion/Precondition/Postcondition | - +===========+=======================+===================================================+ - |``y = x`` |``Y`` |post: ``y == x`` | - +-----------+-----------------------+---------------------------------------------------+ - |``Y(x)`` |``Y`` |post: ``Y(x) == x`` | - +-----------+-----------------------+---------------------------------------------------+ - |``x == y`` |convertible to ``bool``|``==`` is an equivalence relation over its domain. | - +-----------+-----------------------+---------------------------------------------------+ - |``y == x`` |convertible to ``bool``|``==`` is an equivalence relation over its domain. | - +-----------+-----------------------+---------------------------------------------------+ - |``x != y`` |convertible to ``bool``|``bool(a==b) != bool(a!=b)`` over its domain. | - +-----------+-----------------------+---------------------------------------------------+ - |``y != x`` |convertible to ``bool``|``bool(a==b) != bool(a!=b)`` over its domain. | - +-----------+-----------------------+---------------------------------------------------+ - - If ``X`` and ``Y`` both model Random Access Traversal Iterator then - the following additional requirements must be met. - - +-----------+-----------------------+---------------------+--------------------------------------+ - |Expression |Return Type |Operational Semantics|Assertion/ Precondition | - +===========+=======================+=====================+======================================+ - |``x < y`` |convertible to ``bool``|``y - x > 0`` |``<`` is a total ordering relation | - +-----------+-----------------------+---------------------+--------------------------------------+ - |``y < x`` |convertible to ``bool``|``x - y > 0`` |``<`` is a total ordering relation | - +-----------+-----------------------+---------------------+--------------------------------------+ - |``x > y`` |convertible to ``bool``|``y < x`` |``>`` is a total ordering relation | - +-----------+-----------------------+---------------------+--------------------------------------+ - |``y > x`` |convertible to ``bool``|``x < y`` |``>`` is a total ordering relation | - +-----------+-----------------------+---------------------+--------------------------------------+ - |``x >= y`` |convertible to ``bool``|``!(x < y)`` | | - +-----------+-----------------------+---------------------+--------------------------------------+ - |``y >= x`` |convertible to ``bool``|``!(y < x)`` | | - +-----------+-----------------------+---------------------+--------------------------------------+ - |``x <= y`` |convertible to ``bool``|``!(x > y)`` | | - +-----------+-----------------------+---------------------+--------------------------------------+ - |``y <= x`` |convertible to ``bool``|``!(y > x)`` | | - +-----------+-----------------------+---------------------+--------------------------------------+ - |``y - x`` |``Distance`` |``distance(Y(x),y)`` |pre: there exists a value ``n`` of | - | | | |``Distance`` such that ``x + n == y``.| - | | | |``y == x + (y - x)``. | - +-----------+-----------------------+---------------------+--------------------------------------+ - |``x - y`` |``Distance`` |``distance(y,Y(x))`` |pre: there exists a value ``n`` of | - | | | |``Distance`` such that ``y + n == x``.| - | | | |``x == y + (x - y)``. | - +-----------+-----------------------+---------------------+--------------------------------------+ - - - - In N1530: - - In [lib.iterator.adaptor] - - Change:: - - class iterator_adaptor - : public iterator_facade - - To:: - - class iterator_adaptor - : public iterator_facade // see details - - - Change the text from: - The ``Base`` type must implement the expressions involving - ``m_iterator`` in the specifications... - - until the end of the **iterator_adaptor requirements** section, to: - The ``Base`` argument shall be Assignable and Copy Constructible. - - - Add: - -.. topic:: ``iterator_adaptor`` base class parameters - - The *V'*, *C'*, *R'*, and *D'* parameters of the ``iterator_facade`` - used as a base class in the summary of ``iterator_adaptor`` - above are defined as follows: - - .. parsed-literal:: - - *V'* = if (Value is use_default) - return iterator_traits::value_type - else - return Value - - *C'* = if (CategoryOrTraversal is use_default) - return iterator_traversal::type - else - return CategoryOrTraversal - - *R'* = if (Reference is use_default) - if (Value is use_default) - return iterator_traits::reference - else - return Value& - else - return Reference - - *D'* = if (Difference is use_default) - return iterator_traits::difference_type - else - return Difference - - - In [lib.iterator.special.adaptors] - - Change:: - - class indirect_iterator - : public iterator_adaptor - { - friend class iterator_core_access; - - to:: - - class indirect_iterator - { - public: - typedef /* see below */ value_type; - typedef /* see below */ reference; - typedef /* see below */ pointer; - typedef /* see below */ difference_type; - typedef /* see below */ iterator_category; - - Change:: - - private: // as-if specification - typename indirect_iterator::reference dereference() const - { - return **this->base(); - } - - to:: - - Iterator const& base() const; - reference operator*() const; - indirect_iterator& operator++(); - indirect_iterator& operator--(); - private: - Iterator m_iterator; // exposition - - - After the synopsis add: - - The member types of ``indirect_iterator`` are defined - according to the following pseudo-code, where ``V`` is - ``iterator_traits::value_type`` - - .. parsed-literal:: - - if (Value is use_default) then - typedef remove_const::type>::type value_type; - else - typedef remove_const::type value_type; - - if (Reference is use_default) then - if (Value is use_default) then - typedef indirect_reference::type reference; - else - typedef Value& reference; - else - typedef Reference reference; - - if (Value is use_default) then - typedef pointee::type\* pointer; - else - typedef Value\* pointer; - - if (Difference is use_default) - typedef iterator_traits::difference_type difference_type; - else - typedef Difference difference_type; - - if (CategoryOrTraversal is use_default) - typedef |iterator-category|\ ( - iterator_traversal::type,``reference``,``value_type`` - ) iterator_category; - else - typedef |iterator-category|\ ( - CategoryOrTraversal,``reference``,``value_type`` - ) iterator_category; - - - [Note: See resolution to 9.44y for a description of ``pointee`` and - ``indirect_reference``] - - After the requirements section, add: - -.. topic:: ``indirect_iterator`` models - - - In addition to the concepts indicated by ``iterator_category`` - and by ``iterator_traversal::type``, a - specialization of ``indirect_iterator`` models the following - concepts, Where ``v`` is an object of - ``iterator_traits::value_type``: - - * Readable Iterator if ``reference(*v)`` is convertible to - ``value_type``. - - * Writable Iterator if ``reference(*v) = t`` is a valid - expression (where ``t`` is an object of type - ``indirect_iterator::value_type``) - - * Lvalue Iterator if ``reference`` is a reference type. - - ``indirect_iterator`` is interoperable with - ``indirect_iterator`` if and only if ``X`` is - interoperable with ``Y``. - - - Before ``indirect_iterator();`` add: - - In addition to the operations required by the concepts described - above, specializations of ``indirect_iterator`` provide the - following operations. - - Change: - :Returns: An instance of ``indirect_iterator`` with - the ``iterator_adaptor`` subobject copy constructed from ``x``. - - to: - :Returns: An instance of ``indirect_iterator`` with - ``m_iterator`` copy constructed from ``x``. - - - At the end of the indirect_iterator operations add: - - ``Iterator const& base() const;`` - - :Returns: ``m_iterator`` - - - ``reference operator*() const;`` - - :Returns: ``**m_iterator`` - - - ``indirect_iterator& operator++();`` - - :Effects: ``++m_iterator`` - :Returns: ``*this`` - - - ``indirect_iterator& operator--();`` - - :Effects: ``--m_iterator`` - :Returns: ``*this`` - - - - Change:: - - template - class reverse_iterator : - public iterator_adaptor< reverse_iterator, Iterator > - { - friend class iterator_core_access; - - to:: - - template - class reverse_iterator - { - public: - typedef iterator_traits::value_type value_type; - typedef iterator_traits::reference reference; - typedef iterator_traits::pointer pointer; - typedef iterator_traits::difference_type difference_type; - typedef /* see below */ iterator_category; - - Change:: - - private: // as-if specification - typename reverse_iterator::reference dereference() const { return *prior(this->base()); } - - void increment() { --this->base_reference(); } - void decrement() { ++this->base_reference(); } - - void advance(typename reverse_iterator::difference_type n) - { - this->base_reference() += -n; - } - - template - typename reverse_iterator::difference_type - distance_to(reverse_iterator const& y) const - { - return this->base_reference() - y.base(); - } - - to:: - - Iterator const& base() const; - reference operator*() const; - reverse_iterator& operator++(); - reverse_iterator& operator--(); - private: - Iterator m_iterator; // exposition - - After the synopsis for ``reverse_iterator``, add: - If ``Iterator`` models Random Access Traversal Iterator and Readable - Lvalue Iterator, then ``iterator_category`` is convertible to - ``random_access_iterator_tag``. Otherwise, if - ``Iterator`` models Bidirectional Traversal Iterator and Readable - Lvalue Iterator, then ``iterator_category`` is convertible to - ``bidirectional_iterator_tag``. Otherwise, ``iterator_category`` is - convertible to ``input_iterator_tag``. - - - Change: - **reverse_iterator requirements** - - The base ``Iterator`` must be a model of Bidirectional Traversal - Iterator. The resulting ``reverse_iterator`` will be a model of the - most refined standard traversal and access concepts that are modeled - by ``Iterator``. - - - to: - **reverse_iterator requirements** - - ``Iterator`` must be a model of Bidirectional Traversal Iterator. - - -.. topic:: ``reverse_iterator`` models - - A specialization of ``reverse_iterator`` models the same iterator - traversal and iterator access concepts modeled by its ``Iterator`` - argument. In addition, it may model old iterator concepts - specified in the following table: - - +---------------------------------------+-----------------------------------+ - | If ``I`` models |then ``reverse_iterator`` models| - +=======================================+===================================+ - | Readable Lvalue Iterator, | Bidirectional Iterator | - | Bidirectional Traversal Iterator | | - +---------------------------------------+-----------------------------------+ - | Writable Lvalue Iterator, | Mutable Bidirectional Iterator | - | Bidirectional Traversal Iterator | | - +---------------------------------------+-----------------------------------+ - | Readable Lvalue Iterator, | Random Access Iterator | - | Random Access Traversal Iterator | | - +---------------------------------------+-----------------------------------+ - | Writable Lvalue Iterator, | Mutable Random Access Iterator | - | Random Access Traversal Iterator | | - +---------------------------------------+-----------------------------------+ - - - ``reverse_iterator`` is interoperable with - ``reverse_iterator`` if and only if ``X`` is interoperable with - ``Y``. - - Change: - :Returns: An instance of ``reverse_iterator`` with a - default constructed base object. - - to: - :Effects: Constructs an instance of ``reverse_iterator`` with ``m_iterator`` - default constructed. - - Change: - :Effects: Constructs an instance of ``reverse_iterator`` with a - base object copy constructed from ``x``. - - to: - :Effects: Constructs an instance of ``reverse_iterator`` with a - ``m_iterator`` constructed from ``x``. - - - Change: - :Returns: An instance of ``reverse_iterator`` that is a copy of ``r``. - - to: - :Effects: Constructs instance of ``reverse_iterator`` whose - ``m_iterator`` subobject is constructed from ``y.base()``. - - - - At the end of the operations for ``reverse_iterator``, add: - ``Iterator const& base() const;`` - - :Returns: ``m_iterator`` - - - ``reference operator*() const;`` - - :Effects: - - :: - - Iterator tmp = m_iterator; - return *--tmp; - - - ``reverse_iterator& operator++();`` - - :Effects: ``--m_iterator`` - :Returns: ``*this`` - - - ``reverse_iterator& operator--();`` - - :Effects: ``++m_iterator`` - :Returns: ``*this`` - - - - Change:: - - class transform_iterator - : public iterator_adaptor - { - friend class iterator_core_access; - - to:: - - class transform_iterator - { - public: - typedef /* see below */ value_type; - typedef /* see below */ reference; - typedef /* see below */ pointer; - typedef iterator_traits::difference_type difference_type; - typedef /* see below */ iterator_category; - - - After ``UnaryFunction functor() const;`` add:: - - Iterator const& base() const; - reference operator*() const; - transform_iterator& operator++(); - transform_iterator& operator--(); - - Change:: - - private: - typename transform_iterator::value_type dereference() const; - UnaryFunction m_f; - }; - - to:: - - private: - Iterator m_iterator; // exposition only - UnaryFunction m_f; // exposition only - }; - - - After the synopsis, add: - If ``Iterator`` models Readable Lvalue Iterator and if ``Iterator`` - models Random Access Traversal Iterator, then ``iterator_category`` is - convertible to ``random_access_iterator_tag``. Otherwise, if - ``Iterator`` models Bidirectional Traversal Iterator, then - ``iterator_category`` is convertible to - ``bidirectional_iterator_tag``. Otherwise ``iterator_category`` is - convertible to ``forward_iterator_tag``. If ``Iterator`` does not - model Readable Lvalue Iterator then ``iterator_category`` is - convertible to ``input_iterator_tag``. - - - In the requirements section, change: - The type ``Iterator`` must at least model Readable Iterator. The - resulting ``transform_iterator`` models the most refined of the - following that is also modeled by ``Iterator``. - - * Writable Lvalue Iterator if - ``result_of::reference)>::type`` - is a non-const reference. - - * Readable Lvalue Iterator if - ``result_of::reference)>::type`` - is a const reference. - - * Readable Iterator otherwise. - - - The ``transform_iterator`` models the most refined standard traversal - concept that is modeled by ``Iterator``. - - The ``reference`` type of ``transform_iterator`` is - ``result_of::reference)>::type``. - The ``value_type`` is ``remove_cv >::type``. - - to: - The argument ``Iterator`` shall model Readable Iterator. - - - After the requirements section, add: - -.. topic:: ``transform_iterator`` models - - The resulting ``transform_iterator`` models the most refined of the - following options that is also modeled by ``Iterator``. - - * Writable Lvalue Iterator if - ``transform_iterator::reference`` is a non-const - reference. - - * Readable Lvalue Iterator if - ``transform_iterator::reference`` is a const reference. - - * Readable Iterator otherwise. - - The ``transform_iterator`` models the most refined standard traversal - concept that is modeled by the ``Iterator`` argument. - - If ``transform_iterator`` is a model of Readable Lvalue Iterator then - it models the following original iterator concepts depending on what - the ``Iterator`` argument models. - - +-----------------------------------+-----------------------------------+ - | If ``Iterator`` models |then ``transform_iterator`` models | - +===================================+===================================+ - | Single Pass Iterator | Input Iterator | - +-----------------------------------+-----------------------------------+ - | Forward Traversal Iterator | Forward Iterator | - +-----------------------------------+-----------------------------------+ - | Bidirectional Traversal Iterator | Bidirectional Iterator | - +-----------------------------------+-----------------------------------+ - | Random Access Traversal Iterator | Random Access Iterator | - +-----------------------------------+-----------------------------------+ - - If ``transform_iterator`` models Writable Lvalue Iterator then it is a - mutable iterator (as defined in the old iterator requirements). - - ``transform_iterator`` is interoperable with - ``transform_iterator`` if and only if ``X`` is - interoperable with ``Y``. - - - Remove the private operations section heading and remove:: - - ``typename transform_iterator::value_type dereference() const;`` - - :Returns: ``m_f(transform_iterator::dereference());`` - - After the entry for ``functor()``, add:: - - ``Iterator const& base() const;`` - - :Returns: ``m_iterator`` - - - ``reference operator*() const;`` - - :Returns: ``m_f(*m_iterator)`` - - - ``transform_iterator& operator++();`` - - :Effects: ``++m_iterator`` - :Returns: ``*this`` - - - ``transform_iterator& operator--();`` - - :Effects: ``--m_iterator`` - :Returns: ``*this`` - - - Change:: - - template - class filter_iterator - : public iterator_adaptor< - filter_iterator, Iterator - , use_default - , /* see details */ - > - { - public: - - to:: - - template - class filter_iterator - { - public: - typedef iterator_traits::value_type value_type; - typedef iterator_traits::reference reference; - typedef iterator_traits::pointer pointer; - typedef iterator_traits::difference_type difference_type; - typedef /* see below */ iterator_category; - - Change:: - - private: // as-if specification - void increment() - { - ++(this->base_reference()); - satisfy_predicate(); - } - - void satisfy_predicate() - { - while (this->base() != this->m_end && !this->m_predicate(*this->base())) - ++(this->base_reference()); - } - - Predicate m_predicate; - Iterator m_end; - - to:: - - Iterator const& base() const; - reference operator*() const; - filter_iterator& operator++(); - private: - Predicate m_pred; // exposition only - Iterator m_iter; // exposition only - Iterator m_end; // exposition only - - - - Change: - The base ``Iterator`` parameter must be a model of Readable - Iterator and Single Pass Iterator. The resulting - ``filter_iterator`` will be a model of Forward Traversal Iterator - if ``Iterator`` is, otherwise the ``filter_iterator`` will be a - model of Single Pass Iterator. The access category of the - ``filter_iterator`` will be the same as the access category of - ``Iterator``. - - to: - The ``Iterator`` argument shall meet the requirements of Readable - Iterator and Single Pass Iterator or it shall meet the requirements of - Input Iterator. - - After the requirements section, add: - -.. topic:: ``filter_iterator`` models - - The concepts that ``filter_iterator`` models are dependent on which - concepts the ``Iterator`` argument models, as specified in the - following tables. - - +-----------------------------+----------------------------------------------------------+ - | If ``Iterator`` models | then ``filter_iterator`` models | - +=============================+==========================================================+ - | Single Pass Iterator | Single Pass Iterator | - +-----------------------------+----------------------------------------------------------+ - | Forward Traversal Iterator | Forward Traversal Iterator | - +-----------------------------+----------------------------------------------------------+ - - +--------------------------------+----------------------------------------------+ - | If ``Iterator`` models | then ``filter_iterator`` models | - +================================+==============================================+ - | Readable Iterator | Readable Iterator | - +--------------------------------+----------------------------------------------+ - | Writable Iterator | Writable Iterator | - +--------------------------------+----------------------------------------------+ - | Lvalue Iterator | Lvalue Iterator | - +--------------------------------+----------------------------------------------+ - - +-------------------------------------------------------+---------------------------------+ - | If ``Iterator`` models | then ``filter_iterator`` models | - +=======================================================+=================================+ - | Readable Iterator, Single Pass Iterator | Input Iterator | - +-------------------------------------------------------+---------------------------------+ - | Readable Lvalue Iterator, Forward Traversal Iterator | Forward Iterator | - +-------------------------------------------------------+---------------------------------+ - | Writable Lvalue Iterator, Forward Traversal Iterator | Mutable Forward Iterator | - +-------------------------------------------------------+---------------------------------+ - - - ``filter_iterator`` is interoperable with ``filter_iterator`` - if and only if ``X`` is interoperable with ``Y``. - - - Change: - :Returns: a ``filter_iterator`` whose - predicate is a default constructed ``Predicate`` and - whose ``end`` is a default constructed ``Iterator``. - - to: - :Effects: Constructs a ``filter_iterator`` whose``m_pred``, ``m_iter``, and ``m_end`` - members are a default constructed. - - Change: - :Returns: A ``filter_iterator`` at position ``x`` that filters according - to predicate ``f`` and that will not increment past ``end``. - - to: - :Effects: Constructs a ``filter_iterator`` where ``m_iter`` is either - the first position in the range ``[x,end)`` such that ``f(*m_iter) == true`` - or else``m_iter == end``. The member ``m_pred`` is constructed from - ``f`` and ``m_end`` from ``end``. - - Change: - :Returns: A ``filter_iterator`` at position ``x`` that filters - according to a default constructed ``Predicate`` - and that will not increment past ``end``. - - to: - :Effects: Constructs a ``filter_iterator`` where ``m_iter`` is either - the first position in the range ``[x,end)`` such that ``m_pred(*m_iter) == true`` - or else``m_iter == end``. The member ``m_pred`` is default constructed. - - - Change: - :Returns: A copy of iterator ``t``. - - to: - :Effects: Constructs a filter iterator whose members are copied from ``t``. - - Change: - :Returns: A copy of the predicate object used to construct ``*this``. - - to: - :Returns: ``m_pred`` - - Change: - :Returns: The object ``end`` used to construct ``*this``. - - to: - :Returns: ``m_end`` - - At the end of the operations section, add: - - ``reference operator*() const;`` - - :Returns: ``*m_iter`` - - - ``filter_iterator& operator++();`` - - :Effects: Increments ``m_iter`` and then continues to - increment ``m_iter`` until either ``m_iter == m_end`` - or ``m_pred(*m_iter) == true``. - :Returns: ``*this`` - - - Change:: - - class counting_iterator - : public iterator_adaptor< - counting_iterator - , Incrementable - , Incrementable - , Access - , /* see details for traversal category */ - , Incrementable const& - , Incrementable const* - , /* distance = Difference or a signed integral type */> - { - friend class iterator_core_access; - public: - - to:: - - class counting_iterator - { - public: - typedef Incrementable value_type; - typedef const Incrementable& reference; - typedef const Incrementable* pointer; - typedef /* see below */ difference_type; - typedef /* see below */ iterator_category; - - - - Change:: - - private: - typename counting_iterator::reference dereference() const - { - return this->base_reference(); - } - - to:: - - Incrementable const& base() const; - reference operator*() const; - counting_iterator& operator++(); - counting_iterator& operator--(); - private: - Incrementable m_inc; // exposition - - After the synopsis, add: - - If the ``Difference`` argument is ``use_default`` then - ``difference_type`` is an unspecified signed integral - type. Otherwise ``difference_type`` is ``Difference``. - - ``iterator_category`` is determined according to the following - algorithm: - - .. parsed-literal:: - - if (CategoryOrTraversal is not use_default) - return CategoryOrTraversal - else if (numeric_limits::is_specialized) - return |iterator-category|\ ( - random_access_traversal_tag, Incrementable, const Incrementable&) - else - return |iterator-category|\ ( - iterator_traversal::type, - Incrementable, const Incrementable&) - - - - Change: - [*Note:* implementers are encouraged to provide an implementation of - ``distance_to`` and a ``difference_type`` that avoids overflows in - the cases when the ``Incrementable`` type is a numeric type.] - - to: - [*Note:* implementers are encouraged to provide an implementation of - ``operator-`` and a ``difference_type`` that avoid overflows in - the cases where ``std::numeric_limits::is_specialized`` - is true.] - - Change: - The ``Incrementable`` type must be Default Constructible, Copy - Constructible, and Assignable. The default distance is - an implementation defined signed integegral type. - - The resulting ``counting_iterator`` models Readable Lvalue Iterator. - - to: - The ``Incrementable`` argument shall be Copy Constructible and Assignable. - - Change: - Furthermore, if you wish to create a counting iterator that is a Forward - Traversal Iterator, then the following expressions must be valid: - - to: - If ``iterator_category`` is convertible to ``forward_iterator_tag`` - or ``forward_traversal_tag``, the following must be well-formed: - - Change: - If you wish to create a counting iterator that is a - Bidirectional Traversal Iterator, then pre-decrement is also required: - - to: - If ``iterator_category`` is convertible to - ``bidirectional_iterator_tag`` or ``bidirectional_traversal_tag``, - the following expression must also be well-formed: - - Change: - If you wish to create a counting iterator that is a Random Access - Traversal Iterator, then these additional expressions are also - required: - - to: - If ``iterator_category`` is convertible to - ``random_access_iterator_tag`` or ``random_access_traversal_tag``, - the following must must also be valid: - - After the requirements section, add: - -.. topic:: ``counting_iterator`` models - - Specializations of ``counting_iterator`` model Readable Lvalue - Iterator. In addition, they model the concepts corresponding to the - iterator tags to which their ``iterator_category`` is convertible. - Also, if ``CategoryOrTraversal`` is not ``use_default`` then - ``counting_iterator`` models the concept corresponding to the iterator - tag ``CategoryOrTraversal``. Otherwise, if - ``numeric_limits::is_specialized``, then - ``counting_iterator`` models Random Access Traversal Iterator. - Otherwise, ``counting_iterator`` models the same iterator traversal - concepts modeled by ``Incrementable``. - - ``counting_iterator`` is interoperable with - ``counting_iterator`` if and only if ``X`` is - interoperable with ``Y``. - - At the begining of the operations section, add: - - In addition to the operations required by the concepts modeled by - ``counting_iterator``, ``counting_iterator`` provides the following - operations. - - Change: - :Returns: A default constructed instance of ``counting_iterator``. - - to: - :Requires: ``Incrementable`` is Default Constructible. - :Effects: Default construct the member ``m_inc``. - - Change: - :Returns: An instance of ``counting_iterator`` that is a copy of ``rhs``. - - to: - :Effects: Construct member ``m_inc`` from ``rhs.m_inc``. - - Change: - :Returns: An instance of ``counting_iterator`` with its base - object copy constructed from ``x``. - - to: - :Effects: Construct member ``m_inc`` from ``x``. - - At the end of the operations section, add: - - ``reference operator*() const;`` - - :Returns: ``m_inc`` - - - ``counting_iterator& operator++();`` - - :Effects: ``++m_inc`` - :Returns: ``*this`` - - - ``counting_iterator& operator--();`` - - :Effects: ``--m_inc`` - :Returns: ``*this`` - - - ``Incrementable const& base() const;`` - - :Returns: ``m_inc`` - - -9.38x Problem with specification of a->m in Readable Iterator -============================================================= - -:Submitter: Howard Hinnant -:Status: New - -c++std-lib-12585: - -Readable Iterator Requirements says: - - +----------+--------+-----------------------------------------------------------+ - | ``a->m`` | ``U&`` | pre: ``(*a).m`` is well-defined. Equivalent to ``(*a).m`` | - +----------+--------+-----------------------------------------------------------+ - -Do we mean to outlaw iterators with proxy references from meeting -the readable requirements? - -Would it be better for the requirements to read ``static_cast(*a).m`` -instead of ``(*a).m`` ? - -:Proposed resolution: NAD. - -:Rationale: We think you're misreading "pre:". - If ``(*a).m`` is not well defined, then the iterator is not - required to provide ``a->m``. So a proxy iterator is not - required to provide ``a->m``. - - As an aside, it is possible for proxy iterators to - support ``->``, so changing the requirements to - read ``static_cast(*a).m`` is interesting. - However, such a change to Readable Iterator would - mean that it no longer corresponds to the - input iterator requirements. So old iterators would not - necessarily conform to new iterator requirements. - - -9.39x counting_iterator Traversal argument unspecified -====================================================== - -:Submitter: Pete Becker - -c++std-lib-12635: - -counting_iterator takes an argument for its Traversal type, with a -default value of use_default. It is derived from an instance of -iterator_adaptor, where the argument passed for the Traversal type -is described as "\ ``/* see details for traversal category -*/``". The details for counting_iterator describe constraints on -the Incrementable type imposed by various traversal -categories. There is no description of what the argument to -iterator_adaptor should be. - - -:Proposed resolution: - We no longer inherit from iterator_adaptor. So instead, - we specify the iterator_category in terms of the Traversal type - (which is now called CategoryOrTraversal). Also the - requirements and models section was reorganized to - match these changes and to make more sense. - - - -9.40x indirect_iterator requirements muddled -============================================ - -:Submitter: Pete Becker - -c++std-lib-12640: - - The value_type of the Iterator template parameter should itself - be dereferenceable. The return type of the ``operator*`` for - the value_type must be the same type as the Reference template - parameter. - - I'd say this a bit differently, to emphasize what's required: - iterator_traits::value_type must be dereferenceable. - The Reference template parameter must be the same type as - ``*iterator_traits::value_type()``. - - The Value template parameter will be the value_type for the - indirect_iterator, unless Value is const. If Value is const X, then - value_type will be non- const X. - - Also non-volatile, right? In other words, if Value isn't use_default, it - just gets passed as the Value argument for iterator_adaptor. - - The default for Value is:: - - iterator_traits< iterator_traits::value_type >::value_type - - If the default is used for Value, then there must be a valid - specialization of iterator_traits for the value type of the - base iterator. - - The earlier requirement is that - ``iterator_traits::value_type`` must be - dereferenceable. Now it's being treated as an iterator. Is this - just a pun, or is ``iterator_traits::value_type`` - required to be some form of iterator? If it's the former we need - to find a different way to say it. If it's the latter we need to - say so. - -:Proposed resolution: - Change: - - The ``value_type`` of the ``Iterator`` template parameter - should itself be dereferenceable. The return type of the - ``operator*`` for the ``value_type`` must be the same type as - the ``Reference`` template parameter. The ``Value`` template - parameter will be the ``value_type`` for the - ``indirect_iterator``, unless ``Value`` is const. If ``Value`` - is ``const X``, then ``value_type`` will be *non-* ``const X``. - The default for ``Value`` is:: - - iterator_traits< iterator_traits::value_type >::value_type - - If the default is used for ``Value``, then there must be a - valid specialization of ``iterator_traits`` for the value type - of the base iterator. - - The ``Reference`` parameter will be the ``reference`` type of the - ``indirect_iterator``. The default is ``Value&``. - - The ``Access`` and ``Traversal`` parameters are passed - unchanged to the corresponding parameters of the - ``iterator_adaptor`` base class, and the ``Iterator`` parameter - is passed unchanged as the ``Base`` parameter to the - ``iterator_adaptor`` base class. - - to: - - The expression ``*v``, where ``v`` is an object of - ``iterator_traits::value_type``, shall be valid - expression and convertible to ``reference``. ``Iterator`` - shall model the traversal concept indicated by - ``iterator_category``. ``Value``, ``Reference``, and - ``Difference`` shall be chosen so that ``value_type``, - ``reference``, and ``difference_type`` meet the requirements - indicated by ``iterator_category``. - - [Note: there are further requirements on the - ``iterator_traits::value_type`` if the ``Value`` - parameter is not ``use_default``, as implied by the algorithm - for deducing the default for the ``value_type`` member.] - - -:Rationale: Not included above is the specification of the - ``value_type``, ``reference``, etc., members, which is handled by - the changes in 9.37x. - - -9.41x Problem with transform_iterator requirements -================================================== - -:Submitter: Pete Becker - -c++std-lib-12641: - - The reference type of transform_iterator is ``result_of< - UnaryFunction(iterator_traits::reference) - >::type``. The ``value_type`` is - ``remove_cv >::type``. - -These are the defaults, right? If the user supplies their own types -that's what gets passed to iterator_adaptor. And again, the -specification should be in terms of the specialization of -iterator_adaptor, and not in terms of the result: - -Reference argument to iterator_adaptor:: - - if (Reference != use_default) - Reference - else - result_of< - UnaryFunction(iterator_traits::reference) - >::type - -Value argument to iterator_adaptor:: - - if (Value != use_default) - Value - else if (Reference != use_default) - remove_reference::type - else - remove_reference< - result_of< - UnaryFunction(iterator_traits::reference) - >::type - >::type - -There's probably a better way to specify that last alternative, but -I've been at this too long, and it's all turning into a maze of -twisty passages, all alike. - -:Proposed resolution: - Replace: - - The reference type of transform_iterator is ``result_of< - UnaryFunction(iterator_traits::reference) - >::type``. The ``value_type`` is - ``remove_cv >::type``. - - with: - - If ``Reference`` is ``use_default`` then the ``reference`` - member of ``transform_iterator`` is ``result_of< - UnaryFunction(iterator_traits::reference) - >::type``. Otherwise, ``reference`` is ``Reference``. - - If ``Value`` is ``use_default`` then the ``value_type`` - member is ``remove_cv >::type``. - Otherwise, ``value_type`` is ``Value``. - - -9.42x filter_iterator details unspecified -========================================= - -:Submitter: Pete Becker - -c++std-lib-12642: - -The paper says:: - - template - class filter_iterator - : public iterator_adaptor< - filter_iterator, - Iterator, - use_default, - /* see details */ > - -That comment covers the Access, Traversal, Reference, and Difference -arguments. The only specification for any of these in the details is: - - The access category of the filter_iterator will be the same as - the access category of Iterator. - -Needs more. - -:Proposed resolution: - Add to the synopsis:: - - typedef iterator_traits::value_type value_type; - typedef iterator_traits::reference reference; - typedef iterator_traits::pointer pointer; - typedef iterator_traits::difference_type difference_type; - typedef /* see below */ iterator_category; - - and add just after the synopsis: - - If ``Iterator`` models Readable Lvalue Iterator and Forward - Traversal Iterator then ``iterator_category`` is convertible - to ``std::forward_iterator_tag``. Otherwise - ``iterator_category`` is convertible to - ``std::input_iterator_tag``. - - -9.43x transform_iterator interoperability too restrictive -========================================================= - -:Submitter: Jeremy Siek - -We do not need to require that the function objects have the same -type, just that they be convertible. - -:Proposed resolution: - - Change:: - - template - transform_iterator( - transform_iterator const& t - , typename enable_if_convertible::type* = 0 // exposition - ); - - to:: - - template - transform_iterator( - transform_iterator const& t - , typename enable_if_convertible::type* = 0 // exposition only - , typename enable_if_convertible::type* = 0 // exposition only - ); - - -9.44y ``indirect_iterator`` and smart pointers -============================================== - -:Submitter: Dave Abrahams - -``indirect_iterator`` should be able to iterate over containers of -smart pointers, but the mechanism that allows it was left out of -the specification, even though it's present in the Boost -specification - -:Proposed resolution: Add ``pointee`` and ``indirect_reference`` - to deal with this capability. - - In [lib.iterator.helper.synopsis], add:: - - template - struct pointee; - - template - struct indirect_reference; - - After ``indirect_iterator``\ 's abstract, add: - -.. topic:: Class template ``pointee`` - - .. include:: pointee_ref.rst - -.. topic:: Class template ``indirect_reference`` - - .. include:: indirect_reference_ref.rst - -See proposed resolution to Issue 9.37x for more changes related to -this issue. - -9.45y N1530: Typos and editorial changes in proposal text (not standardese) -=========================================================================== - -:Submitter: Dave Abrahams - -1. "because specification helps to highlight that the ``Reference`` - template parameter may not always be identical to the iterator's - ``reference`` type, and will keep users making mistakes based on - that assumption." - - :Proposed resolution: add "from" before "making" - -2. mention of obsolete projection_iterator - - :Proposed Resolution: - - From n1530, in the **Specialized Adaptors** section, remove: - - ``projection_iterator``, which is similar to ``transform_iterator`` - except that when dereferenced it returns a reference instead of - a value. - - :Rationale: - This iterator was in the original boost library, but the new - iterator concepts allowed this iterator to be - folded into ``transform_iterator``. - - - -9.46y N1530: ``base()`` return-by-value is costly -================================================= - -:Submitter: Dave Abrahams - -We've had some real-life reports that iterators that use -``iterator_adaptor``\ 's ``base()`` function can be inefficient -when the ``Base`` iterator is expensive to copy. Iterators, of -all things, should be efficient. - -:Proposed resolution: - - In [lib.iterator.adaptor] - - Change:: - - Base base() const; - - to:: - - Base const& base() const; - - twice (once in the synopsis and once in the **public - operations** section). - - -9.47x Forgot default constructible in Forward Traversal Iterator -================================================================ - -:Submitter: Jeremy Siek - -We want Forward Traversal Iterator plus Readable Lvalue Iterator to -match the old Foward Iterator requirements, so we need Forward -Traversal Iterator to include Default Constructible. - -:Proposed resolution: - - Change: - - A class or built-in type ``X`` models the *Forward Traversal Iterator* - concept if the following expressions are valid and respect the stated - semantics. - - +-------------------------------------------------------------------------------------------+ - |Forward Traversal Iterator Requirements (in addition to Single Pass Iterator) | - +---------------------------------------+-----------------------------------+---------------+ - - to: - - A class or built-in type ``X`` models the *Forward Traversal Iterator* - concept if, in addition to ``X`` meeting the requirements of - Default Constructible and Single Pass Iterator, the following - expressions are valid and respect the - stated semantics. - - +--------------------------------------------------------------------------------------------------------+ - |Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator) | - +---------------------------------------+-----------------------------------+----------------------------+ - -9.48x Editorial changes (non-normative text) -============================================ - -Change: - Iterator facade uses the Curiously Recurring Template Pattern (CRTP) - [Cop95] so that the user can specify the behavior of - ``iterator_facade`` in a derived class. Former designs used policy - objects to specify the behavior. ``iterator_facade`` does not use policy - objects for several reasons: - -to: - Iterator facade uses the Curiously Recurring Template - Pattern (CRTP) [Cop95] so that the user can specify the behavior - of ``iterator_facade`` in a derived class. Former designs used - policy objects to specify the behavior, but that approach was - discarded for several reasons: - - -Change: - iterator's ``operator++`` returns the iterator type itself means - that all iterators generated by ``iterator_facade`` would be - instantiations of ``iterator_facade``. Cumbersome type generator - -to: - iterator's ``operator++`` returns the iterator type itself - would mean that all iterators built with the library would - have to be specializations of ``iterator_facade<...>``, rather - than something more descriptive like - ``indirect_iterator``. Cumbersome type generator - - -Change: - The return type for ``operator->`` and ``operator[]`` is not - explicitly specified. Instead it requires each ``iterator_facade`` - instantiation to meet the requirements of its ``iterator_category``. - -To: - The return types for ``iterator_facade``\ 's ``operator->`` and - ``operator[]`` are not explicitly specified. Instead, those types - are described in terms of a set of requirements, which must be - satisfied by the ``iterator_facade`` implementation. - - -9.49x Clarification of iterator_facade requirements and type members -==================================================================== - -A general cleanup and simplification of the requirements and -description of type members for ``iterator_facade``. - - -The user is only allowed to add ``const`` as a qualifier. - -Change: - ``typedef remove_cv::type value_type;`` - -to: - ``typedef remove_const::type value_type;`` - - -We use to have an unspecified type for ``pointer``, to match the -return type of ``operator->``, but there's no real reason to make them -match, so we just use the simpler ``Value*`` for ``pointer``. - -Change: - - ``typedef /* see description of operator-> */ pointer;`` - -To: - ``typedef Value* pointer;`` - - -Remove: - Some of the constraints on template parameters to - ``iterator_facade`` are expressed in terms of resulting nested - types and should be viewed in the context of their impact on - ``iterator_traits``. - -Change: - The ``Derived`` template parameter must be a class derived from - ``iterator_facade``. - -and: - The following table describes the other requirements on the - ``Derived`` parameter. Depending on the resulting iterator's - ``iterator_category``, a subset of the expressions listed in the table - are required to be valid. The operations in the first column must be - accessible to member functions of class ``iterator_core_access``. - -to: - The following table describes the typical valid expressions on - ``iterator_facade``\ 's ``Derived`` parameter, depending on the - iterator concept(s) it will model. The operations in the first - column must be made accessible to member functions of class - ``iterator_core_access``. In addition, - ``static_cast(iterator_facade*)`` shall be well-formed. - - -Remove: - The nested ``::value_type`` type will be the same as - ``remove_cv::type``, so the ``Value`` parameter must be - an (optionally ``const``\ -qualified) non-reference type. - - The nested ``::reference`` will be the same as the ``Reference`` - parameter; it must be a suitable reference type for the resulting - iterator. The default for the ``Reference`` parameter is - ``Value&``. - - -Change: - - In the table below, ``X`` is the derived iterator type, ``a`` is an - object of type ``X``, ``b`` and ``c`` are objects of type ``const X``, - ``n`` is an object of ``X::difference_type``, ``y`` is a constant - object of a single pass iterator type interoperable with X, and ``z`` - is a constant object of a random access traversal iterator type - interoperable with ``X``. - - +--------------------+-------------------+-------------------------------------+---------------------------+ - |Expression |Return Type |Assertion/Note |Required to implement | - | | | |Iterator Concept(s) | - +====================+===================+=====================================+===========================+ - |``c.dereference()`` |``X::reference`` | |Readable Iterator, Writable| - | | | |Iterator | - +--------------------+-------------------+-------------------------------------+---------------------------+ - |``c.equal(b)`` |convertible to bool|true iff ``b`` and ``c`` are |Single Pass Iterator | - | | |equivalent. | | - +--------------------+-------------------+-------------------------------------+---------------------------+ - |``c.equal(y)`` |convertible to bool|true iff ``c`` and ``y`` refer to the|Single Pass Iterator | - | | |same position. Implements ``c == y``| | - | | |and ``c != y``. | | - +--------------------+-------------------+-------------------------------------+---------------------------+ - |``a.advance(n)`` |unused | |Random Access Traversal | - | | | |Iterator | - +--------------------+-------------------+-------------------------------------+---------------------------+ - |``a.increment()`` |unused | |Incrementable Iterator | - +--------------------+-------------------+-------------------------------------+---------------------------+ - |``a.decrement()`` |unused | |Bidirectional Traversal | - | | | |Iterator | - +--------------------+-------------------+-------------------------------------+---------------------------+ - |``c.distance_to(b)``|convertible to |equivalent to ``distance(c, b)`` |Random Access Traversal | - | |X::difference_type | |Iterator | - +--------------------+-------------------+-------------------------------------+---------------------------+ - |``c.distance_to(z)``|convertible to |equivalent to ``distance(c, z)``. |Random Access Traversal | - | |X::difference_type |Implements ``c - z``, ``c < z``, ``c |Iterator | - | | |<= z``, ``c > z``, and ``c >= c``. | | - +--------------------+-------------------+-------------------------------------+---------------------------+ - -to: - - In the table below, ``F`` is ``iterator_facade``, ``a`` is an - object of type ``X``, ``b`` and ``c`` are objects of type ``const X``, - ``n`` is an object of ``F::difference_type``, ``y`` is a constant - object of a single pass iterator type interoperable with ``X``, and ``z`` - is a constant object of a random access traversal iterator type - interoperable with ``X``. - - **iterator_facade Core Operations** - - +--------------------+----------------------+-------------------------+---------------------------+ - |Expression |Return Type |Assertion/Note |Used to implement Iterator | - | | | |Concept(s) | - +====================+======================+=========================+===========================+ - |``c.dereference()`` |``F::reference`` | |Readable Iterator, Writable| - | | | |Iterator | - +--------------------+----------------------+-------------------------+---------------------------+ - |``c.equal(y)`` |convertible to bool |true iff ``c`` and ``y`` |Single Pass Iterator | - | | |refer to the same | | - | | |position. | | - +--------------------+----------------------+-------------------------+---------------------------+ - |``a.increment()`` |unused | |Incrementable Iterator | - +--------------------+----------------------+-------------------------+---------------------------+ - |``a.decrement()`` |unused | |Bidirectional Traversal | - | | | |Iterator | - +--------------------+----------------------+-------------------------+---------------------------+ - |``a.advance(n)`` |unused | |Random Access Traversal | - | | | |Iterator | - +--------------------+----------------------+-------------------------+---------------------------+ - |``c.distance_to(z)``|convertible to |equivalent to |Random Access Traversal | - | |``F::difference_type``|``distance(c, X(z))``. |Iterator | - +--------------------+----------------------+-------------------------+---------------------------+ - - - diff --git a/doc/iterator_adaptor.html b/doc/iterator_adaptor.html deleted file mode 100644 index d09d4c5..0000000 --- a/doc/iterator_adaptor.html +++ /dev/null @@ -1,450 +0,0 @@ - - - - - - -Iterator Adaptor - - - - - - - -

Iterator Adaptor

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization:Boost Consulting, Indiana University Open Systems -Lab, University of Hanover Institute for Transport -Railway Operation and Construction
Date:2004-01-12
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved
-
- --- - - - -
abstract:
- - -

Each specialization of the iterator_adaptor class template is derived from -a specialization of iterator_facade. The core interface functions -expected by iterator_facade are implemented in terms of the -iterator_adaptor's Base template parameter. A class derived -from iterator_adaptor typically redefines some of the core -interface functions to adapt the behavior of the Base type. -Whether the derived class models any of the standard iterator concepts -depends on the operations supported by the Base type and which -core interface functions of iterator_facade are redefined in the -Derived class.

- -
-

Overview

- - -

The iterator_adaptor class template adapts some Base 1 -type to create a new iterator. Instantiations of iterator_adaptor -are derived from a corresponding instantiation of iterator_facade -and implement the core behaviors in terms of the Base type. In -essence, iterator_adaptor merely forwards all operations to an -instance of the Base type, which it stores as a member.

- - - - - -
[1](1, 2) The term "Base" here does not refer to a base class and is -not meant to imply the use of derivation. We have followed the lead -of the standard library, which provides a base() function to access -the underlying iterator object of a reverse_iterator adaptor.
-

The user of iterator_adaptor creates a class derived from an -instantiation of iterator_adaptor and then selectively -redefines some of the core member functions described in the -iterator_facade core requirements table. The Base type need -not meet the full requirements for an iterator; it need only -support the operations used by the core interface functions of -iterator_adaptor that have not been redefined in the user's -derived class.

-

Several of the template parameters of iterator_adaptor default -to use_default. This allows the -user to make use of a default parameter even when she wants to -specify a parameter later in the parameter list. Also, the -defaults for the corresponding associated types are somewhat -complicated, so metaprogramming is required to compute them, and -use_default can help to simplify the implementation. Finally, -the identity of the use_default type is not left unspecified -because specification helps to highlight that the Reference -template parameter may not always be identical to the iterator's -reference type, and will keep users from making mistakes based on -that assumption.

-
-
-

Reference

- - -
-template <
-    class Derived
-  , class Base
-  , class Value               = use_default
-  , class CategoryOrTraversal = use_default
-  , class Reference           = use_default
-  , class Difference = use_default
->
-class iterator_adaptor 
-  : public iterator_facade<Derived, V', C', R', D'> // see details
-{
-    friend class iterator_core_access;
- public:
-    iterator_adaptor();
-    explicit iterator_adaptor(Base iter);
-    Base const& base() const;
- protected:
-    typedef iterator_adaptor iterator_adaptor_;
-    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:
-    Base m_iterator; // exposition only
-};
-
-
-

iterator_adaptor requirements

-

static_cast<Derived*>(iterator_adaptor*) shall be well-formed. -The Base argument shall be Assignable and Copy Constructible.

-
-
-

iterator_adaptor base class parameters

-

The V', C', R', and D' parameters of the iterator_facade -used as a base class in the summary of iterator_adaptor -above are defined as follows:

-
-V' = if (Value is use_default)
-          return iterator_traits<Base>::value_type
-      else
-          return Value
-
-C' = if (CategoryOrTraversal is use_default)
-          return iterator_traversal<Base>::type
-      else
-          return CategoryOrTraversal
-
-R' = if (Reference is use_default)
-          if (Value is use_default)
-              return iterator_traits<Base>::reference
-          else
-              return Value&
-      else
-          return Reference
-
-D' = if (Difference is use_default)
-          return iterator_traits<Base>::difference_type
-      else
-          return Difference
-
- - - -
-
-

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.
-

explicit iterator_adaptor(Base iter);

- --- - - - -
Returns:An instance of iterator_adaptor with -m_iterator copy constructed from iter.
-

Base const& base() const;

- --- - - - -
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
-
-
-
-

Tutorial Example

- - - -

In this section we'll further refine the node_iter class -template we developed in the iterator_facade tutorial. If you haven't already -read that material, you should go back now and check it out because -we're going to pick up right where it left off.

- -

You probably didn't think of it this way, but the node_base* -object that underlies node_iterator is itself an iterator, -just like all other pointers. If we examine that pointer closely -from an iterator perspective, we can see that it has much in common -with the node_iterator we're building. First, they share most -of the same associated types (value_type, reference, -pointer, and difference_type). Second, even some of the -core functionality is the same: operator* and operator== on -the node_iterator return the result of invoking the same -operations on the underlying pointer, via the node_iterator's -dereference and equal member functions). The only real behavioral difference -between node_base* and node_iterator can be observed when -they are incremented: node_iterator follows the -m_next pointer, while node_base* just applies an address offset.

-

It turns out that the pattern of building an iterator on another -iterator-like type (the Base 1 type) while modifying -just a few aspects of the underlying type's behavior is an -extremely common one, and it's the pattern addressed by -iterator_adaptor. Using iterator_adaptor is very much like -using iterator_facade, but because iterator_adaptor tries to -mimic as much of the Base type's behavior as possible, we -neither have to supply a Value argument, nor implement any core -behaviors other than increment. The implementation of -node_iter is thus reduced to:

-
-template <class Value>
-class node_iter
-  : public boost::iterator_adaptor<
-        node_iter<Value>                // Derived
-      , Value*                          // Base
-      , boost::use_default              // Value
-      , boost::forward_traversal_tag    // CategoryOrTraversal
-    >
-{
- private:
-    struct enabler {};  // a private type avoids misuse
-
- public:
-    node_iter()
-      : node_iter::iterator_adaptor_(0) {}
-
-    explicit node_iter(Value* p)
-      : node_iter::iterator_adaptor_(p) {}
-
-    template <class OtherValue>
-    node_iter(
-        node_iter<OtherValue> const& other
-      , typename boost::enable_if<
-            boost::is_convertible<OtherValue*,Value*>
-          , enabler
-        >::type = enabler()
-    )
-      : node_iter::iterator_adaptor_(other.base()) {}
-
- private:
-    friend class boost::iterator_core_access;
-    void increment() { this->base_reference() = this->base()->next(); }
-};
-
-

Note the use of node_iter::iterator_adaptor_ here: because -iterator_adaptor defines a nested iterator_adaptor_ type -that refers to itself, that gives us a convenient way to refer to -the complicated base class type of node_iter<Value>. [Note: -this technique is known not to work with Borland C++ 5.6.4 and -Metrowerks CodeWarrior versions prior to 9.0]

-

You can see an example program that exercises this version of the -node iterators here.

-

In the case of node_iter, it's not very compelling to pass -boost::use_default as iterator_adaptor's Value -argument; we could have just passed node_iter's Value -along to iterator_adaptor, and that'd even be shorter! Most -iterator class templates built with iterator_adaptor are -parameterized on another iterator type, rather than on its -value_type. For example, boost::reverse_iterator takes an -iterator type argument and reverses its direction of traversal, -since the original iterator and the reversed one have all the same -associated types, iterator_adaptor's delegation of default -types to its Base saves the implementor of -boost::reverse_iterator from writing:

-
-std::iterator_traits<Iterator>::some-associated-type
-
-

at least four times.

-

We urge you to review the documentation and implementations of -reverse_iterator and the other Boost specialized iterator -adaptors to get an idea of the sorts of things you can do with -iterator_adaptor. In particular, have a look at -transform_iterator, which is perhaps the most straightforward -adaptor, and also counting_iterator, which demonstrates that -iterator_adaptor's Base type needn't be an iterator.

-
-
- - - - diff --git a/doc/iterator_adaptor.pdf b/doc/iterator_adaptor.pdf deleted file mode 100755 index 1dca935..0000000 Binary files a/doc/iterator_adaptor.pdf and /dev/null differ diff --git a/doc/iterator_adaptor.rst b/doc/iterator_adaptor.rst deleted file mode 100644 index 42e25e3..0000000 --- a/doc/iterator_adaptor.rst +++ /dev/null @@ -1,37 +0,0 @@ -+++++++++++++++++ - Iterator Adaptor -+++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, University of Hanover `Institute for Transport - Railway Operation and Construction`_ -:date: $Date$ -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de - -:abstract: - -.. include:: iterator_adaptor_abstract.rst - -.. contents:: Table of Contents - -Overview -======== - -.. include:: iterator_adaptor_body.rst - - -Reference -========= - -.. include:: iterator_adaptor_ref.rst - -Tutorial Example -================ - -.. include:: iterator_adaptor_tutorial.rst diff --git a/doc/iterator_adaptor_abstract.diff b/doc/iterator_adaptor_abstract.diff deleted file mode 100755 index 6cebd77..0000000 --- a/doc/iterator_adaptor_abstract.diff +++ /dev/null @@ -1,22 +0,0 @@ -Index: iterator_adaptor_abstract.rst -=================================================================== -RCS file: /cvsroot/boost/boost/libs/iterator/doc/iterator_adaptor_abstract.rst,v -retrieving revision 1.1 -retrieving revision 1.2 -diff -b -d -u -r1.1 -r1.2 ---- iterator_adaptor_abstract.rst 5 Aug 2003 18:19:55 -0000 1.1 -+++ iterator_adaptor_abstract.rst 24 Nov 2003 05:02:46 -0000 1.2 -@@ -1,5 +1,11 @@ Issue 9.21 --The ``iterator_adaptor`` is a base class template derived from an --instantiation of ``iterator_facade``. The core interface functions -+.. Version 1.1 of this ReStructuredText document corresponds to -+ n1530_, the paper accepted by the LWG. -+ -+.. Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All -+ rights reserved -+ -+Each specialization of the ``iterator_adaptor`` class template is derived from -+a specialization of ``iterator_facade``. The core interface functions - expected by ``iterator_facade`` are implemented in terms of the - ``iterator_adaptor``\ 's ``Base`` template parameter. A class derived - from ``iterator_adaptor`` typically redefines some of the core diff --git a/doc/iterator_adaptor_abstract.rst b/doc/iterator_adaptor_abstract.rst deleted file mode 100644 index c20ac7b..0000000 --- a/doc/iterator_adaptor_abstract.rst +++ /dev/null @@ -1,16 +0,0 @@ -.. Version 1.1 of this ReStructuredText document corresponds to - n1530_, the paper accepted by the LWG. - -.. Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All - rights reserved - -Each specialization of the ``iterator_adaptor`` class template is derived from -a specialization of ``iterator_facade``. The core interface functions -expected by ``iterator_facade`` are implemented in terms of the -``iterator_adaptor``\ 's ``Base`` template parameter. A class derived -from ``iterator_adaptor`` typically redefines some of the core -interface functions to adapt the behavior of the ``Base`` type. -Whether the derived class models any of the standard iterator concepts -depends on the operations supported by the ``Base`` type and which -core interface functions of ``iterator_facade`` are redefined in the -``Derived`` class. diff --git a/doc/iterator_adaptor_body.diff b/doc/iterator_adaptor_body.diff deleted file mode 100755 index a170244..0000000 --- a/doc/iterator_adaptor_body.diff +++ /dev/null @@ -1,35 +0,0 @@ -Index: iterator_adaptor_body.rst -=================================================================== -RCS file: /cvsroot/boost/boost/libs/iterator/doc/iterator_adaptor_body.rst,v -retrieving revision 1.2 -retrieving revision 1.3 -diff -b -d -u -r1.2 -r1.3 ---- iterator_adaptor_body.rst 22 Sep 2003 19:55:00 -0000 1.2 -+++ iterator_adaptor_body.rst 24 Nov 2003 05:02:46 -0000 1.3 -@@ -1,3 +1,9 @@ -+.. Version 1.2 of this ReStructuredText document corresponds to -+ n1530_, the paper accepted by the LWG for TR1. -+ -+.. Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All -+ rights reserved -+ - The ``iterator_adaptor`` class template adapts some ``Base`` [#base]_ - type to create a new iterator. Instantiations of ``iterator_adaptor`` - are derived from a corresponding instantiation of ``iterator_facade`` -@@ -19,7 +25,7 @@ Issue 9.1 et al - redefined in the user's derived class. - - Several of the template parameters of ``iterator_adaptor`` default --to ``use_default`` (or ``use_default_access``). This allows the -+to ``use_default``. This allows the - user to make use of a default parameter even when she wants to - specify a parameter later in the parameter list. Also, the - defaults for the corresponding associated types are somewhat -@@ -28,6 +34,6 @@ Issue 9.45y - the identity of the ``use_default`` type is not left unspecified - because specification helps to highlight that the ``Reference`` - template parameter may not always be identical to the iterator's --``reference`` type, and will keep users making mistakes based on -+``reference`` type, and will keep users from making mistakes based on - that assumption. - diff --git a/doc/iterator_adaptor_body.rst b/doc/iterator_adaptor_body.rst deleted file mode 100644 index 238cc8c..0000000 --- a/doc/iterator_adaptor_body.rst +++ /dev/null @@ -1,40 +0,0 @@ -.. Version 1.2 of this ReStructuredText document corresponds to - n1530_, the paper accepted by the LWG for TR1. - -.. Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All - rights reserved - -The ``iterator_adaptor`` class template adapts some ``Base`` [#base]_ -type to create a new iterator. Instantiations of ``iterator_adaptor`` -are derived from a corresponding instantiation of ``iterator_facade`` -and implement the core behaviors in terms of the ``Base`` type. In -essence, ``iterator_adaptor`` merely forwards all operations to an -instance of the ``Base`` type, which it stores as a member. - -.. [#base] The term "Base" here does not refer to a base class and is - not meant to imply the use of derivation. We have followed the lead - of the standard library, which provides a base() function to access - the underlying iterator object of a ``reverse_iterator`` adaptor. - -The user of ``iterator_adaptor`` creates a class derived from an -instantiation of ``iterator_adaptor`` and then selectively -redefines some of the core member functions described in the -``iterator_facade`` core requirements table. The ``Base`` type need -not meet the full requirements for an iterator; it need only -support the operations used by the core interface functions of -``iterator_adaptor`` that have not been redefined in the user's -derived class. - -Several of the template parameters of ``iterator_adaptor`` default -to ``use_default``. This allows the -user to make use of a default parameter even when she wants to -specify a parameter later in the parameter list. Also, the -defaults for the corresponding associated types are somewhat -complicated, so metaprogramming is required to compute them, and -``use_default`` can help to simplify the implementation. Finally, -the identity of the ``use_default`` type is not left unspecified -because specification helps to highlight that the ``Reference`` -template parameter may not always be identical to the iterator's -``reference`` type, and will keep users from making mistakes based on -that assumption. - diff --git a/doc/iterator_adaptor_ref.html b/doc/iterator_adaptor_ref.html deleted file mode 100755 index 7a9b9b9..0000000 --- a/doc/iterator_adaptor_ref.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - - - -
- - -
-template <
-    class Derived
-  , class Base
-  , class Value        = use_default
-  , class CategoryOrTraversal  = use_default
-  , class Reference  = use_default
-  , class Difference = use_default
->
-class iterator_adaptor 
-  : public iterator_facade<Derived, V, C, R, D> // see details
-{
-    friend class iterator_core_access;
- public:
-    iterator_adaptor();
-    explicit iterator_adaptor(Base iter);
-    Base base() const;
- protected:
-    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:
-    Base m_iterator; // exposition only
-};
-
-
-

iterator_adaptor base class parameters

-

The V, C, R, and D parameters of the iterator_facade -used as a base class in the summary of iterator_adaptor -above are defined as follows:

-
-V = if (Value is use_default)
-          return iterator_traits<Base>::value_type
-      else
-          return Value
-
-C = if (CategoryOrTraversal is use_default)
-          return iterator_traversal<Base>::type
-      else
-          return CategoryOrTraversal
-
-R = if (Reference is use_default)
-          if (Value is use_default)
-              return iterator_traits<Base>::reference
-          else
-              return Value&
-      else
-          return Reference
-
-D = if (Difference is use_default)
-          return iterator_traits<Base>::difference_type
-      else
-          return Difference
-
-
-
-

iterator_adaptor usage

-

The Derived template parameter must be a publicly derived from -iterator_adaptor. 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.

-
-
-

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.
-

explicit iterator_adaptor(Base iter);

- --- - - - -
Returns:An instance of iterator_adaptor with -m_iterator copy constructed from iter.
-

Base base() const;

- --- - - - -
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
-
-
- - - - diff --git a/doc/iterator_adaptor_ref.rst b/doc/iterator_adaptor_ref.rst deleted file mode 100644 index b8de30d..0000000 --- a/doc/iterator_adaptor_ref.rst +++ /dev/null @@ -1,178 +0,0 @@ -.. Version 1.4 of this ReStructuredText document corresponds to - n1530_, the paper accepted by the LWG for TR1. - -.. Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All - rights reserved. - -.. parsed-literal:: - - template < - class Derived - , class Base - , class Value = use_default - , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class iterator_adaptor - : public iterator_facade // see details__ - { - friend class iterator_core_access; - public: - iterator_adaptor(); - explicit iterator_adaptor(Base iter); - Base const& base() const; - protected: - typedef iterator_adaptor iterator_adaptor\_; - 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 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 const& y) const; - - private: - Base m_iterator; // exposition only - }; - -__ base_parameters_ - -.. _requirements: - -``iterator_adaptor`` requirements ---------------------------------- - -``static_cast(iterator_adaptor*)`` shall be well-formed. -The ``Base`` argument shall be Assignable and Copy Constructible. - - -.. _base_parameters: - -``iterator_adaptor`` base class parameters ------------------------------------------- - -The *V'*, *C'*, *R'*, and *D'* parameters of the ``iterator_facade`` -used as a base class in the summary of ``iterator_adaptor`` -above are defined as follows: - -.. parsed-literal:: - - *V'* = if (Value is use_default) - return iterator_traits::value_type - else - return Value - - *C'* = if (CategoryOrTraversal is use_default) - return iterator_traversal::type - else - return CategoryOrTraversal - - *R'* = if (Reference is use_default) - if (Value is use_default) - return iterator_traits::reference - else - return Value& - else - return Reference - - *D'* = if (Difference is use_default) - return iterator_traits::difference_type - else - return Difference - -.. ``iterator_adaptor`` models - --------------------------- - - In order for ``Derived`` to model the iterator concepts corresponding - to ``iterator_traits::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`` in evaluating any valid - expression involving ``Derived`` in those concepts' requirements. - -.. The above is confusing and needs a rewrite. -JGS -.. That's why it's removed. We're embracing inheritance, remember? - -``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. - - -``explicit iterator_adaptor(Base iter);`` - -:Returns: An instance of ``iterator_adaptor`` with - ``m_iterator`` copy constructed from ``iter``. - -``Base const& base() const;`` - -: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 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 const& y) const; - -:Returns: ``y.base() - m_iterator`` diff --git a/doc/iterator_adaptor_tutorial.rst b/doc/iterator_adaptor_tutorial.rst deleted file mode 100755 index 4106846..0000000 --- a/doc/iterator_adaptor_tutorial.rst +++ /dev/null @@ -1,135 +0,0 @@ -.. Copyright David Abrahams 2004. 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) - -In this section we'll further refine the ``node_iter`` class -template we developed in the |fac_tut|_. If you haven't already -read that material, you should go back now and check it out because -we're going to pick up right where it left off. - -.. |fac_tut| replace:: ``iterator_facade`` tutorial -.. _fac_tut: iterator_facade.html#tutorial-example - -.. sidebar:: ``node_base*`` really *is* an iterator - - It's not really a very interesting iterator, since ``node_base`` - is an abstract class: a pointer to a ``node_base`` just points - at some base subobject of an instance of some other class, and - incrementing a ``node_base*`` moves it past this base subobject - to who-knows-where? The most we can do with that incremented - position is to compare another ``node_base*`` to it. In other - words, the original iterator traverses a one-element array. - -You probably didn't think of it this way, but the ``node_base*`` -object that underlies ``node_iterator`` is itself an iterator, -just like all other pointers. If we examine that pointer closely -from an iterator perspective, we can see that it has much in common -with the ``node_iterator`` we're building. First, they share most -of the same associated types (``value_type``, ``reference``, -``pointer``, and ``difference_type``). Second, even some of the -core functionality is the same: ``operator*`` and ``operator==`` on -the ``node_iterator`` return the result of invoking the same -operations on the underlying pointer, via the ``node_iterator``\ 's -|dereference_and_equal|_). The only real behavioral difference -between ``node_base*`` and ``node_iterator`` can be observed when -they are incremented: ``node_iterator`` follows the -``m_next`` pointer, while ``node_base*`` just applies an address offset. - -.. |dereference_and_equal| replace:: ``dereference`` and ``equal`` member functions -.. _dereference_and_equal: iterator_facade.html#implementing-the-core-operations - -It turns out that the pattern of building an iterator on another -iterator-like type (the ``Base`` [#base]_ type) while modifying -just a few aspects of the underlying type's behavior is an -extremely common one, and it's the pattern addressed by -``iterator_adaptor``. Using ``iterator_adaptor`` is very much like -using ``iterator_facade``, but because iterator_adaptor tries to -mimic as much of the ``Base`` type's behavior as possible, we -neither have to supply a ``Value`` argument, nor implement any core -behaviors other than ``increment``. The implementation of -``node_iter`` is thus reduced to:: - - template - class node_iter - : public boost::iterator_adaptor< - node_iter // Derived - , Value* // Base - , boost::use_default // Value - , boost::forward_traversal_tag // CategoryOrTraversal - > - { - private: - struct enabler {}; // a private type avoids misuse - - public: - node_iter() - : node_iter::iterator_adaptor_(0) {} - - explicit node_iter(Value* p) - : node_iter::iterator_adaptor_(p) {} - - template - node_iter( - node_iter const& other - , typename boost::enable_if< - boost::is_convertible - , enabler - >::type = enabler() - ) - : node_iter::iterator_adaptor_(other.base()) {} - - private: - friend class boost::iterator_core_access; - void increment() { this->base_reference() = this->base()->next(); } - }; - -Note the use of ``node_iter::iterator_adaptor_`` here: because -``iterator_adaptor`` defines a nested ``iterator_adaptor_`` type -that refers to itself, that gives us a convenient way to refer to -the complicated base class type of ``node_iter``. [Note: -this technique is known not to work with Borland C++ 5.6.4 and -Metrowerks CodeWarrior versions prior to 9.0] - -You can see an example program that exercises this version of the -node iterators `here`__. - -__ ../example/node_iterator3.cpp - -In the case of ``node_iter``, it's not very compelling to pass -``boost::use_default`` as ``iterator_adaptor``\ 's ``Value`` -argument; we could have just passed ``node_iter``\ 's ``Value`` -along to ``iterator_adaptor``, and that'd even be shorter! Most -iterator class templates built with ``iterator_adaptor`` are -parameterized on another iterator type, rather than on its -``value_type``. For example, ``boost::reverse_iterator`` takes an -iterator type argument and reverses its direction of traversal, -since the original iterator and the reversed one have all the same -associated types, ``iterator_adaptor``\ 's delegation of default -types to its ``Base`` saves the implementor of -``boost::reverse_iterator`` from writing: - -.. parsed-literal:: - - std::iterator_traits::*some-associated-type* - -at least four times. - -We urge you to review the documentation and implementations of -|reverse_iterator|_ and the other Boost `specialized iterator -adaptors`__ to get an idea of the sorts of things you can do with -``iterator_adaptor``. In particular, have a look at -|transform_iterator|_, which is perhaps the most straightforward -adaptor, and also |counting_iterator|_, which demonstrates that -``iterator_adaptor``\ 's ``Base`` type needn't be an iterator. - -.. |reverse_iterator| replace:: ``reverse_iterator`` -.. _reverse_iterator: reverse_iterator.html - -.. |counting_iterator| replace:: ``counting_iterator`` -.. _counting_iterator: counting_iterator.html - -.. |transform_iterator| replace:: ``transform_iterator`` -.. _transform_iterator: transform_iterator.html - -__ index.html#specialized-adaptors - diff --git a/doc/iterator_archetypes.html b/doc/iterator_archetypes.html deleted file mode 100755 index 143e9d0..0000000 --- a/doc/iterator_archetypes.html +++ /dev/null @@ -1,220 +0,0 @@ - - - - - - -Iterator Archetype - - - - - - - -
-

Iterator Archetype

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
Organization:Boost Consulting, Indiana University Open Systems -Lab, Zephyr Associates, Inc.
Date:2004-01-27
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004. All rights reserved
- --- - - - -
abstract:The iterator_archetype class constructs a minimal implementation of -one of the iterator access concepts and one of the iterator traversal concepts. -This is used for doing a compile-time check to see if a the type requirements -of a template are really enough to cover the implementation of the template. -For further information see the documentation for the boost::concept_check library.
- -
-

Reference

-
-

iterator_archetype Synopsis

-
-namespace iterator_archetypes
-{
-    // Access categories
-
-    typedef /*implementation  defined*/ readable_iterator_t;
-    typedef /*implementation  defined*/ writable_iterator_t;
-    typedef /*implementation  defined*/ readable_writable_iterator_t;
-    typedef /*implementation  defined*/ readable_lvalue_iterator_t;
-    typedef /*implementation  defined*/ writable_lvalue_iterator_t;
-
-}
-
-template <
-    class Value
-  , class AccessCategory
-  , class TraversalCategory
->
-class iterator_archetype
-{
-    typedef /* see below */ value_type;
-    typedef /* see below */ reference;
-    typedef /* see below */ pointer;
-    typedef /* see below */ difference_type;
-    typedef /* see below */ iterator_category;
-};
-
-
-
-

Access Category Tags

-

The access category types provided correspond to the following -standard iterator access concept combinations:

-
-readable_iterator_t :=
-
-  Readable Iterator
-
-writable_iterator_t :=
-
-  Writeable Iterator
-
-readable_writable_iterator_t :=
-
-  Readable Iterator & Writeable Iterator & Swappable Iterator
-
-readable_lvalue_iterator_t :=
-
-  Readable Iterator & Lvalue Iterator
-
-writeable_lvalue_iterator_t :=
-
-  Readable Iterator & Writeable Iterator & Swappable Iterator & Lvalue Iterator
-
-
-
-

iterator_archetype Requirements

-

The AccessCategory argument must be one of the predefined access -category tags. The TraversalCategory must be one of the standard -traversal tags. The Value type must satisfy the requirements of -the iterator concept specified by AccessCategory and -TraversalCategory as implied by the nested traits types.

-
-
-

iterator_archetype Models

-

iterator_archetype models the iterator concepts specified by the -AccessCategory and TraversalCategory -arguments. iterator_archetype does not model any other access -concepts or any more derived traversal concepts.

-
-
-

Traits

-

The nested trait types are defined as follows:

-
-if (AccessCategory == readable_iterator_t)
-  
-  value_type = Value
-  reference  = Value
-  pointer    = Value*
-
-else if (AccessCategory == writable_iterator_t)
-
-  value_type = void
-  reference  = void
-  pointer    = void
-
-else if (AccessCategory == readable_writable_iterator_t)
-
-  value_type = Value
-
-  reference :=
-
-    A type X that is convertible to Value for which the following
-    expression is valid. Given an object x of type X and v of type 
-    Value.
-
-    x = v
-
-  pointer    = Value*
-
-else if (AccessCategory == readable_lvalue_iterator_t)
-  
-  value_type = Value
-  reference  = Value const&
-  pointer    = Value const*
-
-else if (AccessCategory == writable_lvalue_iterator_t)
-  
-  value_type = Value
-  reference  = Value&
-  pointer    = Value*
-
-if ( TraversalCategory is convertible to forward_traversal_tag )
-
-  difference_type := ptrdiff_t
-
-else
-
-  difference_type := unspecified type
-
-
-iterator_category := 
-
-  A type X satisfying the following two constraints:
-
-     1. X is convertible to X1, and not to any more-derived
-        type, where X1 is defined by:
-
-          if (reference is a reference type
-              && TraversalCategory is convertible to forward_traversal_tag)
-          {
-              if (TraversalCategory is convertible to random_access_traversal_tag)
-                  X1 = random_access_iterator_tag
-              else if (TraversalCategory is convertible to bidirectional_traversal_tag)
-                  X1 = bidirectional_iterator_tag
-              else
-                  X1 = forward_iterator_tag
-          }
-          else
-          {
-              if (TraversalCategory is convertible to single_pass_traversal_tag
-                  && reference != void)
-                  X1 = input_iterator_tag
-              else
-                  X1 = output_iterator_tag
-          }
-
-     2. X is convertible to TraversalCategory
-
-
-
-
- - - - diff --git a/doc/iterator_archetypes.pdf b/doc/iterator_archetypes.pdf deleted file mode 100755 index c00fda4..0000000 Binary files a/doc/iterator_archetypes.pdf and /dev/null differ diff --git a/doc/iterator_archetypes.rst b/doc/iterator_archetypes.rst deleted file mode 100755 index 18d22ff..0000000 --- a/doc/iterator_archetypes.rst +++ /dev/null @@ -1,189 +0,0 @@ -++++++++++++++++++++ - Iterator Archetype -++++++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, `Zephyr Associates, Inc.`_ -:date: $Date$ -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Zephyr Associates, Inc.`: http://www.styleadvisor.com - -:abstract: The ``iterator_archetype`` class constructs a minimal implementation of - one of the iterator access concepts and one of the iterator traversal concepts. - This is used for doing a compile-time check to see if a the type requirements - of a template are really enough to cover the implementation of the template. - For further information see the documentation for the |concepts|_ library. - -.. |concepts| replace:: ``boost::concept_check`` -.. _concepts: ../../concept_check/index.html - - -.. contents:: Table of Contents - -Reference -========= - -``iterator_archetype`` Synopsis -............................... - -:: - - namespace iterator_archetypes - { - // Access categories - - typedef /*implementation defined*/ readable_iterator_t; - typedef /*implementation defined*/ writable_iterator_t; - typedef /*implementation defined*/ readable_writable_iterator_t; - typedef /*implementation defined*/ readable_lvalue_iterator_t; - typedef /*implementation defined*/ writable_lvalue_iterator_t; - - } - - template < - class Value - , class AccessCategory - , class TraversalCategory - > - class iterator_archetype - { - typedef /* see below */ value_type; - typedef /* see below */ reference; - typedef /* see below */ pointer; - typedef /* see below */ difference_type; - typedef /* see below */ iterator_category; - }; - -``Access Category Tags`` -........................ - -The access category types provided correspond to the following -standard iterator access concept combinations: - -:: - - readable_iterator_t := - - Readable Iterator - - writable_iterator_t := - - Writeable Iterator - - readable_writable_iterator_t := - - Readable Iterator & Writeable Iterator & Swappable Iterator - - readable_lvalue_iterator_t := - - Readable Iterator & Lvalue Iterator - - writeable_lvalue_iterator_t := - - Readable Iterator & Writeable Iterator & Swappable Iterator & Lvalue Iterator - -``iterator_archetype`` Requirements -................................... - -The ``AccessCategory`` argument must be one of the predefined access -category tags. The ``TraversalCategory`` must be one of the standard -traversal tags. The ``Value`` type must satisfy the requirements of -the iterator concept specified by ``AccessCategory`` and -``TraversalCategory`` as implied by the nested traits types. - -``iterator_archetype`` Models -............................. - -``iterator_archetype`` models the iterator concepts specified by the -``AccessCategory`` and ``TraversalCategory`` -arguments. ``iterator_archetype`` does not model any other access -concepts or any more derived traversal concepts. - -``Traits`` -.......... - -The nested trait types are defined as follows: - -:: - - if (AccessCategory == readable_iterator_t) - - value_type = Value - reference = Value - pointer = Value* - - else if (AccessCategory == writable_iterator_t) - - value_type = void - reference = void - pointer = void - - else if (AccessCategory == readable_writable_iterator_t) - - value_type = Value - - reference := - - A type X that is convertible to Value for which the following - expression is valid. Given an object x of type X and v of type - Value. - - x = v - - pointer = Value* - - else if (AccessCategory == readable_lvalue_iterator_t) - - value_type = Value - reference = Value const& - pointer = Value const* - - else if (AccessCategory == writable_lvalue_iterator_t) - - value_type = Value - reference = Value& - pointer = Value* - - if ( TraversalCategory is convertible to forward_traversal_tag ) - - difference_type := ptrdiff_t - - else - - difference_type := unspecified type - - - iterator_category := - - A type X satisfying the following two constraints: - - 1. X is convertible to X1, and not to any more-derived - type, where X1 is defined by: - - if (reference is a reference type - && TraversalCategory is convertible to forward_traversal_tag) - { - if (TraversalCategory is convertible to random_access_traversal_tag) - X1 = random_access_iterator_tag - else if (TraversalCategory is convertible to bidirectional_traversal_tag) - X1 = bidirectional_iterator_tag - else - X1 = forward_iterator_tag - } - else - { - if (TraversalCategory is convertible to single_pass_traversal_tag - && reference != void) - X1 = input_iterator_tag - else - X1 = output_iterator_tag - } - - 2. X is convertible to TraversalCategory - - diff --git a/doc/iterator_concepts.html b/doc/iterator_concepts.html deleted file mode 100644 index 7962ff0..0000000 --- a/doc/iterator_concepts.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - -Iterator Concepts - - - - - - - -
-

Iterator Concepts

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
Organization:Boost Consulting, Indiana University Open Systems -Lab, Zephyr Associates, Inc.
Date:2004-01-27
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004. All rights reserved
- --- - - - -
abstract:The iterator concept checking classes provide a mechanism for -a template to report better error messages when a user instantiates -the template with a type that does not meet the requirements of -the template.
-

For an introduction to using concept checking classes, see -the documentation for the boost::concept_check library.

-
-

Reference

- - -
-

iterator_concepts.hpp Synopsis

-
-namespace boost_concepts {
-
-    // Iterator Access Concepts
-
-    template <typename Iterator>
-    class ReadableIteratorConcept;
-
-    template <
-        typename Iterator
-      , typename ValueType = std::iterator_traits<Iterator>::value_type
-    >
-    class WritableIteratorConcept;
-
-    template <typename Iterator>
-    class SwappableIteratorConcept;
-
-    template <typename Iterator>
-    class LvalueIteratorConcept;
-
-    // Iterator Traversal Concepts
-
-    template <typename Iterator>
-    class IncrementableIteratorConcept;
-
-    template <typename Iterator>
-    class SinglePassIteratorConcept;
-
-    template <typename Iterator>
-    class ForwardTraversalConcept;
-
-    template <typename Iterator>
-    class BidirectionalTraversalConcept;
-
-    template <typename Iterator>
-    class RandomAccessTraversalConcept;
-
-    // Interoperability
-
-    template <typename Iterator, typename ConstIterator>
-    class InteroperableIteratorConcept;
-
-}
-
-
-
-
- - - - diff --git a/doc/iterator_concepts.pdf b/doc/iterator_concepts.pdf deleted file mode 100755 index ba9b983..0000000 Binary files a/doc/iterator_concepts.pdf and /dev/null differ diff --git a/doc/iterator_concepts.rst b/doc/iterator_concepts.rst deleted file mode 100755 index 0904ef3..0000000 --- a/doc/iterator_concepts.rst +++ /dev/null @@ -1,128 +0,0 @@ - - -++++++++++++++++++ - Iterator Concepts -++++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, `Zephyr Associates, Inc.`_ -:date: $Date$ -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Zephyr Associates, Inc.`: http://www.styleadvisor.com - -:abstract: The iterator concept checking classes provide a mechanism for - a template to report better error messages when a user instantiates - the template with a type that does not meet the requirements of - the template. - - -For an introduction to using concept checking classes, see -the documentation for the |concepts|_ library. - -.. |concepts| replace:: ``boost::concept_check`` -.. _concepts: ../../concept_check/index.html - - -Reference -========= - -Iterator Access Concepts -........................ - -* |Readable|_ -* |Writable|_ -* |Swappable|_ -* |Lvalue|_ - -.. |Readable| replace:: *Readable Iterator* -.. _Readable: ReadableIterator.html - -.. |Writable| replace:: *Writable Iterator* -.. _Writable: WritableIterator.html - -.. |Swappable| replace:: *Swappable Iterator* -.. _Swappable: SwappableIterator.html - -.. |Lvalue| replace:: *Lvalue Iterator* -.. _Lvalue: LvalueIterator.html - - -Iterator Traversal Concepts -........................... - -* |Incrementable|_ -* |SinglePass|_ -* |Forward|_ -* |Bidir|_ -* |Random|_ - - -.. |Incrementable| replace:: *Incrementable Iterator* -.. _Incrementable: IncrementableIterator.html - -.. |SinglePass| replace:: *Single Pass Iterator* -.. _SinglePass: SinglePassIterator.html - -.. |Forward| replace:: *Forward Traversal* -.. _Forward: ForwardTraversal.html - -.. |Bidir| replace:: *Bidirectional Traversal* -.. _Bidir: BidirectionalTraversal.html - -.. |Random| replace:: *Random Access Traversal* -.. _Random: RandomAccessTraversal.html - - - -``iterator_concepts.hpp`` Synopsis -.................................. - -:: - - namespace boost_concepts { - - // Iterator Access Concepts - - template - class ReadableIteratorConcept; - - template < - typename Iterator - , typename ValueType = std::iterator_traits::value_type - > - class WritableIteratorConcept; - - template - class SwappableIteratorConcept; - - template - class LvalueIteratorConcept; - - // Iterator Traversal Concepts - - template - class IncrementableIteratorConcept; - - template - class SinglePassIteratorConcept; - - template - class ForwardTraversalConcept; - - template - class BidirectionalTraversalConcept; - - template - class RandomAccessTraversalConcept; - - // Interoperability - - template - class InteroperableIteratorConcept; - - } diff --git a/doc/iterator_facade.html b/doc/iterator_facade.html deleted file mode 100644 index 207485b..0000000 --- a/doc/iterator_facade.html +++ /dev/null @@ -1,1321 +0,0 @@ - - - - - - -Iterator Facade - - - - - - - -

Iterator Facade

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization:Boost Consulting, Indiana University Open Systems -Lab, University of Hanover Institute for Transport -Railway Operation and Construction
Date:2004-01-12
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved
-
- --- - - - -
abstract:iterator_facade is a base class template that implements the -interface of standard iterators in terms of a few core functions -and associated types, to be supplied by a derived iterator class.
- -
-

Overview

- - -

While the iterator interface is rich, there is a core subset of the -interface that is necessary for all the functionality. We have -identified the following core behaviors for iterators:

-
    -
  • dereferencing
  • -
  • incrementing
  • -
  • decrementing
  • -
  • equality comparison
  • -
  • random-access motion
  • -
  • distance measurement
  • -
-

In addition to the behaviors listed above, the core interface elements -include the associated types exposed through iterator traits: -value_type, reference, difference_type, and -iterator_category.

-

Iterator facade uses the Curiously Recurring Template -Pattern (CRTP) [Cop95] so that the user can specify the behavior -of iterator_facade in a derived class. Former designs used -policy objects to specify the behavior, but that approach was -discarded for several reasons:

-
-
    -
  1. the creation and eventual copying of the policy object may create -overhead that can be avoided with the current approach.
  2. -
  3. The policy object approach does not allow for custom constructors -on the created iterator types, an essential feature if -iterator_facade should be used in other library -implementations.
  4. -
  5. Without the use of CRTP, the standard requirement that an -iterator's operator++ returns the iterator type itself -would mean that all iterators built with the library would -have to be specializations of iterator_facade<...>, rather -than something more descriptive like -indirect_iterator<T*>. Cumbersome type generator -metafunctions would be needed to build new parameterized -iterators, and a separate iterator_adaptor layer would be -impossible.
  6. -
-
-
-

Usage

-

The user of iterator_facade derives his iterator class from a -specialization of iterator_facade and passes the derived -iterator class as iterator_facade's first template parameter. -The order of the other template parameters have been carefully -chosen to take advantage of useful defaults. For example, when -defining a constant lvalue iterator, the user can pass a -const-qualified version of the iterator's value_type as -iterator_facade's Value parameter and omit the -Reference parameter which follows.

-

The derived iterator class must define member functions implementing -the iterator's core behaviors. The following table describes -expressions which are required to be valid depending on the category -of the derived iterator type. These member functions are described -briefly below and in more detail in the iterator facade -requirements.

-
- ---- - - - - - - - - - - - - - - - - - - - - - - - - - -
ExpressionEffects
i.dereference()Access the value referred to
i.equal(j)Compare for equality with j
i.increment()Advance by one position
i.decrement()Retreat by one position
i.advance(n)Advance by n positions
i.distance_to(j)Measure the distance to j
-
- -

In addition to implementing the core interface functions, an iterator -derived from iterator_facade typically defines several -constructors. To model any of the standard iterator concepts, the -iterator must at least have a copy constructor. Also, if the iterator -type X is meant to be automatically interoperate with another -iterator type Y (as with constant and mutable iterators) then -there must be an implicit conversion from X to Y or from Y -to X (but not both), typically implemented as a conversion -constructor. Finally, if the iterator is to model Forward Traversal -Iterator or a more-refined iterator concept, a default constructor is -required.

-
-
-

Iterator Core Access

-

iterator_facade and the operator implementations need to be able -to access the core member functions in the derived class. Making the -core member functions public would expose an implementation detail to -the user. The design used here ensures that implementation details do -not appear in the public interface of the derived iterator type.

-

Preventing direct access to the core member functions has two -advantages. First, there is no possibility for the user to accidently -use a member function of the iterator when a member of the value_type -was intended. This has been an issue with smart pointer -implementations in the past. The second and main advantage is that -library implementers can freely exchange a hand-rolled iterator -implementation for one based on iterator_facade without fear of -breaking code that was accessing the public core member functions -directly.

-

In a naive implementation, keeping the derived class' core member -functions private would require it to grant friendship to -iterator_facade and each of the seven operators. In order to -reduce the burden of limiting access, iterator_core_access is -provided, a class that acts as a gateway to the core member functions -in the derived iterator class. The author of the derived class only -needs to grant friendship to iterator_core_access to make his core -member functions available to the library.

- - -

iterator_core_access will be typically implemented as an empty -class containing only private static member functions which invoke the -iterator core member functions. There is, however, no need to -standardize the gateway protocol. Note that even if -iterator_core_access used public member functions it would not -open a safety loophole, as every core member function preserves the -invariants of the iterator.

-
-
-

operator[]

-

The indexing operator for a generalized iterator presents special -challenges. A random access iterator's operator[] is only -required to return something convertible to its value_type. -Requiring that it return an lvalue would rule out currently-legal -random-access iterators which hold the referenced value in a data -member (e.g. counting_iterator), because *(p+n) is a reference -into the temporary iterator p+n, which is destroyed when -operator[] returns.

-

Writable iterators built with iterator_facade implement the -semantics required by the preferred resolution to issue 299 and -adopted by proposal n1550: the result of p[n] is an object -convertible to the iterator's value_type, and p[n] = x is -equivalent to *(p + n) = x (Note: This result object may be -implemented as a proxy containing a copy of p+n). This approach -will work properly for any random-access iterator regardless of the -other details of its implementation. A user who knows more about -the implementation of her iterator is free to implement an -operator[] that returns an lvalue in the derived iterator -class; it will hide the one supplied by iterator_facade from -clients of her iterator.

-
-
-

operator->

-

The reference type of a readable iterator (and today's input -iterator) need not in fact be a reference, so long as it is -convertible to the iterator's value_type. When the value_type -is a class, however, it must still be possible to access members -through operator->. Therefore, an iterator whose reference -type is not in fact a reference must return a proxy containing a copy -of the referenced value from its operator->.

-

The return types for iterator_facade's operator-> and -operator[] are not explicitly specified. Instead, those types -are described in terms of a set of requirements, which must be -satisfied by the iterator_facade implementation.

- - - - - -
[Cop95](1, 2) [Coplien, 1995] Coplien, J., Curiously Recurring Template -Patterns, C++ Report, February 1995, pp. 24-27.
-
-
-
-

Reference

- - -
-template <
-    class Derived
-  , class Value
-  , class CategoryOrTraversal
-  , class Reference  = Value&
-  , class Difference = ptrdiff_t
->
-class iterator_facade {
- public:
-    typedef remove_const<Value>::type value_type;
-    typedef Reference reference;
-    typedef Value* pointer;
-    typedef Difference difference_type;
-    typedef /* see below */ iterator_category;
-
-    reference operator*() const;
-    /* see below */ operator->() const;
-    /* see below */ operator[](difference_type n) const;
-    Derived& operator++();
-    Derived operator++(int);
-    Derived& operator--();
-    Derived operator--(int);
-    Derived& operator+=(difference_type n);
-    Derived& operator-=(difference_type n);
-    Derived operator-(difference_type n) const;
- protected:
-    typedef iterator_facade iterator_facade_;
-};
-
-// Comparison operators
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type // exposition
-operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-// Iterator difference
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-/* see below */
-operator-(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-          iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-// Iterator addition
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (iterator_facade<Dr,V,TC,R,D> const&,
-                   typename Derived::difference_type n);
-
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (typename Derived::difference_type n,
-                   iterator_facade<Dr,V,TC,R,D> const&);
-
-

The iterator_category member of iterator_facade is

-
-iterator-category(CategoryOrTraversal, value_type, reference)
-
-

where iterator-category is defined as follows:

-
-iterator-category(C,R,V) :=
-   if (C is convertible to std::input_iterator_tag
-       || C is convertible to std::output_iterator_tag
-   )
-       return C
-
-   else if (C is not convertible to incrementable_traversal_tag)
-       the program is ill-formed
-
-   else return a type X satisfying the following two constraints:
-
-      1. X is convertible to X1, and not to any more-derived
-         type, where X1 is defined by:
-
-           if (R is a reference type
-               && C is convertible to forward_traversal_tag)
-           {
-               if (C is convertible to random_access_traversal_tag)
-                   X1 = random_access_iterator_tag
-               else if (C is convertible to bidirectional_traversal_tag)
-                   X1 = bidirectional_iterator_tag
-               else
-                   X1 = forward_iterator_tag
-           }
-           else
-           {
-               if (C is convertible to single_pass_traversal_tag
-                   && R is convertible to V)
-                   X1 = input_iterator_tag
-               else
-                   X1 = C
-           }
-
-      2. category-to-traversal(X) is convertible to the most
-         derived traversal tag type to which X is also
-         convertible, and not to any more-derived traversal tag
-         type.
-
-

[Note: the intention is to allow iterator_category to be one of -the five original category tags when convertibility to one of the -traversal tags would add no information]

- - - -

The enable_if_interoperable template used above is for exposition -purposes. The member operators should only be in an overload set -provided the derived types Dr1 and Dr2 are interoperable, -meaning that at least one of the types is convertible to the other. The -enable_if_interoperable approach uses SFINAE to take the operators -out of the overload set when the types are not interoperable. -The operators should behave as-if enable_if_interoperable -were defined to be:

-
-template <bool, typename> enable_if_interoperable_impl
-{};
-
-template <typename T> enable_if_interoperable_impl<true,T>
-{ typedef T type; };
-
-template<typename Dr1, typename Dr2, typename T>
-struct enable_if_interoperable
-  : enable_if_interoperable_impl<
-        is_convertible<Dr1,Dr2>::value || is_convertible<Dr2,Dr1>::value
-      , T
-    >
-{};
-
-
-

iterator_facade Requirements

-

The following table describes the typical valid expressions on -iterator_facade's Derived parameter, depending on the -iterator concept(s) it will model. The operations in the first -column must be made accessible to member functions of class -iterator_core_access. In addition, -static_cast<Derived*>(iterator_facade*) shall be well-formed.

-

In the table below, F is iterator_facade<X,V,C,R,D>, a is an -object of type X, b and c are objects of type const X, -n is an object of F::difference_type, y is a constant -object of a single pass iterator type interoperable with X, and z -is a constant object of a random access traversal iterator type -interoperable with X.

-
-

iterator_facade Core Operations

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ExpressionReturn TypeAssertion/NoteUsed to implement Iterator -Concept(s)
c.dereference()F::reference Readable Iterator, Writable -Iterator
c.equal(y)convertible to booltrue iff c and y -refer to the same -position.Single Pass Iterator
a.increment()unused Incrementable Iterator
a.decrement()unused Bidirectional Traversal -Iterator
a.advance(n)unused Random Access Traversal -Iterator
c.distance_to(z)convertible to -F::difference_typeequivalent to -distance(c, X(z)).Random Access Traversal -Iterator
-
-
-
-

iterator_facade operations

-

The operations in this section are described in terms of operations on -the core interface of Derived which may be inaccessible -(i.e. private). The implementation should access these operations -through member functions of class iterator_core_access.

-

reference operator*() const;

- --- - - - -
Returns:static_cast<Derived const*>(this)->dereference()
-

operator->() const; (see below)

- --- - - - -
Returns:

If reference is a reference type, an object -of type pointer equal to:

-
-&static_cast<Derived const*>(this)->dereference()
-
-

Otherwise returns an object of unspecified type such that, -(*static_cast<Derived const*>(this))->m is equivalent to (w = **static_cast<Derived const*>(this), -w.m) for some temporary object w of type value_type.

-
-

unspecified operator[](difference_type n) const;

- --- - - - -
Returns:an object convertible to value_type. For constant -objects v of type value_type, and n of type -difference_type, (*this)[n] = v is equivalent to -*(*this + n) = v, and static_cast<value_type -const&>((*this)[n]) is equivalent to -static_cast<value_type const&>(*(*this + n))
-

Derived& operator++();

- --- - - - -
Effects:
-static_cast<Derived*>(this)->increment();
-return *static_cast<Derived*>(this);
-
-
-

Derived operator++(int);

- --- - - - -
Effects:
-Derived tmp(static_cast<Derived const*>(this));
-++*this;
-return tmp;
-
-
-

Derived& operator--();

- --- - - - -
Effects:
-static_cast<Derived*>(this)->decrement();
-return *static_cast<Derived*>(this);
-
-
-

Derived operator--(int);

- --- - - - -
Effects:
-Derived tmp(static_cast<Derived const*>(this));
---*this;
-return tmp;
-
-
-

Derived& operator+=(difference_type n);

- --- - - - -
Effects:
-static_cast<Derived*>(this)->advance(n);
-return *static_cast<Derived*>(this);
-
-
-

Derived& operator-=(difference_type n);

- --- - - - -
Effects:
-static_cast<Derived*>(this)->advance(-n);
-return *static_cast<Derived*>(this);
-
-
-

Derived operator-(difference_type n) const;

- --- - - - -
Effects:
-Derived tmp(static_cast<Derived const*>(this));
-return tmp -= n;
-
-
-
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (iterator_facade<Dr,V,TC,R,D> const&,
-                   typename Derived::difference_type n);
-
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (typename Derived::difference_type n,
-                   iterator_facade<Dr,V,TC,R,D> const&);
-
- --- - - - -
Effects:
-Derived tmp(static_cast<Derived const*>(this));
-return tmp += n;
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-
((Dr1 const&)lhs).equal((Dr2 const&)rhs).
-
Otherwise,
-
((Dr2 const&)rhs).equal((Dr1 const&)lhs).
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-
!((Dr1 const&)lhs).equal((Dr2 const&)rhs).
-
Otherwise,
-
!((Dr2 const&)rhs).equal((Dr1 const&)lhs).
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-
((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) < 0.
-
Otherwise,
-
((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) > 0.
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-
((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) <= 0.
-
Otherwise,
-
((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) >= 0.
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-
((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) > 0.
-
Otherwise,
-
((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) < 0.
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-
((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) >= 0.
-
Otherwise,
-
((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) <= 0.
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,difference>::type
-operator -(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - - - -
Return Type:

if is_convertible<Dr2,Dr1>::value

-
-
-
then
-
difference shall be -iterator_traits<Dr1>::difference_type.
-
Otherwise
-
difference shall be iterator_traits<Dr2>::difference_type
-
-
-
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-
-((Dr1 const&)lhs).distance_to((Dr2 const&)rhs).
-
Otherwise,
-
((Dr2 const&)rhs).distance_to((Dr1 const&)lhs).
-
-
-
-
-
-

Tutorial Example

- - - -

In this section we'll walk through the implementation of a few -iterators using iterator_facade, based around the simple -example of a linked list of polymorphic objects. This example was -inspired by a posting by Keith Macdonald on the Boost-Users -mailing list.

-
-

The Problem

-

Say we've written a polymorphic linked list node base class:

-
-# include <iostream>
-
-struct node_base
-{
-    node_base() : m_next(0) {}
-
-    // Each node manages all of its tail nodes
-    virtual ~node_base() { delete m_next; }
-
-    // Access the rest of the list
-    node_base* next() const { return m_next; }
-
-    // print to the stream
-    virtual void print(std::ostream& s) const = 0;
-    
-    // double the value
-    virtual void double_me() = 0;
-
-    void append(node_base* p)
-    {
-        if (m_next) 
-            m_next->append(p); 
-        else
-            m_next = p; 
-    }
-
- private:
-    node_base* m_next;
-};
-
-

Lists can hold objects of different types by linking together -specializations of the following template:

-
-template <class T>
-struct node : node_base
-{
-    node(T x)
-      : m_value(x)
-    {}
-
-    void print(std::ostream& s) const { s << this->m_value; }
-    void double_me() { m_value += m_value; }
-
- private:
-    T m_value;
-};
-
-

And we can print any node using the following streaming operator:

-
-inline std::ostream& operator<<(std::ostream& s, node_base const& n)
-{
-    n.print(s);
-    return s;
-}
-
-

Our first challenge is to build an appropriate iterator over these -lists.

-
-
-

A Basic Iterator Using iterator_facade

-

We will construct a node_iterator class using inheritance from -iterator_facade to implement most of the iterator's operations.

-
-# include "node.hpp"
-# include <boost/iterator/iterator_facade.hpp>
-
-class node_iterator
-  : public boost::iterator_facade<...>
-{
-   ...
-};
-
-
-

Template Arguments for iterator_facade

-

iterator_facade has several template parameters, so we must decide -what types to use for the arguments. The parameters are Derived, -Value, CategoryOrTraversal, Reference, and Difference.

-
-

Derived

-

Because iterator_facade is meant to be used with the CRTP -[Cop95] the first parameter is the iterator class name itself, -node_iterator.

-
-
-

Value

-

The Value parameter determines the node_iterator's -value_type. In this case, we are iterating over node_base -objects, so Value will be node_base.

-
-
-

CategoryOrTraversal

-

Now we have to determine which iterator traversal concept our -node_iterator is going to model. Singly-linked lists only have -forward links, so our iterator can't can't be a bidirectional -traversal iterator. Our iterator should be able to make multiple -passes over the same linked list (unlike, say, an -istream_iterator which consumes the stream it traverses), so it -must be a forward traversal iterator. Therefore, we'll pass -boost::forward_traversal_tag in this position 1.

- - - - - -
[1]iterator_facade also supports old-style category -tags, so we could have passed std::forward_iterator_tag here; -either way, the resulting iterator's iterator_category will -end up being std::forward_iterator_tag.
-
-
-

Reference

-

The Reference argument becomes the type returned by -node_iterator's dereference operation, and will also be the -same as std::iterator_traits<node_iterator>::reference. The -library's default for this parameter is Value&; since -node_base& is a good choice for the iterator's reference -type, we can omit this argument, or pass use_default.

-
-
-

Difference

-

The Difference argument determines how the distance between -two node_iterators will be measured and will also be the -same as std::iterator_traits<node_iterator>::difference_type. -The library's default for Difference is std::ptrdiff_t, an -appropriate type for measuring the distance between any two -addresses in memory, and one that works for almost any iterator, -so we can omit this argument, too.

-

The declaration of node_iterator will therefore look something -like:

-
-# include "node.hpp"
-# include <boost/iterator/iterator_facade.hpp>
-
-class node_iterator
-  : public boost::iterator_facade<
-        node_iterator
-      , node_base
-      , boost::forward_traversal_tag
-    >
-{
-   ...
-};
-
-
-
-
-

Constructors and Data Members

-

Next we need to decide how to represent the iterator's position. -This representation will take the form of data members, so we'll -also need to write constructors to initialize them. The -node_iterator's position is quite naturally represented using -a pointer to a node_base. We'll need a constructor to build an -iterator from a node_base*, and a default constructor to -satisfy the forward traversal iterator requirements 2. -Our node_iterator then becomes:

-
-# include "node.hpp"
-# include <boost/iterator/iterator_facade.hpp>
-
-class node_iterator
-  : public boost::iterator_facade<
-        node_iterator
-      , node_base
-      , boost::forward_traversal_tag
-    >
-{
- public:
-    node_iterator()
-      : m_node(0)
-    {}
-
-    explicit node_iterator(node_base* p)
-      : m_node(p)
-    {}
-
- private:
-    ...
-    node_base* m_node;
-};
-
- - - - - -
[2]Technically, the C++ standard places almost no -requirements on a default-constructed iterator, so if we were -really concerned with efficiency, we could've written the -default constructor to leave m_node uninitialized.
-
-
-

Implementing the Core Operations

-

The last step is to implement the core operations required by -the concepts we want our iterator to model. Referring to the -table, we can see that the first three rows are applicable -because node_iterator needs to satisfy the requirements for -readable iterator, single pass iterator, and incrementable -iterator.

-

We therefore need to supply dereference, -equal, and increment members. We don't want these members -to become part of node_iterator's public interface, so we can -make them private and grant friendship to -boost::iterator_core_access, a "back-door" that -iterator_facade uses to get access to the core operations:

-
-# include "node.hpp"
-# include <boost/iterator/iterator_facade.hpp>
-
-class node_iterator
-  : public boost::iterator_facade<
-        node_iterator
-      , node_base
-      , boost::forward_traversal_tag
-    >
-{
- public:
-    node_iterator()
-      : m_node(0) {}
-
-    explicit node_iterator(node_base* p)
-      : m_node(p) {}
-
- private:
-    friend class boost::iterator_core_access;
-
-    void increment() { m_node = m_node->next(); }
-
-    bool equal(node_iterator const& other) const
-    {
-        return this->m_node == other.m_node;
-    }
-
-    node_base& dereference() const { return *m_node; }
-
-    node_base* m_node;
-};
-
-

Voilà; a complete and conforming readable, forward-traversal -iterator! For a working example of its use, see this program.

-
-
-
-

A constant node_iterator

- -

Now, our node_iterator gives clients access to both node's print(std::ostream&) const member function, but also its -mutating double_me() member. If we wanted to build a -constant node_iterator, we'd only have to make three -changes:

-
-class const_node_iterator
-  : public boost::iterator_facade<
-        node_iterator
-      , node_base const
-      , boost::forward_traversal_tag
-    >
-{
- public:
-    const_node_iterator()
-      : m_node(0) {}
-
-    explicit const_node_iterator(node_base* p)
-      : m_node(p) {}
-
- private:
-    friend class boost::iterator_core_access;
-
-    void increment() { m_node = m_node->next(); }
-
-    bool equal(const_node_iterator const& other) const
-    {
-        return this->m_node == other.m_node;
-    }
-
-    node_base const& dereference() const { return *m_node; }
-
-    node_base const* m_node;
-};
-
- -

As a matter of fact, node_iterator and const_node_iterator -are so similar that it makes sense to factor the common code out -into a template as follows:

-
-template <class Value>
-class node_iter
-  : public boost::iterator_facade<
-        node_iter<Value>
-      , Value
-      , boost::forward_traversal_tag
-    >
-{
- public:
-    node_iter()
-      : m_node(0) {}
-
-    explicit node_iter(Value* p)
-      : m_node(p) {}
-
- private:
-    friend class boost::iterator_core_access;
-
-    bool equal(node_iter<Value> const& other) const
-    {
-        return this->m_node == other.m_node;
-    }
-
-    void increment()
-    { m_node = m_node->next(); }
-
-    Value& dereference() const
-    { return *m_node; }
-
-    Value* m_node;
-};
-typedef node_iter<node_base> node_iterator;
-typedef node_iter<node_base const> node_const_iterator;
-
-
-
-

Interoperability

-

Our const_node_iterator works perfectly well on its own, but -taken together with node_iterator it doesn't quite meet -expectations. For example, we'd like to be able to pass a -node_iterator where a node_const_iterator was expected, -just as you can with std::list<int>'s iterator and -const_iterator. Furthermore, given a node_iterator and a -node_const_iterator into the same list, we should be able to -compare them for equality.

-

This expected ability to use two different iterator types together -is known as interoperability. Achieving interoperability in -our case is as simple as templatizing the equal function and -adding a templatized converting constructor 3 4:

-
-template <class Value>
-class node_iter
-  : public boost::iterator_facade<
-        node_iter<Value>
-      , Value
-      , boost::forward_traversal_tag
-    >
-{
- public:
-    node_iter()
-      : m_node(0) {}
-
-    explicit node_iter(Value* p)
-      : m_node(p) {}
-
-    template <class OtherValue>
-    node_iter(node_iter<OtherValue> const& other)
-      : m_node(other.m_node) {}
-
- private:
-    friend class boost::iterator_core_access;
-    template <class> friend class node_iter;
-
-    template <class OtherValue>
-    bool equal(node_iter<OtherValue> const& other) const
-    { 
-        return this->m_node == other.m_node;
-    }
-
-    void increment()
-    { m_node = m_node->next(); }
-
-    Value& dereference() const
-    { return *m_node; }
-
-    Value* m_node;
-};
-typedef impl::node_iterator<node_base> node_iterator;
-typedef impl::node_iterator<node_base const> node_const_iterator;
-
- - - - - -
[3]If you're using an older compiler and it can't handle -this example, see the example code for workarounds.
- - - - - -
[4]If node_iterator had been a random access -traversal iterator, we'd have had to templatize its -distance_to function as well.
-

You can see an example program which exercises our interoperable -iterators here.

-
-
-

Telling the Truth

-

Now node_iterator and node_const_iterator behave exactly as -you'd expect... almost. We can compare them and we can convert in -one direction: from node_iterator to node_const_iterator. -If we try to convert from node_const_iterator to -node_iterator, we'll get an error when the converting -constructor tries to initialize node_iterator's m_node, a -node* with a node const*. So what's the problem?

-

The problem is that -boost::is_convertible<node_const_iterator,node_iterator>::value -will be true, but it should be false. is_convertible -lies because it can only see as far as the declaration of -node_iter's converting constructor, but can't look inside at -the definition to make sure it will compile. A perfect solution -would make node_iter's converting constructor disappear when -the m_node conversion would fail.

-

In fact, that sort of magic is possible using -boost::enable_if. By rewriting the converting constructor as -follows, we can remove it from the overload set when it's not -appropriate:

-
-#include <boost/type_traits/is_convertible.hpp>
-#include <boost/utility/enable_if.hpp>
-
-  ...
-
-private: 
-  struct enabler {};
-
-public:
-  template <class OtherValue>
-  node_iter(
-      node_iter<OtherValue> const& other
-    , typename boost::enable_if<
-          boost::is_convertible<OtherValue*,Value*>
-        , enabler
-      >::type = enabler()
-  )
-    : m_node(other.m_node) {}
-
-
-
-

Wrap Up

-

This concludes our iterator_facade tutorial, but before you -stop reading we urge you to take a look at iterator_adaptor. -There's another way to approach writing these iterators which might -even be superior.

-
-
-
- - - - diff --git a/doc/iterator_facade.pdf b/doc/iterator_facade.pdf deleted file mode 100755 index 048f3d3..0000000 Binary files a/doc/iterator_facade.pdf and /dev/null differ diff --git a/doc/iterator_facade.rst b/doc/iterator_facade.rst deleted file mode 100644 index 41a775f..0000000 --- a/doc/iterator_facade.rst +++ /dev/null @@ -1,40 +0,0 @@ -++++++++++++++++ - Iterator Facade -++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, University of Hanover `Institute for Transport - Railway Operation and Construction`_ -:date: $Date$ -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de - -:abstract: - - .. include:: iterator_facade_abstract.rst - -.. contents:: Table of Contents - -Overview -======== - -.. include:: iterator_facade_body.rst - - -Reference -========= - -.. include:: iterator_facade_ref.rst - -.. _counting: counting_iterator.html - -Tutorial Example -================ - -.. include:: iterator_facade_tutorial.rst - diff --git a/doc/iterator_facade_abstract.rst b/doc/iterator_facade_abstract.rst deleted file mode 100644 index f024b9b..0000000 --- a/doc/iterator_facade_abstract.rst +++ /dev/null @@ -1,4 +0,0 @@ -``iterator_facade`` is a base class template that implements the -interface of standard iterators in terms of a few core functions -and associated types, to be supplied by a derived iterator class. - diff --git a/doc/iterator_facade_body.rst b/doc/iterator_facade_body.rst deleted file mode 100644 index 82f57a1..0000000 --- a/doc/iterator_facade_body.rst +++ /dev/null @@ -1,192 +0,0 @@ -.. Version 1.1 of this ReStructuredText document corresponds to - n1530_, the paper accepted by the LWG for TR1. - -.. Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All - rights reserved - - -While the iterator interface is rich, there is a core subset of the -interface that is necessary for all the functionality. We have -identified the following core behaviors for iterators: - -* dereferencing -* incrementing -* decrementing -* equality comparison -* random-access motion -* distance measurement - -In addition to the behaviors listed above, the core interface elements -include the associated types exposed through iterator traits: -``value_type``, ``reference``, ``difference_type``, and -``iterator_category``. - -Iterator facade uses the Curiously Recurring Template -Pattern (CRTP) [Cop95]_ so that the user can specify the behavior -of ``iterator_facade`` in a derived class. Former designs used -policy objects to specify the behavior, but that approach was -discarded for several reasons: - - 1. the creation and eventual copying of the policy object may create - overhead that can be avoided with the current approach. - - 2. The policy object approach does not allow for custom constructors - on the created iterator types, an essential feature if - ``iterator_facade`` should be used in other library - implementations. - - 3. Without the use of CRTP, the standard requirement that an - iterator's ``operator++`` returns the iterator type itself - would mean that all iterators built with the library would - have to be specializations of ``iterator_facade<...>``, rather - than something more descriptive like - ``indirect_iterator``. Cumbersome type generator - metafunctions would be needed to build new parameterized - iterators, and a separate ``iterator_adaptor`` layer would be - impossible. - -Usage ------ - -The user of ``iterator_facade`` derives his iterator class from a -specialization of ``iterator_facade`` and passes the derived -iterator class as ``iterator_facade``\ 's first template parameter. -The order of the other template parameters have been carefully -chosen to take advantage of useful defaults. For example, when -defining a constant lvalue iterator, the user can pass a -const-qualified version of the iterator's ``value_type`` as -``iterator_facade``\ 's ``Value`` parameter and omit the -``Reference`` parameter which follows. - -The derived iterator class must define member functions implementing -the iterator's core behaviors. The following table describes -expressions which are required to be valid depending on the category -of the derived iterator type. These member functions are described -briefly below and in more detail in the iterator facade -requirements. - - +------------------------+-------------------------------+ - |Expression |Effects | - +========================+===============================+ - |``i.dereference()`` |Access the value referred to | - +------------------------+-------------------------------+ - |``i.equal(j)`` |Compare for equality with ``j``| - +------------------------+-------------------------------+ - |``i.increment()`` |Advance by one position | - +------------------------+-------------------------------+ - |``i.decrement()`` |Retreat by one position | - +------------------------+-------------------------------+ - |``i.advance(n)`` |Advance by ``n`` positions | - +------------------------+-------------------------------+ - |``i.distance_to(j)`` |Measure the distance to ``j`` | - +------------------------+-------------------------------+ - -.. Should we add a comment that a zero overhead implementation of iterator_facade - is possible with proper inlining? - -In addition to implementing the core interface functions, an iterator -derived from ``iterator_facade`` typically defines several -constructors. To model any of the standard iterator concepts, the -iterator must at least have a copy constructor. Also, if the iterator -type ``X`` is meant to be automatically interoperate with another -iterator type ``Y`` (as with constant and mutable iterators) then -there must be an implicit conversion from ``X`` to ``Y`` or from ``Y`` -to ``X`` (but not both), typically implemented as a conversion -constructor. Finally, if the iterator is to model Forward Traversal -Iterator or a more-refined iterator concept, a default constructor is -required. - - - -Iterator Core Access --------------------- - -``iterator_facade`` and the operator implementations need to be able -to access the core member functions in the derived class. Making the -core member functions public would expose an implementation detail to -the user. The design used here ensures that implementation details do -not appear in the public interface of the derived iterator type. - -Preventing direct access to the core member functions has two -advantages. First, there is no possibility for the user to accidently -use a member function of the iterator when a member of the value_type -was intended. This has been an issue with smart pointer -implementations in the past. The second and main advantage is that -library implementers can freely exchange a hand-rolled iterator -implementation for one based on ``iterator_facade`` without fear of -breaking code that was accessing the public core member functions -directly. - -In a naive implementation, keeping the derived class' core member -functions private would require it to grant friendship to -``iterator_facade`` and each of the seven operators. In order to -reduce the burden of limiting access, ``iterator_core_access`` is -provided, a class that acts as a gateway to the core member functions -in the derived iterator class. The author of the derived class only -needs to grant friendship to ``iterator_core_access`` to make his core -member functions available to the library. - -.. This is no long uptodate -thw -.. Yes it is; I made sure of it! -DWA - -``iterator_core_access`` will be typically implemented as an empty -class containing only private static member functions which invoke the -iterator core member functions. There is, however, no need to -standardize the gateway protocol. Note that even if -``iterator_core_access`` used public member functions it would not -open a safety loophole, as every core member function preserves the -invariants of the iterator. - -``operator[]`` --------------- - -The indexing operator for a generalized iterator presents special -challenges. A random access iterator's ``operator[]`` is only -required to return something convertible to its ``value_type``. -Requiring that it return an lvalue would rule out currently-legal -random-access iterators which hold the referenced value in a data -member (e.g. |counting|_), because ``*(p+n)`` is a reference -into the temporary iterator ``p+n``, which is destroyed when -``operator[]`` returns. - -.. |counting| replace:: ``counting_iterator`` - -Writable iterators built with ``iterator_facade`` implement the -semantics required by the preferred resolution to `issue 299`_ and -adopted by proposal n1550_: the result of ``p[n]`` is an object -convertible to the iterator's ``value_type``, and ``p[n] = x`` is -equivalent to ``*(p + n) = x`` (Note: This result object may be -implemented as a proxy containing a copy of ``p+n``). This approach -will work properly for any random-access iterator regardless of the -other details of its implementation. A user who knows more about -the implementation of her iterator is free to implement an -``operator[]`` that returns an lvalue in the derived iterator -class; it will hide the one supplied by ``iterator_facade`` from -clients of her iterator. - -.. _n1550: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1550.html - -.. _`issue 299`: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#299 - -.. _`operator arrow`: - - -``operator->`` --------------- - -The ``reference`` type of a readable iterator (and today's input -iterator) need not in fact be a reference, so long as it is -convertible to the iterator's ``value_type``. When the ``value_type`` -is a class, however, it must still be possible to access members -through ``operator->``. Therefore, an iterator whose ``reference`` -type is not in fact a reference must return a proxy containing a copy -of the referenced value from its ``operator->``. - -The return types for ``iterator_facade``\ 's ``operator->`` and -``operator[]`` are not explicitly specified. Instead, those types -are described in terms of a set of requirements, which must be -satisfied by the ``iterator_facade`` implementation. - -.. [Cop95] [Coplien, 1995] Coplien, J., Curiously Recurring Template - Patterns, C++ Report, February 1995, pp. 24-27. - diff --git a/doc/iterator_facade_ref.rst b/doc/iterator_facade_ref.rst deleted file mode 100644 index da7c28d..0000000 --- a/doc/iterator_facade_ref.rst +++ /dev/null @@ -1,438 +0,0 @@ -.. Version 1.3 of this ReStructuredText document corresponds to - n1530_, the paper accepted by the LWG for TR1. - -.. Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All - rights reserved - - -.. parsed-literal:: - - template < - class Derived - , class Value - , class CategoryOrTraversal - , class Reference = Value& - , class Difference = ptrdiff_t - > - class iterator_facade { - public: - typedef remove_const::type value_type; - typedef Reference reference; - typedef Value\* pointer; - typedef Difference difference_type; - typedef /* see below__ \*/ iterator_category; - - reference operator\*() const; - /* see below__ \*/ operator->() const; - /* see below__ \*/ operator[](difference_type n) const; - Derived& operator++(); - Derived operator++(int); - Derived& operator--(); - Derived operator--(int); - Derived& operator+=(difference_type n); - Derived& operator-=(difference_type n); - Derived operator-(difference_type n) const; - protected: - typedef iterator_facade iterator_facade\_; - }; - - // Comparison operators - template - typename enable_if_interoperable::type // exposition - operator ==(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator !=(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator <(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator <=(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator >(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator >=(iterator_facade const& lhs, - iterator_facade const& rhs); - - // Iterator difference - template - /* see below__ \*/ - operator-(iterator_facade const& lhs, - iterator_facade const& rhs); - - // Iterator addition - template - Derived operator+ (iterator_facade const&, - typename Derived::difference_type n); - - template - Derived operator+ (typename Derived::difference_type n, - iterator_facade const&); - -__ `iterator category`_ - -__ `operator arrow`_ - -__ brackets_ - -__ minus_ - -.. _`iterator category`: - -The ``iterator_category`` member of ``iterator_facade`` is - -.. parsed-literal:: - - *iterator-category*\ (CategoryOrTraversal, value_type, reference) - -where *iterator-category* is defined as follows: - -.. include:: facade_iterator_category.rst - -The ``enable_if_interoperable`` template used above is for exposition -purposes. The member operators should only be in an overload set -provided the derived types ``Dr1`` and ``Dr2`` are interoperable, -meaning that at least one of the types is convertible to the other. The -``enable_if_interoperable`` approach uses SFINAE to take the operators -out of the overload set when the types are not interoperable. -The operators should behave *as-if* ``enable_if_interoperable`` -were defined to be:: - - template enable_if_interoperable_impl - {}; - - template enable_if_interoperable_impl - { typedef T type; }; - - template - struct enable_if_interoperable - : enable_if_interoperable_impl< - is_convertible::value || is_convertible::value - , T - > - {}; - - -``iterator_facade`` Requirements --------------------------------- - -The following table describes the typical valid expressions on -``iterator_facade``\ 's ``Derived`` parameter, depending on the -iterator concept(s) it will model. The operations in the first -column must be made accessible to member functions of class -``iterator_core_access``. In addition, -``static_cast(iterator_facade*)`` shall be well-formed. - -In the table below, ``F`` is ``iterator_facade``, ``a`` is an -object of type ``X``, ``b`` and ``c`` are objects of type ``const X``, -``n`` is an object of ``F::difference_type``, ``y`` is a constant -object of a single pass iterator type interoperable with ``X``, and ``z`` -is a constant object of a random access traversal iterator type -interoperable with ``X``. - -.. _`core operations`: - -.. topic:: ``iterator_facade`` Core Operations - - +--------------------+----------------------+-------------------------+---------------------------+ - |Expression |Return Type |Assertion/Note |Used to implement Iterator | - | | | |Concept(s) | - +====================+======================+=========================+===========================+ - |``c.dereference()`` |``F::reference`` | |Readable Iterator, Writable| - | | | |Iterator | - +--------------------+----------------------+-------------------------+---------------------------+ - |``c.equal(y)`` |convertible to bool |true iff ``c`` and ``y`` |Single Pass Iterator | - | | |refer to the same | | - | | |position. | | - +--------------------+----------------------+-------------------------+---------------------------+ - |``a.increment()`` |unused | |Incrementable Iterator | - +--------------------+----------------------+-------------------------+---------------------------+ - |``a.decrement()`` |unused | |Bidirectional Traversal | - | | | |Iterator | - +--------------------+----------------------+-------------------------+---------------------------+ - |``a.advance(n)`` |unused | |Random Access Traversal | - | | | |Iterator | - +--------------------+----------------------+-------------------------+---------------------------+ - |``c.distance_to(z)``|convertible to |equivalent to |Random Access Traversal | - | |``F::difference_type``|``distance(c, X(z))``. |Iterator | - +--------------------+----------------------+-------------------------+---------------------------+ - - - -``iterator_facade`` operations ------------------------------- - -The operations in this section are described in terms of operations on -the core interface of ``Derived`` which may be inaccessible -(i.e. private). The implementation should access these operations -through member functions of class ``iterator_core_access``. - -``reference operator*() const;`` - -:Returns: ``static_cast(this)->dereference()`` - -``operator->() const;`` (see below__) - -__ `operator arrow`_ - -:Returns: If ``reference`` is a reference type, an object - of type ``pointer`` equal to:: - - &static_cast(this)->dereference() - - Otherwise returns an object of unspecified type such that, - ``(*static_cast(this))->m`` is equivalent to ``(w = **static_cast(this), - w.m)`` for some temporary object ``w`` of type ``value_type``. - -.. _brackets: - -*unspecified* ``operator[](difference_type n) const;`` - -:Returns: an object convertible to ``value_type``. For constant - objects ``v`` of type ``value_type``, and ``n`` of type - ``difference_type``, ``(*this)[n] = v`` is equivalent to - ``*(*this + n) = v``, and ``static_cast((*this)[n])`` is equivalent to - ``static_cast(*(*this + n))`` - - - -``Derived& operator++();`` - -:Effects: - - :: - - static_cast(this)->increment(); - return *static_cast(this); - -``Derived operator++(int);`` - -:Effects: - - :: - - Derived tmp(static_cast(this)); - ++*this; - return tmp; - - -``Derived& operator--();`` - -:Effects: - - :: - - static_cast(this)->decrement(); - return *static_cast(this); - - -``Derived operator--(int);`` - -:Effects: - - :: - - Derived tmp(static_cast(this)); - --*this; - return tmp; - - -``Derived& operator+=(difference_type n);`` - -:Effects: - - :: - - static_cast(this)->advance(n); - return *static_cast(this); - - -``Derived& operator-=(difference_type n);`` - -:Effects: - - :: - - static_cast(this)->advance(-n); - return *static_cast(this); - - -``Derived operator-(difference_type n) const;`` - -:Effects: - - :: - - Derived tmp(static_cast(this)); - return tmp -= n; - -:: - - template - Derived operator+ (iterator_facade const&, - typename Derived::difference_type n); - - template - Derived operator+ (typename Derived::difference_type n, - iterator_facade const&); - -:Effects: - - :: - - Derived tmp(static_cast(this)); - return tmp += n; - - -:: - - template - typename enable_if_interoperable::type - operator ==(iterator_facade const& lhs, - iterator_facade const& rhs); - -:Returns: - if ``is_convertible::value`` - - then - ``((Dr1 const&)lhs).equal((Dr2 const&)rhs)``. - - Otherwise, - ``((Dr2 const&)rhs).equal((Dr1 const&)lhs)``. - -:: - - template - typename enable_if_interoperable::type - operator !=(iterator_facade const& lhs, - iterator_facade const& rhs); - -:Returns: - if ``is_convertible::value`` - - then - ``!((Dr1 const&)lhs).equal((Dr2 const&)rhs)``. - - Otherwise, - ``!((Dr2 const&)rhs).equal((Dr1 const&)lhs)``. - -:: - - template - typename enable_if_interoperable::type - operator <(iterator_facade const& lhs, - iterator_facade const& rhs); - -:Returns: - if ``is_convertible::value`` - - then - ``((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) < 0``. - - Otherwise, - ``((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) > 0``. - -:: - - template - typename enable_if_interoperable::type - operator <=(iterator_facade const& lhs, - iterator_facade const& rhs); - -:Returns: - if ``is_convertible::value`` - - then - ``((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) <= 0``. - - Otherwise, - ``((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) >= 0``. - -:: - - template - typename enable_if_interoperable::type - operator >(iterator_facade const& lhs, - iterator_facade const& rhs); - -:Returns: - if ``is_convertible::value`` - - then - ``((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) > 0``. - - Otherwise, - ``((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) < 0``. - - -:: - - template - typename enable_if_interoperable::type - operator >=(iterator_facade const& lhs, - iterator_facade const& rhs); - -:Returns: - if ``is_convertible::value`` - - then - ``((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) >= 0``. - - Otherwise, - ``((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) <= 0``. - -.. _minus: - -:: - - template - typename enable_if_interoperable::type - operator -(iterator_facade const& lhs, - iterator_facade const& rhs); - -:Return Type: - if ``is_convertible::value`` - - then - ``difference`` shall be - ``iterator_traits::difference_type``. - - Otherwise - ``difference`` shall be ``iterator_traits::difference_type`` - -:Returns: - if ``is_convertible::value`` - - then - ``-((Dr1 const&)lhs).distance_to((Dr2 const&)rhs)``. - - Otherwise, - ``((Dr2 const&)rhs).distance_to((Dr1 const&)lhs)``. diff --git a/doc/iterator_facade_tutorial.rst b/doc/iterator_facade_tutorial.rst deleted file mode 100755 index f56085d..0000000 --- a/doc/iterator_facade_tutorial.rst +++ /dev/null @@ -1,523 +0,0 @@ -.. Copyright David Abrahams 2004. 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) - -In this section we'll walk through the implementation of a few -iterators using ``iterator_facade``, based around the simple -example of a linked list of polymorphic objects. This example was -inspired by a `posting`__ by Keith Macdonald on the `Boost-Users`_ -mailing list. - -.. _`Boost-Users`: ../../../more/mailing_lists.htm#users - -__ http://thread.gmane.org/gmane.comp.lib.boost.user/5100 - -The Problem ------------ - -Say we've written a polymorphic linked list node base class:: - - # include - - struct node_base - { - node_base() : m_next(0) {} - - // Each node manages all of its tail nodes - virtual ~node_base() { delete m_next; } - - // Access the rest of the list - node_base* next() const { return m_next; } - - // print to the stream - virtual void print(std::ostream& s) const = 0; - - // double the value - virtual void double_me() = 0; - - void append(node_base* p) - { - if (m_next) - m_next->append(p); - else - m_next = p; - } - - private: - node_base* m_next; - }; - -Lists can hold objects of different types by linking together -specializations of the following template:: - - template - struct node : node_base - { - node(T x) - : m_value(x) - {} - - void print(std::ostream& s) const { s << this->m_value; } - void double_me() { m_value += m_value; } - - private: - T m_value; - }; - -And we can print any node using the following streaming operator:: - - inline std::ostream& operator<<(std::ostream& s, node_base const& n) - { - n.print(s); - return s; - } - -Our first challenge is to build an appropriate iterator over these -lists. - -A Basic Iterator Using ``iterator_facade`` ------------------------------------------- - -We will construct a ``node_iterator`` class using inheritance from -``iterator_facade`` to implement most of the iterator's operations. - -:: - - # include "node.hpp" - # include - - class node_iterator - : public boost::iterator_facade<...> - { - ... - }; - - - -Template Arguments for ``iterator_facade`` -.......................................... - -``iterator_facade`` has several template parameters, so we must decide -what types to use for the arguments. The parameters are ``Derived``, -``Value``, ``CategoryOrTraversal``, ``Reference``, and ``Difference``. - - -``Derived`` -''''''''''' - -Because ``iterator_facade`` is meant to be used with the CRTP -[Cop95]_ the first parameter is the iterator class name itself, -``node_iterator``. - -``Value`` -''''''''' - -The ``Value`` parameter determines the ``node_iterator``\ 's -``value_type``. In this case, we are iterating over ``node_base`` -objects, so ``Value`` will be ``node_base``. - - -``CategoryOrTraversal`` -''''''''''''''''''''''' - -Now we have to determine which `iterator traversal concept`_ our -``node_iterator`` is going to model. Singly-linked lists only have -forward links, so our iterator can't can't be a `bidirectional -traversal iterator`_. Our iterator should be able to make multiple -passes over the same linked list (unlike, say, an -``istream_iterator`` which consumes the stream it traverses), so it -must be a `forward traversal iterator`_. Therefore, we'll pass -``boost::forward_traversal_tag`` in this position [#category]_. - -.. [#category] ``iterator_facade`` also supports old-style category - tags, so we could have passed ``std::forward_iterator_tag`` here; - either way, the resulting iterator's ``iterator_category`` will - end up being ``std::forward_iterator_tag``. - -``Reference`` -''''''''''''' - -The ``Reference`` argument becomes the type returned by -``node_iterator``\ 's dereference operation, and will also be the -same as ``std::iterator_traits::reference``. The -library's default for this parameter is ``Value&``; since -``node_base&`` is a good choice for the iterator's ``reference`` -type, we can omit this argument, or pass ``use_default``. - -``Difference`` -'''''''''''''' - -The ``Difference`` argument determines how the distance between -two ``node_iterator``\ s will be measured and will also be the -same as ``std::iterator_traits::difference_type``. -The library's default for ``Difference`` is ``std::ptrdiff_t``, an -appropriate type for measuring the distance between any two -addresses in memory, and one that works for almost any iterator, -so we can omit this argument, too. - -The declaration of ``node_iterator`` will therefore look something -like:: - - # include "node.hpp" - # include - - class node_iterator - : public boost::iterator_facade< - node_iterator - , node_base - , boost::forward_traversal_tag - > - { - ... - }; - -Constructors and Data Members -............................. - -Next we need to decide how to represent the iterator's position. -This representation will take the form of data members, so we'll -also need to write constructors to initialize them. The -``node_iterator``\ 's position is quite naturally represented using -a pointer to a ``node_base``. We'll need a constructor to build an -iterator from a ``node_base*``, and a default constructor to -satisfy the `forward traversal iterator`_ requirements [#default]_. -Our ``node_iterator`` then becomes:: - - # include "node.hpp" - # include - - class node_iterator - : public boost::iterator_facade< - node_iterator - , node_base - , boost::forward_traversal_tag - > - { - public: - node_iterator() - : m_node(0) - {} - - explicit node_iterator(node_base* p) - : m_node(p) - {} - - private: - ... - node_base* m_node; - }; - -.. [#default] Technically, the C++ standard places almost no - requirements on a default-constructed iterator, so if we were - really concerned with efficiency, we could've written the - default constructor to leave ``m_node`` uninitialized. - -Implementing the Core Operations -................................ - -The last step is to implement the `core operations`_ required by -the concepts we want our iterator to model. Referring to the -table__, we can see that the first three rows are applicable -because ``node_iterator`` needs to satisfy the requirements for -`readable iterator`_, `single pass iterator`_, and `incrementable -iterator`_. - -__ `core operations`_ - -We therefore need to supply ``dereference``, -``equal``, and ``increment`` members. We don't want these members -to become part of ``node_iterator``\ 's public interface, so we can -make them private and grant friendship to -``boost::iterator_core_access``, a "back-door" that -``iterator_facade`` uses to get access to the core operations:: - - # include "node.hpp" - # include - - class node_iterator - : public boost::iterator_facade< - node_iterator - , node_base - , boost::forward_traversal_tag - > - { - public: - node_iterator() - : m_node(0) {} - - explicit node_iterator(node_base* p) - : m_node(p) {} - - private: - friend class boost::iterator_core_access; - - void increment() { m_node = m_node->next(); } - - bool equal(node_iterator const& other) const - { - return this->m_node == other.m_node; - } - - node_base& dereference() const { return *m_node; } - - node_base* m_node; - }; - -Voilà; a complete and conforming readable, forward-traversal -iterator! For a working example of its use, see `this program`__. - -__ ../example/node_iterator1.cpp - -A constant ``node_iterator`` ----------------------------- - -.. Sidebar:: Constant and Mutable iterators - - The term **mutable iterator** means an iterator through which - the object it references (its "referent") can be modified. A - **constant iterator** is one which doesn't allow modification of - its referent. - - The words *constant* and *mutable* don't refer to the ability to - modify the iterator itself. For example, an ``int const*`` is a - non-\ ``const`` *constant iterator*, which can be incremented - but doesn't allow modification of its referent, and ``int* - const`` is a ``const`` *mutable iterator*, which cannot be - modified but which allows modification of its referent. - - Confusing? We agree, but those are the standard terms. It - probably doesn't help much that a container's constant iterator - is called ``const_iterator``. - -Now, our ``node_iterator`` gives clients access to both ``node``\ -'s ``print(std::ostream&) const`` member function, but also its -mutating ``double_me()`` member. If we wanted to build a -*constant* ``node_iterator``, we'd only have to make three -changes: - -.. parsed-literal:: - - class const_node_iterator - : public boost::iterator_facade< - node_iterator - , node_base **const** - , boost::forward_traversal_tag - > - { - public: - const_node_iterator() - : m_node(0) {} - - explicit const_node_iterator(node_base* p) - : m_node(p) {} - - private: - friend class boost::iterator_core_access; - - void increment() { m_node = m_node->next(); } - - bool equal(const_node_iterator const& other) const - { - return this->m_node == other.m_node; - } - - node_base **const**\ & dereference() const { return \*m_node; } - - node_base **const**\ * m_node; - }; - -.. Sidebar:: ``const`` and an iterator's ``value_type`` - - The C++ standard requires an iterator's ``value_type`` *not* be - ``const``\ -qualified, so ``iterator_facade`` strips the - ``const`` from its ``Value`` parameter in order to produce the - iterator's ``value_type``. Making the ``Value`` argument - ``const`` provides a useful hint to ``iterator_facade`` that the - iterator is a *constant iterator*, and the default ``Reference`` - argument will be correct for all lvalue iterators. - -As a matter of fact, ``node_iterator`` and ``const_node_iterator`` -are so similar that it makes sense to factor the common code out -into a template as follows:: - - template - class node_iter - : public boost::iterator_facade< - node_iter - , Value - , boost::forward_traversal_tag - > - { - public: - node_iter() - : m_node(0) {} - - explicit node_iter(Value* p) - : m_node(p) {} - - private: - friend class boost::iterator_core_access; - - bool equal(node_iter const& other) const - { - return this->m_node == other.m_node; - } - - void increment() - { m_node = m_node->next(); } - - Value& dereference() const - { return *m_node; } - - Value* m_node; - }; - typedef node_iter node_iterator; - typedef node_iter node_const_iterator; - - -Interoperability ----------------- - -Our ``const_node_iterator`` works perfectly well on its own, but -taken together with ``node_iterator`` it doesn't quite meet -expectations. For example, we'd like to be able to pass a -``node_iterator`` where a ``node_const_iterator`` was expected, -just as you can with ``std::list``\ 's ``iterator`` and -``const_iterator``. Furthermore, given a ``node_iterator`` and a -``node_const_iterator`` into the same list, we should be able to -compare them for equality. - -This expected ability to use two different iterator types together -is known as |interoperability|_. Achieving interoperability in -our case is as simple as templatizing the ``equal`` function and -adding a templatized converting constructor [#broken]_ [#random]_:: - - template - class node_iter - : public boost::iterator_facade< - node_iter - , Value - , boost::forward_traversal_tag - > - { - public: - node_iter() - : m_node(0) {} - - explicit node_iter(Value* p) - : m_node(p) {} - - template - node_iter(node_iter const& other) - : m_node(other.m_node) {} - - private: - friend class boost::iterator_core_access; - template friend class node_iter; - - template - bool equal(node_iter const& other) const - { - return this->m_node == other.m_node; - } - - void increment() - { m_node = m_node->next(); } - - Value& dereference() const - { return *m_node; } - - Value* m_node; - }; - typedef impl::node_iterator node_iterator; - typedef impl::node_iterator node_const_iterator; - -.. |interoperability| replace:: **interoperability** -.. _interoperability: new-iter-concepts.html#interoperable-iterators-lib-interoperable-iterators - -.. [#broken] If you're using an older compiler and it can't handle - this example, see the `example code`__ for workarounds. - -.. [#random] If ``node_iterator`` had been a `random access - traversal iterator`_, we'd have had to templatize its - ``distance_to`` function as well. - - -__ ../example/node_iterator2.hpp - -You can see an example program which exercises our interoperable -iterators `here`__. - -__ ../example/node_iterator2.cpp - -Telling the Truth ------------------ - -Now ``node_iterator`` and ``node_const_iterator`` behave exactly as -you'd expect... almost. We can compare them and we can convert in -one direction: from ``node_iterator`` to ``node_const_iterator``. -If we try to convert from ``node_const_iterator`` to -``node_iterator``, we'll get an error when the converting -constructor tries to initialize ``node_iterator``\ 's ``m_node``, a -``node*`` with a ``node const*``. So what's the problem? - -The problem is that -``boost::``\ |is_convertible|_\ ``::value`` -will be ``true``, but it should be ``false``. |is_convertible|_ -lies because it can only see as far as the *declaration* of -``node_iter``\ 's converting constructor, but can't look inside at -the *definition* to make sure it will compile. A perfect solution -would make ``node_iter``\ 's converting constructor disappear when -the ``m_node`` conversion would fail. - -.. |is_convertible| replace:: ``is_convertible`` -.. _is_convertible: ../../type_traits/index.html#relationships - -In fact, that sort of magic is possible using -|enable_if|__. By rewriting the converting constructor as -follows, we can remove it from the overload set when it's not -appropriate:: - - #include - #include - - ... - - private: - struct enabler {}; - - public: - template - node_iter( - node_iter const& other - , typename boost::enable_if< - boost::is_convertible - , enabler - >::type = enabler() - ) - : m_node(other.m_node) {} - -.. |enable_if| replace:: ``boost::enable_if`` -__ ../../utility/enable_if.html - - -Wrap Up -------- - -This concludes our ``iterator_facade`` tutorial, but before you -stop reading we urge you to take a look at |iterator_adaptor|__. -There's another way to approach writing these iterators which might -even be superior. - -.. |iterator_adaptor| replace:: ``iterator_adaptor`` -__ iterator_adaptor.html - -.. _`iterator traversal concept`: new-iter-concepts.html#iterator-traversal-concepts-lib-iterator-traversal -.. _`readable iterator`: new-iter-concepts.html#readable-iterators-lib-readable-iterators -.. _`lvalue iterator`: new-iter-concepts.html#lvalue-iterators-lib-lvalue-iterators -.. _`single pass iterator`: new-iter-concepts.html#single-pass-iterators-lib-single-pass-iterators -.. _`incrementable iterator`: new-iter-concepts.html#incrementable-iterators-lib-incrementable-iterators -.. _`forward traversal iterator`: new-iter-concepts.html#forward-traversal-iterators-lib-forward-traversal-iterators -.. _`bidirectional traversal iterator`: new-iter-concepts.html#bidirectional-traversal-iterators-lib-bidirectional-traversal-iterators -.. _`random access traversal iterator`: new-iter-concepts.html#random-access-traversal-iterators-lib-random-access-traversal-iterators - diff --git a/doc/iterator_traits.html b/doc/iterator_traits.html deleted file mode 100755 index 2691867..0000000 --- a/doc/iterator_traits.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - -Iterator Traits - - - - - - - -
-

Iterator Traits

- --- - - - - - - - - - - - -
Author:David Abrahams
Contact:dave@boost-consulting.com
Organization:Boost Consulting
Date:2004-01-13
Copyright:Copyright David Abrahams 2004. All rights reserved
- --- - - - -
abstract:Header <boost/iterator/iterator_traits.hpp> provides -the ability to access an iterator's associated types using -MPL-compatible metafunctions.
-
-

Overview

-

std::iterator_traits provides access to five associated types -of any iterator: its value_type, reference, pointer, -iterator_category, and difference_type. Unfortunately, -such a "multi-valued" traits template can be difficult to use in a -metaprogramming context. <boost/iterator/iterator_traits.hpp> -provides access to these types using a standard metafunctions.

-
-
-

Summary

-

Header <boost/iterator/iterator_traits.hpp>:

-
-template <class Iterator>
-struct iterator_value
-{
-    typedef typename 
-      std::iterator_traits<Iterator>::value_type 
-    type;
-};
-
-template <class Iterator>
-struct iterator_reference
-{
-    typedef typename 
-      std::iterator_traits<Iterator>::reference
-    type;
-};
-
-
-template <class Iterator>
-struct iterator_pointer
-{
-    typedef typename 
-      std::iterator_traits<Iterator>::pointer 
-    type;
-};
-
-template <class Iterator>
-struct iterator_difference
-{
-    typedef typename
-      detail::iterator_traits<Iterator>::difference_type
-    type;
-};
-
-template <class Iterator>
-struct iterator_category
-{
-    typedef typename
-      detail::iterator_traits<Iterator>::iterator_category
-    type;
-};
-
-
-
-

Broken Compiler Notes

-

Because of workarounds in Boost, you may find that these -metafunctions actually work better than the facilities provided by -your compiler's standard library.

-

On compilers that don't support partial specialization, such as -Microsoft Visual C++ 6.0 or 7.0, you may need to manually invoke -BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION on the -value_type of pointers that are passed to these metafunctions.

-

Because of bugs in the implementation of GCC-2.9x, the name of -iterator_category is changed to iterator_category_ on that -compiler. A macro, BOOST_ITERATOR_CATEGORY, that expands to -either iterator_category or iterator_category_, as -appropriate to the platform, is provided for portability.

-
-
- - - - diff --git a/doc/iterator_traits.pdf b/doc/iterator_traits.pdf deleted file mode 100755 index 796fff6..0000000 Binary files a/doc/iterator_traits.pdf and /dev/null differ diff --git a/doc/iterator_traits.rst b/doc/iterator_traits.rst deleted file mode 100755 index aaaaa6f..0000000 --- a/doc/iterator_traits.rst +++ /dev/null @@ -1,94 +0,0 @@ -+++++++++++++++++ - Iterator Traits -+++++++++++++++++ - -:Author: David Abrahams -:Contact: dave@boost-consulting.com -:organization: `Boost Consulting`_ -:date: $Date$ -:copyright: Copyright David Abrahams 2004. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com - -:abstract: Header ```` provides - the ability to access an iterator's associated types using - MPL-compatible metafunctions_. - -.. _metafunctions: ../../mpl/doc/index.html#metafunctions - -Overview -======== - -``std::iterator_traits`` provides access to five associated types -of any iterator: its ``value_type``, ``reference``, ``pointer``, -``iterator_category``, and ``difference_type``. Unfortunately, -such a "multi-valued" traits template can be difficult to use in a -metaprogramming context. ```` -provides access to these types using a standard metafunctions_. - -Summary -======= - -Header ````:: - - template - struct iterator_value - { - typedef typename - std::iterator_traits::value_type - type; - }; - - template - struct iterator_reference - { - typedef typename - std::iterator_traits::reference - type; - }; - - - template - struct iterator_pointer - { - typedef typename - std::iterator_traits::pointer - type; - }; - - template - struct iterator_difference - { - typedef typename - detail::iterator_traits::difference_type - type; - }; - - template - struct iterator_category - { - typedef typename - detail::iterator_traits::iterator_category - type; - }; - -Broken Compiler Notes -===================== - -Because of workarounds in Boost, you may find that these -metafunctions_ actually work better than the facilities provided by -your compiler's standard library. - -On compilers that don't support partial specialization, such as -Microsoft Visual C++ 6.0 or 7.0, you may need to manually invoke -BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION_ on the -``value_type`` of pointers that are passed to these metafunctions. - -Because of bugs in the implementation of GCC-2.9x, the name of -``iterator_category`` is changed to ``iterator_category_`` on that -compiler. A macro, ``BOOST_ITERATOR_CATEGORY``, that expands to -either ``iterator_category`` or ``iterator_category_``, as -appropriate to the platform, is provided for portability. - -.. _BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION: ../../type_traits/index.html#transformations - diff --git a/doc/make_counting_iterator.rst b/doc/make_counting_iterator.rst deleted file mode 100755 index f1c9ae9..0000000 --- a/doc/make_counting_iterator.rst +++ /dev/null @@ -1,9 +0,0 @@ - -:: - - template - counting_iterator make_counting_iterator(Incrementable x); - -:Returns: An instance of ``counting_iterator`` - with ``current`` constructed from ``x``. - diff --git a/doc/make_filter_iterator.html b/doc/make_filter_iterator.html deleted file mode 100755 index 994bd7b..0000000 --- a/doc/make_filter_iterator.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - -
-
-template <class Predicate, class Iterator>
-filter_iterator<Predicate,Iterator>
-make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
-
- --- - - - -
Returns:An instance of filter_iterator<Predicate,Iterator> -where m_iter is either the first position in the range [x,end) such that -f(*this->base()) == true or else m_iter == end. -The member m_pred is constructed from f and m_end from end.
-
-template <class Predicate, class Iterator>
-filter_iterator<Predicate,Iterator>
-make_filter_iterator(Iterator x, Iterator end = Iterator());
-
- --- - - - -
Returns:An instance of filter_iterator<Predicate,Iterator> -where m_iter is either the first position in the range [x,end) -such that f(*this->base()) == true, where f is a default -constructed Predicate, or else m_iter == end. -The member m_pred is default constructed and m_end -is constructed from end.
-
- - - - diff --git a/doc/make_filter_iterator.rst b/doc/make_filter_iterator.rst deleted file mode 100755 index e4cd877..0000000 --- a/doc/make_filter_iterator.rst +++ /dev/null @@ -1,16 +0,0 @@ - -:: - - template - filter_iterator - make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator()); - -:Returns: filter_iterator(f, x, end) - -:: - - template - filter_iterator - make_filter_iterator(Iterator x, Iterator end = Iterator()); - -:Returns: filter_iterator(x, end) diff --git a/doc/make_reverse_iterator.rst b/doc/make_reverse_iterator.rst deleted file mode 100644 index c3e20ed..0000000 --- a/doc/make_reverse_iterator.rst +++ /dev/null @@ -1,9 +0,0 @@ -:: - - template - reverse_iteratorn - make_reverse_iterator(BidirectionalIterator x); - -:Returns: An instance of ``reverse_iterator`` - with a ``current`` constructed from ``x``. - diff --git a/doc/make_transform_iterator.rst b/doc/make_transform_iterator.rst deleted file mode 100755 index 5d5f1b2..0000000 --- a/doc/make_transform_iterator.rst +++ /dev/null @@ -1,19 +0,0 @@ -:: - - template - transform_iterator - make_transform_iterator(Iterator it, UnaryFunction fun); - -:Returns: An instance of ``transform_iterator`` with ``m_f`` - initialized to ``f`` and ``m_iterator`` initialized to ``x``. - - - -:: - - template - transform_iterator - make_transform_iterator(Iterator it); - -:Returns: An instance of ``transform_iterator`` with ``m_f`` - default constructed and ``m_iterator`` initialized to ``x``. diff --git a/doc/make_zip_iterator.rst b/doc/make_zip_iterator.rst deleted file mode 100755 index 0369760..0000000 --- a/doc/make_zip_iterator.rst +++ /dev/null @@ -1,8 +0,0 @@ -:: - - template - zip_iterator - make_zip_iterator(IteratorTuple t); - -:Returns: An instance of ``zip_iterator`` with ``m_iterator_tuple`` - initialized to ``t``. diff --git a/doc/new-iter-concepts.html b/doc/new-iter-concepts.html deleted file mode 100755 index b78dc6e..0000000 --- a/doc/new-iter-concepts.html +++ /dev/null @@ -1,1023 +0,0 @@ - - - - - - -New Iterator Concepts - - - - - - - -

New Iterator Concepts

- --- - - - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
Organization:Boost Consulting, Indiana University Open Systems -Lab, Zephyr Associates, Inc.
Date:2004-07-14
Number:This is a revised version of n1550=03-0133, which was -accepted for Technical Report 1 by the C++ standard -committee's library working group. This proposal is a -revision of paper n1297, n1477, and n1531.
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt -2003. All rights reserved
-
- - --- - - - -
Abstract:We propose a new system of iterator concepts that treat -access and positioning independently. This allows the -concepts to more closely match the requirements -of algorithms and provides better categorizations -of iterators that are used in practice.
- -
-

Motivation

-

The standard iterator categories and requirements are flawed because -they use a single hierarchy of concepts to address two orthogonal -issues: iterator traversal and value access. As a result, many -algorithms with requirements expressed in terms of the iterator -categories are too strict. Also, many real-world iterators can not be -accurately categorized. A proxy-based iterator with random-access -traversal, for example, may only legally have a category of "input -iterator", so generic algorithms are unable to take advantage of its -random-access capabilities. The current iterator concept hierarchy is -geared towards iterator traversal (hence the category names), while -requirements that address value access sneak in at various places. The -following table gives a summary of the current value access -requirements in the iterator categories.

- ---- - - - - - - - - - - - - - - - - - - -
Value Access Requirements in Existing Iterator Categories
Output Iterator*i = a
Input Iterator*i is convertible to T
Forward Iterator*i is T& (or const T& once issue 200 -is resolved)
Random Access Iteratori[n] is convertible to T (also i[n] = t -is required for mutable iterators once issue 299 -is resolved)
-

Because iterator traversal and value access are mixed together in a -single hierarchy, many useful iterators can not be appropriately -categorized. For example, vector<bool>::iterator is almost a -random access iterator, but the return type is not bool& (see -issue 96 and Herb Sutter's paper J16/99-0008 = WG21 -N1185). Therefore, the iterators of vector<bool> only meet the -requirements of input iterator and output iterator. This is so -nonintuitive that the C++ standard contradicts itself on this point. -In paragraph 23.2.4/1 it says that a vector is a sequence that -supports random access iterators.

-

Another difficult-to-categorize iterator is the transform iterator, an -adaptor which applies a unary function object to the dereferenced -value of the some underlying iterator (see transform_iterator). -For unary functions such as times, the return type of -operator* clearly needs to be the result_type of the function -object, which is typically not a reference. Because random access -iterators are required to return lvalues from operator*, if you -wrap int* with a transform iterator, you do not get a random -access iterator as might be expected, but an input iterator.

-

A third example is found in the vertex and edge iterators of the -Boost Graph Library. These iterators return vertex and edge -descriptors, which are lightweight handles created on-the-fly. They -must be returned by-value. As a result, their current standard -iterator category is input_iterator_tag, which means that, -strictly speaking, you could not use these iterators with algorithms -like min_element(). As a temporary solution, the concept -Multi-Pass Input Iterator was introduced to describe the vertex and -edge descriptors, but as the design notes for the concept suggest, a -better solution is needed.

-

In short, there are many useful iterators that do not fit into the -current standard iterator categories. As a result, the following bad -things happen:

-
    -
  • Iterators are often mis-categorized.
  • -
  • Algorithm requirements are more strict than necessary, because they -cannot separate the need for random access or bidirectional -traversal from the need for a true reference return type.
  • -
-
-
-

Impact on the Standard

-

This proposal for TR1 is a pure extension. Further, the new iterator -concepts are backward-compatible with the old iterator requirements, -and old iterators are forward-compatible with the new iterator -concepts. That is to say, iterators that satisfy the old requirements -also satisfy appropriate concepts in the new system, and iterators -modeling the new concepts will automatically satisfy the appropriate -old requirements.

- - -
-

Possible (but not proposed) Changes to the Working Paper

-

The extensions in this paper suggest several changes we might make -to the working paper for the next standard. These changes are not -a formal part of this proposal for TR1.

-
-

Changes to Algorithm Requirements

-

The algorithms in the standard library could benefit from the new -iterator concepts because the new concepts provide a more accurate way -to express their type requirements. The result is algorithms that are -usable in more situations and have fewer type requirements.

-

For the next working paper (but not for TR1), the committee should -consider the following changes to the type requirements of algorithms. -These changes are phrased as textual substitutions, listing the -algorithms to which each textual substitution applies.

-

Forward Iterator -> Forward Traversal Iterator and Readable Iterator

-
-find_end, adjacent_find, search, search_n, rotate_copy, -lower_bound, upper_bound, equal_range, binary_search, -min_element, max_element
-

Forward Iterator (1) -> Single Pass Iterator and Readable Iterator, -Forward Iterator (2) -> Forward Traversal Iterator and Readable Iterator

-
-find_first_of
-

Forward Iterator -> Readable Iterator and Writable Iterator

-
-iter_swap
-

Forward Iterator -> Single Pass Iterator and Writable Iterator

-
-fill, generate
-

Forward Iterator -> Forward Traversal Iterator and Swappable Iterator

-
-rotate
-

Forward Iterator (1) -> Swappable Iterator and Single Pass Iterator, -Forward Iterator (2) -> Swappable Iterator and Incrementable Iterator

-
-swap_ranges
-
-
Forward Iterator -> Forward Traversal Iterator and Readable Iterator and Writable Iterator
-
remove, remove_if, unique
-
-

Forward Iterator -> Single Pass Iterator and Readable Iterator and Writable Iterator

-
-replace, replace_if
-
-
Bidirectional Iterator -> Bidirectional Traversal Iterator and Swappable Iterator
-
reverse
-
Bidirectional Iterator -> Bidirectional Traversal Iterator and Readable and Swappable Iterator
-
partition
-
-

Bidirectional Iterator (1) -> Bidirectional Traversal Iterator and Readable Iterator, -Bidirectional Iterator (2) -> Bidirectional Traversal Iterator and Writable Iterator

-
-copy_backwards
-
-
Bidirectional Iterator -> Bidirectional Traversal Iterator and Swappable Iterator and Readable Iterator
-
next_permutation, prev_permutation
-
Bidirectional Iterator -> Bidirectional Traversal Iterator and Readable Iterator and Writable Iterator
-
stable_partition, inplace_merge
-
Bidirectional Iterator -> Bidirectional Traversal Iterator and Readable Iterator
-
reverse_copy
-
Random Access Iterator -> Random Access Traversal Iterator and Readable and Writable Iterator
-
random_shuffle, sort, stable_sort, partial_sort, nth_element, push_heap, pop_heap -make_heap, sort_heap
-
Input Iterator (2) -> Incrementable Iterator and Readable Iterator
-
equal, mismatch
-
Input Iterator (2) -> Incrementable Iterator and Readable Iterator
-
transform
-
-
-
-

Deprecations

-

For the next working paper (but not for TR1), the committee should -consider deprecating the old iterator tags, and -std::iterator_traits, since it will be superceded by individual -traits metafunctions.

-
-
-

vector<bool>

-

For the next working paper (but not for TR1), the committee should -consider reclassifying vector<bool>::iterator as a Random -Access Traversal Iterator and Readable Iterator and Writable -Iterator.

-
-
-
-
-

Design

-

The iterator requirements are to be separated into two groups. One set -of concepts handles the syntax and semantics of value access:

-
    -
  • Readable Iterator
  • -
  • Writable Iterator
  • -
  • Swappable Iterator
  • -
  • Lvalue Iterator
  • -
-

The access concepts describe requirements related to operator* and -operator->, including the value_type, reference, and -pointer associated types.

-

The other set of concepts handles traversal:

-
    -
  • Incrementable Iterator
  • -
  • Single Pass Iterator
  • -
  • Forward Traversal Iterator
  • -
  • Bidirectional Traversal Iterator
  • -
  • Random Access Traversal Iterator
  • -
-

The refinement relationships for the traversal concepts are in the -following diagram.

-

traversal.png

-

In addition to the iterator movement operators, such as -operator++, the traversal concepts also include requirements on -position comparison such as operator== and operator<. The -reason for the fine grain slicing of the concepts into the -Incrementable and Single Pass is to provide concepts that are exact -matches with the original input and output iterator requirements.

-

This proposal also includes a concept for specifying when an iterator -is interoperable with another iterator, in the sense that int* is -interoperable with int const*.

-
    -
  • Interoperable Iterators
  • -
-

The relationship between the new iterator concepts and the old are -given in the following diagram.

-

oldeqnew.png

-

Like the old iterator requirements, we provide tags for purposes of -dispatching based on the traversal concepts. The tags are related via -inheritance so that a tag is convertible to another tag if the concept -associated with the first tag is a refinement of the second tag.

-

Our design reuses iterator_traits<Iter>::iterator_category to -indicate an iterator's traversal capability. To specify -capabilities not captured by any old-style iterator category, an -iterator designer can use an iterator_category type that is -convertible to both the the most-derived old iterator category tag -which fits, and the appropriate new iterator traversal tag.

- -

We do not provide tags for the purposes of dispatching based on the -access concepts, in part because we could not find a way to -automatically infer the right access tags for old-style iterators. -An iterator's writability may be dependent on the assignability of -its value_type and there's no known way to detect whether an -arbitrary type is assignable. Fortunately, the need for -dispatching based on access capability is not as great as the need -for dispatching based on traversal capability.

-

A difficult design decision concerned the operator[]. The direct -approach for specifying operator[] would have a return type of -reference; the same as operator*. However, going in this -direction would mean that an iterator satisfying the old Random Access -Iterator requirements would not necessarily be a model of Readable or -Writable Lvalue Iterator. Instead we have chosen a design that -matches the preferred resolution of issue 299: operator[] is -only required to return something convertible to the value_type -(for a Readable Iterator), and is required to support assignment -i[n] = t (for a Writable Iterator).

-
-
-

Proposed Text

-
-

Addition to [lib.iterator.requirements]

-
-

Iterator Value Access Concepts [lib.iterator.value.access]

-

In the tables below, X is an iterator type, a is a constant -object of type X, R is -std::iterator_traits<X>::reference, T is -std::iterator_traits<X>::value_type, and v is a constant -object of type T.

-
-

Readable Iterators [lib.readable.iterators]

-

A class or built-in type X models the Readable Iterator concept -for value type T if, in addition to X being Assignable and -Copy Constructible, the following expressions are valid and respect -the stated semantics. U is the type of any specified member of -type T.

- ----- - - - - - - - - - - - - - - - - - - - - - - -
Readable Iterator Requirements (in addition to Assignable and Copy Constructible)
ExpressionReturn TypeNote/Precondition
iterator_traits<X>::value_typeTAny non-reference, -non-cv-qualified type
*aConvertible to T
-
pre: a is dereferenceable. If a == b then *a
-
is equivalent to *b.
-
-
a->mU&pre: pre: (*a).m is well-defined. Equivalent to (*a).m.
- -
-
-

Writable Iterators [lib.writable.iterators]

-

A class or built-in type X models the Writable Iterator concept -if, in addition to X being Copy Constructible, the following -expressions are valid and respect the stated semantics. Writable -Iterators have an associated set of value types.

- ----- - - - - - - - - - - - - - - -
Writable Iterator Requirements (in addition to Copy Constructible)
ExpressionReturn TypePrecondition
*a = o pre: The type of o -is in the set of -value types of X
-
-
-

Swappable Iterators [lib.swappable.iterators]

-

A class or built-in type X models the Swappable Iterator concept -if, in addition to X being Copy Constructible, the following -expressions are valid and respect the stated semantics.

- ----- - - - - - - - - - - - - - - -
Swappable Iterator Requirements (in addition to Copy Constructible)
ExpressionReturn TypePostcondition
iter_swap(a, b)voidthe pointed to values are -exchanged
-

[Note: An iterator that is a model of the Readable Iterator and -Writable Iterator concepts is also a model of Swappable -Iterator. --end note]

-
-
-

Lvalue Iterators [lib.lvalue.iterators]

-

The Lvalue Iterator concept adds the requirement that the return -type of operator* type be a reference to the value type of the -iterator.

- ----- - - - - - - - - - - - - - - -
Lvalue Iterator Requirements
ExpressionReturn TypeNote/Assertion
*aT&T is cv -iterator_traits<X>::value_type -where cv is an optional -cv-qualification. pre: a is -dereferenceable.
-

If X is a Writable Iterator then a == b if and only if -*a is the same object as *b. If X is a Readable -Iterator then a == b implies *a is the same object as -*b.

-
-
-
-

Iterator Traversal Concepts [lib.iterator.traversal]

-

In the tables below, X is an iterator type, a and b are -constant objects of type X, r and s are mutable objects of -type X, T is std::iterator_traits<X>::value_type, and -v is a constant object of type T.

-
-

Incrementable Iterators [lib.incrementable.iterators]

-

A class or built-in type X models the Incrementable Iterator -concept if, in addition to X being Assignable and Copy -Constructible, the following expressions are valid and respect the -stated semantics.

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible)
ExpressionReturn TypeAssertion
++rX&&r == &++r
r++  
*r++  
iterator_traversal<X>::typeConvertible to -incrementable_traversal_tag 
-

If X is a Writable Iterator then X a(r++); is equivalent -to X a(r); ++r; and *r++ = o is equivalent -to *r = o; ++r. -If X is a Readable Iterator then T z(*r++); is equivalent -to T z(*r); ++r;.

- -
-
-

Single Pass Iterators [lib.single.pass.iterators]

-

A class or built-in type X models the Single Pass Iterator -concept if the following expressions are valid and respect the stated -semantics.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality -Comparable)
ExpressionReturn TypeOperational -SemanticsAssertion/ -Pre-/Post-condition
++rX& pre: r is -dereferenceable; post: -r is dereferenceable or -r is past-the-end
a == bconvertible to bool == is an equivalence -relation over its domain
a != bconvertible to bool!(a == b) 
iterator_traversal<X>::typeConvertible to -single_pass_traversal_tag  
- -
-
-

Forward Traversal Iterators [lib.forward.traversal.iterators]

-

A class or built-in type X models the Forward Traversal Iterator -concept if, in addition to X meeting the requirements of Default -Constructible and Single Pass Iterator, the following expressions are -valid and respect the stated semantics.

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator)
ExpressionReturn TypeAssertion/Note
X u;X&note: u may have a -singular value.
++rX&r == s and r is -dereferenceable implies -++r == ++s.
iterator_traits<X>::difference_typeA signed integral type representing -the distance between iterators 
iterator_traversal<X>::typeConvertible to -forward_traversal_tag 
- -
-
-

Bidirectional Traversal Iterators [lib.bidirectional.traversal.iterators]

-

A class or built-in type X models the Bidirectional Traversal -Iterator concept if, in addition to X meeting the requirements of -Forward Traversal Iterator, the following expressions are valid and -respect the stated semantics.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - -
Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal -Iterator)
ExpressionReturn TypeOperational -SemanticsAssertion/ -Pre-/Post-condition
--rX& 

pre: there exists -s such that r -== ++s. post: -s is -dereferenceable.

-

++(--r) == r. ---r == --s -implies r == -s. &r == &--r.

-
r--convertible to const X&
-{
-  X tmp = r;
-  --r;
-  return tmp;
-}
-
-
 
iterator_traversal<X>::typeConvertible to -bidirectional_traversal_tag  
- -
-
-

Random Access Traversal Iterators [lib.random.access.traversal.iterators]

-

A class or built-in type X models the Random Access Traversal -Iterator concept if the following expressions are valid and respect -the stated semantics. In the table below, Distance is -iterator_traits<X>::difference_type and n represents a -constant object of type Distance.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal Iterator)
ExpressionReturn TypeOperational SemanticsAssertion/ -Precondition
r += nX&
-{
-  Distance m = n;
-  if (m >= 0)
-    while (m--)
-      ++r;
-  else
-    while (m++)
-      --r;
-  return r;
-}
-
-
 
a + n, n + aX{ X tmp = a; return tmp -+= n; } 
r -= nX&return r += -n 
a - nX{ X tmp = a; return tmp --= n; } 
b - aDistancea < b ?  distance(a,b) -: -distance(b,a)pre: there exists a -value n of -Distance such that -a + n == b. b -== a + (b - a).
a[n]convertible to T*(a + n)pre: a is a Readable -Iterator
a[n] = vconvertible to T*(a + n) = vpre: a is a Writable -Iterator
a < bconvertible to boolb - a > 0< is a total -ordering relation
a > bconvertible to boolb < a> is a total -ordering relation
a >= bconvertible to bool!(a < b) 
a <= bconvertible to bool!(a > b) 
iterator_traversal<X>::typeConvertible to -random_access_traversal_tag  
- -
-
-

Interoperable Iterators [lib.interoperable.iterators]

-

A class or built-in type X that models Single Pass Iterator is -interoperable with a class or built-in type Y that also models -Single Pass Iterator if the following expressions are valid and -respect the stated semantics. In the tables below, x is an object -of type X, y is an object of type Y, Distance is -iterator_traits<Y>::difference_type, and n represents a -constant object of type Distance.

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ExpressionReturn TypeAssertion/Precondition/Postcondition
y = xYpost: y == x
Y(x)Ypost: Y(x) == x
x == yconvertible to bool== is an equivalence relation over its domain.
y == xconvertible to bool== is an equivalence relation over its domain.
x != yconvertible to boolbool(a==b) != bool(a!=b) over its domain.
y != xconvertible to boolbool(a==b) != bool(a!=b) over its domain.
-

If X and Y both model Random Access Traversal Iterator then -the following additional requirements must be met.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ExpressionReturn TypeOperational SemanticsAssertion/ Precondition
x < yconvertible to booly - x > 0< is a total ordering relation
y < xconvertible to boolx - y > 0< is a total ordering relation
x > yconvertible to booly < x> is a total ordering relation
y > xconvertible to boolx < y> is a total ordering relation
x >= yconvertible to bool!(x < y) 
y >= xconvertible to bool!(y < x) 
x <= yconvertible to bool!(x > y) 
y <= xconvertible to bool!(y > x) 
y - xDistancedistance(Y(x),y)pre: there exists a value n of -Distance such that x + n == y. -y == x + (y - x).
x - yDistancedistance(y,Y(x))pre: there exists a value n of -Distance such that y + n == x. -x == y + (x - y).
-
-
-
-
-

Addition to [lib.iterator.synopsis]

-
-// lib.iterator.traits, traits and tags
-template <class Iterator> struct is_readable_iterator;
-template <class Iterator> struct iterator_traversal;
-
-struct incrementable_traversal_tag { };
-struct single_pass_traversal_tag : incrementable_traversal_tag { };
-struct forward_traversal_tag : single_pass_traversal_tag { };
-struct bidirectional_traversal_tag : forward_traversal_tag { };
-struct random_access_traversal_tag : bidirectional_traversal_tag { };
-
-
-
-

Addition to [lib.iterator.traits]

-

The is_readable_iterator class -template satisfies the UnaryTypeTrait requirements.

-

Given an iterator type X, is_readable_iterator<X>::value -yields true if, for an object a of type X, *a is -convertible to iterator_traits<X>::value_type, and false -otherwise.

-

iterator_traversal<X>::type is

-
-category-to-traversal(iterator_traits<X>::iterator_category) 
-
-

where category-to-traversal is defined as follows

-
-category-to-traversal(C) =
-    if (C is convertible to incrementable_traversal_tag)
-        return C;
-    else if (C is convertible to random_access_iterator_tag)
-        return random_access_traversal_tag;
-    else if (C is convertible to bidirectional_iterator_tag)
-        return bidirectional_traversal_tag;
-    else if (C is convertible to forward_iterator_tag)
-        return forward_traversal_tag;
-    else if (C is convertible to input_iterator_tag)
-        return single_pass_traversal_tag;
-    else if (C is convertible to output_iterator_tag)
-        return incrementable_traversal_tag;
-    else
-        the program is ill-formed
-
-
-
-
-

Footnotes

-

The UnaryTypeTrait concept is defined in n1519; the LWG is -considering adding the requirement that specializations are derived -from their nested ::type.

- -
-
- - - - diff --git a/doc/new-iter-concepts.pdf b/doc/new-iter-concepts.pdf deleted file mode 100755 index 322b032..0000000 --- a/doc/new-iter-concepts.pdf +++ /dev/null @@ -1,3499 +0,0 @@ -%PDF-1.3 -1 0 obj -<< -/Type /Catalog -/Pages 2 0 R -/Outlines 135 0 R -/Names 211 0 R -/PageMode /UseOutlines -/URI << -/Base () ->> -/ViewerPreferences << ->> -/OpenAction 316 0 R -/PTEX.Fullbanner (This is pdfTeX, Version 3.14159-1.10b) ->> -endobj -2 0 obj -<< -/Type /Pages -/Kids [ 3 0 R 56 0 R 78 0 R 90 0 R 93 0 R 98 0 R 102 0 R 112 0 R 115 0 R 122 0 R 126 0 R ] -/Count 11 ->> -endobj -3 0 obj -<< -/Type /Page -/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R ] -/Resources 32 0 R -/MediaBox [ 0 0 595.276 841.89 ] -/Parent 2 0 R -/Contents 55 0 R ->> -endobj -4 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 0 1 1 ] -/Rect [ 181.001 641.875 302.379 652.723 ] -/Subtype /Link -/A << -/Type /Action -/S /URI -/URI (mailto:dave@boost-consulting.com) ->> ->> -endobj -5 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 0 1 1 ] -/Rect [ 306.475 641.875 376.656 652.723 ] -/Subtype /Link -/A << -/Type /Action -/S /URI -/URI (mailto:jsiek@osl.iu.edu) ->> ->> -endobj -6 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 0 1 1 ] -/Rect [ 380.752 641.875 480.019 652.723 ] -/Subtype /Link -/A << -/Type /Action -/S /URI -/URI (mailto:witt@styleadvisor.com) ->> ->> -endobj -7 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 0 1 1 ] -/Rect [ 181.001 629.92 258.393 640.768 ] -/Subtype /Link -/A << -/Type /Action -/S /URI -/URI (http://www.boost-consulting.com) ->> ->> -endobj -8 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 0 1 1 ] -/Rect [ 346.358 629.92 430.269 640.768 ] -/Subtype /Link -/A << -/Type /Action -/S /URI -/URI (http://www.osl.iu.edu) ->> ->> -endobj -9 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 0 1 1 ] -/Rect [ 434.267 629.92 493.561 640.768 ] -/Subtype /Link -/A << -/Type /Action -/S /URI -/URI (http://www.styleadvisor.com) ->> ->> -endobj -10 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 0 1 1 ] -/Rect [ 181.001 617.965 229.818 628.702 ] -/Subtype /Link -/A << -/Type /Action -/S /URI -/URI (http://www.styleadvisor.com) ->> ->> -endobj -11 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 98.32 448.058 147.912 456.859 ] -/Subtype /Link -/A << -/S /GoTo -/D (motivation) ->> ->> -endobj -12 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 98.32 426.473 205.225 437.321 ] -/Subtype /Link -/A << -/S /GoTo -/D (impact-on-the-standard) ->> ->> -endobj -13 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 120.238 406.27 381.564 418.226 ] -/Subtype /Link -/A << -/S /GoTo -/D (possible-but-not-proposed-changes-to-the-working-paper) ->> ->> -endobj -14 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 138.868 391.16 300.29 402.009 ] -/Subtype /Link -/A << -/S /GoTo -/D (changes-to-algorithm-requirements) ->> ->> -endobj -15 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 138.868 377.351 197.26 388.089 ] -/Subtype /Link -/A << -/S /GoTo -/D (deprecations) ->> ->> -endobj -16 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 138.868 365.479 203.624 373.56 ] -/Subtype /Link -/A << -/S /GoTo -/D (vector-bool) ->> ->> -endobj -17 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 98.32 344.031 129.564 354.769 ] -/Subtype /Link -/A << -/S /GoTo -/D (design) ->> ->> -endobj -18 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 98.32 324.383 163.907 335.231 ] -/Subtype /Link -/A << -/S /GoTo -/D (proposed-text) ->> ->> -endobj -19 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 120.238 304.181 287.057 316.136 ] -/Subtype /Link -/A << -/S /GoTo -/D (addition-to-lib-iterator-requirements) ->> ->> -endobj -20 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 138.868 288.517 386.716 300.472 ] -/Subtype /Link -/A << -/S /GoTo -/D (iterator-value-access-concepts-lib-iterator-value-access) ->> ->> -endobj -21 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 155.804 274.708 337.235 286.663 ] -/Subtype /Link -/A << -/S /GoTo -/D (readable-iterators-lib-readable-iterators) ->> ->> -endobj -22 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 155.804 260.898 333.804 272.854 ] -/Subtype /Link -/A << -/S /GoTo -/D (writable-iterators-lib-writable-iterators) ->> ->> -endobj -23 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 155.804 247.089 351.515 259.044 ] -/Subtype /Link -/A << -/S /GoTo -/D (swappable-iterators-lib-swappable-iterators) ->> ->> -endobj -24 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 155.804 233.28 314.515 245.235 ] -/Subtype /Link -/A << -/S /GoTo -/D (lvalue-iterators-lib-lvalue-iterators) ->> ->> -endobj -25 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 138.868 219.47 356.552 231.426 ] -/Subtype /Link -/A << -/S /GoTo -/D (iterator-traversal-concepts-lib-iterator-traversal) ->> ->> -endobj -26 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 155.804 205.661 382.787 217.616 ] -/Subtype /Link -/A << -/S /GoTo -/D (incrementable-iterators-lib-incrementable-iterators) ->> ->> -endobj -27 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 155.804 191.852 354.919 203.807 ] -/Subtype /Link -/A << -/S /GoTo -/D (single-pass-iterators-lib-single-pass-iterators) ->> ->> -endobj -28 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 155.804 178.042 413.367 189.997 ] -/Subtype /Link -/A << -/S /GoTo -/D (forward-traversal-iterators-lib-forward-traversal-iterators) ->> ->> -endobj -29 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 155.804 164.233 454.269 176.188 ] -/Subtype /Link -/A << -/S /GoTo -/D (bidirectional-traversal-iterators-lib-bidirectional-traversal-iterators) ->> ->> -endobj -30 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 155.804 150.424 474.941 162.379 ] -/Subtype /Link -/A << -/S /GoTo -/D (random-access-traversal-iterators-lib-random-access-traversal-iterators) ->> ->> -endobj -31 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 155.804 136.614 375.647 148.569 ] -/Subtype /Link -/A << -/S /GoTo -/D (interoperable-iterators-lib-interoperable-iterators) ->> ->> -endobj -32 0 obj -<< -/Font << -/F17 33 0 R -/F38 38 0 R -/F8 42 0 R -/F39 46 0 R -/F40 50 0 R ->> -/ProcSet [ /PDF /Text ] ->> -endobj -33 0 obj -<< -/Type /Font -/Subtype /Type1 -/Encoding 34 0 R -/FirstChar 67 -/LastChar 119 -/Widths 35 0 R -/BaseFont /TEGGAL+CMR17 -/FontDescriptor 36 0 R ->> -endobj -34 0 obj -<< -/Type /Encoding -/Differences [ 0 /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress /exclam /quotedblright /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /exclamdown /equal /questiondown /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis /suppress 129 /.notdef 160 /space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi 171 /.notdef 173 /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress /dieresis 197 /.notdef ] ->> -endobj -35 0 obj -[ 668 0 0 0 0 0 328 0 0 0 0 693 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 459 0 406 0 406 0 0 0 0 0 0 0 0 511 459 511 0 354 359 354 0 0 668 ] -endobj -36 0 obj -<< -/Ascent 694 -/CapHeight 683 -/Descent -195 -/FontName /TEGGAL+CMR17 -/ItalicAngle 0 -/StemV 53 -/XHeight 431 -/FontBBox [ -33 -250 945 749 ] -/Flags 4 -/CharSet (/C/I/N/a/c/e/n/o/p/r/s/t/w) -/FontFile 37 0 R ->> -endobj -37 0 obj -<< -/Length1 933 -/Length2 2950 -/Length3 532 -/Length 3598 -/Filter /FlateDecode ->> -stream -xÚí•y8”}ÛÇ+Ä=e'E¸,#éafÈK–d2ö"û6f.ŒÆ 3£1È’-ÙEŠBd([¡’½!RÖn"[vy¦îç¾ïžî?ß÷¯÷x¯ëŸësžßßy~óüÇ•03—×Á“]@4™D“G( Ô]㳡‡@¡ºK#I§°4P @¨ª"7@ jJ(5Åã( KöbPnî4@V÷èw‘ - ã R8, 0ÆÒÜAOf –˜“qÆPtˆDàì÷Tà,H)@¼ð pÝ$ì»! É• ¨üÆûxý™ºR¨LS€,ÓäQ€iO&t…ÀLÈÌ^ ÓÉÿ†©_‹£}ˆD¬ç÷ò߇ô4Ö“@düG@öôò¡À˜Œ)¤_¥VàÞŒA<ÁÇó×,††%p:$7"Àÿ¨h‚/ˆ7#Ðpî€+–HÄAþW̹ý°³Ð;}ZÇèØûü‘3ÃH4 †×_U¿‹0âofN‡Bðìà -p8‚)d¾~9üÒK„#ã $æ…PFX -Ë€0o“”@ áA_ôe†)È4æ€9“‹€+™ù¾N¤ -ÓýúA*J ó7¡˜É_ÄÜ û7©0Ü_„`zƒ#ÀH?!3Kþ ˜×Ox€Q~BeFý ‘Œö2ûÒà?G~ò$Ù×_^I WT†ªÇ••ãªÿ[wŽDðö1§e8®¢ªü#Šó¡P@íÇgnóOv%0w‚¾ 2ÐGÆ©‡y¤VEêÝyyMn÷I·êk&OÞÔï íßMÌk3ô–{ßz£0Ÿk’mRœ¾%B® 8Ó‰þâ}-­÷ÛäçÉt¿G"Ö‹éÆŒ /ÉÕÐîÚªžåÏÊ»M_¿o/H²Éy–9ÿ|&ÛLö”ÅûÄ®F» •aHkt:ñ\dø}%‰³ŽAk»ë˸228ο›œíÖ,}þUÖtV§^còaËc)%¥÷œ¾È.ÿuœ³sZÞýZ÷*ÞËÅ¥< ã*±›J”ü$ºãåœA‘ørnµn®W6Ù+†.uÝ5¼ä›]–y÷÷ÓšR©Ù¯w>\TE9œ<Ý|¯0¶š ãCª‰]Ö+5ÀHuœèÕ#Çþ+™äa·`¢œ–¼ÚjŠá§X6  ¤"Âz$Hé¦?æõ/DU'Q^@ˆ7¥’:€N”޲ºT¤Ž<æ?;ë¡  kz—SVlmòûȃƒ²o.…‡a­›n¤7cˆò¯ö"ø+ôô@›“ƒúŸ:s^ø ÷ +Ašw@ Qt›"ýÙM -꟱ -·dÈ­¼ -ͬ}­åþgìí4És,¶½Pt*wèÜë7\…åK,¿‰ÕñæªdðÕji;ªÊÕ,èÃÒf¡·',pŸ½ üÇŸªN†ð%c…^@å«6 -ñ憆–1Òž•ÒŽ¡:§dbӪʃã?–¯]Tì#¿”zµÀ)GG8¯Ê=§ªñîA)vºoº\ÎM¥ë®†HÇ8ÒÁY)Õ÷¿}†¬O>Pà -nAh8$¼jæ:¬¬ÆÖPOÍÒÚôVUÞé M­È¯ë°=x, èÁÁ ÌÓAŒ§à‘Á‡ êv/ÿ9-D³ËéÛ|S¤{ºñba.Ï|Kôã"í©þãUœÆe(˵üžhy[]}^—JN?ôãõ-½?Ö?Ñ(4-ˆâ®†šè‡(5{ƒ…]½g´÷±«½%—MûnÄCÃSw¶Å~+ˆ^“©=­´tw‘µ îã.®pF¼ðe×|Ì\”µ;èlg |am’œûêK YùNìì‚Æ“vÿrÆT™µDÛ&y>ÄO¸/Ëû}zbÍà Ÿã¾æ“à)H|ž1žƒÃq{æ+’k÷­džÃáƒ_D8_£*ÄÅ?âa§ÚÓß”gΤ¿µrhŽ2›ö›E”œ G§r'M4J¦Š‰ BªÇ;>~*]J¸9ËBµ†ÏEEÎ ³\·TŸ°R¥ójyy7D©ÕbŸÄõ©T0tdÆ"$®k‚•ßZhˆï\ ˆ658Ej<"9u›Q'«`ÂÄm¶iØp_^ú -G¸8çÔ!;’_´þ -]¬Næ±{Ì}E$#¿OZ[ÖÐNtJº·k©÷½ÐÅha¾¾Ñc§»Íù«ÞË›ÓpXÄþÛSF¾ãWL—5$¶j¹Ü§Eõðø¨#…öN:D–>“áÐê‹>yuÑâuUÚú!@ûج65ä½*ßîÃW‘ÜH¥ÚQïó]½·ÙÆ=Ýøl .óN3 o+¢q©Ù—7NöÒÜrX}½YÑ9úbaû–îU·e“ƒ¹¨ë¯›'ÞX–˜Üâ°9ÄùâfÝÞˆ\ 7ra/ŠUóFtnÉðK¢Ülü»j/z/óĶ[m]Óæó“RÙrÛvë)WñwÎBZ.ð¡ ²u£„h)—è–ëЊ!t‹Ìë*O‘!£­ƒb®\KRvù»pô£Ã…rìy^yËŽó׊2‹N)TGtûPv®_<[Ü÷^lÊvƒW¯DŽv¶ÔùÝ“åë1:›¾ê®˜l =+lCu’R5smä[?-—Ú¢?øAåI’.Úök†×e¼qyüRjÅëa -®µ LÔF±©ÕP®ï°+2‰qàsUv$øÄys?±ì@[ñcaH6…^®P‘€š˜Òô—ç3üºšD/Á¿mM½ö¬TPý\PË7Ž­I9ßϦ>(¯(Tí:Àñ¨îZ1ìöýs~¤¶ôµóŸQ99ÇíÑ,,ö!ö¹æG Ü7²ré -¥˜ac¨çù åsÇÓSRϳ®5öVª:¥¶zâֳƚÞ¾šþ¦Úb:/‘’Ú!®UªQôñ¿ìéSù÷è˜S÷sQÝv¿‰ÚÐ -‡µÌs-Ív&ƒƒ Žø[Ù0ÄD±s#j:²“`Úª›| "¶TÏ ®!³ÄUõ›‡xtݺv¸KĹt£’ZÇ÷Í÷%ƒMÑ;®~ù³—Ñ=»¿°T›×çHºj^aç¾{/M“|x2Ùþ·–†Ò@ýÄAéµ:§êß‹/›7¥û—‡öû²¸Ðòö¾ó¬VˆSò›m(mެa1w+60p=¿ÌÅW©[5\’ev*Œ5ë­‘¿{§± -2_äe-ššï¬n#påÊu©¥ÖÙTO¬syüš£L{cK@Mîu1ûœÒ>­ßºµÅú¸4Ù$9‡j âürÒ‰A~Ä!JË觉>-‡ýz®,sRZÚÁ%ä°¼Ã|‘ÚÌC…ôtnº#Ý6štE£3¬G0‚Ça+?.‹ÛÝþ ï¨ ¡Ü>kɳP¶°RÈ{ŸÅ¨×)•n*W–†ÁÌü-döq½þÃÖ|¦6Þ]Þêžu¬Ýz÷ƒ¤îzd²å*”,Ùs¢´Cž#NìÅåÍÞþô1ñâfÉ¢š¸¸Þ@çÆl¾OÐ@† ¿Ñ«úb•Ó[H#ª5ŸhÔnÀi'[$¶es¾¹§üÐáLÙkŠ¢FMÔ.Þ†t^î4ôØå%ͲÎ7Ú›[×.º¥ØÆJy棭y¾ 8JV!°=‘ÊG_Ë•ï©nï+ë) ÒÝÞ!å - .ôX“»ò¸1Ð6Í2yäóÌž´¹Xß4"³Òɾ`Åp]°{•žó]À0vQ\ž7™ÿ.¨±XÜ""D‰Ml£Ý¾1ÿk]A2ZˆÜ†¹ZÆáa‰Âî‘TŠ–m§èÅ/µ"T>;}u;)åáV!~øÿðüÿpDK¡‘=±”ó`Cüendstream -endobj -38 0 obj -<< -/Type /Font -/Subtype /Type1 -/Encoding 34 0 R -/FirstChar 40 -/LastChar 122 -/Widths 39 0 R -/BaseFont /YMRQIU+CMBX10 -/FontDescriptor 40 0 R ->> -endobj -39 0 obj -[ 447 447 0 0 319 383 319 575 0 0 575 0 0 0 0 0 0 0 319 0 0 0 0 0 0 869 818 831 882 756 724 0 0 436 0 0 692 0 900 864 786 0 862 639 800 0 869 1189 0 0 0 319 0 319 0 0 0 559 639 511 639 527 351 575 639 319 0 0 319 958 639 575 639 607 474 454 447 639 607 831 607 607 511 ] -endobj -40 0 obj -<< -/Ascent 694 -/CapHeight 686 -/Descent -194 -/FontName /YMRQIU+CMBX10 -/ItalicAngle 0 -/StemV 114 -/XHeight 444 -/FontBBox [ -301 -250 1164 946 ] -/Flags 4 -/CharSet (/parenleft/parenright/comma/hyphen/period/slash/two/colon/A/B/C/D/E/F/I/L/N/O/P/R/S/T/V/W/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) -/FontFile 41 0 R ->> -endobj -41 0 obj -<< -/Length1 1533 -/Length2 9126 -/Length3 532 -/Length 10026 -/Filter /FlateDecode ->> -stream -xÚí—UX\Û¶­qw'XáÜÝ!¸»[áNáî Ü îw înÁCp— §ÖÚû¬äìóxïÓýnU=Ì¿1ZkÕǘó«¢&WQg³p2J;9‚˜Ø˜ÙøŠâ:l¬6fVVq$jj W )ÈÆÉQÒä°ññ±¤fà ð‡Ÿ‹“Ÿ•‰ áäìíjce ÐIÐÿ5‰ ætµ17u(š‚¬` sS{€º“¹ äÍ ³·¨ýµÂ  tºz-˜‘ØØ6æ €ÐÊÆ‰å¯L²Ž–Nž•-Üÿ{Èèê û;&=ÒÂÉÑÞ`´DbQr»ÁYþoÄúOqiw{{%S‡¿äÿîÔÿ7u°±÷þ÷ 'gwРèdtuüÏ©ÚÀ…w²ÿ_6² S{s1G+{ €õ_%7i/ …Š ÈÜ`ijïü»t´øÏàÆý€EWQMUVóí¿÷ôïASG†·ó?²Íþ›Ù~3¸;®6^}Vp{ÙÀÁïÿ¾2ü3)Gs' G+;7ÀÔÕÕÔ |zÀÄðeØ8Z½@/pbfG'x Ü€¥“+Ò_ÊÉ -`q6u:Ú-A ý«Êöïê¿¶ïŸ2'€ÅÜÉÁÁôw… Àbííl tü]â¯ﲓÅï€ÅÍÞÔÍúŸ -Øäéô›yÿR¶wú-à VûM`QñßÖ“øM൒¿‰À"õñ€}¤€Eö75~XEé7U”ÿ!^°ŠÊob°¨ý&°¦úowHã7´~8µö?Än±™«©¹ô?ZÏÇñOý6|÷°ün<8®ÙoÇ5ÿ‡ØXÁy-þ@°ðç·üÁ†V øXÿàm°ùÁ¶ö Ø×á7‚Ï8‹ãöuúÁ¾Î Ø×åûºþ`_·?ÜIÐî…ûNåñ‚SyþFvp*¯?œÊû§òùÿ÷M,.îäåËÄî;øÄ‚Spø8¹ýÿçLMGw ¬$øP³²ò€Oã_UswWðíúûÁ ~Bü7[Ú€Ÿ'@ ÐiyÁÉ\ Ì6­1¢4@êóT,¤¸US¼R}÷lrèR¤ý—y†:ÇòLl´}Ø}2Ï'"·¨v?Õqé³`—øôù—}“ýLŸ"ËLEï=gŠ»Ð#ô¶Æ¹ëc.Hå™ÑÒdÝÂOçƒGù*t’ðkä=ú =YaÜ<:Ò™öš‘áu4äjé.¥ï9#×=1’aÖ'Cl#šß®^8µ»c=~FÈKz1†x0‡‹Žv{ó~„ŒºrB$âß²ÙÀÃÄÇÕ±“sP‘ÛXúuB‘¥Š¨{OïûÛ'i /Ï–[ÊÖÒÇÉõár"ÁÑnÓø%¡!­‡ùΗQ¦šŒ´K‹9„x'`Z@òð·Ø°ÌºCìäg¼Šñ„W5¹JW³ZhÕ´Ö©¸†qÍ™›ÛÜßuñà¶ö†D6D≯úÙwI4:í6[ùWŸæ'¾…©½† *³ö©tXÝewQòÎ~”]Êϧ»bަƒ¥j»ØWšUïÏE:¶Éto¦…`ÎM q¨¿•àˆ „øÈõ!Jî1iù…™ÿ Æ!á[LäFàþئr£j:ZÄ4ñ‚ÜSÈÚs"|³Îæs·ÏKÂt´«¡¶èü¤z%ºÖÁL«Ä{þáÍDOÄ8fñî»èÁed³O‡ž¬Tú?~€n¡PI‡ÏÖü ¤[ÅÃÝÈ™[ÐU{s-!¬t6d$’Îz„`àÔIcY¡ÇÃtIÇ0™;¢¥Å‡„ê'—qÌ#ºä6yÆL-9‚-T¢«8eóV±‹ ¯üøKb?šäsç &A»º¶þ%-ÛÁ‹7g¥‹^Ÿ€!·wSذ¨ôþ¸ ÒÚô­M­ÇäŠc]ˆa¿ä£¢©~w°Û+lÇÓˆ<æ ªÝ\èsßÃ)*}i!`Þ#Í·’Sz wÔ¾ 6É¥ŸZ²Á¶•¦¥²}Å”å_Ã3`“.‘¸ÆíÐó*ÃU'vÉLûl¥å0òk8ÁD0³Ú hà—bPu1r¶k˼ï?«yW6X¡ê¤™§íº9ùn¥û‘(Ú‹ôkŠÍÎÔ¼âÇÇïW'ÛfÞž¶­¸œ¤âûÜŽPÁÎ!NßkÄe ÃP0Œ£6^]ñ…3ênÅô× Ñ,H+âmÎÚÉàÈ9‹/µÈ³uÞu/± E˜c-›ÇÚD]ÊH XBt -jÈþ,©pA¯ÜU®½Y1©ÕòH¤räÙÔºÕN -ZKf}¤ËEÅé&=U?P.Ípô³’TÑßç³Þq‡<°XO&ö.VcÜêÈböG^ò™xº†Écó{ÈdN& ö¸ÞÇcuhøŠBï¹»Ø!"J1à ]÷ç-µÈŠ('—)2™=SÃn?wJ´i'å»êÔÞUÏ$²åÁã±p8Þ±W{e‡Ó› -vXÌòØînòok¨´êÅHã1‘ø°:j{…ï¥ró7‡¥WŒúyÀ¥î+ì qA«=r›°Õ@µ^¼Ùw Ží:‡ã óIhHwÄ7-/\³”ÝK*LŸüÁ÷ Æ®²ÿýš :5û¿}“„Qì´¦æöþÙD%•jrw5u˜ñ©‘D<O‡>—Àú´Î^ô<ûiÏ«óü-î¡&Ý£\Ý -k\‘ósDQÝi§9ÑS<µ7îs‘>XýØÅd—ý̪ÁTóÓÍ×5å*åѸ50qX«Cpd3ÍRÛÛÂxA5;èxóX«œo›¾c"åšN¤ÛWe£¯Û´íçÅlHÍ@~]äˆÊÁ4™}Æl&š¢W)V¿ê79GV£oˆÕIܦ¶Z¶êEºÁ>99ºA1].˜¢ºc*?án¾ ‚œù>oE@ÿ€*IúxS5ˆÉÕÃ¥›Ä¨.'†›4ä2ývKÚ;Å$¶Þæè}N±¿™\l¯‘Ë V¾Ë×8‘Ô¼3éÁ]÷-Õ¦3øyúGV~ˆ)ÇhtÍU8¢s -l‡J3)¸=hi)6>QxÂö(1T}¦°l¤.ûAB7é.b`©_Tëá&¼”OÚÔÆãþ¥£ûÃÍFoìÜëÆ„ ÊKÖÃYú»Ñ™"5õ;šBgyƒ Á/ë.ï‘w‘B>0†º3,윱ìx0n.¦ Ôb„²|ƒ!ÌY#-‚Bj)s›—>Ð1 î*DÓ¿acÏŸ;‚¯sͦˆÄ’O%\ÂEí ‚@ZŽ ˜¦ŒÆ_Ýeåë8µÁÂÿÑk¸µ%üÄÀrs55QK!^ë†dDb + ˆMÿ r¹¼>Xæ‚!Á3Uað­n!úÙ~g÷CÞ%¦—R»"0.ÕS?Y³Áˆ#«¸ûa‹ Äe $ᦠKó¥íWA‹¡$ÊÄIS+GäM¯|¨÷{ ½âúlžkƒž1dô 5K§ùXo&Á™;w‹¡^_ÕÜ~µæ×2AíJh$|œN{¡f¤Ñ,këH?ã¢ÑïÝvÍ ë® úæ¿6¾¨qÕ˜1x8|L4¢ ãå]îÖñ›ç~wþá*.ÃAÎ$=u¦y#Zd–7¯ªž^xÊžUÀ \¥—%íÜŒñ}•¦9| -_¡õè ¬|ë õ–kfì66“ž¾¢éÍ™Û)R¥³Ìû­Ú#•ˆ8Õ·B‚Ê‹e•eq˜V'¦HÔ­ü¼Ã\›hý!ì«M0+TäT56ëVñc.²µZW\ya·¢Ö±Œ¯KŒkü–’òQ"A^pn£~ľÈ"Ûw¤*L …àWÔC?Àeà¿S,àd7cr›"SñÖ`¡¬#¼d,UU³Ö[¯'?G‡Wx¡FŸ“‘Xm*|÷Uà]È—JÇs¤É$6„+\ òvÕÅœí”`ñB ™ fÃ¥·Ë/ľxTXe´¸30ú*1ð¡ö>ûÓjL.±÷*owÃ3ñ­ÎÓšSc•˹iùïS¬ŽhPZFÚ>¾ó9éõ€$•ºÙ¸ó£üš[UFý²à:ÝÒuÍÖ? -úùúl¡¼Ÿ®ôœoCûjí…ââÞ['ßɹn€b!yÁÎÅ£7œxËw›/2„¬„n’g²}Ôo#oÄ5t”)¸„9y–3&jò= µ;}¨jŠû6ÈП=›A1š5uo#ÍW¼ä‚\ -ð‚úÌÂ|-|Gó«ÎísARα_r°°ÂžãÎCÀƒÿaƒœòÙN¾D\ٸ߅›ª - &€“ý®¢ž(Žî-öM\ÒtoѱF%ä‹÷››~IÓªúSmºˆ3]oœïȾzÜeHSž¤ØÎ¹Þ]»³¢â“|;b¡p~ÐÏX‚!¢vŠ£Ç4Ö_®¾0@ÂMÖª~-씫|£~ä<ç1oezĺ<Ía=÷uÁ‘Œ€ÏR‡¢Ú°¨CüÜjû 4x´š+øR¯Ì:S› N»ÛµÕ)ý…Î ð 1ÅU£cRy) -7Ù@HS»ŠÝƒ~Þ¯Šœ :MYœèÝÊ¥î¯7œC™ô¼ë=CuWFþ<'?\Rí…ûúãm(cœÈ˜ô){øV:˜Ìfºˆ¢JsTƉE‹pÍÔߨÀÈ蕃œÓkQ› - ~†bßy ïi™‘ûîɼI°!9kE!ô¾ºÊ,kªRDïrCgY^óO°ó(K€èjWngTƒÓËDâi›n)’ÇD¸TR½öŃþ¬ZãBí‘ï–¹´\šp'b’¦³¶õ$kØšÚJ¸\Ó.×µÈß¿d«Òî ‰ŸFóÙ•á9évJµZø½Ä -Âyíf?Gˆ–ʤi­iì€'Ò.ªèŽîˆÆÀ¦MŸñåµe¢’‰gyUñ_ ½…¦Õ“FÔ…Pyàø¶ -…œJv²V¾£TÌêËRÒ…Ô±êí’P÷#¿h„¼ÿýñ­ŽQ6º|Î7ŒÓJé¥nõ›pV3¸òµ_{¯ÐíÉ0ì³,R~B_<¥Û–ì¶æC¬³rr#Z‚GB±z© È*Ï×W<*1wÐááµsÑÖ_°Wüß)9„èl’õE Ï!^!<Ôòty™ ߩ֙j®±çÈ(Ïv-²6:ôW߉V*µÜ„U‡æ^ }¡ul“©‰…¸ø+³=a›ãHû;÷[ù†~ç\wµÌª¥Üz×è×¹¡ûܹ¿âZêžÌýÓJnѪA’'«cN0φQ¢aJ\²ÙÀú>"Ü«R¾w ·5Àóè4HÐHñÖÖf2ö+àCC]b‘¨#©l,"/ö=fv¸7`ZáZÑø&ÉD(™uÉÃN,ZÒšÊÑîÕº/æ3â~ŠD!‚ûDý·zþ²u;eĉ$î9Ú⽤¦óªi‘&óÆ¢,,VL -iÏ›BÑ#lîšVOf[ª/ü튨t뤾È×ÒÛ-UÊ w˜C q?¥vÁŽÝµÆ Å„¡ÖV(ÂM* -¹úàAœÂÚжòȨ́¦hˆãŽ”X9ï &æz>®ÙïÍ›"”{•ô¼nKÃ4^±7†&êÓroàï3Í•? av¼¾vyeñ™[µq2=Do  »Ü¬éص—$$ÑÍôïNf'¯€ú^ ]p{ô™`%æ.Ú³ì¯ò U1­ÒªNzF~R§±ÖmI"ÇgK)_n„i– çÈ­ !Ü?ùÁQ>C?ëIñB ÔÓˆUH¾DvE@×#35ÑYdL¯É›9'ËgÏ‘õ{Ë3fy/]Ë4:Ö貨ùDM= ÷ÁƼÄÛìCâ4¶–)H¸½ öxÕ÷ôzrÁq¦¿ÁÞÿœC8e­ ö—Õys÷—q='ªÀ<ê‚=¥jy|ÄÎÚ¯r -º¥ò^ÈjOˆh²)µ"’c‹lYÊVjFƶAÎnËðg9$Ëò˜V+þÄWËšêÄGú±ÕSn®Â­^ü­µµ—†ÒúòëTŠÈ0˜GÒ›™¢bcÜÞünU(ÁD[„Dó$øÎ'P»ÆÃnoÞ,¼@ÕMs‡ÕêÆ­¤ÑÏ -èîÞu3Ç’ÝÅ,†¤¨„8t÷/£Ë^i\pÔq}רqß÷9Ç“Ò`Í·-@«´èb>/W@±Éìq¢C/¢l-1Q˜k¬›Ï¨r¨,ÃÙžf·/ŸÞ·ž‚ìköº2¢¼Î#¦9ͱS §Fý™Z2Lè’wáûq„éÊ-¥<> üH;öÌ.”ÕU«Ÿè jí^‹%«C"R…ºPKÊ|ˆASsœ§0-ÓÝ·?B')¨ ®¿O±øÕšÕS!Ñ;KgœÏq†â¯’+RòAn›b°À0‹þ¬¿ù`ßx#æ«|•¸ž‰Ó ˜õóñ~YËiâ¾Ã¼æÌJX®þô¯-?’/Û¥ûè½\Âï½»Ó)hï†9Í\ÞG²RŒzëù²Îç.]‡è&ìIÇ<žþÛîºúYÖí²ŒÔÌR£Gúrã,½ŸA(±]‡) Ë8a'üc%?¼“­KZk4Õ0ˆ1×ï®Z{Œ¬Ba¹D²îßa¸šÔûç²ÜÿhJüñµõBö‰÷Ž&u±jà-ÁÜÏ6îýx»3å6sÖ*â]ŠMnö‹a^bíng·D”ÕÆ÷¯´³t·#Ë”åb{ð?WD‰>ëaiæØ+®WV'¤7k›±vo);Ò²ÁT‰Èg»ŒÝרö÷ÃgèCd¼H+€Û{ÈîÒ-Γ3ÒdÓÃènñB¤ÑDÜÍ ê)ý⺘=úº,•.ŸñÔêÐ7e_¹:âyå t¦qƒú¨«Ä’ S‹¾ë×]ž×p'}²û²Uò¢QžÏig“àÿÒ­ñ†åF‡t§¿ãíÐÞ¦á8ÿR1Å8€ß$Çk͹Ö1è •ÅeW”²ª5íÞÝg¸u:—‡õL÷TÒ¾]SPj Ñ5RI‹’"²‚ÁךG¼ ?Ãä'w—AŠ|Ç6â[nA³ÛàÁÍ0<óýt¯îÂó!j) ÙºYÕëE¡ƒ×!æÉï3gQi|øTPèí\3ŒD¨Õôéµ ®£’ ÒÄÇ¾Š±§áfàAåîI˵À´Ve3ÃSiá2ßž8 - ©(û0ø>Êe#˜ß÷W&÷Dâ kC"@HGJ×Ôfókaoj•™Èiÿ’Ƕ}ƒç(×MmLå@ç„n£â¶}”,v+@ŒO!"ÐÓ<úÃñŒ+娆?©;„œêó…Ÿɼ*¤L7ýõ ÂMµ3•WZ~ÞqsZ/‘‹žíº(4ÏXµÒa“‰›j«Ìu¢j¯X±•þGÀg4Sß@¬Ð7‰¦ü¥e?4Þ/þ€­2‡£4Y>ãT<]ø Oòó~^'´Úc$V/º7y˜Fz‡:Os0P3¢Ä»öÛ‚ØËá¨S¹×´óYÖmWí€Ì º•¯Ñ¼¸~XAa`Ç6¢±ý§—ë=G[j?‹˜wÅ,vn~bì*Õ¾ÛØÁQh/mbNÝ_ÖQq ‘&–Ì­ê›ç1SÇÓx¬2§Ø®í›Öþþøè¬Ï3Žb ®Ž©×Ov\rÞQÎàëŠ&ÂéQÓiY˜2ج¡$úgêPÏ1 åm´O)U‡1¤'iã8c¬Ÿ{‹E=ˆ§C¾2ֿ׿“H5)Ò?At³J`³Ulâ’/ÛÌÔpìœ –¦F9Æ"ô-¹^Nfðƒ¿Òà’›Å…¥[{ßÖniöé´6SH:‘y^›¥Ò[°¶ÈóÄîtzKEcÓ¶Æ6~ W³ƒ“ -o~ŸYJm­àB¤ŸmÍ@z.W/_Àæ9$3Ê#†ò€y<5`ÁCƒߥÚSF¥YZöÔ‘ˆÁÇ0[ì0÷‘ ù@Õo$XCG~,6¿²©Üe1Ü“Y.Oy ðè6ëIß-@ç²;JÆyn2…徿©ôÌ,C9\÷Å`”.#¶€à,O а=e›¸|ïCýöNç… å¬dI{§Ÿ2š&åC¨ÚìxXó2lëηe¿Y(’:Êà1aÒÄÆ|Wå‹üpkaQz )Ü!Â=°%¯\3F—ßGù+kFÒ(u𙌠ø…iÕÝ&vgíV®ÂK èÒÊ3V±‹(!Îı>M¸LM¾6?ÕfL°Ç—ç×:RË ŽôSQîǾózÉÙ?‚ÕÕáì?Ëi‚€ñ/qhÏU9úR²ÝúMeÌ?¥zO"°2»º#MR‘âÃÒ½‚œI¥ýãⲸq2‡PÐÔTê½”RXæø¢­ùꘛy4¨Wc¨X¡ãn¶¤Õ×Ráï Žj³9M_k¼ˆ²‚ñ|ÔkEH#®§^êå|I‡4º¶7™H¨ª®H‡WAZ½™RsÉhÙ7Y°¶{|Z¡Eo7Ä ]çAü³šO‹gЮÐs'!Îù±žÄíl º¡Œ:fW\$E”<£²s¨O³ZC@æ\õ!'ohs¾Þ ϞˋHé‹=»èQ]ø2Š|p“ÎäšB£—‰±>g}å ºê†+B£_KÔ½º~,8 ø*ýùžËl³ƒ^6­' 𮥜z™ Ù~ÓÚsXؾLFu~€z©¿Ã~YoÎi‡ÜaZÑ$ÂNÀÄH#n‘gV-Éå1bõ–õ~þÑ›Üä¹M3Ó“KÄ]óIFà1ÒÈ|],â*ŽsÜÛ®Ì#:ó;Ó7GN̓Êê[ã%íAЂ‡ïNK:—†t;¯ZÊÓšYMÙ1ñÇQG7Ý5x`²± -ò–á -lM••òš'‹h(YQ$õ©†É^gQÔbŸ·Ñª!•@¿¿nâ×$MÅNJké¡þŒõo‹+/>£Ìîåå)Fß=R›X/hÑ_à¦õ¯É°…'ȰüR•P±q>ÙWÔÈcÃó7á£T\—"-ÆØCd»äØoh´V½ÀµY”"ß?5ܬP•lùy?çsWoFP»ö• ¥¨/I’Žg"çØÞ'¢%ÑÁÕäÍapŒHj=۟Ͱô-¤¨#W¬¿zè[@ïNRj¹é¢fó›ðô'|¬‘¨ù1L‘ˆl²[|Û¶ôÝS‘dµRø.û©‡qÄ–çòw]ù_ai¹÷ùG1o>Fý’ùŽ0p%Îé÷åñÛ’`q.9튛þÐÓ«B>«®{C»¬ñû°½ÎÀ Äi†¡q6Å]s& Å9"nyWɸ4—ÚŒqOT¡ñôE@aV¿1¥'Ú?#IŠ/MÎ%Z‡–ßÍ,ŠÅ -l#ãÄËÍî{µ%]…B#¡ô ‰/)5ƈ” P¾Ë0ZUÁv,âÌz¼ñV©^t±3‰)C"o ÄÎÒ„›¤ 3g#2•…»e³iƦ*b£½ªüü‰Ï¥ãY†ÊÉäÓf 9Âk[:^¸¸áqá»MP ;Z"™‰Ú•PU‡¨° -ù¥SosØ+à—+³‹­|O,2Š#Ý’ÔÚ7Ö=$Û6’çÕœ ž¾(CÎÂûøãŠÅä¼Wc¹ãÔ¨ÈÈ÷tÎÊ#æè®qÕ2ÏÜÛO—ÈA‚ù «õTü°"üô¦¦Qì|¶ä3®.й} ^uÑù¨qwáíÇiÜi Æ|\›;”fç XÖ£o2âŠÀ\O]m¶ã8¡ç¶xŽâøèeÍå û«M]LÝ[ŒêNéUîT(ËÞª/, ?2G(ÇÞ6éÀÅ/Úhfß=í}-†VuÊÄBªð‚Ì?ÅAïUPL<…êõ¼ÑY¹ødúÊÏzUJ†ŸâÜçpw 3ª \äM Ó,%6?‘™;|õÌ ¾ŸÏÉäQ*&•vGö´ÈàQú®·‚†HŒÒÑ¡·œºÈ\Èò¹Ãg=ÇàT·U{Tj> ±Òؼ ¹Y ι0¹{P×Ü­·+ë‹á…¶LäoR˜xPw]`M[³!V^[Ÿà×ÜÜù¤¸ÆŽ•TƒÜ©¸øR¹:›š\¤ˆ -9Àê~ë;^¥£¤ú¹Ëªh<¦š—8æÝ«0WD+,ÿ[ÛùFsã½ÇÜH_¨¤‹Jâ¹E.6i ;±d3#âØDxYóß•'Ô:'²ymÕÆnFÜm#ÎZÞmP ÆU}ðqPþ^¦1ãS¬7±F—;> -endobj -43 0 obj -[ 556 556 833 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 278 389 389 0 778 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 278 0 778 0 0 778 750 708 722 764 681 653 785 750 361 514 0 625 917 750 778 681 0 736 556 722 750 750 1028 0 0 611 278 500 278 0 0 0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 ] -endobj -44 0 obj -<< -/Ascent 694 -/CapHeight 683 -/Descent -194 -/FontName /MFDKYY+CMR10 -/ItalicAngle 0 -/StemV 69 -/XHeight 431 -/FontBBox [ -251 -250 1009 969 ] -/Flags 4 -/CharSet (/fi/fl/ffi/quotedblright/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/at/A/B/C/D/E/F/G/H/I/J/L/M/N/O/P/R/S/T/U/V/W/Z/bracketleft/quotedblleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) -/FontFile 45 0 R ->> -endobj -45 0 obj -<< -/Length1 1992 -/Length2 14226 -/Length3 532 -/Length 15322 -/Filter /FlateDecode ->> -stream -xÚí·eTÞ¶ö‹Cq—b¡¸»)^¼¸;ww/îîîîÒâîî)îîúæ¿Ï9»Ýçýxï§;n’‘‘ß\s­çYsIr9EzA# ˜µ#=3óg€°Œ3€™‰Ižœ\بïhfc-¢ïü `ææfˆ @@¯ÏìlŸÙYàÉÂ6¶nöf&¦Ž*aê’8‚V@{3C}k€Œ¾£)Ð -4†¡¾%@ÑÆÐ èèÆ´´(üÓàtÚ;à™™Ff†Ž ‰™5<ã?–$¬mœÿ6r²ýŸ&g ½È€ê_6© “F6Ö–n# 1<£¬ H òòÿ†­ÿ=¸˜“¥¥¬¾Õ?ÃÿS¨ÿ«YßÊÌÒí¿l¬lö# ½õÿNUþ—7 ‘™“Õÿn•pÔ·43´6±˜þ+dæ fæ -4’3s44ë[:ÿZýo ÊýË£Œ˜ˆ”º:í­é¿Úäôͬ•Ülÿ=ê?Éÿbæ? ªŽ½™+@“ T^fP"èù?Ÿ´ÿ—–¨µ¡‘™µ €… oo¯ïÚ= bx0̬€® +È0#ƒµ#¨ T/€±=ü? ÊÌ`46û'ö_È -BË?È¿šYAlçdã42°ü¯•ýw ÷·üg˜ Àh«o´¶ÿeþïèÿJ‰ÛZ:9ü €ä m¬¬ôÿDØŒ¦n¶¦@ë?!P/¬ÑŸ'€ÑÁRßÁôO„ Àè´·ùùµ±þ›ÙAF]þ´³ƒ,:šÚÿÊø§R6NöÿÔÊÌù¯ ]вý›Af€Îy-#ð?æÌ²jmö·®ælióW'2ûÏ(È ÐÎIÿÏbq€äõÿŒÌRüC e¡?RþC I‘?’ý7q‚ê"ö‡@¢_ÿ¨"âT‰?2#ù‡@êÒ¤.ó‡@겤þíßÄR—ûC =…?ÒSüC =¥?š»ò©«ü!ºê¿‰¤ ñ‡@ó3°×7´:þdžݺÿÞ÷ÿÙÀúïÿ¹—AwãŸmË š£ÁÍÑðÏcY0ú ÿYØ¿ðŸm÷‚MþBдMÿBмÿ:ÌL ‰›ÿ… O!ÈÔ_G äÊê‚î+Fë¿äÊæ/¹²ý A®ìþB+û¿ðŸsð‚\9þ… WN!È•ó_råòY@®\ÿB+·¿äÊý_øßÇBB6®ô, s zcú§êÜnn¯ÿÌT¶6³sJˆ€î&&NÐêþ5t²ÝUŽÿú]öÿÃÆf ¯ Ðh¿¼`cÈhžÜTê-š?UM.dÒ#[ß5ÛŽ° nY4"eG³^§öTž†¼½Gìò‚ïÖæ)?.vîg“2ÿ¶ç¬·—æÞНv•&ã¶kûé>àågÓÜÍ ;ø·™õÑÒõ‚þÌ‹ã\9*¥}Ø_$`ݚΠÝéœjbi–ÊÁßë(XIPSìJCØ‚×\Pâ Ö&¼ÍƒáZhW/mڜПòárâß´î±¢Ñ ÛˆY¶h0ö¿œ”£¢Ô¾÷ U ¤Lí{Ð+p -#YAÕ™îEu§/p&DCdœÏéZÛÔH^É9´×‹vtYiuM $— -™.âòm*")áÜߎIÜymRñ>d›¾çž(ñ޹‘*ZÔÐ$H­æ¤8ýiéS˜îÌÈ7ʽá?Ù~Ix÷pHÓô*r€7ÛF}2¢~ñþf€€Ò7À+w˜…“ÕH$-Õ§€cÏH%pù[(Ê¡zSKCn6BMæeFF ³“} ÍÊp]@¡¸R±I0ÏÛoÇ/Á5p‚Ý_ëKnW"|ð§²çˆâr\ƒᨎ6ëÆ´#cä!¡“Z´Ë-–NK8‹/|ªÞl:¡~­^¤œäƒ·T™¢¡¤p&íú]Â`JÈoh:A±ä1½æ7:ip5î'Ó”w“Âä|L}yÀÍ´kY½I”ûq”qÙêÙ98–$5þµÉèuHZ¤¾¬Šé /ã@µ¿ýØë…R# .Š¸Ù†uv¶1nrýÂs¾´Ü® DaT´‚T¡¨}‡7[dÌ °2Ôbê²8¦t°¥Þý¡ÆÔz&@ÖËb>sýíkãWî†òJãÔûiœ#iÉN«2°ÔõWö$-C#7ÿð+³“!wZ‚ˆJKצ]ýØäÚÁ–E§; üCõé;v1~;“,Ÿo¢6.R4o×K<Œá©o(?Dê'±Š0¾å掻òñ7KNìœÒÍ¥EŒ·–ïƒ,*av7 Øf`_ü‡ç–bvàqz«*F='À˜3a\ʬš7Éäc¢“Ì\Ú#"a_Ûo¦ÔDd½¼b]#R=; EcLð¤<òÇn”^ŠÒü3ó,D¿#grjuÛZ¶7QMê‘gÖèZk¬˜?s -+BÏÑ4aÆY¼Šl N‹@Ÿ¾#`J¤ÏÐ;¸)¼½1“ôÌ™ç ¢šâ—&#}¸<ú–«b‘´E$)š'¹rbxG=à<›""‘û˜Ò‹[òÆ15Œ[DŽÂÓùƒ˜ßø]ÑœEøËC;µébÆåç©ÍñyŞ·óO"Ü’³Ü÷†·Å‚y©Y-HÆjpHm5nCk\9 !•ÐÞ8ʵeý8caBaBF5ûЕÂ}Žs"÷©¢öTQŽýÄd?õ r¸Êý<¿¶8Äêã»Ä…“Ky( º´9NÁ—®<ëã9QJ[ÁHÍ | uéšÐ<Œ¨ù« ó„om¦`]xóµïñù¨ŒxÉI'ȯÝåv3ª—3§W‘¼+E¥1ÄdîÞµçH¹ÝÜw«Äl•QºÀ¹­p8ä`ë^­)¨4èÞ¬‹“€ydÃ~¼–§Ü_ê3ˆ¡ß£™gÖ¯=Z[X¿É¡ ³2þÞ~‰ ’;rÃ.¦x$«^úÆ(„õì¦ÛG8ù ÓºMHMôµLª¥KËÅlƒùð#Ê(Ïէž9ßãîcn=êñ=¬Ê|“Jû©ReîÙ4®#ÄüI4Ò{ظIfͲü𶦑x9òk^ޤ•…œÊÛÀAüQBê]Ò#)¿÷ ¬k€À§Ÿ9¥âüG]^jh&4HÆx±ŽþÛ?8éçvu] ?ï}¿&þye"/xý,¢:F“P{_W3©„ð3$¸iÝNgUð¸uJERÌþ–Û#‘ú#ÁÉ®u_ÆhèTuK n37ûþ®«a²ÚóJ½¼ÛV©¤xÖoJ屨LIÑ1Ò°>CfÈî‚Ã&×´ë §0É€C þZóþü›.÷ó¤[ÕMcÖ;?Rí;¬&¡rº!³‰F@~ŒJ—ËÑÞÕýôÚ)BS ä7xóz&RJpKuHõ RßFÙ;!ð×\‰~ü<‘-m.á›wè^ñT® üe¢¨[ªWtT=Ýâïâ|´ -úâÛ#Å¢”­WbÝë$ûG 1MË0ã¸,}íYïÛŸóªà,É(ÚHBƒ ã[3‚ÙS±Ž›­ì ÊŒÝ×%”¦jûR>õˆEÔ½å©D‘®ö€6åbw’ §ÁE†nïSQÕ¹j} §à¼6-å/Íö•3bï -QLJÊ¢éÛ\Ø© G?Ç“8ê†k5ÆÊN¨ç€¼N0Žºh>}¤_& hºáŒy ,ÿYÀ×BÔµrJª·‚UwmáÁð14KwÓˆ¼áUòxßÊœuÕF#NÔYÊ“×îc!ð<ó3½T}ß -eèyöûãJÕÜüî£[˜ ó^ „ÿTÛØã¦âÇ—#ЇØlΫ/¬ªŸ†û1‰žãÄk¨žtüBÈ×.ñÊ+«Ïy‹n[q©HÈYÇi=ý °(Zø]rqþj7RÃÖ_#9ĉÙj£ Ó5¼ö›íhrõ,9ƒMÈÜ«xQÊ$:J’/‘ûøèùÀÊw`…Yê‹›6ÕvGÞâe0£‰FÍèuiU¿ Ò ˆåÒ@Ë2 `Þ•lr² ?•¤, =§=Ín%ÇuÊËçô±CÇÙ½Û6ù×§©Dˆ£†Ný®KkOAŒë#æ~3WÿIµnÚÔß øM!ZøJžÓT½›aÎg®o©¯•ä3Û´ˆþEÐÝdÝ–ÈWɺœÝ!‹9Q£ÆÑ·ßä—´õ¢ Qª¡C"ž‰Máóó.j²³8¾†Tt‡ïvu‘~Y$¬öùG;/3â‘á%{'ê9bÓ«§tíœqàAi,u¸ë̸0¡gruQ34*>¦Ž;‘áJPŽÛ• |þóÕ·´’q0ùpÏ{â†W;öF›þt‹$$u0¯ué -FÜ‘ -»¹½¡†~€‹ÓzÂÇ)˜Rñ>ÛׯPxWÀ›øÇ"ýài½Qœúùfè­ò3­óÜ­…E!¦a:#l,–uH±~%\¢æïnh¶“6(Zú/쨕˜·ëÂŒÿ˜âòÀœ«µÝýq 7;w÷K@K“OÄ:+ÇÆ%šTŽ]à`n~~·És¦xìAY´–sb¦‹8¾Nj)¦Åfí´š¤(Jmå}Îò³‚}Àh)ÁEBÂ|4Òš1JûdWòÇo‰hî#¶(¨Âr¨¨ö5Ë¿Rf†ö«™í\ùÇIM*êéâÀºÍÏ£ß8:Æ<{p‘X‚.Y|éXx'Êlý)F kH¢oDNJË „2Ûç¤~:ÜY/siNt þÀ´( hx}I37ZÒ; sŸKñ!㉫<çóªÆ™Š ™–e`މUü:6ú)ý¾R6™?an±?êÚ\„ʺ¤—°6£<7;P¬ê½r·ÉSîÑw¼Åù£µâÀo&ºC—.’^-³µˆ8¢ñR‘ÏÁ÷En_ºÇ[–uê3ÕyàÕœ*g^1§(Šø¦½:½‡ä—”•ÃjµµÙe z…gC…š<‘ñÈ Jßt ® Rÿ¨Ad‚Fñx"iä!E*!…1XÜîj¥<†S^ [w«¦9bì8°±hÈ ½»ž„ÖÏÒ5ÍrœNù+Èž5âM¼u%íl›öã36IE¯_™Žc‚—vôÈ`²Å2ñ1 ý>X›  šo~„JÎå™é?ܶ•cPÛMü ¶³³¤}YTé54ù¹>Rá»uGêÎþ€”§z…hÎÃãÒ퀩øÐÌ ·ˆø«­¦—#oÆ­ÊtTîr9. -5åïŒS× Žmî£íû¹‰Ût´X1°K«éÅÈ›¦ë|ãã}i‘å{.ÖÆ ä’@iŸ€FjE+=ñ˜ë&OÓecMúÅë]CŒ¥¬†…§>ŠSX AÌ;ΤJ  Â¿1 -á‰ê>}|1mc œ”mñoóà -wFÒõIq.W–¸3‡qìÙ.ÕOs•loCVÿ‰rÕb‡–OÃ,ÆqµÛp•-Ånè†åïå<Äèˆ3wjD«0&ü¸…¼4N€!9÷‹Ê¤¢ežÍø:VB‹H–Å—eòc¶Ù7\²O܉ b›x8f¦¢è‡RDg¾i6šh€Ü|n·²§Ùg×]úóÙs…¼JŠÁÎsñŠœ>Õo¨4Üõ¿“kÓÑ ¨zÅ\ÐUkì'Æ8ƒð‘3&®©ñ[df±t$ Ÿ˜¦óÏx(ý'9…åõ›Ë*¨UzÜU -C6O<ºOµÀØJIYvá/úÏ‚,àYwÂR*!bV££…ÄNîê`Èl‰’Õ£îwEáòÁ§©óÚ› :;b ‚ X^£è)°½” ÷÷ z‰‚ p'gÛÅ„ìè}æ T`]’3þÚO5|2bØ3ÅÌoq«®?ïÿÆßÚ<§çòT"iÝø« -–ÝÿGt,ùsæ²"Üw„ÂÃl÷5A‚Ìɋ׸EKñï÷$NÛÅ §)Š(ò'·‘N–k6¥¨¸=ž¸üαÒR]ÈŠ’ÙKô×r±W>S˜ªJ¾ƒ¥ð}…åæå®âOE*g”°‰­òPss½xÞ ͯäÇ>'-­œ¹=€´Â!1Qù¥áQ£~ÂÚášœ[2(¼è‘ -¼æ£Í¸ÓQ¯…› ½Bø­¯Öa\3ãX­Nùr+ì6âxo4#*¥àcyIÒgcQCd¥‘¬]žS¾†±†8ðó6À?ó4€—±Xã0ºFФܾPøÅïEHÑ\!„0‘—ë[²£}‘ /ìÃ÷ˆ'ÚJdJŒ™Yojºö¾Õ/é©D¶Ap{”Ú…Žóâ5*4î -€°«¦†ŸÃŒÑb²Õ6,Gï3ŸÚ… jJäòycÛCu Zr+½àBç1Õ¶Ú¼TÜF¿þ¸§˜Pé&W²ˆf!t/ÇÓ<ƼŸåÆQáûDZœ’èÉî5\Íýa¸Ò¥¥@’7—æÒ«RÏ C£Åø¹ -ìª(â·ð[È÷‘<íöîS>äôÔi()÷ÌŸœ¿ö è)ˆA%G‹a³>>$… ‡\Oû€q/>ßèxïèË,Õp{dí½»jn¾ÌÛú`\ÌðnùŠ=d|ÛÏ’R NÍ,®ôÞKpXóåñºÚ‡äx‰Ýõ ÒÊôšDÈ’YyÙ¿&¢>®¾0d’BåkÊEÀ¨ð¸FÓ '?«ÐQRìç>üšš‘Þæ5þi*1eQ?pgƒhn`ß“ ÉŸöƒˆ™gÕþLíRiR ù– 3ÃýbT„ÒEà@²Ðœ˜Ú/Ö -Þ””A$Ü@±2éÆ{:SÅÀw&¸«:yð€Büæí}è£^Þ‚æùñŽÚ%ŽrT¢OÊ.ÄË% -§n‡÷>Ü_©·±ˆìì [?À½g ¿’'šJºãcN &öù¡×zÄ»_¥Ù?µ`ws¯ž"3["¹ÏR[¹ù^¬™Ù×9 ¶­`•K$bzÛdã0¼´¦}žp¢«ºÔêŽãÙ½ðßòjûjM=ÂP³Óòl›® ¾¦]d‹QœŠñyQ©s‰Î(C§ú¡ôw<ÉÖ"ÁŠ„ßö;ö¢„fµÉËmb‡¥ÁWj¾·NS·©5t>KêâyȘ-:/õ’[ì@ u+*UyÄÈŒ ÕyƦ| -|´àùi—!ÝY¸Ê`RcW}€£î ˆ] …?â1åUdÞP|ßÔœŠ0¼ÝGê@õŸå«¢O ö[?°æ\‡´­ÅµÃЯƒ™ QRR’—CîÍ>”;¯gzí.MÚqù…”xó€ uB–há] {ôzA3™‹M‘5’@õ9Ç#ûÓz=6¢"ât>E|ÏV&KñpL.G‚ÌËò mei#ëSŠÈæ•^Cµ6ª Õ:E T‹ÂhÁ.ðÛ;}†mÔ¾l±Ýè F'­Ÿ~IÙôL~&@—ˆñ­Ð×Y˜¥î“Gõ—7ÿ:ÒqjB¨ä‚¶lô¼xD…\¢ïàLaxÚXBîoׂF°ð¡HÂU¢iì9“¿ÕiÐÑ¿¸=Û¶í²³v{ué‘GÐØ”ˆ"FÛô*Šÿ¬·Ð<º*:ã12o‡³~\ºPü3M p­¬}ñTiÌåYä)Üê6<Û<4$Q‰%‹9J/²T.` M|‘ÒKJ€l ‹¿KI ûC:·X©L—&Î-Ÿš$ô°YËc´ê&ŸùÎ+HoA¾=L½/–¢ñÂs(2CÙü¢¼à…éîoUù230Ì¢z¯Q‹¦ÂÞ†Â÷b;hŽ]þÕPÂ!¨œT™J$Ð![ŠŸ¹!ÜÐJ¢#ó„Ëa³Ð2„ÁîÊ¿`ækQˆ¹Çgg]bd“ÚL;á-HþülLW%p[e)‡íK¼LÂg˜Å¬1>#4 öy¦ðSøåw_ŸE±Ú;Yç#ØÀŠt‰èO®)òX<ñ°çæÊ ºÃÓ¨hAc=#ÁÇtÂ_²D‹q¿ÛÔåž7Æ¥Íïöôw¹ÆJM -¿÷ý"B¾c©{] -Söy[5waa°ï,&Ã}œk)»Ð!mÁ¦/&Ï«NÜî׎Te—gO]økíRPÊ<Û,=)I"“$سxgißðufy=øÔ©xÈ[¤‹Ó™‘;:õ 5XxÞeé‹¢h­¯ŸWS¡°žj3+9èK>wv)Hôï )ØŽWÀíÚek›ó1R½]/”œ³Ÿ´½~0¬ÈÛÐŽ ‹¹”á <Ô¦Ž~³÷\äF _¦M=4_N¥Ë3Ã3 ÿ¸$ì¾²X#8°ƒ¬” ZŠÇ¹?~lðëàùÎÊ«V;¦eF½-³?¥}è³3Çråsâyû­²*°^–¾:{ÚúÑv°ªà Û~߸HbÚ ƒ\×PGô> "e—ûKrüA ï!ß’OH­`t7ãkª}E†ãL×ó8×¾™¿n"¼ÈŦâL£W¥SÈáx{1ö¬ÿÏÒU®.ˆ›Îã¡m¦Ï×O¹¯àë´KòD‰t»ýÍ^€ü«½è²|Iˆ¢ßI×rÎÍzÔÊ:‡ú ß…Å¿XŠtÍUÂçÿŽÛüö›gßÑz ´¤cÁyU}&+ä«nûÑ -ôV&\{Ml°Á[ÈÝXµ­p·T=“2ÇDö´úê.Â¥´ò~mj'ŠÔÈY×=ž4a^Ä¡Ož“²röò-äw³ÒúÓû"œì–ÃÀÙ,$¯âh9øw”à%k9Ü–5¥ÚÍЉŒ¼‡lÊ=pûˆ¡IS.E2—ŸÓ³8ª§$!ÖØuºcžÆt®¶Sù6ãðò-3WØJåÕ0ß#ZMî -SlA`¢{Ôj~ß+žÚˆ[ý òZvne‡¹w¿{çý¬eŒn(`vtÛ¤2Ò»•¿lÜC£§IÆh°À®xw—Mº*Êv*ST!ðþ” -â¢V榆®ípP-ŸÉ˜+zê(Qɶ$HV=½ßU€Éü -%ÅâFdh^•¨R$küV2‚¯q£çZ{_ Xüê|FGN´«ª²9oÀªÖ;Ó#È}Åæ²¥Œ¤BèšÜ¿&ñXv¯è5BœÚÔÑeûTñ‰ì'ë/¸íRQÚ"ÔHÉ6O^Et¾| x‚­DR'óòÒj‹»7OVôïu{‡Ô—ÒéF@)aYDa ô›ÚŽ­¸ÔÜt_ÔšäB>WŽƒ€#õ.m þ½¹@…›545—ÇÆŠõÂú„€+k^Ç+£…“ô|Ž)‘Æê$¹l¼Úßo~ëÂò‡<„Ôbc=#×Ûx®ÑÏ6³^_d: 4¤í'ÌÞþùG—x]Ý&{* WUCñk[è„Ú¼jŒ€¬‘£çð±s˜óÓœu£HaYaÞ9׭˨Øë²!@ ÊNZô°>P)`x7?æÚ÷Qs¯:Å?¶Wg{D– ¸­¡Öa™l$¡ã¥óm#¬¿l¬‡£iTžÑ*Þ°Ÿ¬ õx ho)‘ÀÝ]âÖò(Bœ +ÔwΑi®'r‹`ÉIƒ"èçÚ[°îFFõSG3NXàéæÛ>ù…‰)QÊ|1ïû ÕÕQH>H!ðž³ZˆJ ŽpËæûªH´†ÐkάùaOž…«Ú ?5œÅ§MDfrCiUQi“ŽÃJ gÃJZ 5ŠõÅ‘\”^u¼ùËvÏÁ½ TÒ÷"ìêwÀl ‰~3A9ÕÉ'Þ™,”µÌ«mÒÜqX–Þ5ŠL׳Ša…p=¤qé)_ÿ†v‚°¦O}}\¦çÕR½Æ*zí¡îÓŸ—¤iq)¸ÒÛ¶¶v Çícµe~ªÛø¶‹Ý¸—±ÓÆ“ðÓOˆ_\dÖ5ÿH–Å*ßì&Å%—ö[î;iC&Üâ/I%ˆËõjn®Ÿ¡^öã3ƒÑ> ¼AòY1]°#aì=*Y Ư¤ANÔ ®aBKðÄ$mÍí=òP‚Ç66Èšj0£"ÒŒ?úGÅdÏÜ™Þi­¨ri{Ž`¤ômK´3oñ‹Ž ×Í[ôÏØ·ë?¿hŽê†„5`é$ vkYïw­¯j´bL™…ÁÉâñ¯ôôR®xMŒå¥Åu,ovÎ\‘«- o^Ì# 3§)¸!éeÑÊWi¡ò×j*ĄCì¤!¬êFf/\è=ÃìÇôÇÝÚ‡úÎtß2`qCš§òµ†ÐX:u¯ ®øÅ …ÂßèºHg}èk…>=¯Û2íýs‡ÿ&9ѤtEµ ‘´)—¥Zxw¾Øuç’¦ø¢‹·ŠNýh¦ºwö½CÏZ¥8ÒæÃ‰+¥fPn)¥Æ4Ôȧ‹âCïKMŒÏ“¸ôz´÷ØÐÓöê‹@çÉW¯ÇV©Í™Iæ&XdÏˆÎØã=x$ó,Bu!ÏXŽ’ßßë%²cwdR‰\ÊÃô4gõ¬xçj9/Àv¿ÑÁý)µåBÃÀŠÆôÛæo´ëïõKÄu…ÃŒ"¥¢Š‹î÷ ÔJ®Ë=SÝñÁÐÆà²-L`^ÕtpYÐ`FÃi‘ÃhœÊ³¹;@-ݽxußG.3jf«¸Ö_»üý -kæ3„Œ“{õåï[._>úǽ¼c¹¶#ñæ¼Rîœà¡f5=#Ùo26š¶ås„XÌËO]öwˆ¹·íO»ô/£CïºÅRù#©Íä@ÐÅížÑZCXŠÈÈ"Nˆ”…’›Á€UL|§ÚøyGˆ˜hu`ºRõ ô#×dêˈAH¸¸{tM™†yÜ2Ü0f9‡ÌÂKàû§á+7îZGO~Ú fƒšd™Ý¢¹YÝ ¹~J6‹TaG²z変…ýôç_6Ší3ûš˜šÝ€^kZŠ ÿÃñ±Ii“9nçJèqöéw%,݂Ӈ âTÙÌiÆY7À}ä¦CX¥ÇÆ/ó·Gg—àHxõx©DŸ´œÏe,H¸G¢âi\àC×/4Âi=ý1k¹Wç7YC5.W÷.M‚ ³E}fudÇLTxÆ þê¿à¾Ën¿Mew{fð½ÅUgšÕ+h>Uàfkߤx1J«hÒ œiQœhiØ®YÇIµ53ÏŒ56èGÝÝjèY~¡ÌTËÛھģ!y¬fAÛ&ìÂU†%¿QÚ8"×¥4óä‹ÃŠvòÃËa3–œÛÏw~/ÕæÅξŽ#u¢vrébf)Þc;wçuÓºô‚áœ*9£Ëtúõ ÌÂrsúµ“¨b-&»×‘@î²ï “¼’Yû`=\bE"ŒÌ'Öy÷Ó®Ö=aåWÞ`ñˆùØ÷ÏWVÝÜé¢Ã”ÎÛý Ö¥%g´h–v œ>`FÙGÅÐF(¡yú^,þÈtì_ôüe4Ê}iñoÅ-4&Ζò D-þ%`ߘÃyåÑѪàG—ê/9צ›§Ä›û3¤Ê•äñé¨Ë`ž&ø’åz½oQuhGdõºq¤ ‘[ÍÄ—­ Z·ü[ëTNfž’ËX󮈌ÅΟ…4EЮ}…¬®hoúÙ~³ èkŸƒ¬- ¦´Ú¦9G^V Yóƒw˜ØÛg0z5(ú&cŸîWo9iJ”7Ë"êƒíûlj=ú_1Ý?†¨çŽN8Ð àhäòCé˜ÕÓ4 ïëõVÂÜÊŽßRwŒuÈÒd?6õ‰ñ>‡èhSo‰4±ó 5?Ln\£ ÑÛŽó½}ÛX,ªü*:M ߬ùZ$¿áéìñÛ ÆPN°s£cšþ‘r²fN!±ÁG« »m¾tÞ Ë¨Vý¨¹²è€uŒ­pgžš×á0óÐû–‰þ*¿5l”R9 ۨݹÉ3ùmv‰sG}æ›O68”ª@jv1Û¯«7»œ“ÍA<Š|2r€vox5qöl‡îƧÊ#“¾ÃI‡=¶v“+äÊdlßý¦¸‰6—]ÁœÓÁ¶œdNPun¾;éI½@Ö,LFpBÇc˜° SþþéŒÒ†a›ïAZV²€ë;Ò8A¤ù¼¤ÚÑ9„Ë­ K¤ÄfjÍ…#¸coŒ#UÇ£ÚDî™ú:ŠÓ<×ÐÇdë®´¥BωÝgµD(à"Œ*t÷¢—á³5ƒ¸ÓðÎÞÌK+;ò`Âþ#f=&tõÅf¶½64½²—˜~”ñÁb;<]ZÍж{Çdóò¼Å4#¬*Fôã]t¨Ç².YûÑrˆª-¢_ç%ç|D*Éiro(c.¾A“ ºÀìb}ÿ‚èqåjë€C’g´$ZôöK¼T§^EYØ…‘õ>uÕrQda›hMʹѺ¥Ï³M±öécVÞ'áÈ -}6FD¥ÒñQ4¡êàpžÜ¡r—Ô+Þo‘W§.>¾'ˆ8•U‰»ó"qlkŠi#umu«]¸fyãu…˜Ô•Ö|‘àÓνßSvàì9Õ~#²=gá¡uyL­¹ñBÚCÎÂqU°(%ziš‡ËlÁ½wWêVQ9&[³’p|Ö÷O`ªÈP¥ºSªwDÍCéÂuvh¥À©Nhß0§Š$1PCÑ£åç‡ã$ï±:7–]òîé+wx0¬®Ðjܽ<ñvô#D=~‰läE’­:ó†Êô­…§A¹L¾E éq@œ;!x»ªr(ïÄÔ¸¨Î½ò“X’ï.éøÀM€iì;Ê4~Ëì}(},˜±mºÖ2͇ÃÚy ±\ÙKÕ}q(<ŽqÓÿV\¢QOk5ÃÄÖâ·ÚÇs7JÍË>ºüÁÁZð—Ð[‰Ø9N¸@ʘÍɲ³ªáìtò#oiSÑqù—áç<|b÷ÆïÃkeÎnÄÓX_"ÔÑlƒ–«Õþæ‚#«–=6€;::‡%Q|aé_¿Dø=VÉÈéÔéD²ãOÍïd9ÃÈÔÁrWæã(ÕLkûÄãà¥ûٴΣ½\r§^¬ß”èï[èˆ?Æ‘hö— ôwüŒ¿ËëUÌ!»R]% - -¥QÄ+ëMשޝa<¥x®NFdꂊÕn™L‰˜d~|œh­sÁm)DQÅ =u-z€×Nµ1’‰ÚÄ mZ©ƒ‰Ÿ4Zr夾Í+¶]o Aü²gŒÑ©AµoÿÌ«§fïH¬A€­`-»E<©)±0ø1¯Òc•;:¬DGrÌÏ7e{Bf.D—ÌÃ- ›+˜.Y‡­ÚŒmÖ°vƾ¬Œ1VM52Ô,›é)ûï%òï?¨7‰O§u\wäËÍ)õyYêóMÞ^ó¨m²s Ë)jî¯(kz,¸›÷еNåo. -¢%‚fY¤aÇ·uðåÇħã·Oå90¸8‘ÉâÀÓ›K1€ï>{¡¯Ùñ-Gz,UêÓà”X”>ƒpK•û&ÞÔCïH½Ÿ¼ýšPîQWOðòø¼‚]º‹*{—ìÔ¨CW)¯‚ø.›<õ‚l„R¤û¸÷Ìsª1ys Zî‚÷÷ Ï/&ëM勨€‘Ÿ56ÔÌ”“W™¹_ìU:Œ .B³ÛJ,¦$§HÄÄ%]V।H6ùù»Ëùj?ü°cº63™äoP+õ¦½è#“oàâEíó ©ðEV“…”}d_'ç„/yÏ(@5ÿqVÜý² Í¿SC:÷ºåÍKð=4%ÜXEçDx:¥È|æ×1=Ç´¶ô+ßáPO5Y¸,=bv]ÂG¦˜@õ"L¼GÙª—_ª’bkf8·EF'z%0ûŸ7Ö>¾› ÐV›’%±x(±#‰½3ŒJ–²çлÃslÕr߀}uf{ ÒoQ×8ê†úZæC‚‰4E¼OE‘Õˆ|%Fì:á¤èShyKPƒÍIƒ¡Xgº¿' J‘6aGb_K¤¿¶»RT–5KÆÐ ™â8²Qž³ðòl¾Âw‚µ´î³ðÎÜ”A×ÎøìÒzªÄÔ·¨dªWG-¾óúždYSe\&ãVNV˜;Tö™&YrÊrÌ/z‹Z؃¾ó‹Ó¸»u…h;SùàÍÌÔ7ŽÝ¨óò­tS^nݺÁK½ß氀ϊEGž¸*…@tN¢Ñ$%¿S%m÷¢8#¾ßp"§YŠ[ꟛ8Ú7˜¨H¡û²UX?ŸæEº@'Þóñv(L„PÂÀËâÅô`B_i‹'èÖÜ>BŽ;ë|4 ýÊ÷n||zã.p<­qÃñ5G×’èG¼nÿ(Ù¯ÐBíkTñ/P°à ¿:ŽZJÞ|ÕyÄÇ€k¿Þã]vL iu-.;çà\ø -OÙc {ç¯ëÀ…{ó¦é|¬t—.B(F0mÒH‡{Yéá"^8%òG™Ög×s GJ-ç,»&Lç°œ¹× ƒP`½*²ôX… Í!%®‚Ÿ-À–; ÷eù=ÐÙ¡ðS«–é ù9>!aÜÆa@ÔüÔ9Äb¼Ù‚eIÇgêÀì¾â€Çú¹´Ÿ3·Ì_4¹Ä-Ë÷uGç|°ãK -šW1ÞšAÐÕÚdo²SmàX•ÎO¿LÈ4#þ&OHKã‹Èt»Š‹º -øPÍ5‹›Ÿruž´û²^ýb²ü’ØË!Ý‚¨8/æ’ÚXxUØïÛi!‚1Ú©ÕáÛ“þbY›"È*Ç6£-”LUùòÁõ‡ÏÀ5™>Æ¿ŸŠw^§—K£G G„{È•ìÏú6Hë9•­”–ÒzÂ2Ì–u¸"èÒëE«E¾ê+êÒØw ÅbUÜgC×ÖIÉc¨tPù÷¥†~ÔeJ^ Ðz -oæ%n~Q} åM;óÃ:é™yYÚÊ7zÃVÎ]ÇÖ³‚„©„¢Ó¬;UF)iëÕ <#BÐ`-âzµ_€k_|¸0Ô•ŸÅ w*F|¤]&¤«ù§ë&åw•c´Ðâd‡ÏÓÓvy´‘Lï3¾[ÍBégúáÅsmÄS¨aFdw,Á¹–~hAbŠÎDš¤ö²ÜÛ;{Z/±Œê¼Ã=éK\ÓrIqª{€±º?´íÙ»ËüÈ;!z]0$yˆ²j}¤C²r…K|1S¶]À-ÿâ6ÿûQå]Rº­,yl¸ÊúW\&΃í-¾ádú;™¶ÍhG4c»çÖ~bÓÐ]»€üòO-’RsÚF(Ó÷%·XjÒÁªÕ˜G—³ùAAîÚåC­lùÇýì%p¡ÎĤ™Ó •ëñ&CŠŸq#а¾– àüN®ž—cjŽ‘®c¸ŒôÕÕsó-]1ñ…ó£ aþ^éS‹&ÝÒTœa¿ä7eªÒƒBp¼Ÿ–²yZʔڹ&O?؉5>0ÿÖüšúrd³²UÌÆ£e±Rá9½!ö”b½û·œ:Ìùµ†Y+âJ¢¨2 ùñãÌÓŸaŸd)¿9 u f&àD¤(<|O²Ö˨eTÔþ 5owsç† 9½9ôŽAŽ”ÛG¾‘0¡G¨é›&öƒ‰#[ýkd{ê§3˜Kî•Èt ¡JÆL GXpåÍ× Nèk–:½Œ©°—ÉË݇|(O(ÄV-c,WÛI~O\ûñË’ jü~Ñc!â `õÊÚêÚ¿«Ô½ÀÿjT*ÕŸÍ€¦o~¡zcºÑ,87è)Ä*£Ø$XWÇÐ|ËëŽÅ3ŠC}t‚6ppÂa0âݸÍ`¬Ñçäí+³AljgIë'õz†º m0¿nvx®kÉ)î]C²ü°XƒGcµ'‹<'hÐÐ?'¹&#§¨×îÝâ%¼ùy@YUd/Ü%MŸPûdõ5¹Ø4‚Öi²9{Þw{vnˆÚ¥`Ç“&wtT:mö} I´Žñœ©zíR7{{–‡rk£#CßÖà]¸‚“H'糧cWäè… ½³[^Ä„’Á+Ñ!ÃHÐEu9žq†µ¬¯UÕªŠêÚ‰uSu¦‹6Q8¹)n$.7Åâ¿cD_‡1a¯*¿‘¹Ý|€?NúŽÔW)Öç§å4C­ûJáNWú‘ôG–órªÇ*B¦Où¤H̤Q/§ýçUê{·`OtdFpsa†Èº¹¨tª³bÔn;˜fJçé*DÎ(±g»Ÿ¬à!ú,ó=^V,'t¶É0é |vÕdAÛ'ÝÁŒõi|£øiQ„717+ë÷Òšû™$c­VJjÕ =æÙ®ÕÆûÐ&£øé›ª.6‚4÷ç¯[îcǘ·}þ'ƒ÷‹av¶<Ô­t‹põ’Â"òî)è‰i'Árï ¨8‡Ö…Û¥X;+Ç™W)ÜôdÐbÎù˜IÕÊ^nZ¸ëÇ: -/»½F¯ë_Sckᦹ6Ñý$ø`ªŸ¢2#ÜÕæÏÔIóßûËa ( ëï%IÑÊ6:]áêbÓt:S›‹.Ç$à8ƒ;µ£De^Äaߟï ]Ö1GÜW7^ð„ÆT3ôŒ¶ïÃÛ:îôï_IvKæWun˜{(o×¼è't•4‹ U[ï·;ZTÈ);…αØÊxpgJ1ŒÌ8ƒupÌotm;°Xã+#3oScÉZ+Ü$–:ùiwb¶mßUàÎç1Q2Ê%¾Ô{'ËwPçÇ} Ï˳xv­é¹T¶ã‹"/ï€Ò¨Á87ÁÅ›µŒtõ@Ÿ¨ÂíVÅ3o5*«¼ r™Ç)ÒA[¬°±Oê2nX§ec¢-¬A–i)¶¦ˆk]ð’<ºUá¡Ñï¹^ôhD<\ãRe¶)¾W¦œò*#ðSÌ1ºq…\öýÄ)vW›`½ãÆn LqzÚŒ_€ìÔžQŸ¸2Iž~Bm\ðác'̯£Ä1LåµHvc_¤`鯛F. .™qµgõ×óËÏ")˜Ú¿éfÎòë}³áÜfìûœšRpëôaç€4p£c1ò"tn¯?FT+£ài›u]rd#qò)®$ÂÖbó›–£$S€ôZ‚ƒ¬B€>Uú-%>”¨ä|ˆxº’¼æt®u2†àd‡³§e-$‘¢§Ý”ÿAµôP8ˆsÄ&¦žòmik±§Ÿ¼Tƒí«0ýæØ *©wÍtÁÊqô¶C”ŽyÖ*mPV j¬;ͱäe%^¢µw³0ð‰E „WâÌ(“°ÍÙ–U3ÀZ Nj<¡á¨æ3qÒõWâÌMpÓŸ°K¼)Kô¤F“TÞÛ|’• #*ÁÍ?’C• ø[ÇH¾±â áKì‹ô;E>ßœV øfÓ1ö¿fZÁcs{2ý?|ÀÿÿübCK ¾½£•¾½üÿ»\ŒVendstream -endobj -46 0 obj -<< -/Type /Font -/Subtype /Type1 -/Encoding 34 0 R -/FirstChar 40 -/LastChar 121 -/Widths 47 0 R -/BaseFont /CHKRCT+CMBX12 -/FontDescriptor 48 0 R ->> -endobj -47 0 obj -[ 438 438 0 0 0 0 313 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 850 0 813 862 0 707 0 0 419 0 0 0 1067 0 0 769 0 0 625 782 0 0 1162 0 0 0 313 0 313 0 0 0 547 625 500 625 513 344 563 625 313 0 594 313 938 625 563 625 594 459 444 438 625 594 0 594 594 ] -endobj -48 0 obj -<< -/Ascent 694 -/CapHeight 686 -/Descent -194 -/FontName /CHKRCT+CMBX12 -/ItalicAngle 0 -/StemV 109 -/XHeight 444 -/FontBBox [ -53 -251 1139 750 ] -/Flags 4 -/CharSet (/parenleft/parenright/period/A/C/D/F/I/M/P/S/T/W/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/x/y) -/FontFile 49 0 R ->> -endobj -49 0 obj -<< -/Length1 1340 -/Length2 6345 -/Length3 532 -/Length 7162 -/Filter /FlateDecode ->> -stream -xÚí”e\ÔÛÚ° éN ¡¥A IA¤JA``˜!†f(éé.éFJ)¥»IégöÞçl=û||ßOÏï™ÿ—¹îu¯{]+Ù™µõøä-áæ`8 Á'Ä/$PÔP0zâÄggWtƒ8L „K„$%…ò.Ö€‚!1)a)Q|v€"ÜÁà bmƒÜWäú#I ov‚X€` Âlªa‚ôà0ƒ …tÿèá Ð;ƒ\Á–üøBBKˆ`¶†Àðþ0RƒYÁâ…-]þÝä -vrFIî£$¹(EK8 ê°[á hÂQcQ&ÿ?¤þY\Å -ÕÙÿQþÏUú¯v=êñ¯ ¸½ƒ ìЀ[‚`ÿL5ÿ%§‡þ×0jb!³†‚‚… Î*w°¥6aa°AÁÆÁ0Ë* –íOEUu]E}žíçŸÚ  ¡ïáðwÙ?²ÿd¡_ŒZ'ˆ;à™ ¿  *õýûŸé?S†YÀ-!0Ô€œœ@ø¨“"Q€—³»Àî(c~ê@- `wÂÿc;E '0 -¶BüÑôWTè_Ñ¿¶ïï°*ŒÚ@¸åß!1Q€€ü/GÍùI”þ&qÔH*¿H  ö‹Pý4þ& T¦ö/Beêý"€€þ/Bõ3ü›P7CÀÜ daFüÇl$…ÿŽÿç|PRô‹Pºæ¿H `ñ7 ¢œ,CÔPàßð@Àê7D hý¢œm~CÔ’A~C”„Ýoˆ²€þ†( û_(„Ò€ý†( øoˆÒpø QŽ¿!JÃé7Di8ÿ†¨½Eü†(+—ßeåú Q€ûoˆÒðøÿû"((ÀݽøD…|D…þp’ˆ‹ -"ÿ3ƒ8º€Õ”¢‚‚‚âb’F-\œP'ñç˃ºdÿf+êJ‚Áî` üé ¸ÅÃ@Û·õÁï|”s‡Š±¸Ñ¬b5kÚF[ ^M½F‡ô©;r/T]”¤Po`m0¹]Ñ;‡·xë|QÙ÷wŒM¿Ùp}¹‘âÙHot˜¢á±îÀröj‡¤¹~ìxW]kd¡ÿ]‚q^WúA÷N¶ö}%ýMœ9f´ög®µí©bâF*)P`HP5‡0³.i’ã»P‘y7Ò„¸;óƒ¯|lCpßóÌþ€·¸_äâfÅß¼À´übðòL}/уhÕä"vàŒ¼ÊÏ´(|Õ%K#Ù8ºìÊüÙSšÐ3èadêç/âyrù‡™ò±Œ<“s-\Z‘âÇaOĉ áM­yÌ@´ªØ -ßÁ†ùœ›—&š§Œ¹÷lÔßÖ…z>ü¾T;JÝôDÈ*ÄA³C\q?•‹íö‰°zÐtÌDòuY­o2£slñ–­J~E¨U)‹6Ûøz0ŸÚBÝÔnÿ›i…W]øb26y±ŽJ¤Ò«/ñ”ÉÂíÚjŠ•ãI5QLwä“Ç?ñ&}žz‰ùŸÖ•ªE+‹ÑŸ/1U9OV<ˆ­Õe9¸à²˜èŸMÙŒ ÃÃ6ù„¬r»&Õ”Tq* -ÙŸ†Èd==˜e/Eä-ðkñ™jF(bëúŠÐÑÏÊr¸µ'¸j–ugüÀU¼Á É\œF‹²"Z'HÌ)rJnʰšô'¥o4XÅVÌNïMô¡[sÌ$¸1²:˜˜1ë2»KÇ6Ú€³ŸË>æûXÜr;µ·Š4ÊÿùaiÙTÅbK0ÈÔZz;¼!æE@¦oG‰á—,RÓ{•x´a‡HP´‹2ªhúBDU„òºhu.ú8Cv/…,Kß÷3î‹< ºá´m±%ãh¡·ßÂfpp|ß©¼/%Ñ…ížZ™ÑÅ©2ùÛdzStÆ–(LŠ+o«j‹ÒùóâÎpé -0 #Y¬d={ʨÞúϺ^Rˆ¯È}÷p2=&%r‚E€ì´æÎ—µÒ ‘…bEÊÆý¤µN³®;óø‘ßÒk?E2ñ±½¿Þ~%°m~È@¬\ßtðI0D¡œ‹2ÎwŸÚO®u%a@ƒ¦¾óq—¸DJÿˆ5¥½™4ßùÁ}a¸‹þ¡p{‘ê\ºþ>‹A#p8ÿ"hÒì}âÑ›>…¨ ¯^š :ÒÇ´§Û?»zsS0ogù} .L&A*MZÖÐNM…l;.ž/'“àGC} :£¨+X4–ÌA[h¡h(›Ê`ˆ¿3E†´ ‰Š^h’'Ÿ~í6e¡JÂròÉ6;%3ãlnêyüë(ÍÌxº@ŸÑ @EízI˜áëørŸ†Óå˜=, Ÿ—Ý5¢-¢*OcYùÀOKJ)9‰Ú[œjë^WÐÌFAÄB'ΖžM›4³çn>˜ô¤RjŠ d~›õ™Vëe ,l:'® ž÷ž äð§ä.ª¹f1ÇB„P5T_Nã²é¦Ê.«1QØ™½ËÆQÛôiÆÛ§îòän>Hæõéõ-.£áZ]•”v' ýM{„ºd,ã÷=DòÐ#Z¾¡i~Þ”åÄ©ÓtbŸ>± -/Ì”ØÃËÊq™‹Z23¿jö¿ê±vëêuQ²ã%Üѽ’垥+VÏ«–Ì]š¿RÃ1ÚÂPN°{ë|#LÇîæ<1yu'¤ó4ŽÅÁº: ÓŽ‘å¾AWötÀµÂåxQKС•l]ÉÄï)tï,f 5"s½ù:7Û€Ì÷“Á]y¦7Û„O´ûÒùI8UåÅLíˆd,Oï)’97‚Tç4q¯ß\f¤=>ìž68𚉲"+–þØ×² ñàM-#¶¥zžaì sò¶¢jLºSnß!“B‰!jrN3¸æz« p×ôä~WrÑ>éÅNí>Í'¡7ÞSÅû˜óvëaË©¥×†X±@>Œ5Q˜´¼Œx©rr<˜Ù8ybù ÐT½ñžm,ãüLïW*£#OA˜¸±ò!$üèɽ«#¤å€UÕD"Swá³>uó]sIÀðÙû´G©AÑ7¡\ å°I#¾>_ªTˆ»ÏdbºÉrYlÓ<ýê5-TIšQ*ïaÃÝ¢—uøà»çÝ­Gäù¤»›°úøè© îÒ™ -Þˆët)¹c4Ì`˜‰¤ÎoÚeØ )>Û«¨ð<*%L$aø¶Óù-ªs*ëûhç³·‚ -'~ŠVEØQÓ6m­ïÏ öZ·$Ön‚òhE¡óoføÑƒvì¤ܘj2{Ù¥-ÚÃI16X”°å€œD‘î>Çè+f,Œõ«SÅØ*a%Ø–ïsИ¶5îÇêL£2áGb ûp“(hÎfѧO*©ŒnvÇȪ„’UF*Úe±,8ì·_ùË!'‰Ë¿Äy‘}¾·.½¶µŽ(ÞÛÂDÌn²IJߥ˜&×˦¡~M°G¶ù«ÏžÙ¦õýk„¡éÂ_ÑíyqpÐÍn¨áÃÉî+Yg‘Ê+¦ýJé·†ðFá yË2‡ŸR Ë%Ô$+Ë>x«‰«?Íu>Ñb! êc”AO¢ÝÃËôŸœe[)Žã6†»*‚¿ì\-æ”®Çv`ŠÑ -¯¥tDGˆß¯%ìpNow÷m§"o&µ\ùZ0&u»{q]Ê8`à¯ö c9\K õ"~f²oÃÚ”ˆûÑ)‘T‘±qœ ‰+¯ÿ*UÌÏ“¥¤Ò%˲AcCMüÚ{SEB>å‡ß#Úõ]=]º¬«Óµñ’üm"­×ŸÌÜŸz;ežKv1Ÿ -R°XÑe<¹ßZΧDŸ³òâcø d“#W€îZ¯`û×Å~zqÑàA ä‘ÐL*ÌÝlM²Y»háËXŠuw×¢âh–½3šÄæÄå&ªUÓIöYI#êUˆgp¦L¹¡~Õ´kîAçžœ««È+93E…жê"ÊoÊÑbn,9<áYÃOt¦±Å—Ü—lêÆýƒRß“›àoÔ˜WÖ˜?£”¾×ó‚1.’KþÔ?\Ò([ÌM¤ûPLR•€îŠfâ¨vöpÂj÷ ú‹EXùÍ{2¤âøG¾›„~ŠÉÊ #»ñ½~XèÝœ³Ù[ÏÔøv¦ÁþG¸IK§Àíe;Õ|Ö#®…ÇÂh5­æ[nÙ¡ýŽèGƒ}FFKc%¢×&·Ì)ÕÉY ìdM[7Lôº|jy÷<×_¹fæ?\ºêÔåk®G´f#iéìå?hÔÊw×Ûæ%™Ê§Ë®HáQXŽ@ÎÞP«ëÓ†ˆ„Se¥”¿î/^ÙÏûK¿VÛQm~BYTc*¸Â^ÅLG˜ ‰äªÅÕË‚÷l€—×¼âeìj¾×üˆG(ˆ½‹5œkB÷ç`~¹ûEýæ>Þ±óß’7þÂ3…ø»Ñƒ €Êà-3¿7OŽÇ®/ÐI,p"”çSrUê†. Y]±xm\ -—¸Ä_.»M·Ž­Ž=eëÖ|Û¤¶÷ªWæ@Ió°™–׬âB‹±P‚¿µú„ëÓÓÓ›§ÔÀ´·þ…éóóœ—~.‘axŽ—+~XgîŽåVQdCÔP¼@¯A©s£‹Æ÷¾Ohú¼Ë9«-õÍ~yFbÉòqº/UØy}ša’ßRæ,2)°_¬-Z+Ü÷?zx˜ÉptŸ±X‚ø™Obùò•E‰‹Ÿ(†r˜ŸG=¶'Ûà£Ú©Ã&Sa£ž™fÝ^Á,§ÃöUÆÀÝOt ×7ªÉýÓg^ê’hš; -Ìx´¸JîÄm'ÇSÛÊTyJ•áEI?k/7wƒÑjJyÔCc^¼?+ï™`àu][Ç7WQá:¨&[|‹vr°?úØ»ržÐ”œC¨+QïqïgmO~=!޶áŠjH§²™ÑƵòF‚,þë d¼­máuRY.±IŽôG†kV¦'¶®Qp1­©mÕmo7FPKáË3éÜc02ÿ¶ScqžpJŽÎØ=ö®ûqbÀôî)êz7¦;Oµ®ÿtAƒkŽZæÈÏsóçÀŽëiÀw2áÙ;Ï’¥0TôúxÒÆ‡$ýM±»|¤§â3qK‰Û{mãpuíuÑõã˶¿Î!=Ù‹ý]”ی؟T1ìiç#ÓœÝ:`Âé·þžP–âMþhÏÊÍv.o$+\dÏ'Õà¹#-mðéË£}³zl?a\¯]δŠ\oLÿáØ,³#[cyÂËðÀ|1®ð‹YD3  ºÇýÕ1(ƒ˜Œww* nÞu\äðëôÐ¥€a¿ª{¿‘@S´7ý‡ÔËWë÷™^뎨¸è‰&³õ?Nlþü^ªß5÷8ÁÛp/ݸ0½ûƒ³4Ì0¦·Ît:’Ås¶ej4"G¸U’Y”\ZkÞ²sE¸#8àL»ñ¾²:³Si ˆïœA V¯mY‡®~ïWBk°zRkù½c„Ê ‡— 2U#Ž?[H„ì&Y` ‹ôÞ¸‚D´3¿-©n&ëSÞ}_aK*ŒéµšÒ*ÐѦN<}z„­4ïÇ5šÃšð¹MÉ@–Ãùõ³Ÿ+#ºä[Íݼ›½¥vjºÖ+å(G ÎJCq$ ߇¡¹;ƒ2˜aCHG)Ó º™„}#\Õ|’Ƙ*‰<7tì á@øG0Ö"©‰4½´Hu7µ[â,¾û UÌÉ—Ó@Nr—zžâ°D'2(ö´-IÎÕBôF¦ÕL{Tcöò¸Ý.•tžÐ/±òÎÅÌlcÐ-ïH¬ßëeAlÒÍ ÒúÁ6cšî¶+Ýêâ^É #Ö#ú%à¤.ýÝsUÝìüêý„@Y"N'!Ž}ß±²Dcò4–ãNÆã±œ;^Høì¦áLI€¦qñHCŸ·ŒoöøÃSVôKÆh’“0¶ÐX:óíäð¬åÓ×÷âQÓ‡sJC -Ò–aT·{^tpÓ8h'÷˜wá6­¤Â÷ ˆ -Ôõ¿!žèG'ÐM¼5‹4 -., ð¹¤dÌ™‘ÊìõŽ.­¯TöÜ _|Ù -cs5jÎZSdBú!$²ñXu'ç”u¡ŽÃZin•ˆˆØ”ÒŽãÒ,q¾(­ì!—ßϘôÜl+KWßÖoÄÀÜ7ÒÔi -)µË…ð‹/ÀØVkÙñ¼‡÷—…´:÷]Õ*eö¶LÓê”$¢ Öõfï>Ré¥=ÑË¿7ñF4"÷†tJ>Hö+A9ÖÇK—…{5¥Ðí -Í'e9ª|—@M¾5_¾&Dûâ»Lʳ9ýè±»©Œ×Šû ³¯wõ¾—amTXŸ’„™õ ©ð¨µ©_ž•Oe¹ÎèA"@öºàsšc<ѱÈSlÓSÌ%ƒž÷ðV…T?Îò4­[d\±YÏÍòuq'M˜æpåÂz-ê­÷—¿cs˜0zÒ_|×Ê™ìk4-”ú¶y•òÆ=p¶Å“ß[‘È;}k‰ } y¢³Uµ­ NÒF°]†³^1 ­xôšy'è¹ìSª4 §ÈÚð6f›ÿA¢ÛŸ‘¬©x™¢*ÿÐ(Ñâ¤Ha%LW—h`Š8ü‘Ÿª'Ÿ*:l=G°vÊ¥Âþʘ -6=ÚjþØ×>kþ(á8ו¥ ûdr(Jm€1AFâœ> -Èmçˆ78ÆüæûHŒ6Dþe¬Üø*!ÒïÓȃ:JÅ8UןVÔ¼fK•4@ Óa‘¹s<¯æõÜy^ßùy³#ñNAøœâ±«µ‰ó¸ø+ŸWÌ_¤—˜üxxwä,‚ñZp@ã%Z ýR"ƒÉ1êEt­8wY>§2õ”‡2ǦÎçP}qË1?,¬9òIø¯xK  Šÿ”j®\¸ È.©yñâlãLH ÃŒ‹›fyÛŽrù]pÐð*»ƒ}o³»sƒ^æôÈV…,im¹r¶¦Œc£ÔÆxapøìZj]†#©„P¹µÓ«ôZíÝ2É|¹íâTNF´ÓíŒlŒj¦Nö\PO«‘˜~=F"¥®—">ý â§mÐŒ{ÉÛíaÓF›·áá#9C}ò¹Ë¤Ùª•¯;ºÕÐÎ,(J T¸Ë“jCÑ„ê¸{T¯ÖólÝ/К*yiêã‚]dK„B Í–äºJšh'ÓÎZØó»3àÞy -JÕÑÈ•=5ž«L0nÉËNK4J¸JïmÿÖK¼.»t8nFbk“žœ²·iw½ãÌù®MEž/KW3OBú&àðpU üÙ(mÔîG&³5¥ÆÚ2Þ7®ß,ûå] Ê¥¢¹Keõ-,¥§´‹çÊ”Ò&:Âóóçmsí7ƒqÛ'©ž !#‰}mNSrWeÉâ},ra¡Ð"^ÇŠÉì²ÙÃÜšÍZî›oæ6é”ó–Qr«éÛ×·˜…¤[áÄѦÌè2å ×fY.,Å[.oB®ïË Ó¸…Ék˜³½Å‡Hî0•´¢ËÆõ‹ËÎT×Ûbä³Îœoóæ;ûÜ»ÚÕ—î2­ƒvÊwèH™­J -`§#‰ AEšÛ4XÀabµ„“\—­Rì·Ä`µÖïŽÏž Àßçz“-B¤he|ÑM*šE,ªæb¡Ê/¥ù©Ôì‰'8G}tYÓq$¬–ÏâB ² =_ÙÔ_Ú¸AoéïñϳóåðòÞg-T¤èóçLž’Ø@[–¾ÅŸnKaÌU¬ç¶ %Sô;ræÚ©6Tâád`žâÜ®Ð=KÁœ®ÎÍ“¶7½2V»-:ovO¯E¯+;ôÍ‚*+•rN—MºJ|É«¸Â3&´bùÞ3-?‘óW_G¢·ïsMŠ~l÷ð!rÃŒÚILsc¹^j¶Æq(!Íë]ªÅ5–`þŽÃà[NGÎ(4Öý Ù8-(õZJÄÉ óÇš‡TÙópŽZ«Üº'yýÉõiŸf‚7GÝ‘ï?„jd³aô?…§-w)´[zI‰v‰ÑÐÉ< &èÜ|ÎË©œ-e[Äß/Í|fà;ؼÉäj‚‹}?\·•×ÉE@[X’ÄÂ6uež24}oÓWüö³út¼úà~è¿w½JâJ«aKcÅw; 8"dž…Og~yšaÞp;ð°ãF4Ú=‹k%ÍzYÄ»ÞSk*Ë\—~ª>š@ê#GÒÝÕÉN®/ rmÆÂ,¼ó56"¼#ST94yŠç Ç/…ÊÜZ ”Í‹!.ͺ.±cî¼üÞûÛ’ÂÃh4¥n `ý6NT§õ$Êž@/Lºñnvh™«äT­7qŠ0“5ÍÙ!Ñ$·Üý¯O¸½Mˆ_é¶ -Yû/f_ô-J¶0õ1ê)®†!=´ú•Ý–T•T…Ñiœâ­ceøšòm`ðR[}ò2§BdH›Î³Û}žÙ08ÁýX»°½ò`/@ëø9žâQ Û‹q÷ÈoÅò…z£ß·Bb7ÁäBußSðÓ7ðªË•Õ-æL“…;, `•ÁÿÇþÿø_Qu@N¸=ÈÉÿ@Ë[Ðendstream -endobj -50 0 obj -<< -/Type /Font -/Subtype /Type1 -/Encoding 51 0 R -/FirstChar 33 -/LastChar 122 -/Widths 52 0 R -/BaseFont /QXHNZH+CMTT10 -/FontDescriptor 53 0 R ->> -endobj -51 0 obj -<< -/Type /Encoding -/Differences [ 0 /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /visiblespace /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /dieresis /visiblespace 129 /.notdef 160 /space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi 171 /.notdef 173 /Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /visiblespace /dieresis 197 /.notdef ] ->> -endobj -52 0 obj -[ 525 0 0 0 0 525 0 525 525 525 525 525 525 525 525 525 0 0 0 0 0 0 0 0 0 525 525 525 525 525 525 0 0 0 525 525 0 0 0 0 525 0 0 0 0 0 0 0 0 525 0 525 525 0 0 525 525 0 525 0 525 0 0 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] -endobj -53 0 obj -<< -/Ascent 611 -/CapHeight 611 -/Descent -222 -/FontName /QXHNZH+CMTT10 -/ItalicAngle 0 -/StemV 69 -/XHeight 431 -/FontBBox [ -4 -235 731 800 ] -/Flags 4 -/CharSet (/exclam/ampersand/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/colon/semicolon/less/equal/greater/question/C/D/I/R/T/U/X/Y/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) -/FontFile 54 0 R ->> -endobj -54 0 obj -<< -/Length1 1627 -/Length2 8924 -/Length3 532 -/Length 9888 -/Filter /FlateDecode ->> -stream -xÚí–UXÊÖ¦ƒ»;hÜ¡qw—à NÓHp‚{€ Á5¸—à\,¸»3½÷ùÏNΙ˙«y¦é Þ¯ªV}k­ªzšŽJ]‹MÒÒÉ$çäèÆÆÉÎ)~¥­Í p²R¨ttÒ™ØÉQÆÌ $àäH:C\|N ô‹Jvrö‚€­mÜŒÒLMâH:€ ` 3GÀ+374†…™=@ËÉ róbHÚÛ4ÿZá -й‚  KvTNN€%ØÂ `²;¢rüåIÑÑÊ Àÿ/ÙÒÝùßC ˆ+Ô€ño›L¨IK'G{/€%È -•CÕ ºêåÿ†­ÿ.çno¯jæðWø¿+õ¿›9€í½þg†“ƒ³»xåd ‚8þ÷T]п̽Y‚Ýþ{TÑÍÌl!éhmÿ%]åÀž Ku°›… À âú[9Zþ·håþvÀ¡¡§ j Àò?Mý{PÝ ìè¦íåüOÔ¿fÿÍœ¿ZØ`„Ö—:ú÷ïÿŒþk3YG 'K°£5€‹—`˜y¡B”x>œ°£%Èò„æ`wtrƒ.@kâ°r‚ þÕQnntØÞÌá/ý_’€ÃÌÁÚc3hjÿVy€g3ÈÑdåö[åüõ_þG悆p…–ìj÷[„nålïîú[àpX898˜ýVx6^Î6 Çßt4ÓVø®öf®6¿¨eoÄéWà¯ÐöN¿ãð -BÀÿ©òA³²¹þöÄMäâ=•ÿ(Ð\¬ÿº†ÐƒôMÅÅäú×Õü-BmIÿ&¨™ˆº@ñ€†ÔüMÐ2hÿ&h t~4ŠÞo‚æ ÿ B­šCÌ,ì@nÿÑAîôÿì -ôrü®µ 4´ùo‚†¶ø‡8кXþUå„ú·ú¡ZÿÐ|lþ@hBà?ÚOÛ?êÉ²ÿ¡®~LNèâpü¡®œþ@¨+ç?ð¯ýPW?êÊõ„ºrû¡®Üÿ@¨+?êêío䂺òü¡®¼þ@¨+ï¿ñ$¤¤œ<}Øxl\ܼÐ# ýþsšŽ#zÐe¼@ P€›ëoÕ½rn?ËÐççßl†¾U 'ÈuaÖÉB8Ä6µ1¬Ô_¶`¢ Fʺ)^µ¾ó{Zð|Œý§!eæuzwåéx˜[[”oÈ\£Z}5FåŽ]âÓfž¶À¯ŒûÛ†#aY:ujuǽ+@ÎM|2yqkÄ%•=ß4n+žÎF"°òFÆúv%ƈð¢þSyFU×ǪèéÇ…¯×‹kZ-µ]^/¦ÖQÌ™GI¶ûU‘&]u‘Êå04á÷…d›*^aÛ¹ÂU+„¹Še/ˆ’Ä3ÔA,Á…© %Ÿq¼ŸÉ•Ç‚)°C‰R&ÚÁAMV€a‘ÕnÖŠÙÄ3™.ÕL_¥^š7/aZ¥tŸp«¹/:öŸqÆSñ_Í8ç÷vmž3æíÓmòÒÝSvú3Žðf]QJÙùIîÙ¢‡¬X0h%Á•í"¯ ° äL2Sí€?zeЖ&ɳçaV½E±FiÇÀ)›R.8‘CPï…±§V+b»òÊ;ãs¥N=[IøyD‘Ñ¥~yõ¨Ý>Ðx ãäP¶—’®cñˆXÚ)X&,ìàFÐŽ0ºg¬Nêhd©‡÷NÄv÷Jã;˜š=»<–8”üf«Ãœ÷ùÔ`~Ä ÝWƒülzr9qtùÆÊË¢‹:+èƒÁFŠm‘”åÇ;àtÔÃÐÏQÃÔÔÙæÜE·x]•½ñÍ»p¦•fÄ - uM4< )6¹¨—Þ?Ì|Ç$¸mª•x ²¯¶v®}¢p«Ï{%‚%ž£•}×_†ñ͈IJèÉ)¦Ã”u„AV¹9uH9>3¸È -’®y¨lìµfê¡F`v’}—ãzv ë?`ðV3¼þ¡úJw{‚[T+ß™¥X›Õ‘Ê.8Î8ßüMX'¥ô3 ÷öu’’€ wðwË(¥SÓ‚šsþŒB~–õí=Ų÷ª£¾•µùQ*ÜwåÍäÚ#)ï¸ØË!kt¨hËÏ^q̽çZ‰ÒÞ¨ÔÓÖ¼€0é9PÀQéäXwê>zÁ’ÈÄvq/zawÐ䉰šôÕo±Xò6†@ƒX—‰ä•'¢…Q÷¡fì./ÂéȤ¾ 1y‹Ö,âEyP—r.2 £»¡„Wìž•°5Ç…zŠÀ˜‹7cõW -¹sfïŠ_ÄòuPñoe¸¸ß+¦}ÏûN©$Ô³‚?þÓ:²éæO -ôJñÙú}. ·¹HìÓ¢ÍbºfyD’0^ߥ—!ú“ÈÍ–˜€ -Ac+i¶Ebšfó/+'¥<\Ô;7Ž F8ù=vôtô±á -ÈK"ôžš¹­3ê‚rB8gâAâëd§@HàÉ9u…±ŒJÍŠŸ¤B×­}ª rŸþ<7>w—A·1ýÚ½þœü“Œ=Fا“ -,×W$¡™yë`ž.ÞÛÌ z)‘þ½ôÉ|œ—.Žuc?û÷|©TIIPï&$0OÅ™Ò10ùäŽê–¡‘œ»ŠGËä>Ùýµ¡$fh3kW¦Ûd#eÆô´%™mµ¿ÁO_ð:e$ _öâæøWyöl¼Wû$$Ñ>Ív좺þîn2 ¥ð3º:IÙS1’åi2íÓÁø"b#•‡úçGV®ôÕ©aå6ÌèÎw!á“^¨ˆ™=xÀ²í‹ÖÀ÷B€é[0û¾’}›×7™LÄ´WŸ¢Žj®VÃû^ô|/wòüa@¦f€ýм>ŽôÒ•ùMý\² +db´ó#»_">FJ®ÜÚgK½¯ -Ïâ§T×ÍÞDv½ ºGŒ/ü9Ì -‡Jå"3 -Ÿµ-*5a¹Pß™ü‹$–R‘êIâ<ÆŒÙÒF=²Suã (/IÀŒÂèy—œ`ÒŽDð™C]R™FÈq2­x!Ê!¯-mÏåî‹cMè5ã2Ï2¾i ­&»j‘[ô`¢ìÞÀ[y•%šO¿%^³ŸÑ9Åï)ž“¶ÄÔ‡Ã×®¡}êq/÷8­Â -ˆšX¬S¤Óxfê‘bGÛ˜¥3H¾¹ÅD˜Xd…ÈN[çsÇ­Á™<äÙ?® 0ǪÕùaXKæ™òÆÐ%90ð2Tœ ò|VÛ'D´’“LÔ*jq£Ë2&z‹;¢÷š¤'–åZÕÉâ÷¦$ý‹V$£†ÞšÑàfÑ01PãK6—uÿÏaÇ3ï(ÄòaÛ77î„HÏÓa™Àðønó¢†gfŠb †zÊxµ”ó8[±¬ÎZ¯o¦ºG‹ñÐç« TD`àð‚š‘ yIÙT6üæWh§4gq9äS#‚9óÊ7—ŠvâíÆ5_à ~­®õºÐó{W>fäÞ¨`þÆ9‚Zà~nB1·'p}¯Ãxµ{>HF² -Bµ82¤aûºÝ4(I$!d¯Ñš0ñ3¬±¡ÿvUüpܧâE“ }Õ\ׄÁ°¹/ºÁJ4:L]–´ÉõMýN7q‚Ÿí‚ƒcô‹I—´\·ÙÈ%EY×öÜ|þÎ`J;ò®U]xAË©Žõ ï ɶ–Ã(Å4 ×u¢/p\(ƽåˆ}p¿¬Qœ¸DŒ÷´MÒ$Φ™~þ¨lhD©ódˆ!nb+ê>ùy‹ú¾&;ZÃZ9"ñûÎÌH%B°Ãóû³‘Öy •ŒÚ“˜¦ynÈûQ}*ÍN©aRµ¹™Húµ^ŠíÚíJ‘$›Ž#4‡J <ÌñT!Y»b°Ø'"ò(Bøè?™3™’ÉêºüM[}çZ¶ e½+V|ö{0qËf77b‘ù›ôëvWúÙôBKÇþ§õ¡æï3Nk Ô˜*t‘†ƒ=éN“€æBø>«¡HÚãç¤ñ Rv 9–#9áŒXó–ígžÕ[óÇ»AvëÄÚõF0Ìpô$M†èB¡ÂéDz+‰Á<*W‡˜¢Œ(O8¸˜÷Yå3yfû/ñî­ ¾‰ wß&læ!ÝŸ%¢ M%^n÷7FÀæýXjµ Þq2#é¼$Lr©„gÕ:ðÆW7¤º¯5z÷ŠGªZ¦8͉€È¦U+jk†k7SªŒ¸O)±šÏt< ¤Jg$iûSŸõ&éèSº¦ä{Ò¹h;7ƒéêM™Ýe*ÜòI¾¼ë¤¹ÜŽ™Eã­ï4µF6ŒŒŸÆ1(™§I‡xÆ´™ÒÂLQ¿_½^¯ã/Ugt²Ë«æ$°ÿ„¹pni%ä•{põl)ë€|æŽ)‰ß·O>~ñÞã«TÉìûàøí¡™’ç¸âþ"M‚ {?»b¿€ÂuÛUÔ2¥Â - !·žàj±ô¨Ъµš—»2ÔA¢,êÚ æ Ø6ñ߀‹¨{óLèΑ#1üÞx‹m1‡ôš*'þ€ÑpI 'çá ’î¾bõCtá˜$x ³lÆ1œdÚ£•>X|0ó—#é‚9´ b˜SA`§nÚeW†ÀSXµ ®ö3§ÛŠÒ,ú—¾ûͶ’ØÎíéø¾^ñCÒÕ¢Zæx^xÏ N–·Å#]@Áb´Í•˜9‹0à~ª!S²v­;ºy/ÛZõÕ†=’Ðh’h"÷\&sé³j73ö˜fÌI}œQÊ"oƒIçÞâ/æ·Ï„Ã}˜•SiÕóóí3äã²,á·™†”Þh’ùL™! ¿ÏÓœKc“pœ§M/Ëî¡?f}IšÁgÌ~šœ¹À›öKŠèX=¬€[Kã«34FÛï÷aÏ(öåÇ” W¶[« -ìÖn ƒ!o6üàÝQ³AÆ~ÍYS´ÉZfi]cû›k¯ß¶D¿é÷|üPøZMðò nwï<:BAÒ)lƒ¹æzúåh&sOm‚s3Z ¦h¼ISÃ3¥yclúÛskJ“0úGç -!Dë©;UU,g¯©”ù•RŽé¶4\‡…AEHÈç»N’Øòîô_iÜ1ÓvD‹ý"-Þô~‚ ¾êš²ÆúJÓ)%ù)ó/»›*Þ¥$cžø¡ -¶Úï—ú°)rƒ±Èb_ß\}÷ÕýÆëþ‰:%ûÚºa*HÆÎ¾¸Í -vaf U'^–¾“‘½¢uƒÑ.¦ÖÒž‚ ¹ýXr=HJ€¶( =;Ü`‡Ò¾ÃxšEšÓK·&p¢ŒFÆ Êמ“!›{m^8ëäðLð*ýÛ£•AgÎ0[ýñü: HÂBQR‚åX/†ƒ£½Ø˜ÏˆÜÍS^ƒ¬R#ðq+ùÒ%Í f7ÌýõÇÔt_ø"NB/-³a¦¬¡Õ×ëÜh©î<·2ÆÚïŠèvô˸odM/nÊhSØû—/­eë¬+‡ÅKœOݱÕÐ…,—,ï²O5±œyÝL(3‘·¾¨“D …zóÆG„µ5<¨rÞD*ÇöðO7ÈÞÞh꼆 M$h­ºâ'mÒ‚ßõ^s_öu#'VsT>÷ªögç•“«^ù$ÎÎó­]×t\ÛNÅ:Dø;- ÔÇ龡¸mد6j¶ç?¤‚Û£Én»ˆTÔ°Œ1POz=ø“tþv‡ØýÆÈ?—úÌ [Ñ»3$Þq»D˜ð¤uX’±—c5,û®‘TC§,Ú^«qÌÜÀï\¨*èqÄÅè?õðµ­sMæ|6Yl?HZžÿ¢I8c?Ì[åß._ö¼Í - -×ÊóßUöw÷ðÇ>«6Ÿý¶d—wÄ~ºGñõg³¾ƒ{žŽCÛÛ|½V¿Õi1¾Þ sÚj%£ÝááÀnd êvbù%5 ‡0#à¶“ Í;­žÅ¹²àvµh¦,N„pÖÌ˨`Ö½ÝÅ\•†}íûc‘âì÷™,gáÞ¼Íb±?ft‰€uœ}#œètMž´|Oê„I5¬ô#ŽãÅG¸…_~ž5[ˆïõ\¶Ù‹äjÄO­,“‡?^ø$몰c`ò)D°ø7t¢X%åÙ]auÌç–ãÑL Á-ÍzìËí¡•ÿòØó†×õQ()C§-Ìg¸)Üú\â 5S"aÑ~Œé×g_ç 6ñ´d IÕ)²¹ªz㥣ПXÇãO”õ©p˜^7ýêJ%±_ÒȈ>[±l¬¹¸ÒÌQP^þe&Àýƒ„ù‹Â.iÿ/¶‹fåBÿ]³Ï¸"„UKͲ²<\µNi4°¾„î20¤|ŸÃdÜü>cçÂ&+co½Å)î P.FrjüAÀ4!É!)&‚ŸýÉ;ÿKÔ#Ê…C{Ñ~snÃpeoŒ³Ï -<'ìUh ÷î¥wZyÅçrÏJÀb¯²+üîèç:*ý)ï’…‡‰œ¾ÚG”•v³ -÷brRšO~o ßG’\¤¥ Æè îÙõ˜Šáä̸)½=‚¬{!RûxþP,‚g'#Dxñž±5š˜1§q'·ËsØeËýú þ$P»ÆìîI†GÊ—Éðk'NÝépšd±ß - -«Ùî§ û¸tVÚG ¸¬Ë5€àìÒdé>ð©~Mû62+7ä)Í·g­Á,Ö|¦7×d_1æ0ùWidÞz±þDªaé럀B–OÚ¥#Ý4ÊAãÙüÞž](i¥ïCóZ5- t^FWÐm2á*¢nØÖ’WQ¨ ™|WbüáüJ$…äéâU†$­Ö„³9‚¼>ØÕ`ó~ æ=KX˜mÏ +bê§AÊDU¤Žfœ¦ŸèʃƒîhÆšF®oâònƒ¶D~V…zè`ÝKÂæ… ¶ˆºÒ_ÂE'9É’¤’%yÂÍEfÒi`íˆ*Õ¸Ðd°%î!Jù怄W7ã5ÖxæÚâ2mÆß纣?….Ûma›µ¡³ÒºªB¦š³û«#®órÚ—ïðWvîcj_NxS§$M|˜% -[‰oÔ+ù›è;€ôw¾43µÃN"=“;H>*I‘ªfƒ1ït[×}_;¹õ<ÔÕïíinw «lwßì{C8¸NëÞKF?G•«O_‚j*ñä -C²â×.PV4ÒçŸõ]9ÝÏ]"=³KÄ+¯#{Ë3D´OÎIÈRd) ®e¿ü\"ÊGƒ« -ÕÏ‘>-AYúª§6QðÁÍ{Û÷4QÅxÇMG5ƒáaožl¼Ig×…ÑÎ,Þ²²ÍÓÅE@žöe–ñÕö÷®¥ñöÓ_ðr>5©Ày‡õ~“íK®™Mn”Èòz1xÝÓe CìWpPWþ^ø =uû޾—tñ8É1‹5:ûU^†£3UN‚+²:b“Õ…“¾ú*¢Æ}„MB÷u(ö¼òå~_«"5|T–œÛÇ£ú#®ŸcÄÃOé¦3à“&˜ÂFÈŒýaÑ}Žüé²õžüO=xHºÅhD7Õe š×Yš£’ˆÍX”™ºÇ‹Stâ0¡Sÿó«Ã~ÕÔ@¹oN†ƒ»ç -<2l)òj[¯è!…TwYjÙ—¤ÖäµlZG@òò ’—âݦ~ÍDã,üt:<~ -7†j´Cç#†`1TÌJi§Jwýæ Ngiö .[)w^ë!vS :veò‘uY½³¡hû+i¼D­íÆxÇ)À‡mú¥R–‹ÉʸXímMq¦RX ®ð ù¢ÕÇ®oëÑ‚#2l7‡Ò³r’§F’?†£ïbÊdç™Ð¢&;_\ôåÄ…H¨¤4¢=X6ñ†ÕdÞ4ŠÍeë -8Æ×A^žo¿á‹(œ-·_~IɈMÖzÃU«3„¦+Éy -+/ðý³Ü;ÚÒ‚#NfÄII*n‰x‡|Ìg›¬ÖBØÎíü=–õ/ÍQ³È§£‹¿æ ™7†»¤&%òßä$—0X(¾Ÿî[Àôºy ”Þa}aDbš?\TѾ‹ø•º^[ÃFizÂ&[iåäáEN¿¾··!2Õ…¸½œýi®¾º¶«êP¶8Þ!ÐÝLJO‘Õb¬ÎóÄßT_hŦâlÚfl#æÛI(%<;e÷(´RR¾ØDµõÈU•= ñÕË!ÂË‚®:âB…÷>¦9"ÈWj+átÕxd -ˆ³ÝC\ßgäÇ!×.½Øœ -þÉæƒÒä4/FEÍLO_)e¦Úq{¤"k§eès7Î/WÌ ÚsRßAR±Ã5Î’]@ -<.å:Ûó-ó†qMÝ?ãµ^ÏÜh“ÔhšÑ lœ-š~Û¥@Hu–ó`{é¨;¯ŒuáÚUññ‚sÉ.KÍíØèC&;ÓxùR[«òdkï&…ï»_p”ì KÍ3®·»ô²Ï{V -Ëêp„=9üR{¤Â¡È2MccW-]¶#gÊ›_êåDËR‰ Ý]|DRÃÍfGªþK>E“Ný"ß}„ž¨ŒOMÂC“cè^v½5ñ‡y"¾_«q¾òÜ/}0DÂñz~ôH°ÚYæf²¤Baºú<Ÿw ¦l­j@­Uнe9î¢ÒüjŠÆÇõ†ºËz‰%wzaFEØçVWYm×Í‘cï»lNÂØ'R>yïÀÄ–VÝZërˆ¢å©6ðv×ÓP~·ëZîv@ -hô#<ý©9xŠéž¾ñ⢠ïü6ñ¥†a7ü$¸G`½¿()IL½ *Ûè½&=“½~bYí6IàVyQbòâ8åC´Ø/Qßã{|äEÌ”^å A T2eå\Ä_Fç0gDÛq<¹P†£Í±«tWη`Že>áœ!’dæ{¸.iMó`Uc×™n7~ g™~™çû©„¶ht`#µá*“hÚcè"|âÌÏOôùØ3ÁZÊ-Z¶0dÉóeúò˜B{pµDªJ/¥¼¾×@âl -ìEÎ "èÑ‹ã5sn#lýÀx)¬Ð-j‚Ò -ßñÁZÓ)_ÑhÙˆKµeéê³W ©|Е²–+ÍÎù¤s±¾â~’þå­ìÛ  {ñWt šé—‰öÌ]‘T1Þ×ÀÖoe®dû¼Ö¯(Rñ>i„žá -ÆR~[ÿ1’?Y‡ç¿Õ¿¯Ö—Ì ïèPãV«ƒŸ•!-£.\/Ó•žÁ¨Ñ™Ï÷tú •´ÿÁÿËjb{tL^w­+?mì†áM6A{“Ä×¢Ùí.gÒ´í -†1*Ò£-8"»(g2|—ÅryƒÕºb£ݹ#Ö¸‚HŽ9n†Á$ÇÁÊÎ’‡Rr:«Ï ÀÖE“—‚@Á'„·òS'ÑT[Ç)©¯©ªîK0È$Siz:ó 3ÅÁ:/jNi"“¾1"—îG -K×? S2øÊq[\Õ{ÝO¾Ëÿ$‹¬|RÃBü¼C_ËNu+ºã·zeŒ”÷ýø”øl„çyAC€Ãù§è>~Oüy‹°Ü{§ø¨§{Jdÿ‡ãűúdÔæÊýŠn§I®1»µ^¦Ì·¹”°kU­$ÓÔ˜s}ï”±”ʉk¯eE.Ñœxu,sˆ½]D(ÇbÛì[ñ7¼³”Ì9‡³æÀ™*©`C ‰æc¦Ðw¿R膗ƒÉ¿àoÄÙ¹Å+¡l‰ä«NMÌkbë¢4³Ë8P÷ñ´`‡´EX£õ!\ö]Ƽ›±¢YðHv2Ë–7(˜ÖQ°fò:¼#ÞEi”ç!EûÖ&,¢Ü’bXГݓ`Ót„Æx¦1[r7‰´)*÷½Š7ø>“™zã&Xß«аÛgï ñTçÍa\ò+уDr¤j7† û}…2Oš€Ø^ .o÷å&ò—Z¹z»×+ЇêÊ·ÏœPàEH¹8«oÞî¸Ã'AžƒØìÈLxóë³<=àÿáõÿø"€…=È âæä`±Cý_Ç·¿Ûendstream -endobj -55 0 obj -<< -/Filter /FlateDecode -/Length 2848 ->> -stream -xœ½ZmsÛ¸þî_Áo•çN8o$;m'>_ÓÉÍõš&n3ÓÜ} $Ff#‹EÇu}Ø ’OnOÆI,€}}vä§³$Šá_¥’É8Ò,gZ«h}sG[øûKG!¥fR¥p\ŠX3­àBç,™O3¡å‰dW#š° ]gÕ¸`qƒË¾u?–M AY‹÷ìme‰I;Ú+âŠ)nà]Õ¶§¾”Kâu™$,WŠ8¾¬÷ç‘™GÂë6('ø羜c›$,›§‘–’e1yh¶tñÆ3‹£^zäÖ.¾YF+âÖ§Xü)_¬€q£²Úü“úÐ.Q–u½?Üí¬žÚjo·lcFqcÀ!™ÈÄP„I  ÍããuñoC¦L¦É‰:sÔó[WÄ­ÿ}¨Ê/êÃŽ¡7ݱrs`'U€óâ#É, ÃUŽ æMevªðD=»óhEÜúâÅ¡EwyØ•Åæ³UBu¨¶ùLsóy?p4~‚À"|”–¿5èŠÅ¾B_üoÑV& §a§%SpuJØÑ§†]O~4ìLï…—|_R(ahðîÎÞìZô´ývÊ2W)c–Ç9†hæ¯Óyp€öj¿A;ûÂqüdµràÑ*ç•°¾’'ªÖQÏq<^‘üá–Œ@~o¹û|Ŷåy€áÅOÅ*à¶V18Ĩ0§Ȥ†w» ϱÞƤ£NÁ(þÂY)Ô)@u7é´íÊ/¹‡r}ƒí‚ÙÛ$Ì@Ž€¸ØíHPH±ÊFšiÐæ[Bã¶3ë -ƒ`ÀfŠºÔÅ*V‘»XÛLêa;íù$ ÂÒ[g‚ËyÎD¢»­¨å[Ú: Pí³Yt†·¥£™lìç½4ÊÃß¼HÔŒHòPuC6lx¶/ïݳë|å߸a (3§ nâºo3îàcïcWyÛöñmÖk¯‹ÖÍh›²¿ƒë¡›âû£¡ì«¨R¬÷®EsI\Ä,ÎÄV‰hSºJÁ¾x²Ñµ{@•NUjQÊp#E†hlŠÔ’RH7Œâ^—îúÈQºèIk{•¢¶“Fû¹øx4, h‹v \»¶ßtGŸ°ª®oF"wL{‘ºØm‰¿ª½¾é‘x“Îû<\òBÚÍr}wÙ¶c`^Cy;U®±ñ§õè^ ¼µ)Zʹ)%?ô/‹çMéÆîüò¡ìX¯º,rKºn+g<ùóÈ)B’k&Á)9Y,]R;r³ãj×1 ­cß\]’ÛRV(ÍùÆ\“Ò éɸ֕Ù,Ï7t´¼&@[z›Œ±‡H -úךÐY™ÉëEGø—{“Cø—r¦bèÙ@-ó¯,&d%ë91‰Å|usk¶È ÑM¸‹8ûð-Æö ªšô±´‰ÞÛ~š€&Oø¬@™âÈYìizH8TíÀõ‹€ å¢q$¨‰×ÖõÁÕÞx,¹+]äü²Xatuê®Û1@ ÓBüÿ˹#¼ôËŽb¿-ûØ®WâÚ‘wXj÷õ¨Ë -8üÑ®èð¿ -ÅLé4òt8a7&½˜ãª`·œk¿/±’ÈYeÖR@Mç2h%¢q$Ty^*o¸+:ÍIS¢! -)ñÆ ½)?Ý¡am¡hArß—j·†˜áyÏCЭShsL,Hþ•ÕäÙ¼ºˆ„êòv׃Ì3³\3î­3ÅbÒÆá~Bq5d ´Çlä%”÷s¹†²í«ºÞý)„Rœi°µ·îÔœP€r(Í J©°=Ÿ ¬…Iz.'9 -gÍ6mCùØW:‹¼¥'"*É•?O><µ3"¡°¡¦ýž”2îÈá?m@zÍ!Å$‘·ëDz-˜²¯{ŒôÁ¬'ÌB潃Öá×8DãH¨ÕÚÐélWþð ®Þ»ã -Vuo Í]SvõðÜ~ „C¦¹’ÈcrZ²Œ§”‚ð„ÏsÎâxß •/ÞkR£š¢sP#s×%Ï‹õ°÷2Ï.ƒí‹zó«#cà.¬+•·+Ö®#t'®e‹L±”Gž„ÓÔ+Ë”žW¬Î¿D×J³ÌÄVÆ’c­¸¡p¨ç7¤¨‚j@¿ü7 -{5íSw…žxSàõ®:/i.¤8ó~ã©—Bâ2ÍÇL~2ÅA@€-gGƒ ¨D:Á= å'ף“ÝÓYÌ4Ú:rDô5óš:׀ʸ=xgSPw¦Á$@:#ÔÙ[w:}{û%Þv ÜW¹õ €]/†öI5 BUàIøþ#fZ©çѨ0Ÿd„»Ô( FrMìî®kgŽ*Ñ8!jÊir×O÷‹ÉÇù$hÅj°ç<è“<› ã'Ì5àHƒèr ‘„s "$6úZÿµ?Ú?)ÏS%ké¼føu‡OFÐYì‚~«˜ÓyÂüR{ΟÇo¡óLd¸B¿%Rù~ ¥Œwž—Y8<H‡ºµKª¢Ç'#ó)Eyb²xb‹ççP'äChÖóãêt¬îãƒþPãµ÷"Ð旅žÄ¬Í¶Ýš'+W Мˆ<©‚ÙŶyùê™Þ|ð¡øœr‰•û3}ݸ´Ó O\Œ"ÙGŠG(ýis´kÂÑ£ÐZ& -ªÈSÁÔöXó™ü\§¦x>n §Orª;â¡CîÌ£Wõ)Ö8Ÿ¾; -œÆz…½€lí/,PÇ6 -ìzjHó G*¢^%ÓÑÀ"æ\ý9bÄ„l2c§&Â!×ÝyÜEß:u -ý-Ótˆÿ–húíØô ܬ¼•X!¹¤Šzù§V€TYò<ñ!c–Äsv —V)ÿ•M=ýˆ+îÿ§N¬Bë6~ùþèª1•öûkOÀÀ§§1ãêH¼™ ßEoš–yƸ -–’N"Óˆ(PQÉ”#e>jÒ:êWr›ýýìªSćendstream -endobj -56 0 obj -<< -/Type /Page -/Annots [ 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R ] -/Resources 66 0 R -/MediaBox [ 0 0 595.276 841.89 ] -/Parent 2 0 R -/Contents 77 0 R ->> -endobj -57 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 120.238 758.283 266.91 770.238 ] -/Subtype /Link -/A << -/S /GoTo -/D (addition-to-lib-iterator-synopsis) ->> ->> -endobj -58 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 120.238 742.343 254.374 754.298 ] -/Subtype /Link -/A << -/S /GoTo -/D (addition-to-lib-iterator-traits) ->> ->> -endobj -59 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 98.32 724.908 142.847 733.708 ] -/Subtype /Link -/A << -/S /GoTo -/D (footnotes) ->> ->> -endobj -60 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 0 1 1 ] -/Rect [ 350.669 502.326 391.516 514.281 ] -/Subtype /Link -/A << -/Type /Action -/S /URI -/URI (http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/lwg-active.html#200) ->> ->> -endobj -61 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 0 1 1 ] -/Rect [ 291.807 478.017 332.654 489.972 ] -/Subtype /Link -/A << -/Type /Action -/S /URI -/URI (http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/lwg-active.html#299) ->> ->> -endobj -62 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 0 1 1 ] -/Rect [ 341.433 426.212 377.085 438.167 ] -/Subtype /Link -/A << -/Type /Action -/S /URI -/URI (http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/lwg-active.html#96) ->> ->> -endobj -63 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 0 1 1 ] -/Rect [ 415.206 366.436 495.948 378.391 ] -/Subtype /Link -/A << -/Type /Action -/S /URI -/URI (http://www.boost.org/libs/utility/transform_iterator.htm) ->> ->> -endobj -64 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 0 1 1 ] -/Rect [ 358.268 307.213 450.453 318.062 ] -/Subtype /Link -/A << -/Type /Action -/S /URI -/URI (http://www.boost.org/libs/graph/doc/table_of_contents.html) ->> ->> -endobj -65 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 0 1 1 ] -/Rect [ 240.423 259.393 353.761 270.241 ] -/Subtype /Link -/A << -/Type /Action -/S /URI -/URI (http://www.boost.org/libs/utility/MultiPassInputIterator.html) ->> ->> -endobj -66 0 obj -<< -/Font << -/F8 42 0 R -/F39 46 0 R -/F43 67 0 R -/F38 38 0 R -/F40 50 0 R -/F14 72 0 R ->> -/ProcSet [ /PDF /Text ] ->> -endobj -67 0 obj -<< -/Type /Font -/Subtype /Type1 -/Encoding 68 0 R -/FirstChar 45 -/LastChar 123 -/Widths 69 0 R -/BaseFont /SBSTLV+CMTI10 -/FontDescriptor 70 0 R ->> -endobj -68 0 obj -<< -/Type /Encoding -/Differences [ 0 /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress /exclam /quotedblright /numbersign /sterling /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /exclamdown /equal /questiondown /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis /suppress 129 /.notdef 160 /space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi 171 /.notdef 173 /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress /dieresis 197 /.notdef ] ->> -endobj -69 0 obj -[ 358 0 0 0 0 0 0 0 0 0 0 0 0 307 0 0 0 0 0 0 743 704 0 0 0 653 0 0 386 0 0 627 0 743 0 678 0 729 562 716 0 0 999 0 0 0 0 0 0 0 0 0 511 460 460 511 460 307 460 511 307 0 0 256 818 562 511 511 0 422 409 332 537 460 664 0 486 0 511 ] -endobj -70 0 obj -<< -/Ascent 694 -/CapHeight 683 -/Descent -194 -/FontName /SBSTLV+CMTI10 -/ItalicAngle -14 -/StemV 68 -/XHeight 431 -/FontBBox [ -163 -250 1146 969 ] -/Flags 4 -/CharSet (/hyphen/colon/A/B/F/I/L/N/P/R/S/T/W/a/b/c/d/e/f/g/h/i/l/m/n/o/p/r/s/t/u/v/w/y/endash) -/FontFile 71 0 R ->> -endobj -71 0 obj -<< -/Length1 1280 -/Length2 8134 -/Length3 532 -/Length 8938 -/Filter /FlateDecode ->> -stream -xÚí–UT\Û¶®qHá,ªp×àîN(¨ -w n!HÁ‚ œàÜÝÝ‚…Á=—µöÙ;¹ë<ÞûtÚ™5æ×GýÿGcÎV 4êZì’PGs˜¬£ƒ;˜,”VÑVƒ€`H -ÀÀ 탸Á^@Ü`B@°  Pfþøðx ñò ù @iG'o¸•µIšù¯$~ ¤=Ìnqª@ܬaö5, v@-G 8ÌÍ›(igÔük†+Pæ -sñ€A9`0 -·pšÃ¬àο<)8X:ùÿ†º;ý{Èæâúh -Èô·Mfà£I¨£ƒ7 -³pª:>ªÁ½üÿ°õÏâ²îvvªû¿ÊÿÝ©ÿ6±‡ÛyÿW†£½“»Ì¨â…¹8ü3Uö/s*0(ÜÝþŸ£ -n;¸…¤ƒ• Èæáñü+w•…{Á êp7 k %ÄÎöwæý§“ÇþýíƒSKJK[Y—õ¿¶öïAuÜÁMÛÛ ýÎþ›Á¿ù±I.p/ è±ËàÇÄÇß¿ŸLþ!&ã`á…;X¹xù€ˆ7àñ=/Ð „;@a^@˜×£cNG·Ç)ÀÇÎø-]í+/ÓÚÛÉæðWüï¯ÓÂÑÎñw„ï1Iò7ñ9¥þCü §ìoâr*ü¦ÇLåßôXWõ?$ð8Oý7q95Óc­ßÄäÔþMü@N½ÿÐãÉâ„ü¦Góß$ø¸Žÿô(ýÁ@NØøhÀò|t`õ>Z°þûÿeíþÀG]ûßø¸ñœ࣮ãø¨ëô> -¹üB®àc?ÝþÀÇÅ»ÿ6<þÀGž¿‘ëQ×û|\àãÉ…¸þkYÿýKI9zù²ƒù¸ì\¼ ¿œñùýþïL¸³;Lá p üµpwq9¸ýýíxÔø7[Â_(Ì f˜Ÿq´µI® /ò—ÉûŒÊìJù¡ t¨5¬úƒ0Ç÷a‚)—ºQmسü0|x1^Ò¥RN¨%ïY­ä«^_-ΰ9ü^l"æìT-ô#‹ïƦH}Y=¸ö‘;óÔ[Nu¬G tç«­¨åÊ{`þ²oPŠfgîOým†×æ1S tß’&YMʉ0ÝÝÕ¸Á›9Ç\Çùü>RãÔs‡y²Žå Û%ì‚QY*ÈÓD˜½,ׇà4[êyýLAù_Õ;¸4ý3êæT±ù -œ;ñ¨l&lP ùßÒðI£g¬õkW{r˜ M•ôžqV¿ÿŒ’Û¦H1ƒv°6iM¿$GFÞÜ1 ݼŜ²,ÜÀq†Žê|ẙâ v‹™Ê—¤6µ"c &ù8÷º>6:&9¯"(¡'¢i'Jq6ê´îµÍg Èª¤øtMðw`Ü„câsèŒøòç*upˆn’êÌ—ÿÌTÀŠ•®7%=Ø (l - !¡ŸPãïL»NfwÛ> uñiÇLWš\ ¤mCü çÚ´',¦*Ã*×wãù–u·–T¨ 왞n€€{ÏàÕ'ü”…Z<àk»KãJ¿gÂÔ/ ) -¯ƒaú|ñ ‹‡E3dK¿ày¼æ™6eTóKæ´ -·=&Y|lúxñóÒïÀLŽ^uü¨!ª°I’ì“Wò45'ý Ú{D˜›FìmÃ)©±ýwïpW2±Ãe^9•Tè~¿Æ¥WiÏošÒY7q‚©4GÕ+ÚüÐÓìàg€Í¾e5 -TÑÄüzÖ"k¦gL)UÙY¥±V©o膪LUæÂÀ'[.@•qŒ›#s"—ööBÙ6Δg„YóDljGÅ>Fó=¦Ù¬°ˆÞ¥v3ú÷þ6w -?V.™Œº®Šùh)üÖ‘KGÕ;œÃH1»Z›V1®ÜìÇÖeÇ~·z‚ y‚Ÿò:“®Ì¸ŠŸì¯Óûúí - oÙŸD†¥ü2µû”f”fIòW›¢\6›Ù"DMÕ¿Ñq8½óªyER`1ÚßzÀѲϠy¤úlx}_úp1Q‡ðŒcyT°L“…ªcISÅá@y`C/¾©ãµ+§aÍÐÎnmvöbxå¾Àk1yŠý ºóM ;^؇ùž¥ŸI2-‹ýÂÑ«Ÿ@2½O¤F5·Ÿ–`—Iƒ_©¿ZdÜCä2µ;OºÍ–²Z¡Ðûf\ÇläEnbP‹­Žì ¥‰$:AÑô3ûNã`Z9ûúHÙµ–ìvf.w½`ãŸZWz[”©l”Œƒx­óO‘(F¡Þ&0g}y¥ÿ®a• Z{Xå«8§îÌ-õmµ\ù7åw|³‹r´§EÒÉãGEkæä½{%a";¢Gân{4-Sìþ„éÒÄ rݬ9ö1yÇa9èk·Y*3Ôs2/%#îáQ¶¹cÈÙµ²9Åýñ7ß’Ý…lùS]·±´öµUž7ÊðLe¥I…õ&½ ‡ja -^áZ‚†5ü‡R½B˜¬s©¥×+'“bO#!®¼ 7Ǻ±ð›Ô*™:(¯sV6Ú=ÅL]rÑ—3@I‘¤,nC€£Çjĵ4=yª/ ~dšÂ€.äÖc@Ÿi¸L© š?ƒÊuè|^ÿ9a¡å‰Ê«3ûƒId)þýYaÛ –?)’ÚxÁ âè#rMbx±•APŲi{¬ˆé&–@2+»eÎË,/·tóœ‰;U:—~Èýð$5äW«w·¶ÒÛíRÉI^Ûo"³ZïTv·0ó·}*¿ åÞÅÞ|ímã,ø8 á,´UO$ÑKSHÕÆP·ŸÜÖé׺™D™ àšÂPë“Û㦿5¶énz­õR,n¬Fö:xYäëh -sL¼Êý…™12Ó]Ûé`‰¼lŠPô~`GŽš¡aÄp[öÕ³â³ÉÈb¯òÉ<>œâÕ÷’x“â›8¥Õöl{^&E¼fùt)Ñû³¨ŒÞO^X?¥»K U ̈l¬;{V+üþe¶¥™m¢á¨rÀìù¬r×3ôý4›=>ùº±ý<<Lñ¥Ëzúˆ?cö'ogÙÐw‡Œµ‡ ¾Ü,ÊÏ è³ ‚­½g¸¤~ÐdÓ¾£V¬Ìü>C3üqÁ'þ³OƒÃs‰îÿ`IµÕíŠt~Ä #ærŒ;’x&†ð)&þ¹¯€¢ªÔŽ‘àiKmEºæ˜mOÔhcc¡)l}ÌMãþö»‰!ÀF(…í+wÐëjÂZj²“E›¸®—]üâ3ÄÆO–¥Zˆ$ŸŠkM ¿P‘݈‡{/ŽÕÄÐ\8 \G×ma„÷Þ‚Rß6G±j¢ÛŸdºiYŸh…Þ—]ŠPaa–!»Û)¥’UÎSÝ¿6Ý®ºIàruÁ”›;à  ¥:Ý@ñg'÷F&A‰óâ˜FÓ»7•N¦ˆÁ:úÔ5€|RšÊ‚\šíÐ6D­{Ü ÐBÈIHO'q‚"Z\“ªRÕ<ËRI#p;³”PÙ²”Á— U)C4·5“ˆ·{ý¾¢r{´¼Qõm=tÓ=<]tƒäÎX”U{ä49VQɉ N✇Û8W‹Þ¯%¦ÁŽDãté® -}<]ßc b=÷Ú&:£¯þäþÁ² R/âÌdÓÚk-&rÚ"ËÈ™çüªï{º8Ú[DÄÔ]¾dŒâ3³6X½ÿؾ1^²òñ*ÿdÿÍg9k ܇µÔAh+ޤÉE¹­Ú¯IBÌ\¯…¤É¨ÉÓtÿSùòܵ³ÙÙO´ç¦ÝÞÒŸj9&»jR$C¬:ðŒd%7>ö¥Àß!ÐQ>»¿7³È"÷)1äÕb©É'üU'ÌmþggÜbô³|‚°åÚ2ÛÊ4Cœâ¦ý¤üɉ‰¼6„ÑE\Ï£ÅØ‡Î!‰¯ö§°,o”ýP 댕þw¸íââN¥HP;àXÓ÷^ë -Ä€¹÷<¨ß ¡“»\Wf-ïå7äÂx:Ý;ÜP_g#›}y?žvbI³Ñà"€‹g–ë’0œYNC³2 ™Êyi ²õ<¤\¾[L^òÝÀs™»UQדþÁudñK9öí¢ŠÙãgöë”=R3cj¶k±j’@ âð‘ˆ8/kdv¯vc‰AÙ õ†v`–5ÀÇê£øEE¤FÕÅVe¯lëÒégÌþt¾ý•6ÅMǹ @í}™Ü€ÂBžW–çÉ*8Á„xgÅ0˜©@ûÄ>h¶?ZɲÍa ±û“-©)& u΃ Ëž¢»|F₦6=íkìÃîQ\ ÿ•Ò -0«KWØ„•ØK–+PY¢ZÛ—ð6ã@qèÄí¤=°ÛÖ}haqzó;Æ#Ôs“(ú†ÙmƇóœ·>Èyýæeòâï„Æ¼­?5#HÃcQÂæuUÁ²½µUê u©1^¼™N§}eºNSë“'3³½|3Ç÷egæÕ‹ý½L¯ÓÅÏmÛ¶)º5ÔÒ¤ÞÌ+“Jóæma{e@­JNWØ)q„…â£Wª÷hÆ·ó‘t}u:læûûJ~}œÑ‰?6-…Dþ$õ’ëéĈâ¯läðèr—£µtá¬,¾lÔ¢ò{ªHöÔy¶O ÂѺôÃêªV㮤»Þ²÷Œ<çsô`UãѲQFh˜tè{5 ê¡Ü;ô™uØïoµäõV0&+Q ß;£ŽÊÿ±'tB]Àª’ÍŒžk|ÇÔÜæÁ Ó ¤b‹˜U|ô,“µÊæsrËBøêÇ>Œ±9-7¼,IŸÐŽU<|wGD9ùγC‘||øœ,6o/b5t_Á·uQ¬ÙÀ­iÐñø8¾£h{ƒA,Pš‚¥ƒ±¤yÇr/û]"™át}‘‹$/#~MÔÕG2t–‘†øŒ/ Ù ƒÁ©^ŒžAÊì½±^+g 1³+ ^ÚŽÁV†i°KN re@\Tª:ãOtäàXsþÌÙl,(ŽàwL;öŽUåvÞ‹FÔÁ÷]‹ êRÌ,'K«/ -^KŸÖ´UÝêfk5>¸ÈØÕñeLydµÙìfx~ª·Ó·frÊ£©,ÎðŠã[ºûÖJbËîx™‰¿ýÝ»Àmôpiƒ:M„$*ø!²›¬ï<¶"¯sîíW"c µ™Èøƒ>*§W’ØdÄR®3bJ±a7ñáÇάç›"ÅÐü/»ú]1- ÚÒ«Z²‘v4u+¨1þ´j$bëwbf–’ýZ«ç-±Ý®Þøœ|¡·…hõó—’J&ã"s­Ô«H(ŸÀ)<Ï0p$îŠꑯÿ#sô©î]m—ØÐ,y@·š—×ÈDZ¼à*&›xŽñr³€/UŽ­ PmÆR¤ëÛFëPɦÁüŽßl5'§蟽 –ºmbùÈÏx´ KÀŒXôÊùöá¹ü ü.Cs -”Ùçû´*UC–•­E(Öж^]âÝ¢bKq3Cû1ظûQÌ=ÏxqëFß:aÏe€¸“F±ØÞùkÚøò¾ò:/}"ÄÁû GL9 -\n‡ð—ç®(¡5«¯ŒiýI[lWŒS¹N`UjaíF9oƒ"Ñgb¥RHsö*æ *›ª%m,‰VIDúõÊìkU7/¦ÅoM×”Ƶ{ŒÄtþPÝ‚ äSo?\ïKÿØ c9R]åicå¾;rÒŒ²í•H·±D‡;hbŽ>=e¤â¯’ý{z(š-¤1›ŠZÒYUÂ-jåª;Uû)±;•;öHâÙì˜8´ WV@ÒsMء素CxÄ£þÞm^¬Mžú{cMª*çÚFÅbª‚4"o“5ã…u±„O®H7¸9½G¨Qt=W_vi¿Æ7×ggïå/Âh -AØcœ>WÓ{x?$¬èåJ®¾!a´ÑzÙ&’T#ÿÒ"îCÜÄ[ÐÁÄõ„l@øŸ-QyÝ×™Þ+()ZïNox¬ž5o)ùe [IøqFdh{ؽNÆš¢Vˈø&ÌüO_±CS6L`¡(ﺂ˜¼¥½‹;d³rûçohÒ$‹tŸ(A|¶¢j 2•;j™§‚Ñ@œa’A´öÂ{(¶gÛ%Ù|€à!›“`*@³È£›Uõ¯›2×lv<Áp -¢ lš‚ØV¢ —}pXÚÒtùœM²ÇæHØÔwÙkö‚KÔ#¤p&ªTê3•ÏÑù(yЇGàœt¿¶õfy—ã›A5‡Zð”€+Lv0Ø*¹ ¦øK1 «o• Å‚ŒYƒ†±Uôeℸ²Ð¢A&øáÃøµgŒNÎlJ”>žˆÒHhupàé;ÌXâSzÁŸ­o]Õ£f«Ð -™4޽˜¸®3:“Ä⯾6;½W,Ý3½³³Pj­g‰TÔîX -Åßñs¼âW¯›­¾‹Äx/™}ËÔ@zêÜrä·Ïཆn"¢{訩62 L–¼XlÔ¿OÇßÁ ê&(`“‹Éï•J¢Ý¥ò¶bȧ«&\ß‹PæªdŠj5 #°ÿ®dÁÀ«Êñ²«9â˧{Z#NÅW„RÑ€'ÈfûS|NòÑÁ „¼„H«K„ Æ7¬º á"&ÑHƒ¾"¿í@HëO"óÉF‡ÚÆÈí"»ï©RñÓ®î*Žl_¾ó«‚”:}¦±Š¸3{‘ÿM‰Uh+@‹3Þ,–AÑð“!aýäæ•÷eäœt– ²Xù;Œnò…òÑ´³,éYDØ}ÄDTZÔ¸,48‰²HC]1„š—Ê IâŸninбûÑP94ÆõUjÇäTpÆ9 =G#nÅÑ^½$ËN*?q/âgh|Ÿ4Ý´'ö¨'•Ø+ûgˆâñGߵ誼¸ü©²Ò°ö~uýÛwo¹üŸ/"OݤµúíI5ú „Œñ2Ÿ/\~ÁMƒ^h¢€'„ŠéÏ›Çh‘Ðg TsÚ -÷}4XR:Ä£ƒ´¥ŠC¤qŽ—PtG|A‚ϱ¡¶®‡nÄþ[eœ4· Ç”o*^C{õÝŸ ©y”åm±ì¤Fh”ÞîŠÖrSºk œ²3ó×¢b@]$-ÒH[H:âbEùF6¢v^ºßBx“'KÕ‘ŠD8ÆßI–˜Üi代/²Û¿8ø=œW0lHƒxÅèSy}x>(§H´r$T­¥÷mœ5ê›Ó“ «ûë×5úø¬Žº2Å„ö6£kòh¡ z -=ã…—ÈÙ'ò]$´‡ˆJ³Óûæ}j¹߇‹ƒ5‚Ø6¤‰£‘DI•Ä0NÃbu $_k÷Ž#£Ö2›Dp÷ßš r{Š͆ï~ ‡ºý˜ÃjÎKE§œŒÎ°>sí]Ä—ÁžL_ÛnÑ]²a¤YéÌG~ûãPÂ<2Ú~%ÿĺ ÙâEIO -£zÁu\\-òäÎú«þ[%]ÏW?:¤4î=…]Ç•uÜør ±ô‘?Q1ÉÁ_»']”v -Ý÷ «{S)¿ÑE4üÛá,a»æ†ŽoÏ©þ’…É(ù‰f;ÞŽç))#“W Gyi sžúeC¨Ìý'ŠÑ*)â¬÷ B‰[bDCe3¯S‡–…®!Ÿ»ÔÃ$IÆŽ -}„w-·€•"ãB^úį îÛ™(A¿:ÔT7e03lv¯~KùrìC oÄì«Ê«‹¯ ,ZRË)ÿ&ö²DQŽÚd€ï­}Ë>{ùu {€›Øá´ jé ‰úÜtt=æ[éšK”3ìé 6pY U´Œ]%„FÏ[p©×ÈÑì™[¿4:ì¹çîTjj—?B%…LfMÚ` AñÀ_ïf®Q 3‰XgÜ.«?¥’åõ»WºJ@il Àjr•v­Kk¹È–À"½{Z?n4­g°(˜ºôØI›_ÿ–òí¸ÍQV€ð pºï)žO@9lLLúÐØœ-z¸„L­ŽÇÈ«´/ïx½`é,ÑjìyûŠÊuÉŠívØAõEÇù ¡9׈v*JWÒ(y.·…™ Ç>$âgqÉ‹ úÙö§¶ÍßÞ{f ëæòŸÉ -­ -àgÙwSìýÄÂAÆUÐÝwåy†§×įž`t””ªÕØ^äRƒiéO,piëb~ýîðú2žŸ6v¬áUƒÌZdä–¯{Ù%‡(ee£[õú]0ƒ29³{±ó€sz ›Ë¸ ]1rŽ­Žêáɺ­tcÂMX'I¹ÞÅOÑ“6¦Š%AkC[o`úHÖs½.¡kš^±u˜eâžzKÈâüg’Y㌧"y)Ò.T}ðef»`LüÉÍܵ{ïÌì¢mÒuQªÞÌ^Í~<ª¢É$rga޵í`Ci©®Brâ 4l+›æ?‹=ªóå#lBØÍ †[,b`Õˆ³††Õnv'L ú~Æ0Ã%So7É={½ç•D924”R~£AJ«¶À¹óËnöòY¼*ñÖa†µ¶p ÈaÊÒhrÈÇóf?ý\ýáÕfåŒUjLè1œ$.–~–lw–ÁÏÃu%ó}¤ŠËbNbyÇ.!Ä]²ÃÀòáÓ$þr²Eœä Ìi~u lòØŸÃj´ÅNíÝ%ˆeì ´óIE‡ÌÈÖ>¥ÈÓ•‹oñÖÜq«C¨áA©K–èHü?¡8Y•&°;óA‘,þpÕVÒ´ê{sú+‚Fît…¸{I™ˆ§‰ Þ6žÎX޳6Ó õ´Ž3ÏF[¶ÁÝoÏoË¡QT¶6Hî i#'Ê ]Èoˆ÷0uñù”äɳ}{5£­ï$¤`ùþ“°Ø5Ñ鈛ÂâVfg-‚cr9™îOÚÔ!Qv›vDhoeëŸ -M`;ns3·ïÆÓ½¿¨ÇçÃçÌî!ì§!m»O1)5GDpãì‘Ëèòá‘-ÌÑ ÑÊÄ=‘0€¿·ÒüÎ+iuœ=˜I;ŽeØK`©óçüJšˆ0J@€ãÚHÌBüü¬~è­È㳨æ­˜´$ãÉÜoM@–í¹ÔI›¿" ¹yA¿³VÜæ³«kšdº;:õDGx‹ &gm"g¿&±t¥k¿‹Êã¼½½À»W›¦þÔ‡ìûˆÇVzÎØ‘¦‘ùþò»;RÍñpL·óž7¥]ÍIˆm1®›Ï0æ·iUUÌÐSq þ©¬uó;jô§ðˆ—AÎÊVf[äA¶sÔ€¥…rjà›.î&¯"¨bøçB¶§ù#[kwÇ”:Ù½ãÚ¨  µAžûHÝýÂjöLΕ-«E= ÙÏ^·*(ïP&ù«5q¼ Nã¼^ݦ_.ëù‡a?á«Xì_‰óÉ'Q=…8ˆcë…ÅË@¾:°ÏN8¿–µ <⨿wB4—«(®ëbÞL…Ñ/ßߨùÞМûqžo MbÍz\j‹*V Þ (¿»ÙĽ%­*º©HK¹£“ø90yú“\MÚ ]ª«RÓJÞÜÎÀ8Æ ×$]:P%?çä·JÇânB6þňá7!¥•k¦Íæì€~ZÜ·ªˆöoHwúä¯ÊDTMη¬ж«ðó(|?Ïãºê#ô1 .QÝ…ú¦Õ\,H9ÜlΙT>œëØâOG­òÄpå‹•8“;o‰bºŒ~ÉøôvÚ%ºqyŒë.(qØZÞŒ?»Âóà°äòĈÔyÅ‡ŠœîR¼ZöÝ{"„qÈ=*ç½Ê’D/ÿÒ¾ý’|£á$»Ôwýj|Â3Ñdk“†WâƒÀš(†´;‘4Ù£Ë=î>¥ 8©p -<¾gâ¢4ùl|ðìÊ_Á…<_çQ$¯* ÓòŸFçÈúbˆßH´o¡?QR¥fó-Ê{GXPZa-è<‘!Z¡BT] Iúáæÿ0çé -¶ÇʉÃ`ù¤ðÛXûYfôL!ÿ¦kobuwàÉâ4bÝœ9 -óãp1wÝnK>E®2EæÂ;5ÍË÷½tçß 7’ÈXŒ?ì7P •LˆÇL?¤W¦¾>¿¨"!±ëÑd"Sl  <é?b—eaøõôƒ@6êÜC2NâØg#€¬ìCÑÁ½âË—áI NeÓÈ ÅõSQqÎǯÆNuYƒ¹aé7Ím¯çʹsC´f¿Rs-½ìŧHä}c^”wû\^›³4ÒûT¤í騗KÖrÌü-qiƒ³FâЄik!oÜ¥¢„áÒEçöv77,nžÒØ“1â½ÉÍ[B *”%cígk›î[›îLÚZþé2^V{#T?ÔÁ¿¾M‰l”ù»EÝ¢·„å•=ñX {Æ´“r°ní·ð™§¥@íK&IüömFˆ°æ›ißšYòã?Ðw(oÖæBÒ’‹¥;1ž¾O&W/{ÙbĪ,¿«d0N²õo»–`?ß,a-8"W$&ZŠep3-½&9>kôt¿#-ÿõ‰èÜi–k«wÀQóKgö‹} åæ.èÿñüoÿ,ì`7G{ˆ‹-àÿÈŽ …endstream -endobj -72 0 obj -<< -/Type /Font -/Subtype /Type1 -/Encoding 73 0 R -/FirstChar 15 -/LastChar 103 -/Widths 74 0 R -/BaseFont /BZSLOP+CMSY10 -/FontDescriptor 75 0 R ->> -endobj -73 0 obj -<< -/Type /Encoding -/Differences [ 0 /minus /periodcentered /multiply /asteriskmath /divide /diamondmath /plusminus /minusplus /circleplus /circleminus /circlemultiply /circledivide /circledot /circlecopyrt /openbullet /bullet /equivasymptotic /equivalence /reflexsubset /reflexsuperset /lessequal /greaterequal /precedesequal /followsequal /similar /approxequal /propersubset /propersuperset /lessmuch /greatermuch /precedes /follows /arrowleft /arrowright /arrowup /arrowdown /arrowboth /arrownortheast /arrowsoutheast /similarequal /arrowdblleft /arrowdblright /arrowdblup /arrowdbldown /arrowdblboth /arrownorthwest /arrowsouthwest /proportional /prime /infinity /element /owner /triangle /triangleinv /negationslash /mapsto /universal /existential /logicalnot /emptyset /Rfractur /Ifractur /latticetop /perpendicular /aleph /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /union /intersection /unionmulti /logicaland /logicalor /turnstileleft /turnstileright /floorleft /floorright /ceilingleft /ceilingright /braceleft /braceright /angbracketleft /angbracketright /bar /bardbl /arrowbothv /arrowdblbothv /backslash /wreathproduct /radical /coproduct /nabla /integral /unionsq /intersectionsq /subsetsqequal /supersetsqequal /section /dagger /daggerdbl /paragraph /club /diamond /heart /spade /arrowleft 129 /.notdef 161 /minus /periodcentered /multiply /asteriskmath /divide /diamondmath /plusminus /minusplus /circleplus /circleminus 171 /.notdef 173 /circlemultiply /circledivide /circledot /circlecopyrt /openbullet /bullet /equivasymptotic /equivalence /reflexsubset /reflexsuperset /lessequal /greaterequal /precedesequal /followsequal /similar /approxequal /propersubset /propersuperset /lessmuch /greatermuch /precedes /follows /arrowleft /spade 197 /.notdef ] ->> -endobj -74 0 obj -[ 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 ] -endobj -75 0 obj -<< -/Ascent 750 -/CapHeight 683 -/Descent -194 -/FontName /BZSLOP+CMSY10 -/ItalicAngle -14 -/StemV 85 -/XHeight 431 -/FontBBox [ -29 -960 1116 775 ] -/Flags 4 -/CharSet (/bullet/braceleft/braceright) -/FontFile 76 0 R ->> -endobj -76 0 obj -<< -/Length1 819 -/Length2 957 -/Length3 532 -/Length 1535 -/Filter /FlateDecode ->> -stream -xÚíRiTWU°¢ãr\Š}© ’d€°YµDAHˆš‡Ì $38™`ÂêZl¸TÅ­Š -(-Š8.€‡*9¸"ˆ”E¥X,‹· Ç¶¿z:óg¾ûÝwßû}v_J„8}(’q@¹¨ð -„¢|€rùˆ 1† HoŒuwGPPà»z8ò=®ˆð¢b´4É€é^3zI®@¨„4!ÃH€1‘PÉjÈ0P22Z.* ¨÷„ -A¤c!ÎEPà„Œá0‚ ^¯#_RN×~WÇ|lÅBZÅšÓY“3k§H…àPŽðD{dü¦Šû¨ -¦ì•ïKé³>¦$Ú J£f (Òä@ê2Øo.â„Z9°ëË` -B&$#8 Î\¾“ ¿A¨| Ä F ä˜BûpHâ­°ñõáy†IüÅöæÚ× Ä’Y¢€ÿ‰ÝW£Ÿj6%šÐ€å|.Ÿ²Döýø%pÙ|RFá.£iL‹°ÄV‚Ä¡@ ë˜Ç%)†=Øhœ¢‘Þ±²ëÄ g£…L/ÞñYŒÆdPå…>Àý³íÅ?ÿoOOJïàèÜ]X(ê\]‰'“Ä*5ôõ>ŸïæØ„LMÓdúŽÍôc-'Ø9@¨2¤¾–’ÍÞ•aø>7iþ᪼/xÃ_?©7+ )NÚKà‰ÁþÅ_E0YO6¦—s¢«-üd³wŒ§O[¦‰ôßu¬P—™²e ”{[ÂÑ®×íõÎ~ÚSßòUKwíÛØhåQJ?Úóƒí¬úNÛdãÈýx«gØá’ž{µ#ÆÍ Ú6Óf¢kýQ³†Á8Ú†–›S^'gTÌ‘µ_½ãïÈQùè¦UËçŽïĺ#Ryluµýâfá…šÖÆÕø›1b}érM›õ&›»Ž_$9š.]’U|]eŒçƦgi»ÄÑRkÏ‹ Uå*y›×,(±öŸd|äùz¢Ñ^´óËþ='“‚æbËËQƒOæ£)ï[Í&f'½ÌÁ¢÷m·ön‹[uä윞`NZ"w‘aWèó¬³å#jÏš£ãçÕÔ{m~u`¸èÊPc€º°{gqdú3§é7ç+µU ²­QiùSÂbi’&Æ|Þ M»Ðt/õb ÷ó¿ ³Þ~ý*ÔBÞ•¹Wtl£RÚ†x÷_:Q5u—Íêò‰q2wšÃŠš¨Éën„©ø{ ‡U!3Ÿ-tÝËt­‘iLËØ%3¸?Jk¿I=Å -yc0–'8¯8³½®irV“½ê’ÊÍÝÂZú.i^÷Èãü¸=+½¯»¼÷vKm)©;¿ùÊÜI^ܷε…CóBâtÞº·dG½9]/¯‹”—l³ÂÈÌ|Ãa¤¶Bò î¤^¯PßÖ˜•陯ÌU®¯šÕ¾~Ð)ý ûQ u ÂõM;6ÿ‘ë£ÛzjµÒ\¥Vî6m6’ž‹}Škê£.lËLšç—‡~›ž3ùqˆ¯]Ëàçþ¿?ïl/É ê+ôi¶È<%ÊPqÆ\ʽ×}›Z\Y­*jiÈ“àæcÅí²Ýò8Ý­qéÍ)Rs벬ø–¶Æó¼ÓOüŸw) |Aö²9c™àém/E…‰×z¶W¤v—ç¾l ·.],~ÓU´q¡a´Ã~óÖ…³£LÚÏHHQ~µÔƤ{Ãé0Az]­Ih|¥òâªan¿roÙª:Ï%rï2ƒ‘´Žk­ÒôÍsîÜ;î¶‹Hæõ¡šÙg¯hÛz5W.›_MZ¨uHÈxw}¥IÇnÅQìÌ®µ)~‰ º²´5vpErrÈ)=s±\Kn_ŽJ¬¬KL¶ßyÑ"}bÁÿ‡ò¿ÀB@¦€ÍPJŒŽFþ-8J£endstream -endobj -77 0 obj -<< -/Filter /FlateDecode -/Length 4753 ->> -stream -xœÍg]IlŸ·’7÷#q$Æ’¨#©Ýÿú4ÐÝxÒŽ3ërjkK Ù~70?ße«þe«Z$"•«º‘IU•«Íñ.]íàÿo „U"ÊÚ‘k‘gIY®Öy42Ú?«Y\é.ÙdüI½wÔøÁ™#ƒ9òB¬Öu•%u­ ¿ûp÷Í÷ÍJ&²*Vžï„ >lï~\Ý¿Ûn ÿ}?÷úw8=¬ÖEQ¬îç[?ú'ý1éçnlçaħ à÷E?†³þ¥—ýôÓÃê§Õ‡ßÝýæƒÁ2¯ÊDfƒ­²ªJJÙ@@ÅßšV¢Lšâ&­âí´šÇ;ÍD yÊ")êfeÑZ’§nE @5¯¢ôÁ/o ”I‘U@žö 1úC }¾X5È ÌøOì×Üá’§å’3‘%M™­œ©–k&˜>…„þI!*… iÕ䉔aô„@ÿñaˆß·ô8 Ë>ÞÊR@æË3âÃ^a/ò°6ŽÑž¶-îí–¿ÓÓjñ#r~ß´üm‡Œ}7éBç6º”ûù‚xÝ‘Þt.‰›°¿í ŸÓ¬D vãüÔðÝL𤶩6SlÚ‹+¿fÑó¾{áv¢5ôéO»ƒy½G”}jŒDc蛑‡gÚ –%Ô%’3œ64ÄÙÊhR:QÃ0- æØM†ÓÆ.¾AÎÔ¯I*çý°îíë'äâñî·†YDáè Ù$u©¤ ÑUBÿ°*s¤Šš·_›™¿|ìÆIÍ·d¾&MrÐ<ðXtÖ<­ ØÇö`qÕSµ@æRm*þtÓ› ÔMšçf˜z7 ô~gÈ×2QF&Ã倔û<— îŠqq_hŠuQæI“IÚHÅö°#ª÷óþ¨f(ÔÀŸà‰Û>Ëë‡Kï½óâÐíÚ=Íö&ú=) ïš$«û™[=ÎsÆÍ›ùƒç¢üƒA–ùŽÁvÝ©5—êLj$kœŒ¤F©z!=ût0;YÈŒ]'™»úgg­ - EÝ$(+4“Z´»Ž;âJU«G½ šñ­w샆bÎ=rý=<Uü[NGÀG|sIå0J «3i&¡ÍÌwÚ÷Ð Gtl$3K£ ÓÒîºvtFa«Èê˜}vU´Øg¥‡£~&]´ä7­,Ð:*¸Çû½+‰'FØxz°½iÞÔ—/ ujÙ¯™ŠB õ¾·Ì"”±;Ç¢I]‹@³·3·‰y¶ž™&™ÊÚÏ(Û ¯Ðõ/„u OîðŠƒákN6GÃ!Fêš²4Ò3ÖÛs)¬ëÂx¢ -ôµøáÀ» ž›Û'Ò>üf×ó~â\‚ »^ÀåxlÇ~Ô¢¤ñœíl„iþ1Øf} jŠÖÛ ñEå[ v{‡uÕÛÀËJ×<Ñ+ÈåV6É!æ")dR‚3Z–ò vý ˜ü·€ ˜~RR’I¹:ÞAè~ZMχ»?ÝýñÿÔ‡Q°D¸>¹î–Â@Ø"þôÇYóZÖ%4òƦ -7¶2PjU -ðÓjÞþëa%K- -š˜j‹­öL«MÖšêô1?_tD»Qä¼? BÄøüÝýso„G)>Ú1Ô{WmÂó¯qï¬L„û'ÊbÀfå,ù-$,²½Wìöwà†u•'©hŒzã‚ê:àT®Ë\%N¢Ñ|S@€]Sàâ‡ß“¯àú J¢Þ?8Ap$Ô]$5ò"QêË™þ-«ááË©ÁB€ËýýBñP |ÿ/Üh—è–Y øT_ ]L)Áin’¯á&!àŠÿ -nŠõ uË×ã£L$es‹²&É*N0¾?¡£s±däü*¯˜)¾«øG9ÅÃY±Ê2\Î`8=£Pb£³NAÀ@ §ƒ1L3Ç<Î;HÔ ‡+›Cøpƒ+¿ -a<¦|•Šû[1å› žaÊ4Oṙ^ãÊTéõ"HUŽ”jÇí_Ážv²¯ÃŸòQõÐ5ƒF¸-K“4k,·ýãÕ¡ljèñÞÐ#¬JÒZ8„ifíY” h…éé½ÒøbªÔ«¾¯fèµrA8"“h‘ëÓÒš§i) Ö$“>RA®šan¢"#ÅžÛU†+•íãà ÅðuXòÿ…f±€øúÕ+Að+zA@Cf·¬•€Ý¥¤møA§\•¦>ò~¼³ÁŸÙ£÷±$ÿ5uáàð†m.)¦-üEõ?ž~Љb.€¬(ji7hnP©`æ+¶ Æ”65ý!6/øé•USsLñÁÁd6õÖøpó%£"›åÊÜðRçJR¡¢é‘›GL—Ïë$«0µÕ2QŠÆËxY4Ã"C˜Y°‡³Ÿ{4YRré몎cèµrt8âtœ”W€šTRá"ê8‚¹… -ÌȺY ò&%÷uéïï’{ÚIY‹˜v’I²)Ê"©Räïl­nœ&q—º>¥‘L¶ H\A©½”ªMØ´y13M<¦¿ŒèØF±ÊLˆ8ìhÖy„Œ8æÈ2.6e3ô¡¹¤¨>¼²¤¨’˜D j&8Ï…« ˜Ê¿ŒtÏ -ñ%醵iM|!MíD5u턨­)»|éˆÄØ·^¥ )…ÍûŸMÄ«©Ôªžý=.w\ Ð}ng]wˆ©S`·º°š÷c·…ýóÓ0þõÛo{ßïõÝÁL&BÈ@¡êµŽÃ4›'S”u’5« ·gSòJdù®Ò_<ºëÒ„JØ>9ÙˆÌd)usìfÊPžÌW³ó˜o7Û‚3˜¹ôæÅQ¡”ÖB*JEÚLZ)“Æ,ómEžàTøŸTèdÝòm zí€/”m0âu½î潬"8ÕàÇ7N¡Ú'˜›˜€}ÌÀüû˜ b)”ÿ[7>1Õÿdò³ã~ÿÓÄØRaFo^íi=Þï²ê)׆íRqKˆpš¦ê *ôtã¿‘7~«ÇÏ3~ýŸYÖ”J„ª…À CÝe¸ˆµ>! OªÑ–®¨Ã·å9˜Œ2*ž1¦«T -ÑJóp:Ø šœK*ÝÌo̼<{ÌŸ kz!¨‹m*é7MRBØqMe®‹JšýWÍ!’U¬Óëõ]]/‹`Pru?ÓšnÈõêy=®éq!Ѩژ)¬éþô¢ãç_ÿò—f’™U% ÔšŒ· æ–ˆmf‹á̺àðl¨pâÖl­<1ßf1š3Uºý½$!cÛÝH¦fÏŸÀBOÄ7¿TÄÆÖÄé‰ßPñL·ÛxÈßÔ:ÆðÙ4Æ à¥o3x\šþë7kŠ„¹7Agìz6„g3oop꘽!¢¢šÙjÑ:O«¤,CÇÿŸoÛwÈë©.Àªý|L³Ê+›æõ<¬Ù}âÔ_:îåJL)™­ÕYÝ$‡ç4AÀr4]#êS …Õ|ª˜ã¨í–؃e3U5VâXãDì™Î0`éLöÜàZþørÓuzÆ¥Ÿ6s¯êŠÃ“éÕýÿt|îE*œ)=’¶‚æ¶»gøo΂my8ßS-L ÓÐÃŽøFðæPÌïÑððB‡&vÜÛÝ$5õ£á߈•ªÀ“æ+òDæ_Ê`1ôÚmk8¢9¬rrY–ÍÑ1V(S^Š‡Ò—¢˜<‘`ñ£1 vå*Or‘(÷W¬BªŒD@´ð05ÁÜœ7‡¼2´êuᤙEž&%l²ï°º|އ\(dðTŸ)=™£0žjr%KŸ¹––… 7·yÙ¹?vSÔ׬’¬´©Ù_¦ÕEx€Ôs+DZaqÕ®x(”ÖÃáŒûø‹èÙÂ4©,èæÀg#X¸x&ïäD·5$ÄcAªåEÓ ³ ’±£c½¢±›.‡9ÂjMÞ,°HY%Eý*a(`¥¸,Ð`kg´EnN€¯¤\Ú¢¬á—šæ—sÝeŽ•CëgéE“(ûœYs6?S§Ô˜EYõfuTõjîɵÐ& !FUà56Ž:[Á™³—ªÆÀºÙrWÐÛžnU*]`ÙïhÛ9Ÿ=ülvÍjë/׬ŸpŽE>=^ºeôMrsyÀr¦c_(I@̃c‚&6º¸èq8Æå¨NÔ)œW ’¨“´.|qW*¬f^èpó…_|Òn`dÞ -˜ÚõÈNstJvµSòݪd ¼iw¨åé­Ázëvàqjš”‘?mevØárÐT‚" ´8ßŵ¤™þÔš$å±ßí£}Eph^ÃtŸƒÐt3[fÊh¿tÏàEkÎ0õ‹ -¹G;vB£.–:¢“Ú=FQÐa‰~C© ~D÷[ImÕÅ^8@€“Ë…î`«Ýg†Á˜'Úî è-yÔÀÚ9£Y¢…?U(WE¦ -õ ½vÀ—…?DʤšÓØ:y¥qÇT€B)<ÿ½âLãKÄŽ©o~y‡. ÁÜB3ÇÉÙ•4Äd©~%zžL^¤.½#E1e¦2HÑD1ïægò®ªHW{f$»:óºí&?:~Â+£UÁ½o|pŽÑŒCGrYt®tÐÜøUÒIDÕkïi -ö?&㮓¹3kNk?a½Vj^ÐoÔù×¢ðÎg|›EU${k?:*äÊ H³+"mt'm׎±A3ZÑ}"•¤'Óð*…wi£Ð§ƒ=¼IspßøÁæÔ†ÜNÄ0‚îyã”îïÝxá·WÎ)ú -žsµæt¾Ä9«e ˆŠ¤‚°ìmŽ ¶vF[:r9˜ä\ÍXi¿ÕTMÒ|-q¬ÛøÕ"ÉìævÍë—I%3ß¹PY×O®ºqrä‚B·¢ ]PÎ":~AÑ”N⯱ÔÁ=º±ßÌèB*ÉšL(Òþ™ãoÓÏs}ðŠ8{ËoȉPMr)\½©ßßôÀ'Ò¬{Tß}à[&GwÀWöêBŒŸkElë}ûSŒWJ`ÀèCütë0뫘[;£E¸%n®`F‘ä ßzìê\ïüxoê±·œR“'¢H*ú(šLêZ˹;òFŽq…©ÍÒÐrŒ`Ø•*ýí,è–›îà'Ïe‘‹,©É«bíêK%w^;Ð‹Š»?]:åŒ_¿þ.› üãj¹¯:K¢îÔÕàÅx˜‡‚¹…° -Pó² 0æCpK“m6Wµô^m/…·¼ ÖKã° yF¶÷|gÍ{Óô]L..dI#Bn¢b‚Ê€/ýí’oÙÛßÜð;Ø›÷ünëú‡÷ -̘8âÎ8ï p:Ó˽VØ fQÜâQü>]v;žc6¶¦n1Ï™d—Å…t{Ò"H°èâñõx‹ -ÍaíiI§\bÉUûf¹ª<·¶éÚõ Ÿ•‚ƧE‚]÷âzƒ‚ØÜB5®›àv ó`øÒ@"‰õPà·,î¦G¨¿«âÍ–”Ív‰>//Ô-îŽÄ“Ýï Åͦ™Ë¨¬̾†ìõLÊî`om¹' ´æ”*Ù%¶‘fò=ž8Q)‚}»T,tm^8ŠèߦXÈÚÑjÉð¸ -ƒPÂ5ÍêåŒRè$Ä­ d1ãòøòÑ]æÓý[}ëÙ3ö'V"G—Ô´_ë/\h½BÄ \®*»IC r„ñ - -Þ˜Ž L·¤Ÿ7Û;ïb§Š.Rªߺ…-ÒÚ„k -ž:8 uœ>¾ó<óöO<À© ³6Ú9Pî—Žs÷~2ïÔòOè±QJð/¨›ö„¢0˜ù§îÜŽÎýDBÊ4z%1ølµþ2GEzáj6Êö}ê©€8v:u«Og¡Àߺ é.Þvq’q«¶Xõs’avúàø`ä„ÍñzF.ÚÃ+HBã3îìu9“öanÉ™Y’,u‚… p÷òÈ¡CõGª*2ÙïþØË¤endstream -endobj -78 0 obj -<< -/Type /Page -/Parent 2 0 R -/Resources 79 0 R -/MediaBox [ 0 0 595.276 841.89 ] -/Contents 89 0 R ->> -endobj -79 0 obj -<< -/Font << -/F39 46 0 R -/F8 42 0 R -/F38 38 0 R -/F11 80 0 R -/F40 50 0 R -/F44 85 0 R ->> -/ProcSet [ /PDF /Text ] ->> -endobj -80 0 obj -<< -/Type /Font -/Subtype /Type1 -/Encoding 81 0 R -/FirstChar 62 -/LastChar 62 -/Widths 82 0 R -/BaseFont /GBBNME+CMMI10 -/FontDescriptor 83 0 R ->> -endobj -81 0 obj -<< -/Type /Encoding -/Differences [ 0 /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega /alpha /beta /gamma /delta /epsilon1 /zeta /eta /theta /iota /kappa /lambda /mu /nu /xi /pi /rho /sigma /tau /upsilon /phi /chi /psi /omega /epsilon /theta1 /pi1 /rho1 /sigma1 /phi1 /arrowlefttophalf /arrowleftbothalf /arrowrighttophalf /arrowrightbothalf /arrowhookleft /arrowhookright /triangleright /triangleleft /zerooldstyle /oneoldstyle /twooldstyle /threeoldstyle /fouroldstyle /fiveoldstyle /sixoldstyle /sevenoldstyle /eightoldstyle /nineoldstyle /period /comma /less /slash /greater /star /partialdiff /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /flat /natural /sharp /slurbelow /slurabove /lscript /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /dotlessi /dotlessj /weierstrass /vector /tie /psi 129 /.notdef 160 /space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi 171 /.notdef 173 /Omega /alpha /beta /gamma /delta /epsilon1 /zeta /eta /theta /iota /kappa /lambda /mu /nu /xi /pi /rho /sigma /tau /upsilon /phi /chi /psi /tie 197 /.notdef ] ->> -endobj -82 0 obj -[ 778 ] -endobj -83 0 obj -<< -/Ascent 694 -/CapHeight 683 -/Descent -194 -/FontName /GBBNME+CMMI10 -/ItalicAngle -14 -/StemV 72 -/XHeight 431 -/FontBBox [ -32 -250 1048 750 ] -/Flags 4 -/CharSet (/greater) -/FontFile 84 0 R ->> -endobj -84 0 obj -<< -/Length1 776 -/Length2 1036 -/Length3 532 -/Length 1599 -/Filter /FlateDecode ->> -stream -xÚíRkXUFÅGÊ@¼ZgÓ VÜevaYvpAV7Xâ²^d9 ³34Ìn»-b™¨I™Y ¤ÈMSK¹<‚¨)‹¤¥hÈV^ÌLQ1Á[êãý¬_=Íùs¾ï}Ï{ÞyÏÇçEÇ •8½ªhŠŠEbÓhÔbp{Eøü0êX‚¦fëX¨b¹Ü¼f$Ä 2…ÔW!•!|F§Y"9…^a‚’ ( !04:68 LG‚8# k%I‚Øé ¦CÆq"œÀX°&â3àIMéi {ÜÆiO!dÒ9SÀkЦp&qš"-‡zÄ'Šænƒœ—ÃÖPq•‘$£t†ùÁ¤þ†ë iy  iF2@C㡆RÀÇæ4'Œ†¡¨šÕ‘¦¤’I„b?ê÷¸O¤«3Ä£ Kz™û‡:áòôá3'44JîýäiÁhA±ZKè3ö`-~Vs!1„Ä£"sDn=Ý%¹,œÂhœ ’Dêt £³ Üq•XÅ€ phÐÌ9öQ4Ë\2Ë€žfwõ—ŸäQãÂâäïJ›­B_ J¤œ2êdRtÙ_‰ó(â-#TÏR4@æ ìbF†;8C\JOk=Á ¡bˆ½…ÆW¾¹±rUifxÉ©²‘‚ôÉy;Vž8˜µ//PtíBàØ³LÕ÷ZøÒM×,×7‰].¹×#¾ôÁõÒKî•Ê ›5Î'«ÕÕöü8AÑçq£º±k o o,h8ò‚!ÿƒ+ö—;Òª¼»œÚ{ÑtpäžÈ«bY±ûõµŽ¥çZÜÊL]~ò’Ýy>õr.’Xp 2Îÿíâúoû;çÐ%´}{ãÄ„Ï{ÝÚÝœoNýùùú^q’ˆYR[„b¨ŽÝ}V“¤öõ%ÒÀ„ä‡ÍÁ;b·m·~¼¼»çœß”– -ç¶Öv¹{Zø;¹™VÞictv ¯>o§®”å?~‰·¿_·ÍÕ85hᗯ׻ï9ôËÝY1B‰«^kEÉEÞk‡µõóñšbCù8>>®£1T—ìeŸdÓ¸}£¾=‰²Õ¤e¯R±ü/|]’;ß'³£uÖ>y·XAŽª®$§; ?ïx÷V^æ½ü3seû ×á!?E/¾SÔtñt¿ñ]·¦ëkOþtÀW£×<ŠËIš¨7íªò¨s95òè†CÐ3ú•ŒNëªvLUõÛóp_Oâ> -endobj -86 0 obj -[ 894 ] -endobj -87 0 obj -<< -/Ascent 694 -/CapHeight 686 -/Descent -194 -/FontName /JFVSUH+CMMIB10 -/ItalicAngle -14 -/StemV 113 -/XHeight 444 -/FontBBox [ -15 -250 1216 750 ] -/Flags 4 -/CharSet (/greater) -/FontFile 88 0 R ->> -endobj -88 0 obj -<< -/Length1 777 -/Length2 1024 -/Length3 532 -/Length 1588 -/Filter /FlateDecode ->> -stream -xÚíRiTWŽ¢9‚ ˆZ|1$$@XB±² ŠPÀCæ… LfâdÙ)¢hi« .àÅ"÷‚¢,¥AZ ÒK¡”r¬XÀµÖã©þlõtæÏÜï»ï~wîû¬,BÂì<"ú8eÇesùÀ;((À‹Ë4àpVVÞ$P(û(È\77g(Ç€ƒ#à¸ðyNüIð&¤I$+¦€µ7k’ä<%D… (1”ÐBÂ! -©$6ðÄ0:yBB¡ ’ a3¸\€ B -ÄÀXgØOš -ÀEpyUFäÒ×­HÊhSÀzÊ& Ð&Ç’E û5= Ò^þ [o‹ûÉ1l@2)ÿ*ªw Š%ýE!$R9ID Äߦ®‡¯ÜyØ;s(† -=ñX ;®›ãôªŽÊüPDBPJ("&ƒSuˆ#oû ã›raè·.líJÛ×W;Õ  8ž$…€ó†>…¹o0‰*@‡Íápi"ý¾þŠzkš/.$€Çquqts˜ª -å$ qjj‡è˜^cJ' ¡ -]w¡ûθ¢s—§ù»U1%[T|b§º6KUìÎúÉ}î·äù¶phþ»a–azÒ pxU¥="âÝ3;ç™Ò´-Ì>«Ó°Iߘuä`ØŒáPäffecýÉáœ]‹ïKÏێܵ|Ü“P;ýËÕƒ\—£fû§•çù£´øôÖ{]z˾BF”òòê¸n 'ï›'¿úLj®ÒfÓȃ^t™ÕÿØÿƒ~±ÛeÖªL‰Ó@®Õ7e»üš{ûÚ¶¶e•(²ÙùÞ%aÛ®•8ï‘MkÁÞM§;aÝÏ,fO—Ï­õNÌHcTœ®^⟘WØ©yɘ[ùÑú?¶x /Øñè#£ÆŽ†¦y ”ÞŠEù³ ™snŸ\þMÛHT߇~—NìØ»>ï³¥+Fv_üþfmú¢Ä–“òÀùGb­8quva¬×èã¿#é:® ævôä3Ê}§ùh‰r÷IÁ†¡1ëÕŸ÷d2>l:”6¨¥^íŒL$$[’ò›šXŸÑ樤\WÕ(–v¤Gš¢àª¢²vÉãÈYó[{F_Y·û̾éõ·¯]Û³\˜xÉFœ•ôíØÌ‰Ò¶àu š/˜K ð"£~×ÄÍ[¤5vMT}ä`YaÙÝæÁv]•E¯ßà £SMÕ"Êݦ&úª«#f¤‡ÌÍ­±,ÝÔ—l£_êÜ—Ç2ïú.±†ÙrË…=½®e>ëÅm‘®q`ô“˜Ü ÉÁ%¦Êiî–ªDøüj8s~Ý![ÕhââŒÛc]:+Å×õ+#Ǭ»m¶vJªú©b½1'}49¸!Eå¥cÑtvhOŽOÍS¦–rÎëŽß³|û?(Š6ŒWŸKÙPêsZ_ÊQj²ø#n|Öc²`àF°†xfnþ]t‘Éñ”¦—ÙªýýÍR³z§KªË=y®«F‰–ºPSƒ ì¥:ùaŽ:£“ÚRv×à -û±Wè±\̶‘Ó‡dÞïžwdw]8ëÀ/ë¨öŸ)0Po¿å±½ÓµÁSºH6ëùU;$!0ï;*¦ÞS³rÇÑ­¾ÿ¯£áX|»GöÎ?|ÿ ü'„!ñŒ?‘ZÂendstream -endobj -89 0 obj -<< -/Filter /FlateDecode -/Length 2857 ->> -stream -xœí[KsÛ8¾ûWðhUE\|_¶jgj³å=ÍÄ®Êa=J¢-n(R!©8þ÷Û@7$A)q4ÃÖTÊ4>ôãë¨ù|üþc^ùQ{i–ûI{ÛÃMà=ÿéQ”øQœÂ³£sóÀÏ’Ä[[~z¸ùÛû0÷Xä‡Qâ=<ݨUæ§©÷°»ùw{w8+q»VÞ:Lcï¶•íF5‡}©ÙÝnåýæ=üÄg^îçI(„Þš3?ãŒ?ì«æñœ{·G)±kâE -+ˆxSÔr<=µz|ø€L½0r --ð„Kõ¢ü:”8­‘=´@%mãC3 -ïöýÊËBï–¦{ù—fv²ñNl6Ô¾¥ôÆö¢ÞVÃh6ªq @ÿ¶m¶Ô‰ -ÌF òM±]y<ón?½à_ÐïzÛì‰ÅPmäC]’êAÛŒùy“¶_*±—u„Ó¸¢4í×;Õ5LÂ%dÙß•ŸOUg9” Âz¡™˜‰ˆ¾b/Pv(Œ àvåãZ¤3›•/Ö¸Ú¹}ãüÑFeß^÷ÍÌ44Ò\Bšs[ þ¢Ï$“ ŒôŒœR> ­|ʴø­Wp³ˆ|‰E -mÝÌÞ“LkþPÙþ‹Úz5ôe-+çKËQPåÔø¢î[õÜÃRýÓ«š_u¢ñªbÐë¸u„ºhUͳê'Œ…ZÆ0˜3±Ì³\g")›'˜&š¾j›^½©džã†6+Ýu,T¾2«áÐþôü\¦—¤þ/¨þ1ÇÖJ¨ {H”Ò Ùó‚=ë¡zÞ“%ÕÊ ?™%äPÔ#7ÉZÉËH&.äÆpq¹;!Fï ³ðTPZ[p¿~¹€I"—„ER὜FK=˜ÂPDf;¨ÇB=˜êM´ŽEg|N¼hŸÔÓ°7Ñ&ƒµjƒmoäÐÅãÃfEȤ”‰!@”ý</*T¹ ùÔh•g"¨ŠübPc© ‘¹µ” Uø²`œovÞ4NKàVAx¯^£‹'›XD[y¨âSRáNõ×(lÓQÇ«êØ¶'Ì, °ñf£$û°È¢˜úDº—›OÙ‘°D>Œƒ Bü|ô&' ¶Å =L®`Ѽ^Áé®KYn|ƒæKµÃ-SE' 9´yI`{RØK5ŒâØT8C:Œ|"_‰õË^ƒ€ «:=Ø$$Gê3‹þˆ4LÂZœîÛFc(±ìOõ ®4ÊoÂíHÉ k±Ä -V`ŸúbS뺪x"]Êpí«á¤Ê=bfI²Ê”d‹üÄô§R1§Žl—êäØQº<¯/¹38;åÀhãŠñ=w­±ÔD£ùŠzMµc!#™Ý¤›ÇéFN|„Ü«£LN@¾”ª Vm`µÇ–RñØ”DˆHTjÏî÷íÉõò„M_í&'í¤*ºM[×:Äž­Üƒ²é@ªz=Òµ®"[ã(!¥ æßr&±,mé`‡NÄõ1€dõzÑ…Œžê8há=‘…*vze=g€d{2åBÚØ~Iuåp‘bw¼SóëªFù>µÀ®µN]*¯ˆXAÕ‹pz¡kvŠïËbúF¢·*ñŽâë  £¸Šu*)#);Ã0ž†¡"\+» ™wúÔ€íµN·p†Õù6Íý0×*(ôﮜ ËfÈh]u„¥Šo:MW©¡«Î*Bî܉oÂzÊbWXç_i•»ñiöŸÓ;¤(Ïü8tÞ!1Ø8•û -)ü¦­­ùò) -Œ"rPKô¨§ªÙÍÑ0øÚšj83ÁC("â(³[ó—ÜX ÁmŠoEËn‚\q‘s7¶¤-ºñ]ÿ"NºW Ÿ±˜\%û“]eœD¤hDèdþ}ø7¢.¯í+A§€%gŠSл3™ù‹ÎDCëÔµ®YžËF¨»tÚŸþ‘þ‡]PÜËNµÊñ¸”åð«æ²Yáx¥ÑÛÍjæ/š•†P•oPÈŽ<Ë)Ñ¥‹<ÑX(ò`ù—j™N[:>ÊqE‹–yžœE„æ“÷t —…µž=.äá 3׿¨¡D­"K;Ëõªˆê=±ÐR½æà—ë=·Žäzk]ìy3q{‹®kÜ)Ño³]¸X±›³äEñähý«Ó¯qi!þ~Äú¢¤&& ±’’Ÿçræ_ÀÚªç ¥ÆÌ,5ºèÏHÄÙÄT]ùŽ ßUþCÞÃñ²˜1‹þACþï‹™yš¹EÙ‹ÔÓ$|ÑiâX|:k<23ž‹ý" $ýÓcÑ ~ñ_ ä8(v{*X›!rQËRp’ð” 4× [¤ÿOb¾Ø¯7ÿql×·endstream -endobj -90 0 obj -<< -/Type /Page -/Parent 2 0 R -/Resources 91 0 R -/MediaBox [ 0 0 595.276 841.89 ] -/Contents 92 0 R ->> -endobj -91 0 obj -<< -/Font << -/F8 42 0 R -/F11 80 0 R -/F40 50 0 R -/F38 38 0 R -/F44 85 0 R -/F39 46 0 R -/F14 72 0 R ->> -/ProcSet [ /PDF /Text ] ->> -endobj -92 0 obj -<< -/Filter /FlateDecode -/Length 2621 ->> -stream -xœíZKo举ûWèhÛŒHñ! ‚Y$Ì"@²sˆ÷ w«íÆôkZêñúß§ø&%RîÅô-‹ÁÀ-©TUüøÕƒ¤¾Þࢄ¸Ѳ)DÝ ÎY±ÜÝ”Å3üÿ§“ ”#ÊüN<\0R¢šóbhøñáæÏ?ÕEƒ^ëxR±ª#!ЇÕÍ‹Û7«Í(¸=uwÅþ.‡Ía¯î´[¸#ºý8t§v8œìõã-~¼³‹»â×âág0…±·…±@K÷´¿:©:B5aN&ðe©IøòpWÔˆèÛwÅí7øS·Ý©ÏûÜjE+{}ßµ«öIÝÛÊ¡S\†/Áíä]©Wú¥o%1RãZ`JQUÃcŒÆÌˆ'ªª’ÀœºHÇ8"}·RÌænìʘ…­ÕPS"ÍËáH ÌÁÚýÊþü :)Èlô+í“ò"]jLÿx˜ÐŸ4¨®›Ã1Œžð ûÀ¾b@~ÿ¾"?-=h °sgBc·<ߦÞ`&R ­iT,}é_áá - ÿ|S¢ª©‹Wø]"Ü4Åî†Á æb{óéæï›U¶´MœÃ„!Êë‘wOíòËk{ZõSyƒ$7E)P#p#²d”Ý*`’Å݈„„òSF£¦‹œöÛuDgJCª2„IŠÏ¡˜ QÚôedÝð TDÑZþ‰g^¬ì,õµqä–ê?)‘W­°=-»•óâ»z@öÞˆÊlc4Dà'–5q†ggÖÊL¦6Áw²%üÕÐî»ß†<ß9Ä%äJ|´eù{wìN»óÐJžÉäË 6ÜOÝ·©ÇËlK¯ã±U6ë1Ä1Í{œQ.àf>F™\ŒZ‘?bÔÅè}6ª´® ?‡žχ #²ˆ>;Vf2‘©ˆäáÊ2¨7^Lb²* -sN£ß“FÙ"Ð6ÉŠA‰­GþÛÓ°‰"r³?nÛeÂeVJÁ®ã²U6ë2—«’\Þu§ç„{6¡Q#øpô2Ùp4"„ãá8ž - - ÊEÊÜ\X™Éd„ ²2å£Ù€’m‚ CwÍ$$sñ} µÊ¶‰ƒŒ`Dë1]Òm§%(Ñ:¹ôõ2Y‚mÑ´!vtØÙIúÛrÙõ½ïl.b¨ìRIjq—gè=%gÕòrDɘŒóùÝpÏ4[3`siÖ•ZÀÎ͆•™LG*ë°225`d“>.;~­¤ïµå“~è^ÿr^¯·Ëøýá4ø‹LÁ"”!Áùu|·Êf}'¬DM3‚6òU/·Fœ­p ¯^ÇW£kÖÕJ"&ïê~xI¸)0,é•ü4Êæ…þ…;Úm»]·`=÷ g)¤8†¯ªU6ë,¥ ´‰}éÚ£÷ôpL8 --| mþu5Êfe%A%#SGíî-‰z9Þ>Úµ_R¡Y`±¦F¢ÆWZ­Úò«µT –Zr9áªH|%W²yWë -•%I¸š­·¬./·^$Wm„ÙöÛÏCv³ÀׯÇ[ýˆ¨'zgPV¥tÕmpÈÔKŠîÇýò$CWÔLå»°–Îts¸B5wH+2F2ŠfÈ£5´Q”Ý×s»u,Ûmú];,ÉÇÎ%/UúšL/“M#òÿ=3Xúù™œÐÍšŸ~}8í’^TTNL4&5t×ú¥¿wÇx^m¹ôNE ¡ÒŠyó'½I­ü^:ûSï†é߯zGüpú¢·öÏöÉQO4üYè=sûàñVŸœÝ]ÜõÚ˜•=î=~¼SG -uì„Y)v»Í0tú¶L¨/‡³>XYVR[éÍo5Úcײ«`ú½çiDAYŽJÐft‚a¶úŸõü±€;^Q׿ù ½ûðasñQ)åÄC‘¦¨"• ‚Xa¥ûH­lhŸŠ‘X -t±"Ž¥úPe´78.ƒ€ª¨ÚTÒ'úòu³ÕÓgß{²üA¤gÙ³ki0Šæuh!Mqûf¯7{-·ùfˆpö:ƒy£Æ ¼ÚuC»Ö÷þËx‚|ž -¢Ö‘¸P6vå[·„ÙûËÓá°MQ™(¬SaH±ìS?Mªß¯úDÏÁ} 8K /ˆbQD¬WoG©uûˆT×kï‹HBU48¼•¥iXªÛqX*=KHDÓ(Tâܶ½ Úµzðæ‡—ò:ª¹Ïþ!ä2 ¢ü¿°¯Æ±Ü:´–"÷­á^šWzin˜mœí­pö Ñì-|÷IŸLú4á˜<>€ _ -äã´ò9<ý•KùÌûžÊÙr{ŸrÃÊ -²宬¸!J}Ï:02|&Xmzè7}e¾ˆR$)åîÓ×s|¦®J¶ÄJ¢|©=¹÷%Fú×S@ëJò§7 - íÁL·rf­³J±Ó1è¶œÙÛϧÃù8 -vXd»ÿÖzœ;æy7؇µY\€,MŽ~T/v¾¶!ñÝãÁƒÖ¿YÏÛß2¥Çr…xŸvwnKfÁa³t”Ö^JŽ/—Góg—j[ã«Í­}ÿ!{]1 é.Ýö‘E £Ê ú:ó•…Ñcy,±˜Z4ÇÖsíÉöØb=Ù`Š Þ›‘¶+{6ïfdh9*Œôa³0x™, Fäf,:F0Dý' -3©&‡°‘A¶™EÀËd0"— 0cÑ!0²˜@ 2øÉd‚VGÿñ÷34q6Ï„@&‡ƒ¹‡9‹‡±Å)±Áù´0¦)]h õé ‹?¥BfŸOì=h–QÒÜ£U×/CK›°#¤”¿_9”š¨§Ø¶Q_½²šd=H´„58q-Åá¨çþO©’ù„yQ_‰SzaÅMùXí"Ù2‚ªÒ·5jM$d½_š¹Y…K9f=È—.Ý Vu •Y˜òá:T]&[R%,F9,3X°Ž£ïØ’2ʶ閬AD#-6H¸c—B l ÑI ™£²öpŸºuwêöˤ>*P)b´}'–šJ¹ÕçćÍ^ýMWð+øPÍõ¶ÃêåÆv+fÝ(o¾:÷Þ6j Ìj0õ¦ÍRÞ’À5‡Q§"oø ש¸H©ôíJçîÙE“ÿ²°ñ}}ßnó!Hb>Oz™lž4"—äÉ‹.OŽ,&òddÐì1é»-]<õÊa¦r¨Ï“È<"^&‹ˆ¹‘‹‘‘Å"‘ÁO¦Ó~öŸ7þÇÔÔñ -)_K¦ààºF%å³à29p¬ÈàÌY´àŒ-NÁ‰ ºu½m3N.ä/ùäô÷àÅ!Å’ô·//“Åˈ\‚׌E‡×Èb¯Èà{ß8×Ǻz> "gšwHçe² ‘K@œ±è@YL€œßµp©ü=©ÞÍ|7¥5µúæc?/2ÙjlÂÐÏ =šøöÀ|Ì?5öËÍÿ÷0i‰endstream -endobj -93 0 obj -<< -/Type /Page -/Parent 2 0 R -/Resources 94 0 R -/MediaBox [ 0 0 595.276 841.89 ] -/Contents 97 0 R ->> -endobj -94 0 obj -<< -/Font << -/F8 42 0 R -/F40 50 0 R -/F14 72 0 R ->> -/XObject << -/Im1 95 0 R -/Im2 96 0 R ->> -/ProcSet [ /PDF /Text /ImageC ] ->> -endobj -95 0 obj -<< -/Type /XObject -/Subtype /Image -/Width 162 -/Height 189 -/BitsPerComponent 8 -/ColorSpace /DeviceRGB -/Length 6543 -/Filter /FlateDecode ->> -stream -xÚí{XUUúǹ)ˆÅH)©xWMT5ÔJÔ˜¼¢e¨©c^R2íæXN:A†yIÄ{jŠ÷tÄ æet2¼D9fi‰—¡DÅx:¿ÏsÞ§ýìÎ9”6óÓܽß?xÖ^gíµÖyßõ~ßµ9{·Í¦P( -…B¡P( -…B¡¸“HIIÙ¸qãomV×®]+é£cÇŽ½ôÒK•›7ož3gŽz³$T¬XqÆ ¿©)}÷Ýw>>>7nÜpùizzzÏž=*ÿö·¿©7]âäÉ“nnnçÎ;{öìÞ½{¿ÿþû¥K—fff Nœ8AŒ)bóÇûí·_~ùevv6‡.\XmÇ¥K—¤ýÖ­[/^¼HûM›6ýç?ÿ9zôèÂ… srrŒ¿þúëE‹ýãÿCçqÏŸ??qâÄÚµkïß¿ŸÃëׯïܹ“SWN0`À;ï¼³eËÜ››+• 6ܾ};…~øaÇŽ j´W¬X±¢fÍšfÍšU§N¶mÛ&X‰Êµk×ÖªUkèСØð™gž¡æñÇoÕªUµjÕ y¼S£F=zpvåÊäîîÞ¦M*ýüüþøÇ?FEE=ù䓿™3g8}òäÉ4îÓ§O™2eÆŒãrÜ„††FDD|ðÁ¸¸yóæO=õsðõõeÍpJ£FBBBâââ(ÐóåË—K—.]XXXTTÔºuëèèh†fˆ]»v©‹ARRÆÃnÅÅÅ”ñ˻ヒ…ëÕ«'†%„ñ/…ûï¿ÿå—_þÁŽfÍšíÙ³‡Jl íïÞ½›`ôôôüꫯ¨Ä5?ü0úÄ}p‘#Gêׯ/ —H¯T©’Ëq)´k×nÉ’%¶mÛ&ë °`X“¸’!XÒs``àÊ•+‰bÖ!5“&M5j”´ïß¿ÿðáÃÕÅ€Àœ2eŠ0hØ“(ž6mš,Ç¿ï¾û®^½J‚%ŽzýˆråÊðÀÐ2"ÙVZ6lôèÑ´„–/_.[>2/iÝå¸l´HÓ¦NJÈS`;GûŽ;RfPI¬N: ŸãÜÏ>ûŒ|Á²´Ø†‡‡³rÔËìQ›4i"›"O*!ê?ýéOØ—-[^…{?úè#j0/Œ*͈/r4®¬P¡Â!Cdásã܈8x8##ƒBjj*)õ¡‡Â)’v]ŽËŒKl’ô‰ß˜˜¨`Ĉ ÄP4‘ËžÁ¸ÐQ^^3VAÍÆÒfM2UÙ(~Ä)\Ò§Ð2¹8??ÿæ;„B9ågþã!ຠ—Q`¯e\+AæFfÅEœó‰ø2ábM}§P( -…B¡ø`Ö¬Yjkƒë߀€€’~OTX½zõrss“°(,‰Ë—/ûøøàeùmKaI¤§§ûùùáeooï‹/ªA,‰ÐÐP7;ðõܹsÕ ÖáC‡ ëR¥Jyyyáè¦M›ªM¬‡Áƒ»»»—+WÎßß¿téÒ8úg~Qܸ~ýzÙ²eëÖ­»nݺ¨¨¨yóæáå·ÞzK-c%,[¶ Š.((صkWß¾}©IKKkРZÆJxã7dS••%·3f˜oßUÜí(**’ÂæÍ›Û´icÔË­; -‹aãÆÆÍ -«â£>êСƒÚÁÚX³fþ{ÓòX¹re\\œÚÁÚX¾|y×®]ÕÖÆÒ¥KåŽk……±hÑ"‡¯ÖÃüùó{÷î­v°6æÌ™#ÿáTXûöí[½zµÚA¡P(Š[BaaáŠ+Ø)µoßþ½÷Þ“gWùûç?ÿùæ;)((ùå—o¼ñÆÍw’™™É¹¿Ø,==½N:ïÛñÖ[oÕ¬YS¯©oðNxx¸ƒuLL …#GŽ?~ÜfWô"Øi¶dÉ’sçÎI³«W¯²$¶oß~ùòåÏ>ûŒš &±ï ñeñk¦ˆ)S¦´hÑBÊŒ¸`Á‚½{÷ÊëB2k×®]¼xñùóçKªQÜ (ÿ-[¶80g»víĘžžž09Þ ìÔ©“Í®0Ö¥K—&MšÔ¯_ÿ‰'ž ÒP’qÖø2£Q£FÒ àMåYª×_½yóæIII!!!ýë_möAé|ôèÑÑÑÑQQQ.k7‰³gÏâ_;}ôQu¦£GÂåË——;0—.]*aþüóÏ÷r:%Šmve°#v8k|™7¬™Ž;²èÖ­t_\\|ñâÅ‘#G -Ÿ¤¤¤tïÞ+êwÞ‘³^{í5—5Š[BQQÌܳgO77·}ûö‘”q®ð0Q,mD"&77·råÊÆ3n7f%J2.5¾ ìܹ“ųÀøßn‚FÈO?ýt«V­h 7|¦¦¦Â,þøã+W®pŠhÄ9ôÏÎÜÐ:}úôž={d>;vìX¸p!sv˜vv6‡ŒK0c:_¹råúõë *kذáöíÛ-àå‰'ŠÆšùùù¡¡¡?üð°aÃÊ•+' -FqîÿÕW_íׯÎÅŰ4TÀG¬^QŠ#ų–ÌóœøÌ3ÏBa¤ž^x¡C‡5jÔ`Mʸ²¼ïvÀŠîîî/Íœ={6\'eLGŠÌÉÉ1DØD}jj*Ö#|°gÛ¶m -›+±µk×®y{{ËP½!¢ËŠòññ1ò©˜úÍ7ß4ãããÓÒÒ¤ìRÌmñâÅ0?¤-Z»kÖ¬ þÔFq˜?`S7vìXH‰ &Ý>V¯^Mâ&Þ ä0î] ¢¸nݺ•¤Q¶¾øåÆ$>ápa3ï1 Öc«$ª}.ÅÖð¾1»ìO¬’,éŠ?üá\‡œ"¼.û§¼ÿ~º‚ÿ…„ÙP¶²®pÎpæùÇÆÆŠÛ-Nd©“ôåz –†®çÎk×WÊ Î×V䣀€,Cž²™DØðàÁƒ)°‡½‹g±5BÞ‚žëׯ ð\êòa°:ô"I\<ëëëk‹9÷o³ßëË)²³ÙuwÙYAÚlϘ¶d[óüɸò‘G‰ŒŒ”¨yàhÓ·o_¶mä ×ÚŠFêСC· -g±5‡ 4Ƴqýùþx‡«-Z–ÔɱcÇþõ¯™k¸“¥ƒÁ6ú¿2…B¡P( -…5Àå­*ŠX\±¦¤¤¨,ŒÜÜ\yߪxùå—½½½}||>¬Ö°$~øá‡òåË»¹¹•.]:))I bIdff–-[VTÝUß’èСƒ¨ö???ç7˜(îväçç³ïòòòºï¾ûüýýÝÝÝ)SÜíxûí· äôôô¶mÛ.[¶,$$äž{îÑ×Y 4—>ûì³üñ¹sçÂÂÂT?ÙJÈÎÎ&~¥Ü²eKyׇ­„¢¢"£½cÇ);ܦ° "##]¾N]a%DDDÜÁçe·7–Ç[FÆ 8 v°6BCCsrrÔÖFHHÈ¡C‡ÔÖFíÚµÍ3+,‰êÕ«=zTí`m•+¬ŠäääÛ&i¢P( -ÅíÇ7 á¬þýûOœ8QÛÌÏÏÕ3víÚõÞ{ïQ˜0aÂçŸþ+†+..–—@¹ìÿVá ·uíÚ5g5°ÿ~”_‚‚‚ÁƒÿnQÛ¿Ù²eçÛ1eÊ”FuîÜ™z.K /¾ø"þ¥0jÔ¨_÷ŒÃÔ©SEöÁeÿ· -¹­óçÏ‹XŸ>}*V¬(å>øàNÙ633Óи³˜9s¦ùuÆï¾ûnëÖ­mvɬãÇKå¾}û222¾ÿþ{Z2sŒ)‚<Yì~WÛaÈ¿€={ö¼ÿþûòÄ7íÛ·o߯_¿Ó§O›û§·3flذA!“½{÷2ÜÒ¥KÜÖ˜1cDCà0O‡~˜›!ÕlܸQ~Ñþúë¯-ZdüÐé JVXX¸víÚÅ‹c iGíܹ“SŒk="â2‰ØœµÙoxÎÉÉ©P¡Â¦M›8l×®_Áf¿ '(((>>¾J•*þþþ|ÍY³fI¼›²ðK5ˆSÃÂÂDAè¹çž‹ŒŒ4hP@@NLOO÷ññéÞ½;f7úÇ•*U9rdݺu‡ F ýשS§mÛ¶={öôððX¸p¡íå¶Ú´ióöÛo‡æy:÷ƒ/D¿0CYó“'O¦=œP¦LÖŒí§¢d‡ª_¿þèÑ£££££¢¢ÄÅÍ›7gi :Ô××WþuÃr#ÓGhh(–Ç}üussÛdj<~ï½÷2UÌÒ¤IÉ¤ãÆ“§WàIÑè0²Ô$šxl¹ÛŽ–-[Ò•äÈ“e_®^½jôO›˜˜¹O¨¤Rú‹‹©'Ÿ|z±ÝŠÜ‘ƒÌ·òótÙÏòåË1‚Í.?ÌR‡gp¢ÌŠ5Ï"´ýT”¬S§N"õÆ““¶mÛ&«àw¹'qéꎻjuwwy¾/*&†} ·òåËÛìRl0°4&:z÷î-<¹uëV³@ÔJ´öúåÊ•;xð A±jÕ*‡<%JYFÿ,!@ÙÚU®\Yúß²e‹a1u¹y¹-ÍËË˸ÈAÈ˹¾5‹œE5~üxyl×®]ÙŸÈwyì±Çj×®m3‰’ÔÔTbüÑG%ö…µÈ/ÉÉÉÄÜE°;vLÆý-rVVÖƒ>h®áaUx;¿˜pnn®|Ä—"ùR¥J•by˜²ð>ÌoVÐr8—Bn¥,韸 Í¿ÿýoiÃŽŽ¸ BLL‡`L¶y·$·5wîÜððpãЊˆˆ0zÃÌœ~XHK–,‘ãiÖ{>¥y÷7â— Fll, #@×h¿qbnæÒ˜®eD¡ëgð¿’ÛºÉ~X–|’ß ‘ßÍŸ² 3Ò“ª%( -…B¡P(î"Ìš5K`mpìíí­×)ÖÆäÉ“ÝÜܬñþ&EIÆË%½æ@adggûúúâeþîÛ·O bI$&&zzzâeþšŒPX×®]“@øùùÉ -+aùòåîîîþþþ¸Xô¾T Èzˆ%–8€—ùKÙ|G¢Â—É÷ßÿÁƒ)ÇÄÄØìwúQ£ÎV¼yóÄÅ€X–޾ƒ/×VüÏ!oôsð²C½ÂJ0{Y¡^V¨—êe…zY¡^V¨—êe…zù÷}‹B¡P(îvŒ7ο9r¤h¶ü:\¿~]^þïQ\\<|øðÛüë¡UÁ - ==='Mšô¾¯¿þº‡‡ÇôéÓ]oÙÙÙ.[~˜ƒÏ#räÈ‚ öîÝ+‰—$´uêÔ©ŒŒŒœœ\“˜˜(•Î"]{öìÉÏÏ_¶l™¼yûöíÐá¹u£qPPPJJJ•*UÌõfq°’jd¸l®¤·œk`1A°ääävíÚ‡ôïëë+·^×x<)))$$D”\ -m­X±" >>žÅ_«V-yRÉ¥HWµjÕbbb:vìèåå×¹sçððð:8ÏjРAØÓ¹»»ê=â`.kœe¸œ¥·œkœa1A°nݺլY3ÞèÑßßÿÃ?´ÙuNð‘dbª{÷î6WB[,È|PB‰µáææ†kJ銈ˆAÉ©©©ˆkÜä0%ÌÈ -¹dÊ’ss®q)Ãå,½å\ãë ‚±Þƿʎ´´4¾!,K‹ØJ±2q_ÍæJh‹ß«W/©9qâ„¶”$ÒµfÍ -¬Rr„Ü/ E°Ú¦Ä -Áõ/ÚåŽÎâ`Î5.e¸œ¥·œk`1A0z¦CÑçtéÒ…-…=z¿¬ç3gÎÔ«W/++Ë¥Ðáo0ÛìÙ³ñï/Št‘‹i‹¯²RXXXê "àCéÓ,F6w– s–á’OÍÒ[%Õ˜a1A0"ÎáÙ1ÜÄ–)//iËÝqð6)òt)´ÅBåZƒeŒ[ùúøôEºHÓ†Îl/º¬Î¥Æx§Í.ò™à,æ\ãR†ËYz˹ÆÙ,{å•WD/ËD–7NiРûB :š?¾K¡­­[·Ô0ÅFBØõçEº`$ѹÂxÊü¨ mÞÙÊÆF.%œÅÁœkœe¸œ¥·œkœÍò»ãB@. F#+¹¼Æ„‘Ìu“"]·gq0çg.gé-çš[‚ -‚) -…B¡P( -…B¡PüðFùYRendstream -endobj -96 0 obj -<< -/Type /XObject -/Subtype /Image -/Width 550 -/Height 240 -/BitsPerComponent 8 -/ColorSpace /DeviceRGB -/Length 24246 -/Filter /FlateDecode ->> -stream -xÚíwtEÆ $41€éEÞ¤w¤)UPéUzïi‚ÀH/ŠtÐDºô.é ""M:äûÜãœuwóò&á>äì;Ù¹sËsgwg -…B¡P( -…B¡P( -…B¡P( -…B¡P( -…B¡P( -…B¡P( -…B¡P(Šž={6ú:t˜={vˆ«zðàAýúõƒúo»ví.]ºd-¹~ýz‹-ždµíÙ³'kÖ¬®ÿºqãF̘1=zd-üé§ŸòæÍû<úåÚ’O?ý´N:Ë–-ûñǹoÅŠ)üõ×_è}Í^¶yÚ´iéÓ§©~ùå—iÒ¤áîªo¯4f̘ÁhÊ1”£M›6þþþF½7n|áÂëù 8tè÷ïߪÎÓ§OwïÞÝV¸fÍšo¾ùæytaË–-p-›hذá_ý¦Dýøñc V¼xñb[á!C<¨ZƱyóæxñâYKòåË×£G9>yòä¬Y³¶nÝj͸„³gÏšÂßÿ}áÂ… 7¡ -»“ÂãÇûí·»ví’(³víÚ‚ R8uêTS!&iò 罬°Õ†p|åÊ•¹sç<·ÄDŠlÙ²™Ü„d§P¡BRó¹sç8X·nÖÇisæÌ¹víšœvïÞ=ÂÓÏ?ÿ|ûöíxßfòkê4jÔ¨ -¸öE¬~éÒ¥ØÑßÿT‰â¥ƒS½zu9ž?¾Oûöíåçˆ#råÊe;¿S§N"FŒ> Š™|öÙg¶BT÷«¯¾z]èÚµ+ -l‹A±cÇk¢þúë¯=0´>øÀq°ë¸qãŠ!+Â2°”Ò¥K›ŸÄ‘7Þxcÿþý6,eÊ”uëÖ=z·nÝ$ÜjԨѺukN;uꔸîøñãc‰‰'N›6íäÉ“)$WâÌ.]ºd̘îAÉ AƒÞyçܹss&i^Â?üßëz/+œµq2ˆR¥Ja­ÔöÝwßÕ ,‹ÀgãNt_;¹^Ù²e‰o½õÖG}Ä¿ˆhY²d©R¥ -Î$S¦L´Öû6gÏž]ND~%™#GŽPyçΉÈùóçw-Q„ÀÄ*Uª$þ Å@÷4h ã›"E -¨Îõë×wìØA¾³|ùr4j÷îÝü„»À e¦"Q¢DÂ'9mI nݺ¥JÖP³fÍ4iÒTDÉ’%ñÉóæÍŽÓ“Ù´+iÒ¤lذA|;Àâá¡âI’$=!NEˆDàæÍ›:tÑGŸ?ùä0ÕÊ•+þ/ÆÏÏïx œ÷2p­ H…¤ÞW«VmôèÑ®-±Öƒ-Þ‰ ÂP#B'f˜ AR$ -É›$ýÓšY‚‹CoÚ,s•åË—¯W¯ž‘0­uí Ñ Ÿ#WõíÛ×µDC`L9€`c,xZQiLþÀ°â3 É“'‡@0øï/¿ü’9sfˆ^ו°AE¸eæ¾ô矒MG•¡¿{÷nñâÅaeʔՌØÂ³6è†I!ÿ¢P‚B£FÞ~ûm4†aàÆo |ÉõÚfÍš½ÿþûÍ›7§m+W®”¶.\˜sˆ;NÒE¯)Á|TäÈ‘Åê³eËV®\9þëÚ#ç} ¾d…XaͱD˜^Μ9%ÆÑ†9rÔ¯_ŸÐSµjU -‘¼Â]»v¥N÷B3`4Rõ6Lqéß¿ÿâ@L™2Å××N9ãˆ Ô -D… - iÂùɉP]”—~úôéáÇs‚TõÛo¿¡0ض@0B Tøs’ þKÞqøða9öÞ¢E R`™Ðs½—Õ²œµa×ÐBû®-qö_·nì”öCü F™+#ÖW§NxW²dÉÌdNTò²Í0Ošúm `bÈÍC_ÆŒƒõ141g‰"ŒLõÈ„®êë.Z´¨LDOŸ>ƒ–-[’Ã+„IË%’Ñ»6˜ ÁHž\\Cæ©YA:´S§Nr~“&MÚµkgmŒ³6¡ORHmhø¥K—V­ZE“$¯ïÙ³gúôémJ•*¶ïzí¶mÛŠ)"&0jÔ(ºOÛ¢D‰Bî)¥×„W©™®¡É2‰Çpí‘ë}I ‰)’¼`#'NœààÂ… r>ž¸)žp´‡ƒV­ZaÂü7oÞ¼$Ybéøº zv€'dˆ?UªTÅŽ-ÚìÙ³wÿ <3jSBñÈ)Á:8 ¦‡«—k§NŠ~> ‡Ÿàu!lï¾ûîúõë ¸Ps—÷Þ{oÏž=0C¨Žë½¬tÖ†F÷ÄcJÔüǸ¶Ä`âĉVó݆DQAØ—™+Ö‡qáC$Ó‘üˆó¯_¿îe›ms•ú"åXÓøñã±}Im\K/3fÌ€*,_¾\ Þ öÎßwÞyGÜržsÕ¤I“œ%ª¨a¨qÁ‚ñá„yÜ@¬Áç “‡íÃC %C‡PxÆW<*%®„A6-•>|8C† (¢Ÿøm*ßm•ºÖff–ŸibË×®]# ˜ÇCdÍX±ÍHnâ¼3·^Ë]è ´MJœ¤ËJIÜ éª\¹òرc]{伯L84oÞ\f/±e"æÙ³g1()$ÂÊ”8Àx»uë&’ÇT‰§ 6´Þ"¨6/½{÷þøã­%¨ŸjŒ÷˜3gN”DæÈUQlh?—˜(Q¢sçÎaz¤ÐØÆHú,<÷ž/_>4‡ü×Ý¥K—Š+’äâÌIºå¡aáÂ…Esœ÷²ÂY›@ù/ñKºàÚ+—ã¾ðÔ•Ax‚ -5Z±b…™+“3Ñ^¸'à1Â+ÇÞ·²jŒÂs_ˆ˜dOÔCÍõë×'–9KTQÃàÞ1cÆD» …ÀÁ¢!wïÞåçŽ;ò/HÉ ³fÍ*Uª”ÌÈ9 Œ‚Q– “É%4êÀÜ ”ø…Ë%™²¾ñâZôɼçÅAºp¾•+WRÂ_"TÊÚ#’yâ¼–À!8Hø–(m |ê$]V*ضm[Cº’$I‚ówí‘ó¾Ï|…h!òJ‘'¢ž>}:—p !žh '¼zõª‘|ãÆ)m»wïÞçŸnÞ¹U¼*snä¤ÖO îܹc8ÏüaèôÆæOž<)¯þ¢`2+Ä/¨×÷zjmN¸¶Ä:“F=ÜERø§Á“ˆ™C½6oÞ¬6g_ ¢{÷îµÖã,Q„lݺ§mÞõb€ø9xð`ù‰4 ¤H>@†xøúú’¸6˜ Y4>Nœ8ø^4“(& Q’%JÄ7cÆŒ8^y–aàZ›Ì,É ÅŠÒÕ®];"mã.6ÎOÖ#]¯%d@«"M´]ÚfÌÇIº¬TÐd"Ä#¡p®=r½/yŠŸŸ®¦_¿~ &ääzõê/^œ¨‡U‰æ07ä¢E‹¬’'qaúôéòÔGñ -¡\¹rÍš5ƒ’Ë T(B€[·n Çp%l‘ÙÞwŽ?Eq­6¨Úœ ÷|‚A¸¶-d¤ËslìQ.^¼(ob>ÌgªÔC%®–H“ÌËØ -Å«‚S§N 4¦ôÝwßéÔ–B¡P( -…B¡P( -…B¡P( -EZ‹ßê»a -…B¡ðŒPYüÖó¿ -EøÀôéÓkÕª•;wîO>ùDVP -ž÷ pæãå§ -Å« Ï‹ßʪ8+V¬X°`XÐÕ«WÍjKòù˜m_…"üáæÍ›*TÈ›7ï¬Y³6lØÐ¿ÿ(Q¢˜œð¼_€+ -.ìܶF¡gð°øíÉ“'£G^¦L™V­ZeÈA6";v¬Yi³ª]»¶u_•§"\¢oß¾•+W¶æ ;vÌ’% ‡’•ßäøÜ¹sÖý>üÇìÞ½{æÌ™f˹µk×Þ¹sÇß»w(†Ñ͘1C?%P¼Ò€˜eù/l+uxXü:—8qbùü«¢E‹ÆAݺuÍvWuêÔ‘3Ì¿ -EøY|¢D‰Ì>ƒ‚ùóçË¢jE‹5«B)RÄßßߺ_@öìÙÉŒêׯ_±bE???ªºråŠ,#8M yôèQÕªUãÇOSi+^i9räÐa}ÄïyñÛ6mÚtéÒEÎ .]ºdû\š f;G¡x­0iÒ$²›W¥µ×¯_0`@Íš5sçÎ 9r´hÑ|}}#DˆŸìر£ùüA¡x1X¶lY¡B…T -EP¸|ù²¿¿ÿ+Úø-[¶$Nœ˜øá_¼ñÆyóæýõ×_ud/E!_]kR(^¾úê«âÅ‹¿ºíÿçŸ4h3fLÂcÇŽMâ3lذ;ww+…ÂLžåûûï¿/^Ü®]»œ9sÆŠ‹l®_¿~6lÐG<ŠcÈ!¨ÙðáÃU -E°ÐºuëÈ‘#c>o¿ývøèÑ¢E‹âÆKRãü×­[·–/_Þ¹sgY¶´P¡B={ö\½z5åª -ï‘{öìß~ûM…ózbÞ¼y4ùÊ8vìØëž -…7øæ›oòåËwûöíåË—·lÙ2 psÏüùó«d\ñäÉ“½{÷Ž9²råÊo½õVš4i6lH°–MR¯ ä©ß¾}û"FŒÈ_ò’%KªXЧ¢G7oÞäÀßß¿bÅŠR8yòäãÇ«pžŠƒ ?þøãĉ'K–¬N:¤‡'OžTÉ„c\¼xÑÏÏïÀ$¿²¥$„’?ÿüS…£Pxfìæ‘Í²eËÊ—/oþ¥K ÇŽ›8qâgŸ}–4iÒD‰}òÉ'&L8zô¨n^þ¦7Ó­‘"E’B‚ŽÙøF¡P<+V¬([¶¬Ê!TpæÌ™iÓ¦Õ«W/eÊ” $¨V­Ú˜1cpS²d½â•ÆíÛ·åàáÇ‘#Gv–+ЧâÇ,S¦ŒÊ!ÔqáÂØoãÆÓ¥K/^¼>úhĈ{öìÑM…^uØ"ŽB¡ð«V­Òý£Ÿ7._¾}“&MfÍšuþüyŽF…"lbûöíyòäQ9¼ÒxòäÉ/¿ü2zôèªU«úùù¥J•ª~ýúÓ§O?}ú´ -G#ŽBv°sçÎܹs«Â><~üøš5k¾ýöÛI“&­U«ÖäÉ“ýõW•ŒF…âåb÷îÝ9sæT9„W?~|Ê”)µk×Nžø`ðàÁ[¶l¹ÿ¾ -G#ŽBŠ8tèP¦L™T -Á_ýµxñâvíÚåÈ‘Ã××·D‰ýû÷ß°aÃÝ»wU8‚D‰Eå P„GŽɘ1£ÊAáÄ7–/_Þ¹sç¼yóÆŠ«pá½zõZ½zõk¾™F…"Ä8zôhúôéU -Ï ÊüôÓO=zô(X° Ñçý÷ßïÚµëŠ+ˆJq -…—øõ×_Ó¥K§rPx»wï®_¿¾o߾Ŋ#úäÊ•«C‡K–,¹víšF…Bá'NœH“&ÊA2Ü¿óæÍ,]ºtìØ±³fÍÚºuë \¹rE#ŽB¡°áÔ©S©R¥R9(ž>ܱcÇСCË—/7nÜwß}·Y³f³gϾxñ¢F…BΜ9“"E -•ƒ"tñøñã½{÷Ž9²R¥Jo¾ùfÚ´i5j4sæÌsçÎiÄQ(^[à’'O®rPü²oÈ!|¥mgÆŒ“&M’cÔ¬M›6þþþòóÆ7¾pá‚õü:t( ðcœ ê<}út÷îÝm…kÖ¬ùæ›ožÚ³xñâtÄËúC #GŽÜµk—µdþüù6Í\»víK1[†Æi&­ZµzY:ö‚ØóÆ;w"EŠ4tèÐIèׯ_ĈDzÚöìÙÔþ`̘1=zd-üé§ŸòæÍûÔjiUÕªUCÐ/ë-tíÚ—b-™6mZÚ´i‡[°|ùòÓçXÌ™3ç믿þßÿþ!B„^½z}ˆ—õµ;7nÜWý_BLõêÕÏôññiß¾½ü1bD®\¹lçwêÔé@Ĉ#¨Ý ЙÏ>ûÌVHðúꫯžÚžÌ™33Ê!舗õ‡R¥JeÛYµlÙ²ÕªU³Zʉ'^ŠÙþý÷ßbuëÖMœ8±ÿý÷/KÇ^°{ÞØ¼ys¼xñ¬%ùòåëÑ£‡ŸÊ-Zd]ÛMê¿zõê¶mÛ¤„cZnè¢m¸­pÖ¶nÝ:Ì [ üJs÷î]Jh*jó9 ~üøÒAØ„ V®\éTWTþçXNøå—_øéÚ*«Šz6[A·nÝjÔ¨a~Ú ÍV?ª~àÀ9S,W^&´¹5›¹!¥¥K—Ξ=ÛøN,|&Vºtió“n¾ñÆû÷ïçxذa)S¦$ÐGá‹4ˆGŒBëÖ­9íÔ©SþðÃh L>ŸŸô:ÄÁâÅ‹K–,‰£¨\¹²Œ=%:XÅËpð_\"™†mvPt†k d0šþù§ˆïäYi¡a µÄuøhÑì ù˶é¦þ±cÇ~üñÇr-ľvíÚ8‡Ûz gm8ÏH‘"a•èÀ[o½õÑGQxáÂ…wß}ó)P šiõ9â–¹ÄV3ÀÓ&Mš´C‡2dhÛ¶­M]©P" -{‘˜›$I’Ë—/ÕGQQnäÙl%J” Õ2?­†æ¬Ÿ¸@—M–Ê™®nÍÚ~l¦L™:wîÌ€"™ ÜŽq’á5kÖL“&Mõ@`2c]E2Û +`Ü9ÀíC®äBD„CKb¡²Ä)Ô›@ÏAI„¾Ž9ò“O>á cæs€ „ó^Öim"”m™w'&çgË–âl›©Ù²e&-…Q u :´S§NRؤI“víÚYëwÖ&³@RÈíè)&ŒîåÊ•KbYÏž=mKIËŒ%šç_@f8ó‘ê$4ÐÂJ”(Q sŽ=Z$öþûï㚸Š%&+ ª½zõ¢*×±pŽ8‘}6?[¶lI2×^ÃÕé¦!/ýû÷çFS’J í‡[Û×Å«H%S¦LAþ®ú€3±Í@¾ŠÀ-‹óÄí oÑ¢Ee¢`úôé6ñ"@‰¶\"ŒËÕ ¸Ìá fxlˆ45Ë©g¥ýòË/%ü8‡ONõ# -à„S?¾ÑÌ­AÆŒã:ܶ›Új#_€PI¢1wîÜB… - 18p \‚™ØËÒ_²3c&ÄY‚7âZq ´ë³É“ÿ"¢ÂÇqQBãÑ´ úhTÔ³ÙšY____Ò Sb ͵þ `­”Ðr¨õÁƒ]ÝšµýÄb’Yq}ûöuÕãÄÂMÄ!£‡‹@ÈâÉ«V­ -Ūˆ -*È"É$ äDÄ&œ!Xà©ê·ß~û"|†YAÔ ôè‰Lˆ¡«æ!5a½E‹Ð-I®]ïe}úàÜj³OŸ> 6Ä$ 7›6mrm›©¿wïÞ&-EÁ:vìH2NÂrS˜›Íœµ‘Mcþ²¯=j&‰ƸdɹQ'´ÍXRÕÿÉ@#±ks1Ë‚ ™B¬Ð _%(㜱)´$tAõQ& ]ÇÂ9âXAÁüÌ“'9¨^S“ÄB:3ÁçàCpµþþèfm?ÖA“2Ä.3®úÀ}­>¯(f̘A§HZ%Ð0”($ñ92oi/^}ݺuB]dvË)pt†2‡yâ…/ñå©J‹9¿¯´ ŸÌ&aåÊ•#s‘'MR?äVfj ?¼cÇ×á¶MÒÚjƒH ±ò_‘ ÊDbfäÇ?Ûã0ôǘ i…EŠ1=Éæ’%Kf“'f‚±4oÞÁícô‘˃ê£QQÏfk¦Ð#GŽl>³µškýH˜¨'Ÿ¸ -£sukÖöÐÉ}>øà¬[ò;N,|€Ò/ëZµUªTâ-Z4ùî¿%Y&5já›Ü/§‘™ÄsêÔ©(‰Lá*±4…Çyâ‘­¹ îhÏž=$SeÊ”q½—µ‘íÛ·'¸ØZÎùEFJr%×¶™úS“–ÂC(÷÷÷Ç'ì¶À*×Ú¬³@øOzzíÚ5¤gfÚ¹ Œ×ÃŒ¥9šåxçΈ÷‚Žî¥ÿ@zŽ2cÚøÄ‹ ‚¬zîcPcaä -2ižÉBÀ¾<*r­_TbòäÉ4I^‚Â<«èp­Öö gãd¬L’§>È}ÃÁ1 .,X° ŒP"SýèÒÀ™ØÄ‹Kcãu…º%pt-•ÃÐH‡z¯g¥°èüÑÖBÛðñ7mÚ´ø[ÈŒw-³RÔO;ñ±âúð·øpÚï:ܦr×Ú¬³@5kÖÄ(&Nœh&ä­ [Ëq°VýE•ióÆY€Už’7Á^räÈ!Aœ»<÷Qž¿x6[)*äÁü´šký´tH•*•<”qº5[û…»Ž?žKHvžjàáPÛZ”¸© &0‚VòD‘ ^z×®]Œ >D”Éß)a܉ì裀b\¾|ÉË$nĈ±2 s#îpæ¸qãdjõ,Õy/k“ðZä÷ÿ…(ü¾}ûh94L’w×¶Iýe„ÕÏœ9eƒ6øsSz4Õ’ÛL•8k#6Ó]ºt¡§8L:%3Éü¥f"ˆmÆR`öجY3z ˆGÒq<‰™#“øqD€Ëk«žûè:ÎÇ1BYÍOH,>ÍC¯A÷îÝ£ö7¦_´¾••—LLûx¦Œƒ^ªT)W}°Þ÷•Š3fL‚Žü¤³8jü†pck7ÉdrT±%pd+³¾øÌDæXD¼ž•öâÅ‹h 0–"ù¸mø¨œ¼LÚCSeêOê?zô(y1÷%Æ‘>Àƃn×Ú&Lhfð¥çp r4L%6ŸC!~Ø6Œ’`\ò‚49#õÈ3w«Ú`†YIÿÉ€H"$y裼áÙliÓ¦MÍO«¡¹ÖÐ|D-qÍÕ­YÛ'1¯5"áI“&=ÕÀÃz÷îmš$S‹G‘3gNFJ朷oßNØ-T¨PÑ¢E‘i2®FòÂX“?bwóçÏ—Ù¨;¹3ù5™&~ݨX±bâĉќܹsËd 'ɵó^ø.ê`И\]fŃj›©?LýX*„9Èüv‰%àE3fä4Û{˜®µYgŠ+&=%¤¨¼4Nœ8¶÷]S¦Li›=©ZìšûÆŠ‹  ¡GæèÌËtSÞ½éÓ§j,/wyî£DçX8ŸtCêÌO$oµký¦±PÈ›œóóó#ÖsQ˜.ÛÚ4øÁ)É£O§>XïûJcëÖ­ –yÓ ?ÏÏÁƒ;Å;lØ0y!„ñòõõÅ/¹ -CP'Ä‹TE¼è‰g¥…xGø/äM3Ûðõë×àòzõê/^œ fêÇ¥c€ $ÀmVªTI&¢Ãm½©³6ë,)­¼±ƒ“'ÚRN=µjÕ²ùø<¶`ôÇPà'V Ók6µA¤ø+ »äΆbÕGs Ïf+ÀM:Õ[¡9ë7”çffDnÍÚ~ˆ%¹ÿ¥ƒ«žjàá†ýû÷[?U»sçŽÉFe¾TÈ £í‘ÁÉ“'ÅO¢Æfò“0Ô÷Î{®m3€öÛôŠÃÄ‚Zƒ×sm¶<Ÿàüκ¾hú,} j,B±~žö_½zÕõ¿ "dÒ6m⪯-z‘FP'Utrô¬´^‚lHž\còv±õM™4ð~¸=ÔfKd>l¾Pðdd^¶øž±!6ÛôÚ³[»víÚÞ½{Ÿê` -…B¡P( -…B¡P( -…B¡P( -…B¡P(aOž<™2eJµjÕræÌÉ_Y)ñYðøñcë'ÞàáÇ®ïyÚ?a?:—…W(lرc:)±tïÞ]¾Dð^Ï B¼/I˜ÚÝC¡ð€Û·o-Z´téÒK–,YµjÕgŸ}æëëûŒo~ýõײ¦÷(\¸°mƒ‚K„¾øâ ³ »|ñôbà\^¡°à1bDë -ºK—.¥D¾TõRÏ­ -â}IÂÔî -…Ô®]»fÍšæçýû÷&L¸hÑ"a/XЄ ÌÂn®ûØÖØ?vìXÙ²e6lxñâÅï–d—¯;g̘aårk×®•…mœÊÖ*³:õ¹wï^ ²F¢²måÛèž—…W(l(Y²$lMVX ü*'sæÌÄYaÀ¹Ó‡MÏCq_’0¸»‡Báê5jT×O±®^½*æÓ¶mÛ8qâ¬_¿>ÀmߌŶÆ>¡'FŒ˜!*êÍ’ìX_ÕªUãÇo›‹}zÙÙEà¶Ó‡ÑóPß—$ îî¡P¸× ÝBçS§N;vìzõêÉ6‚7nÜÈš5küøññ½… -BÏþ»û¤ÙwÀ¹Æ~Æ ýüüΟ?ïå’ìX"çÛ^ ¢9—åwm•mYrÙ¢E‹€Àm¹¬[xx^ùßó²ð -… ÷îÝ‹9²<ŽD½q¼Â» <òÞ¹Ó‡UÏCq_’€0¹»‡Bá82hÛŠè¨ß‘#Gœk°ÛàºÆ¾yÓû%ÙÍÓÏð²U®ð¼òÈ–…W(‚‚s§«ž¿€}IÂìî -…B¡P( -…B¡P(B ýdL¡ð÷ïß——p -Ep±gÏž¸qãw©O…âµÅܹsß}÷]•ƒB4lØ0B„²t›B¡x*òäÉãããc¾U(^âÞ½{1cÆ$â”,YR¥¡P<§OŸŽ=z”(QôË…"¸˜={¶¯¯/'Z´hÞ—V(‚Î;G“I ¾¬Pw~ B Ètd‰…B=z7n\1™X±bmÚ´Ie¢Px‰³gÏF=räÈ‘"E‚2f̨2Q(<Àßߟ@=>>>Î…8 -EPèÙ³'V;vl___,ˆ £ûl*P¬X1L&^ ài1cÆ Ö² -Åk‹'Ožøùù¥H‘bÍš5™3g^¼xqĈ»t颒Q(\ñûï¿nJ•*5iÒ$²›îÝ»CÒ‚Ú´Z¡PXA É”)Ó•+W8 Ë>/X° UªTú0T¡pÅÀ«T©òðáÃY³fɾŸíÛ·¯V­šJF¡x*†* SïÝ»7{öìR8oÞ<Û¶# -…Bæúôé#«}Nœ8Q¶»„ž7n¨| -Ï0«æîÙ³'Gަ\—V(VÜ¿ßì,0vìXÙÐP`ÛLJ¡PxÀ®]»Ì¶Ô -…â©5jTëÖ­U -E°cÇŽüðC•ƒBá%>ýôÓY³f©Š`ñâÅ}ô‘ÊA¡ðüñܹsU -EðÃ?T®\Yå Px‰*Uª,\¸På P„ ,¨ZµªÊA¡ð~øá’%KT -E0oÞ¼êÕ«« -/Q®\¹åË—«Š`Μ95jÔP9(^¢téÒ«V­R9(!ÀìÙ³kÖ¬©rP(¼DñâÅ×®]«rP(B€Y³f}úé§*…ÂK.\xãÆ*…"øöÛokÕª¥rP(¼Ä´iÓÎ;§rP(B€ýû÷ÿðÃ*…B¡P( -…B¡P( -…B¡̘1Ã,­ÿäÉ“6mÚøûûËÏ7n4nÜøÂ… Öó pèÐ!îß¿T§OŸîÞ½»­pÍš5ß|óÍSÛCc/^‚ŽxYhaäÈ‘»ví²–Œ;¶Ñ¿èÚµëÎ;m3xðàAýúõ9øñÇ‘È`äï¬?¸¸~ýz‹-}S2jÔ¨F>|øeié!C<¦ §gÏžF2:t˜={vˆ«2úàŠvíÚ]ºtÉóx¹bïÞ½42Tôá¹bË–-ØŽµdÇŽF¶-[¶4ëâºÚ‹XâÕ«W[µj²<|øðñãÇÏhAé*½sšÒ³ß%ÄxÁ~Ò BŒùÂwþüù>>>íÛ·—Ÿ#FŒÈ•+—íüN:ýˆ1b0R®uN›6í³Ï>³¼¾úê«§¶'sæÌsæÌ AG¼¬?´*Uª_ýÕZ’6mÚnݺa“'O®S§ò¹uë–‘˜õÌ={ödÍš5 ðÓƒ•+W†àîVù;ë.~úé§¼yóZK‚¯¿þúÿû_„zõêõu ®]»öRT×7nÜ0õ2Æ;w"EŠ4tèÐIèׯ_ĈDzڌ>8ë‹3æ£G<—+hUÈ–‹ñ²þÐô Öd-¯–(QSÂ3÷ïßÿ7Þ€îj/b‰`àÀ!k@áÂ……冨=èêîÝ»Å|²dÉR¾|y96tôÅãûI'zôèQ©R%‘2!R4hЀŸ(yŠ).\ár ùË—/ÿûï¿ œ.]º}ûö CÛ¼yó¬Y³Îž=+u6mÚgµvíZBÏùó祛úùçŸåF›6múî»ïÌù¸hBÞ™3gL ^nõêÕæ'w”ÿR¾hÑ¢+VÐ0kýPmÛ¶I Ç´ÜXî’@H°ÁYÛºuëð*˜¾×xÚ»wïRB{~ÿý÷xñâYkøë¯¿pÎÜQ~BJñH‘˜rò„ÿàšwá?ÜÅ*á äóÛo¿ÁLà'D«ü­õ_¼xñÛo¿ÅN)ôÐ çxaï®ü’-Z4Ã+lí´ÕÔH9%¿qãÆþù‡“¹„ÎÒ~ôäèÑ£æÚãÇÓˆ«xZœI¢D‰^åötܦùòåÔäøäÉ“ˆeëÖ­Ö,Æ&sW}pö#*X° …S§N5ZÇËy/üÛ—_~i-Y¿~ý•+WŒ¶l߾ݳ>pwôG -9¾wïžgûu­íÈ‘#8ºI¿¬£ŒvÑ}ÚS¬X1TÔZIÉ’%­á»P¡BòSìÅÕ‘øy«v¹Ê‡^`ì´›åç† ˆh„6úeê§K—.0a‚Éëƒê…÷ºš&Mš ˜Ÿ¶vÚêq)§ä;Æ17…´ˆFÑ«0ƒò“/ÑvÈÑÌ€ÀEÂhFGn7o^ÆŒé#r ‘É“'‡ÀÃÞùï/¿üB&’;wîï¿ÿž¡ÁÖjԨѺukîÔ©S\›={v®%q?~ü?ÿüóöíÛQ£Fe4Q•âÅ‹cDeÊ”‰=:Cl³???k 'ghÄó_ôŠ ÉÎ>üðÜ9sò/S?éùÇ,×Â%j×®Íã˜:uêO?ý4eÊ”DU©ÍÀY›xQ¶lÙÏ?ÿü­·Þ’µÓ/\¸ðî»ïæÏŸ¿@¤3¶­ØÉǹ…‰tô°Ë±H, pE\DA:™8qb.§œ»D‰X%ì*”ŸK0§Á¬ò7õ$HÀ鬳rí…ëxq mpêÇÉæ§µÎz\GÊ)y)X%—ß¼y“šGJ3”ÆÀÌùW—.]P!”SîÖ6L!ý·*VöïßÏñ°aÃèlݺu>”ÌúàÚ÷Aƒ½óÎ;Œ5g’FIúoÆËy/+ÐÜ©µ„á3{¢ãÆó x<ø'HNÍ?~ìÙ~]kCPX …ü‹Bq°5zûí·éê;vlãůR".”Û‘B&K– Í1öâj‰ü%C±j—8åƒ/Âvp ÜšP…{' d :vìhêÇ~9‡JÚ¶m'NœRP½ð^W…‘Âå§­Îzœ#å*ùŠ+¯éãªU«è,‰aûöí„ßÕ³?ùm·,CF“ˆ}DâE‹ -g›>}:-[¶Ì•+ÎA22—ˆò£ÒÄ\©ŠÁŽdÂgH *Н#ÈR³Ì :´S§Nr~“&MÚµkgm ”LŸ*Am ¹;)¶œvâÄ ‰5õ£]&gÄ3†ÿæÍ›WH£†›$ÈÜÔV$k…0P8wî\(–؈IÛÓ§Oo›!§a‘#GÆR|}}Q-î"ÉH ™$I’D¨~‰8À]räÈa“°S>X1ö%Æ ¥AǬò—ú9'C† Ò ÚÏÝáN®½pŽDâ…S7ˆ_¸óÓÚNg=Αr•<#…]K^½ÁiH%S¦L¡ TÞ¡C¡ˆ#GŽüä“O8€oÛf]^:jÖ¬ e­xãC‚”)S&yÄÆ$Mš4(qêƒkß¡.fé~B³|Œ/ãåz/ë³T"ÆZˆÃĹÉùÙ²eÃ<=èòeËÌÜœ÷øTûuÖ&³LRÈíè)l÷ˆ"I,ÃŽ°&k%ˆ…Ó°#¤ŠMq,»M{qZ¢Ü±j—«|pÈâ×?Ädˆõ2÷hêçãCÐ=ºéÚ‹`éêÊ•+ÑóÓÚN×zœ#å*yFªW¯^\K%„!1ö;vÈÚõüäKYQ†,Ÿ@ù ³’é”ÎSë_@Z„‹Z³{[mè ÖmžK¹Pf’e3/D8Æm3œir¼ÔÂHløðáæ3jx ùp—fÍšY%ì*èmÑ«ü¥~2;B­9oÆ:{á:^d"¶ "ÆÑºµœUœõ8GÊUòŒ”i*>[¿÷Þ{½{÷–‰¼nª~ýúè$}”I!îk¯ @«QÔÅ VâÅ? ÀäõÒß -*¤K—ÎUV®úàÚwÜ”™Øéܹs‹-Ìx¹ÞËú$ÁښݧOŸ† â¾°ñM›6yÖÅÌÝ¡‡ØÈSí×YÛ¯¿þ -ç”çòø=I”dfquD!]¢•™ÇF¼â«Å^\-‘»@®ÄírÊQ'L˜Ð6Å;QKýEb“9‡4‡äÚ‹`é*êaÝfÎÚN×zl#å*y)™ê\N#a‰’”yö“/DC25tÇ%,šXƒÎ¾Ef}ýúuŽâ2c-ò—Ù'RãQ£F_¾| @>Th½oAïÞ½m -@n.Oh-$gΜè¡#‹—°š$äDžÝt‰¡äÜר‹«%r—+VØ´Ë)œ9b¤‘ܺsçÎ2k‡ŠBجõ3p-ü6}‘¯]{á½®¢ÛôW€J”±¶ÓYs¤\%oµ\üa…Üùý÷ß—<øÉ€WŒ¼ÅwçΓ [¿ -!4»f—ôâ}òäÉg¹;<_†]•W­o+°½Ú¿¿yuÙûÚlïá@Büš™yýS‡ÛU>˜¡­SFþÖúèúî·AWpáe=ž%½qÙæ'é»t þ`æ¨_!кlý>ÚUV®úàÚwœOPß"9ïºãH -fchží×{í:}útˆÕÏ{Kt•Â4Þ^j³=ÙaŽ9ât#N„–®zSÏS='"µ¾¶í½gS( -…B¡P( -…B¡P( -…B¡P( -…B¡P ²¼¹|Äjн{wy)Ôf‰rW„x‰øð´Ðºâu*=eÊ”jÕªåÌ™“¿²<ï³@¾Ç™[KŒ5iÒdðàÁò¶•«±˜ýB¼s‡ió³£ÁKß@ñ¼Ap‰1¢u1Ã¥K—R"_JºÂ,Qîij,žZW„{ܾ}»hÑ¢¥K—^²dɪU«>ûì3__ßgÜüâ믿¶­Ëä½øhÉÌ@Œ5*{öì²¾œ«±˜ýB¼s‡ió³£ÁKß@ñ¼Q²dI GÁ |£^V•ïÜ‹®[—(Õ%âÃåBëŠðŠÚµk׬YÓü¼ÿ~„ Ñ1ïɶßıcÇÊ–-Û°aË/x·ˆÍ'N,V¬˜ù9zôèâÅ‹[%À±ßٹö†¿ëN%Û·oŸ4i’³ÍÖú©î"‡Ña,Ünîܹa|GÅóžˆ;ö˜1cÌÒúèR½zõræÌéïïï\tݺDy@¨..ZW„Wà]Q9×o½T$”жß¡'FŒp?ܸ7û€`2Vc4Àÿ“¹ˆMãàBòÕ¿K€Û~fçëþ®;•4kÖìý÷ßoÞ¼9÷% XÛlê‡^&Mš´C‡2duÞ¨?}úô¥J•"Ä-Èú]asGÅ3¢B… -Yþ ëZLp2Y‹ƒO•*Õ‰'"GŽLˆq]tÝ,QºKć˅ÖáÕpPEëBFVx©HÎý&ˆ)ø[ùpÞË}@Œ[A¼# -`Güå^D–‡cqÝïÀì¥bÖðwÝ/)RDÖR5j”¬p+m6õsmÄ0)”úñ ò¼©Zµj¤]auGÅ3‚tþÐa]¹búôédܨÄjÑ·oßîÝ»oÙ²…<%ÀmÑõËå¡»D|¸\h]^ 6ñ°žO¦pæÌïɹß1ÅlUïÍ> V56½€%0áÃi6AdóæÍÆX\÷;;¬kø»î—ÎÛž™6›ú I²†¡Ì‡'K–Lê_»v­b沦YØÜ@ñ,@ñüÿ Y%Õ€ìXpB *Gú ‡GŸáEn‹®X–(Ý%âÃåBëŠðj88aÙ¡Éš¡¥Þ+R€c¿ bŠ,Œïå> V56@!“$Ib-tááÅX\÷;0;wX×ðwî—a»–4ß´YêǾ$ƒ“s:uꉥ~R‰Â6\&fwP< DŸ­0Kª - ²w!V@~-;û Ï·E×Í塾D|¸\h]^ çûï¿'m‘µ¾Ñ™=zÈÓy/ɹ߄ÌHOš4)Àë}@¬jl@ÊS¥J9¦y­Zµ"¿À¦ÄX\÷;0;wX×ðwî—AÈ€YI.O÷źM›¥~Ìú%Ù¶m›ˆÂ:Wã ³;(ždysIÀëÕ«å@Oäuç¢ëf‰ò€P]">\.´®ÇÀRÈv¡©S§F 0r^™[óR‘œûMS –$^îb5FƒªU«Šùøøìª` ÆXÜö;0;wX×ðwÝ©„x„qÑAB¤¬[nÚlêÇ –lÙ²Q.ÓkÖ¹2ˆ¨o8Û@Zp.ºn]¢üE.þZW¼êÀùã™m:é¥"¹î7ñ÷ßË÷û€ØÔØx¹ßë~ü´M ›6g=jû(Ï Ý@¡P( -…B¡P(ŠPÄôéÓm“x -…ÂK̘1ãYv5U(^7¤M›VÞS(!0YfG¡P<¿üò‹|L­P(‚…mÛ¶EˆÁ|P£P(<£uëÖ‘#GŽ=úo¿ý¦ÒP(‚…š5kBØ¢E‹fûBG¡P8ñøñã¸qãBÒ0™Þ½{«@ -ïqóæMYEí7ÞÐÏöЧbÍš5¾¾¾òñZ‚ ôC0…Â{L˜0X#æ#+Ó* -øøã%Á±bŲn¢¡P(<#}úô˜O¤@è¼´BáwîÜ!ÐDŽ9^¼xqãÆõññ)[¶¬ŠE¡ðû÷ï'Üh j¾¾¾˜Ï AƒT, -EP˜3g&óÅ_Ô¨Qcúôé… †ªÉBU -…Â35j%J”Õ«W§I“fݺu~~~²Z¦B¡pE¹råd“ëŽ;.X°àþýûåË—>|¸JF¡ðŒ»wï&I’dãÆ;œ={öôéÓ”è"Ì -…+®^½Ú§O9®S§Ž¬aþàÁ}cM¡x*–.]ºuëV9Nš4©<Á9qâ„ÙôV¡PXaý| AƒS§N•ãGéŠ7 -ÅSssœ(Q"³š~•£P<Mš4™8q¢ÊA¡$H O? -ïѬY³qãÆ©Š nܸÎÝj -EPhÕªÕèÑ£U -E+V¬[·n© -/ѶmÛ#F¨Š FŒÞl’«P(;v6l˜ÊA¡¢D‰òàÁ•ƒBá%ºví:xð`•ƒBøøøè‚„ -…÷èѣǀT -Epñøñãˆ#ª -ïѧOŸ¾}ûªŠàâþýûQ£FU9(Þã‹/¾èÙ³§ÊA¡.îܹ3fL•ƒBá= Ô­[7•ƒB\ܼyÓ××Wå Px¡C‡vêÔIå P×®]‹/žÊA¡ðÇo×®ÊA¡.®\¹òÖ[o© -ï1jÔ¨Ö­[«ŠàââÅ‹‰'V9(ÞcìØ±Í›7W9(ÁÅùóç“%K¦rP(¼Ç„ š6mªrP(‚‹3gÎèÖŸ -E°0eÊ”† ªŠàâĉiÒ¤Q9(ÞcúôéuëÖU9(ÁÅÑ£G3dÈ rP(¼Ç·ß~[«V-•ƒB\ݽ{÷ÅG³xñâ°GŽic_4ÛðfÍš5êÏ?ÿ ÅúCŒ™3g¶jÕê+'ÝwҳÇ¿,c2dÈÁƒŸ½žÍ›7Ç‹ÏZ’/_¾=zÈñÉ“'ñ™[·nµf1\BáÙ³gMáï¿ÿ¾páBÚC¨ÂĤðøñãß~û-ƒ.QfíÚµ ¤pêÔ©¦B¬Ï ¥ó^x§/¿üÒZ²~ýú+W®ÈñÅ‹·oßîÚ6S?w'¶J!Ç÷îÝÿ°iÓ¦ï¾ûÎÚ=%/ XÐMúuôèQk -F÷iO±bňqÖJð?F [°Eˆá—_~yÆú¹véÒ¥„0£\{æÌ~Λ7ïï¿ÿ¾yóæ?ü°|ùr×ünþüù -øì³ÏHiM!2Y´hÒøë¯¿‚*q•£×µvÜYbCš4i,X`~nܸñŸþY½zõµkלšã:ÖΖ;vŒã_ýÚãÚ*§;+V¬ H ìèçŸ~F bˆ«W¯nëããÓ¾}{ù9bĈ\¹rÙÎïÔ©Ó â?|øÐµÎiÓ¦1:!‹™3gž3gÎËŠ¿Þ#UªT –µ¤R¥Jü±Ð³ÿýïéÒ¥CáC±þ“L fkÔæÅ€A„!nÝ«W/¡gb /˜[ܸqÏ;÷ìUaÖÏ©°Ù7Þxcÿþý6,eÊ”uëÖ=z·nÝÄÑjԨѺukN;uêT@à2GñãÇÇè'Nœ6mÚÉ“'KV™]ºtɘ1#Á‘’Aƒ½óÎ;¹sçæLÒ(1Š?üßâz/+ñ 6XKðæ}•²eËŽ7εmR?þ*Z´hœ@ –Î?~|÷î]x>A°L™2ÜtË–-¶p㬠AåÏŸŸBþE¡Œ>Äãí·ß¦SÉ“';¶M-ßÿý)S¦˜Ÿ´0|ÏRÿÕ«Wñ*… nÛ¶mœ8qpÈr-²¥¿éÓ§Ï”)¥N:p 'k%ò¦H‘‚t56«…@&©³víÚ܈«³ÄUb \‰%ð±É’%Ã:\Kl ~aD¿ýö›ü¼}ûvÔ¨Qé½&î85Ç9Ö®-¡/8(´hÕªUÎ6åé5ÑÉZvr_ÃCB è®R¬’ÜHÑ A~.¹#Táúõë;vì`à $ÏßÁƒãQ÷íÛçÊ=š6mJ³¡FtÜdÄ&>z`J·nÝ"äÁ=¬q–Pn~rGùoPñíÚ¶m›”pLËM¾¶$ÜÂ)gmëÖ­C¶D|,ÝøIŽÚ°]€±6uøðáˆèÙ뇥àÈS»¹JFNÇ™ Ö‡0ƒ"ðAœ$ªbD!³åX5Îà,qJŒcôSÃ'%Î -ø.S§U—œšÔX;[båx®m°±>bw¢D‰BåñDÍš5!œÕQ²dI|$Yîˆã’ÄŸ†%Mš4 ðMx†F.Ä7kô$I’HS‰Sx’0šgi¹í'Ÿ|"Ƭ¿÷ùçŸúé§øùù„ó^Ö"þÁZˆ[Æ5ÉùÙ²eÃ:Ûfê_¶l™™[#5À¹q0tèPئ6iÒ¤]»vÖúµI”—BnGO/]º„sƒÄJ,ëÙ³'Þ޶Ж¢E‹Šx³gÏÎ tçëÇ‘.JGãåZzD .Ž› -c±xïÞ½Å%¢cÆ¢©ÓD‡råÊ8qÂYâ”ÃǺ)Á¸µ³Ä©r+W®Ä·˜Ÿx¹(Q¢ ó»jŽs¬]ÇŽ±&†r­kÈ‘é.\À{p÷ j8¸³ äà2)„aþ¢çØ‘° ,—A Rð1þKø#šÃ¾ÿþ{Wîªp-&ÃtŽèoâ£g¦ý@Öô]½pŒFñ_tÃCü;v,j#×Bª¡àyR§NÍЉªR›³6|{¤H‘ Xú[o½õÑG‰äß}÷]´:5µ­€Ç&VâQM üAžÞ>Kýxfø* -ϵd=¤í\Ë $t'V¬Xˆ‘KªU«FÊéœÄCž2dÀáó×|:‡¡~Æ‹aSr–8%†ëÆóÐ`¨ ÖÊ@;KœÚ5aÂÔÃü´ê’Ss\ÇÚÙ+ÇÃXœmp²>î‹C%]¢ýû÷_ظ¯¯¯XwÕªUÑöZ¨P¡‚¸&’<ÎêN×pžð³;:CÇ…ÀãBëׯÎÐ ™Ãɘ) Î;·hÑiq½—5»|ï½÷lÍîÓ§OÆ q>¸ øžkÛLýøX3w‡wìØšMðh¹)a{3ÁYQÝæŽ¢Û’(È`†’‰yZ[ Òœ€lŽ‘Ð)sø!®ÆKD6&OšChàZü’eÈs½zõä¿9rä ÚÚÂ7n -£èÚµ+ŽWÏ]¸„ Z݈³$(‰1Ä4› -%Õr-q>•! 1[:ºjŽm¬]["c-“¥®m€+2î„N¬Ofº¸/ÑêÙ-·,Î gHƒ‡Ã1dvzúôé´lÙ’;bÚ2s%&Ì%’滲8Ü)ÁH¸Þ›øè™)!1 ¸5j;räˆÜc÷ ÃgðBcÆŒá¿è¡Lfï0d“™›Új#ÑÀÏKП;wn¡B…$[8p \w²Yœ0%áf .É)wâúQ'"…\ËU’Cq-‘BܵðOäŒmš¼ÛˆbA’äZLÄ5ñÌÇŽ#³v–¸J *bQÄÓœ%NíB‡ (æ§U—œšãk×–X9ž³ ®¬ÿ*Oñ{¸;3IªT©":ÌèÏž={÷¿À§Á Þ~ûíQ£F‘~R‚!p¤O(×N:U¾&žÒNÒ=8cÕ3”8:s"Èž={  ×{Y‰GunkÎùØ,,]r%×¶™ú?øà™»“YnÊýýýßyçÝX…àZ›5Ê3¸ô”„é™Iî‚ó±6rܸqÖ£ñ‡èÃÖ­[Ÿ¥~„ ¿•Ì„üTžû˜k¡Ð2‡‚EŽÙFÛ°eâј@0pÔŽq¾ÉÑ7*t–xØÎ;{ôèÁ½Ä¸–XÛ4hù‰‡1NÍq޵kKÌXXÛ@ć‚»Ïž=KÔ¼ysÛ}ŸñÍ\Z Mdä/”É·ÁàB¥òÇÃÒ‰ž™ ÿýñÇm-„FNž<–.ï°yˆ¿´“-¹-TYÑ~2k(Ÿõ¦Ö\k3ÏgeÞ…Ÿ8q¢á0òÖ„­åŒš•°¡2»þ,õCÒ­a øU¼¹‡LehÈ(…0XÙ8ÃAº'ô w-9 aÑä€p†‹/:K‚’Ù+ÝÁöMZá,±ÿàãã#é˜M—\5Ç9Ö®-±q-[œ¬Oî*/N×Ìœ­ÑX™½GȘΜ9ÑpIÿIÍè܃¡!ï€Qັ2’—téÒeÏž»›?¾9šÀ§áçq¡$›ätxËܹsK0ÅÏqÞËùP ð-b¼Œ…LPÕ6S?1‘ú ÓM›6M˜0¡äË%J” ‚Ãè8ÍŒ©‡Ú¬Qžè/=%¤D \üÁöê•[ßÈ‚_Ñ~Üæ³Ôϸ#^x ¾”äÍ[s-? UƒûI<2Vø.k{ÌLÈ Ð$nÔ¹sgym+q•X¿~ý°Yò\X–Ìr;Kl€LÒ#™(#ó‡&°iŽs¬][bÆ:¨V1îœC~W¼xqÜ7Tž„cÆŒiOjæîxÉ&È»ybe•©ŒR¥JÅmp¡2ÕƒW¡©2s"ñÑ3SÂס`4ÀÐ3l÷îÝq&&ô=ŠX¸/B&YF¯d~†&!+¸ -™…y‘ÕCmHÛÌaòx{ÎáÐ-L%6¢K;¹¯•j"YäöYê'¸4kÖŒ–#ÒdQ~s-”ÌzfJ0Õÿ…¼^EØ%·"ù29¨ø‹ÌqG $ÀkUªTIž~¢ýüüpÎ4öØìÈY›y~*ï@Êk¢0%¢-åÔC¾`#º‡2o“ -àZB¹Ÿ¥þ 6Ð/d ëÔ©´^+Óqæ9ˆõ-bãb}'SÜ 7cÇΑ#‡¼0æ,q•qŸ>ø¤<ôq–8_J!M3?­ºäª9αv¶ÄÆñœmp²>ë} -Å«¨£Ö ¸ŒÂuã©ÑÖxˆ¿´ÊIfÈ× „W¯^ nm¶W7>‚×ÑŸ¥~äLË]ßè1 B69KœƒŠYXç%σµz;×6xÃú -…B¡P( -…B¡P( -…B¡P(Š0ˆ¿þú«[·nòBl»vížýÕñ‡Ú^Üz*œ/ÚéV -…Bΰ}ûödÉ’uîÜyÆ 3fÌÈš5«m¡ páÂÁZòÝu)`ݪ@ñJ&1I.˜L‰‡­²žÓV ºa"ŒãêÕ«I“&µ~ظråJÜ©|äºl¬sÉYJäÓ{9M^ã'xI%¶eTɧ8¾råÊܹså+ ÛRÀºUâ•@Ú´i#EŠ„¦™’:uêDŒ1(Nòü¶ZÐ aƒ ²~$e…ë²±Î%gq×™2e"E*X°`þüùñ«U«V?¾,nà\FuòäÉéÓ§/Uªf…Uâ­K[ [¨~†}À(0 -FV–[\Vè½÷ÞÃ@ä;ÛæÏo«…ݰ@ñ²qìØ±,ÿ…umL-[6³yŠA-ë\r–¸#¾ííÛ·¯ÄÙrÔuUØLLžòT«VmôèÑ–¥€­ Э -TÃ>~üñGØaÂ,É[²dÉ1cÆÈ—éÎÍ žßV ºaëÊŠ ¸Á¡ÿÂöµõ›o¾)kq[õÚÔ²±¶%g׎@ùI”p²†!1EVLu]F‚¿™x¦Y—6Э -T{_ ÎÖ¿4œü]žS€ -DácÎÍ žÛV ºa놊 ü¶ÿa£¨¨¬Ù+¸|ù2>’ïyÙØ€—œ•cÔxüøñð!öX¥l9ê\F?ŒÂ‹7FÍpàüñ‡Y -Ø -ݪ ÔW~S<ÎV¾|y”ŸR¡B”ŠÐ°wï^ÈŒÌ*;7/x~[-膪®/¨Y…ÿB¢7ÀÇÂ=dñ\™ÑxÚ²±ÿ.9‹ï5»Òƒ&Mš„¯&4Ú».£jÝ8rÏž=²D­Y -Ø -ݪÀu«EXãld -h2¡m$ÍWL™7ožëæÏo«ݰ@Õ5ìãèÑ£h5ÚáÇvP<áWž—5KÎbk\›3gN2ëúõësJèçç'YƒsUëÆ‘„6™â6K[¦[¨r†}ÎFV"oá]±2´Q’w\7/xN[-膮( VhÛÉ“'m±—ËÆBÈÉÙ­ß ±æ)†—Ë¨š¥€½nU #˜3gNþüùå˜Ð#.BŽOjó‚ç´Õ‚nX ¯ (Š×®›¼ø­tÃ…B¡P( -…B¡P( -…B¡P( -…B¡P(Š0Žÿ')ö9endstream -endobj -97 0 obj -<< -/Filter /FlateDecode -/Length 1790 ->> -stream -xœ­XKÛ6¾ûWèÖÝ6Rô %1Hz(Ú[hƒø–ö µµ¶P[ÚHr¶ù÷ÎpHêáMŠ‹…ùÎ çùQ7IÃ_"± -ŠREy.ƒÝyøÿÙR‘GB0^Ù eGež¡Çá‡íæåÛ2P‘ʳ`û°LfA‘'QQÛýæCp³=Ö·A˜e"¸éoÑžÂÏq"pÞÖg³ÔÞiÜŒHŸÍèOÕØà¼k‡cóˆÃ9?ÐNÏ'G'tÄ­¾"ÞŸèÇðì-ø©N|z×µ;CArF+¨r:á¼iÈéÎCwÂ…SG"ŸšöÀ´{ºIuè«stülÙü´µ¶6f”¹ŠÊ¬Ð†þh÷br,€‘•R‚ÖËRO2Þ~ywN‚»Í;ø³4lCïJYDe™Þé;Š4…÷{T¼›Î.ŽŽ’‰ pÞŒu_è¤+×»†Òë³1åO>ëÖ -j™‰×%<I£‚ü¡tjÒŽ«œõãÅ4är£É!Á{ÎðUë:-*û6Öcg`ß i·×+ˆ-²ÂÖ«¦¿]+k©ˆRáJ`c¡Ç´&Ôý¢K’ô{2Äj¬¨¥²(V¹¯•®£©ÄÖUœ5ÉcÀ¦(Ê()Wᤡ b‘D,Àˆ¡°u¸XŠSÐâ3ùœ8C1ç]J´$ŸJ»û7Ö¾[&=7Τ„ÐÝT*§À8÷©SEþjèR‘ABP䞣~4 ’ª`í€ÐÿjÞ­Ïû‰ùI§ç\ºMyXA¿Ø$¨“ I¼|Ð[ÝÉnùYoI­ß:>51{`Ù•ÍÃàÎ/ æ4‘Q–¦W³`~UâBšé±J<Àœ^ÌÛ+€9³(ËùÉókó—{f¤¹}à •æéÄ 8×½î¹Ò^`üäsË[,›²+ì$º: LêÁÜ££—ÞáÆÚ@ƒºí›áÑÄ5·^SÌê0‰zooÜ2/h½¥¿ü6{¦x¯?Ø…"s PãCcW½]îkxaÖ{ž~2ÇsÐFš±š&:+Âu#Çn9Z-v];µ@?6§,Só–¶d‹»3U,Ÿ+m¼¾ªÁCX(¶v˜æ:º²ü~°èÈ艭բµŠw¯~˜å‚Å`W»3C‘®µº‚ìgñÕo”{”¹Æµƒß?-oôõ…ù¯¿Œ …ˆ"q=Õ¦ù¼l¥±þ”RI.#—T¦>YìÁàŽ(ƒ‚õã8J” -Î¥™™œ6ïýjÅÌB–«É£ ®^*-±ˆdÌ/üž2ãð:Xÿý«W×õ…R Œäÿ£/3{V_hÚpVÎôÝA ºþóê³€`ãcÞ ÛLï} CÓœ`è¼}cKÒŽóHôæ7ÏÆnZ&³—ý®z¬î)~NéÙ u)LiRP·0Ï D—ú)¹„ÓŸÎ*Ã*ÓÉÀº¦ødÛáh♲U/Þ[h^µ³ìMp&4‘ÏŸ\vi9Ä®|wè‹!x–™…øjy`úöh­çóú³C&¢-(ép¨WòNf‘‚bÿå¼K -‘ð+ô7´â¿Å13 =n‹8N - €‰È" Ä_ÇyTÄÂűq…¢œõ4Vyµ>Uëýs.ñëøø½Õa¥Å•¸ë Ï>xäÐ ÷Ð*?‘d#rÏl‘¶£ îKßÕ7…*£T>ÿ¦p$s¸–*('ðª4dZ¹”Å»—ÂÞmþwÊ/ÿendstream -endobj -98 0 obj -<< -/Type /Page -/Annots [ 99 0 R ] -/Resources 100 0 R -/MediaBox [ 0 0 595.276 841.89 ] -/Parent 2 0 R -/Contents 101 0 R ->> -endobj -99 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 0 1 1 ] -/Rect [ 174.61 639.008 215.925 650.133 ] -/Subtype /Link -/A << -/Type /Action -/S /URI -/URI (http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/lwg-active.html#299) ->> ->> -endobj -100 0 obj -<< -/Font << -/F8 42 0 R -/F40 50 0 R -/F39 46 0 R -/F38 38 0 R -/F43 67 0 R ->> -/ProcSet [ /PDF /Text ] ->> -endobj -101 0 obj -<< -/Filter /FlateDecode -/Length 4041 ->> -stream -xœÍ[mo¹þî_±Ÿzvñ–oû’¶¸Á]›¢(îR_s@rÖÒÚÞV^9Ò:>ÿû‡’»¢d%VqAx—ä‡ÃyyfH}<áYÿxV*¦ò:+«š…Îæ·'yv ÿÿêG(U0¥KxNtδÈYUÙ,¢ð—‹“o¨²šÕ…Ì.®NhŽ‚³²Ì.'ï³Óy3´gÙŒg§×«õP:}„W)ev:4×ø¨²Ó‡ìêæg™(³Óò!ç -{†%ò’zšÛž˜¥ÐÅæîÖ+÷·³Œàà¾} qÝЮ›‡þ±uŒTÙé'ûÇ­Àòï8i–Ñ:ØYökvñ÷®X­ôsVkíDðî,«”%"J<›ÙðÚûÕ@IJ›¼³Kl©&Ú‘«À²í ë·¤î-­;l€‘ŽíÖSX]á,`ÑÅ ³L4CØ ³3ý5Q¾´ýDoATV}’˜©™Ï7~öùªŸ·wÃÆl¨¨ -3ºk¬ ‡hF\ƒ#2oî7­øl$ñÂIü!l›ÌÍ«û%òY×^ÞæÑ¨W¤Gy¼Òƒ£áᑚ‡•i%<¬nB VŒó ðgé¿ììLWíÚÓŠt6÷úÕ]ߨ9?ÓX~8vhpðµoˆ?Z-­žÍÜ—ƒ[Ȳõ ¡ê¯FZ ŠÍjøk™ïZ¿Š*^Óµ_BÓ/hÕ‘è¼ò¹—o6$¤>8+óú_ÿn¶æ¡'Z¶¡‰E\:kÁíÐ:ËÈvE £ÒSMºi‡4|ŸZ=ïý«åó²ìC³~¤®°¿¤=Î`o·ñ$6NG@E,Ëe¼x´Ç-­M¶ïÝè¡5Fmz^’ˆ‰z“²ÞÑ4ÇþZ{Uï6wÖѧ7ÎA\ÓËf¾·¯+ô‘+w¦‹cæÍ]Pù ¤½¢80º|dõ=×ë¶I4OCmߺÕÚ`,`±!”Ò:ŸŒ-8:[°WïB³b P|^oB8&ÿëæºììæF1[·7bŸ‰ -á##ĉÂÅžûeˆMBN\Ö5 -:0l;FºMg7Ïİ·îí¾š† Ì„ÿá¥`Z•ÞxWwÖ¿ÿ5eèZ€WÎ -Õ8!]Xå Üvëv>”¬HWM„¾°+ÖYó¾ñFEK³íÑþ5Û˜Z„V¬È‹1“Æ)L]‚Ý:Šâ?ܤÔ; ÄqÔºî×=½‘øÈBãM$Hq.€ 8_·¼Û~žt³ªD¿McÿˆáÓN -ŒÞø¹>ÞnÓÁGWÌèóTl/vN>Ùz“ÿÍAIçž[o/v••Çn§ @L{Ý´žÓt9sXœf›Á£=rþYpvë¾nú€ƒš€uz4[ÈÜ4ne9 Zí|ŒØ·À(UÂá Kû-?Cï–FŸ;MÞXo†Q`´Èá´öã=­& ç‘qò±â"~ÚÇvêÉ›u£F>ÂHI?Žxµ†©nWÎ8í’ÚáàÓÛ¶Y¸Ø` v¯ééuŠ€ã‘ÐñPmTuy¤k:ÞÄ›dÔ®0¾ïMcÊ榉bdnÞo¶-¤K1qµ ò…-xÑÆaÜv’&™gˉŽGê§;•éÝ ]m£¤µLUn+îMȲŽüJy©ÑJ0Á+›l›Žõµ{x¥Ý4z Ÿ¦ÝSŠàcÑŽUð˜~›)a ¨ÇLM*4f+S:–•WIÿV1.ù¡¡­`9ìy>/f5«>²»Á6ý&Ù¤ÍvC@ðˆ›hÿnv†@fûœ}šY`UÓr€Õû.BÈS˜ aabé3‘+V*9Ñ»éÏs¦ ž¢b¤IÏÊ/ˆØ,¢¶•`ð\³l¨9¦i‚¡X^„Íù0JE¹v&kÞ’ë_în©+án?œaµ‡W”µH®hï!*3–É®’vÌÓæþn”¬BÁ2%Øã|G”w¦²ÃŠW÷¾åixÿLC2\ƒ•Tò‰m9æåÈs…cåTÞ¸ŒýÃfžYg` R† ðzRø¥¸ü#–Ê`ZLïŒ4¬(Mp¿8ËŒßlF´Ü¤H ÒÌŠS.z¾pPÁÕDœKôphE¯ï­ùÚQ—Ì}„Ù§Üo°ì¸6¿€±c ò’ûè\ˆŒ„n¼<@ªªžH ÷oX£Æ×RÓ¹óÖâÓöÚ-«WÔø~éBÑ%sŽ8—Q(W- ÎØjexLº½-–}—=Ö £íB/¼$Ⱦ$(ø2íË™Æ/)vJ¦”;a›Bx¶B­È±™LÉwp` -Ì|³‹•â€äùÕfhâr‘é^)€¦žþ'v!²• ˜á(EH%ücUï—–õÁnDzÉÆ „øö0™'Ci̓Þ ‹W¯ÂNLÉ*€y¥3 ËÕ?+œ±YDm+œ¨2guifTá``X7ݰùÓ/ß½zµ7¯â¹IË'$9Ó9‡ù§žð"E±bZ‹§DÊs–Cä9P¦¼0+”™†ÙMöÿ¼íˆÍ"jÛ!º(˜ÈÍŒü®Þê0!TÍ*PÝ£pJÄör*´fœ×SNw X»ñnÓyÏ"„5S!Cÿ´k¿ùØiØ#"¢½å4lÍÉ;¨p麮èiWÍ1YM,2å¤jŽ|K†±™,$ÂŽ,½ª‹à<0 hå(DQ¸KŬ5f‡Ëv¼žŽL˜L TÍ—KQF|²!êÞ¥¸Ã + Øs ÛÍ+È*Ä~·[3©Cˆˆ³bÏÑ–ËI­Œý±¶ÔˆY\U¦ÂùÆH3V¨‚Vaj˜³(va!ð,*ŠÄÝ•˜DuÖÚ%!.Ù×n…ËÁ%GÆ‘Ô8#.ŒÃÑ—¸LåjA8¥Ó+ëVñÞYD—`¡¬˜ŠÎO’6SÊ8bâº'‡~Qf†³žo¢ž¥—Lt,Œï¯ ¦5©Ûchc·xú~>tãÒ¿]¸/èÛý°ë[zUœp@ûÛ¸`àRôzׄaø>ÞÞnAÛn³|\·[E×ú" ˆä¨ÜÒ -ùÊieƒª)·ÞÛuó Kc“Rî°u?Žgjžô¾UxÅŽàH›>ì6„ƒÑÙo篌¤©+ÞÚ*çDsüQ„›lŠòvÛO ¢_à°£pë®D(H¤¥¨‰¶J—Œãí|BóØ=5~–ûäÆOB½[h¸}'éãÐT¤¦3eÊæ>.Ùв#Ñ;E/ÊâãR@%ã¸y>‚}°þIVèŸñ§T…3]®ò9׬ÿ°¤`k QŽwg'|ôÍhËÁï/bߘI¹§: %@SÀ;ˆî9;¡t)¿Èf泃ªA_»Jå`íz¯Jå5–8­N}r¯Kɳ“¿Ùò-¼›—Ô«,šä9<¹½L ^2 mÌ5éø¸)ѱ šaõEoß0€$HÕÇZ„£¶w ’ƒä«©äÿ¹Úo\·€^ݰGì^çÃñHç7 -ùmÍ÷åK“…àø]*e»tº0±¬ŠLÖ%*]hÝyBVQ@d‘µf…>H4{2OGlQÛÎ .ÁÀ¦Ì]ì´ý£0F–?ákd÷öžç˜­ó>º‡7(¶Eµ›ÑýL?À¡ÖOøî.£}´³Yî@s{ ZÂÇE2_‹‡9–ƒ™T.öz˜ÒTÿépçE³Ç&±£Å„·*a#Þ^¯úñ)ñò¶è„Z:—Àðx¾'Ìëkä0Vg\ƒkâÉ3T™kV™o´Àtèu&8Â8ÇL© -ƒ–¢»~Éäu*Œé<š^´Þ–©¤¹)uì¸ÀÀõF“¹£/öu™œ_‚WÏCÖ™vŸ^L(l]JA5Œ‘e 3qo‡l ¦À»c”.G×7ÔîÅ]:ŸO‡ö’ÙÕw¢x¢ö]ƒ Cd˜V ;+8«Ê`,ïÜÍÁN)øžSŠäùD aJ> -endobj -103 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 268.455 652.676 347.121 664.631 ] -/Subtype /Link -/A << -/S /GoTo -/D (readable-iterator) ->> ->> -endobj -104 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 367.468 652.676 443.81 664.631 ] -/Subtype /Link -/A << -/S /GoTo -/D (writable-iterator) ->> ->> -endobj -105 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 125.038 473.906 201.324 484.754 ] -/Subtype /Link -/A << -/S /GoTo -/D (writable-iterator) ->> ->> -endobj -106 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 479.881 473.906 521.862 484.754 ] -/Subtype /Link -/A << -/S /GoTo -/D (readable-iterator) ->> ->> -endobj -107 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 73.413 461.951 108.947 472.799 ] -/Subtype /Link -/A << -/S /GoTo -/D (readable-iterator) ->> ->> -endobj -108 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 122.844 237.147 198.582 247.995 ] -/Subtype /Link -/A << -/S /GoTo -/D (writable-iterator) ->> ->> -endobj -109 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 187.928 225.192 266.771 236.04 ] -/Subtype /Link -/A << -/S /GoTo -/D (readable-iterator) ->> ->> -endobj -110 0 obj -<< -/Font << -/F38 38 0 R -/F8 42 0 R -/F40 50 0 R -/F43 67 0 R ->> -/ProcSet [ /PDF /Text ] ->> -endobj -111 0 obj -<< -/Filter /FlateDecode -/Length 3921 ->> -stream -xœÝÛnÛFöÝ_Á§ÂNÊéÜg˜Ý. ºEŠb±M l¤Œ¬8*dI‘h'Ùýù=sã GCZ¶T¤[©)rtæÌ¹ß¨g¤Âð©G7•Ò ’RT³›3\]ÿïûœKÄ…‚ëÂÃZPŒ´”U@øûåÙ7ÿ`ºjP#Yuùî,l" Rªº¼:{]ÿüñ¢b¬:o7›öíò¢ªIu>‡?LÃÍ—Ý|Ûvëí.Üx½\¸%oÑnðÅ9r÷ÝÜ]l/­sÿe¸úõ¢úµºü0J°T#Öx\žÃWÆÕùlÙî˜]¸µÞ†«·ÞíbÙÙ‹Úo¼‚¿¼iªs¸Muuþy7¨²§ñ;s·&„" ýÜÞ¿”ð#QBû57k`_Í—=bÝûd¿+8”õß5t6x¹.*a. µ=±lrþÒ~Šûç9ò>NZ#,šîl½šy’o€€ØâÝ׿’âØ›í•]tµpÄ[¬û'ݺL',*èƒèô6RÞ²Ænµº;½Xo<‹<¬š56i`5AÌ‹õj×moí·gTç`¼™³1#–þîòÝzéh -G1û4ç†×aGè“£Ôv„Ì’ÁKcÈ´‡Ë;`‡„;òâ*ÀjWî’@ÎfxðY—# ðv]ÛÍ{(;¿ô¦]9št‹Ùyº|wÙ+xÄNJ(D -h÷ ѯðì -´è‡3 Z¤«p-¸9ã…4þóòì糟õ€î¹3¾¹ý@îʯ©ýQj…"ª)Z*‚Ò = -R`ÖJ¶ÊY)­T0R¯æn©šßx»46üêz{öÆ©†Ó«Fµõ*,ëÜ­uøüÂIÙÆû øÛFjšù/.Û7û\„(‹Iq e9V@Z¸p_û3‰l(‚œÙ€góã„ä»O–öÐnçyzdÌ6ôX/B რÚ¹+̈>˜¹ïÂ×CÀƒc4spÞ·>ˆò÷ Déuù4Dùòº<ÐA¬X‰-g1‚ @ÖÍË•×ÅT€B £ûèøŸkÌŸ•bi - ‘äýêçÖá´;„9æ³—€Ö™BÔÅ.\µaMš±„{ëwa™ËÞ\ -• $›¤?M9Íƒíµ¿x•$Ÿau,ÏÉ•Cº={¥9‘Åðå~:YÐIÈŒ X”²Y~ÖL¡ÈxƒÍ Eçïm)5X?~ }ÂêÉÍ3ˆnó_T&°Ü.ºÖ¥½Ë”4Û2=¸ñÍ„MÒ#¬™B‰sê©2”öÎ]A—»u"Œ>ËS ®³,/Qà-èß#¢"M¦Ô ZÁ#굄¸2B!§6vKô€QqwȼÙ¯ùïÜåf›U¯Ñ%àœTÅ/ÆBHOÕˆ£P*àoÈx~ƒ-Mn²¼MŠ2~³mԲºRMÈ=|ifÙÃrŸ]b 7Ôõv7U³Ñ¡hs9Rÿ ’*ÖW~¼ƒ3ôÜ¡6o;¬à!D‘9Å‚µ<¾ºÚ…k—pÛË­KmŸ$‚ÖGÆå‘–T°Ô4ºÏÛu¤;p«þë}=#xbíÏiž¦Òœ†`éuÅy½q -ý¤(D : -Q¡Æåð|›ßh#ÞÍ·sK;¯ŽR"´1œ†u•Y¥ýÂyš&§)™úÓhù—·õ©6…͉âWéà)_–Óc-þû¿’&ãÁ‘Ùƒj4dÀ[¿õtá$,®ãêü$¼é² ¶IgMB~ä§ušQ2zhh|YŠoVK K&°§q„b™”p“€+O—$ÕW<ÿöÛ¾Œ^b㈫È›‰#Mks¹^-?¢¸¬¬Ì¢Â#ÿŸ\ˆ𙟹ô½öö¦¿³6ɪI,›Ïz®xÁÙqiŒÔÇÚè“âÙA`S’™ú†q©ó#RnJÎìdRÎ5FZ©Ã¤<,žŸ Þ}ÅSo±±Jäõ¶ñº!Á -ÖU\rpÍŤÚ/©“5{ - »Q0MaɃd]6ì1²®püÚâfãG5ÂTFq3Æ&ú~±Vºä˜’òêðbmëe±¶ƒ #bÍ‘`â±®öK”ƒ*"…pEÓ?¨"æOÂ3köLòvçþÌý¤– ó ³ù&ŽL¼öÕÄ~¬P9DÝ ¾“oÓ.™{i;\ „ǘ¢óU5O.|õËÔ –kWšúøu‘ààþ®ïÓv©2ÎsWÍíyž5e,ªyan)ȽAQ‚@ìBdv«A¼‰Z”œ! ×è3¸ÎbY‚ôö¹³ƒHZ³ÌÉ3ý·T…g]OWèã¼X–,Ž”‰AE¼H~1ˆgËT„˜Ç“•+û âî!D¼q£f.|îÜXRjµÎ 'Eã@’É3_5e‡SB%Ô)h‰uÔˆ‘Œ3ÒËá"Nìê®»zöl<¥¤"XÐDÓòÅGŽ&Xu¶Ÿ_sDS™æ¯ä} voNɨÉÝùIð °¦ðQ@Ôøâ!ž#¥É08Q,9Z‘º’b>9–‘µöÌŒ¹µIÅ5îÆ}ß¾`çmƒ¢©€ø—M‹åPºG£éwr`|æW³´<þ°èE!ß ó†1Îaq|ÐŽI‡éÂ.™žÖép4•$޶·¬ÿ±Wa8ÚùÇ®¶ãöÉC¨ Ð÷øG°;‘1ùd´Ûq¤3hÚì‰É2LpMZà -oBk -ùàþ­A˜³²Ü#48¹¡hªD?–ž´W.Œ^øãu¤ÜÈd´ ¹Ï ¨4>m÷y¾ó|]\¯Ê=$?ã<¢O&‘_x*mœÿT.ܺz׿u‹O}=àºzËzÙV‹Uœªþ4,õÇã°½ñˆË†£ÕéTµ Ÿ·ó]/«¹EŒ@…Éê‹0¤äâQ ß>¸YÌv£!ÿšc‘ÉÚœ%’‰†>lþ¨ð“Ïú£€Ï1yºØ7ÑIpCÆ-©ÞÕì[Æ“Ž[3«oLZƒN€6´aà?ÉJ¾¦zdøš 88«Ú5µü$ ÈÔÚ^j ÿÕ˜OJ Qš„Χ¥ü§Ã:ŸÂì]%{5èé M¢L%…1Çù˜ÉkÑÛt¢Cp“§à ¶bËá)@OB[sjè:ˆü‰ðMEþ°÷ ~'‘?z@£yL/Çä#¥eÅ00‰…×çž>-e5^´{X'‘ìq̨€@‘æ¨ýRèhö{Ô¢¼ŽãÆMû -DmˆÛWÛýâÞWEZö"{Œÿ0{2#mÆp£¦D–6I8·OŸŽŠlì܈b+“? ÇvêÅÑpþŒ¾™* á›d;üeëO&ÙýiÙþ¥´ÝN;Ös]˜zŸäº™—U¡Â1^z3¥óŽ•Ò¾"säkAX@+Œ™Ze“aØmÛ;Û°õ·¤ÄUÓxúcfɼCÍi©÷êÓk_îºsæÛ˜8›˜ SÂF«8KÚ>ÁJKƃ‚#БVæeANš}*8ZXu¬Pp$¶âG…—NrÞT8ÎO„¡6¢† UðÅöz<Ì9‰À<ÂåîË[£ÁL–DßO†˜b:ÖÈ#£!}=äžú—ʺhÔŽ’—ì3­í°ñ}ƒ!vq¬Þ À› ±(ôªi”Ã`™÷Èýš)äÌÈ¡2Ãî &92ø9=·oL`÷æâ/#oèdn"òÁoõÁWû‚Üð 1jÕÀ>%ËØX\ÜGˆì‹xIDò®ÛhN;‘„2>}ëâ¹ÍÛŸìqçM<†()½%QìV5T‚ç>–)IŠÍ )b‡WLgul8 ü»wle´•³'ÞÚÌÂÒPmß–»G ýê:Y¾§…ÄlrÅ{ïm1>5£BAdã†ù<–_3…—y72Ãëà)•(Œ—¡ÿycsDd±4ŸJ~’ÄÏ_–5ÐU»G4°A‚¨tQA f pÅö™ñDd1ÌÏ‹ÕuÞ1ó?Ðîú¢od&I_O»Ž‘„aÓ8§úk×ý mZ?ÁŸtÑŠïÀÜPc”¹†Ú.|pum -GxëYºhöæ˜!)îšä|¼ƒf‘‰òXh£ Œ¸Žœ³Ìpc ʲÁ*˜;˜¹óòÞíˆ&’AªbÍ¢Õ z,“^‘ù<Ö+¢4¾\ž¾!Ó¿…äÃñ#”¥m¢Ðòo¦@£u>añ¨ßåaÉüËô¯ó¤ÝÞÒõø«ÑˆºžÂžy -AX\²gœa_+ò+ܹT¡6æôk³ŸÎþ¦h -endstream -endobj -112 0 obj -<< -/Type /Page -/Parent 2 0 R -/Resources 113 0 R -/MediaBox [ 0 0 595.276 841.89 ] -/Contents 114 0 R ->> -endobj -113 0 obj -<< -/Font << -/F38 38 0 R -/F40 50 0 R -/F8 42 0 R -/F43 67 0 R -/F14 72 0 R ->> -/ProcSet [ /PDF /Text ] ->> -endobj -114 0 obj -<< -/Filter /FlateDecode -/Length 3477 ->> -stream -xœÝ\Kã6¾÷¯p.7zň/‘J6 l^‹Íaw2éC€Lj[=cÀm÷ÈêLòï·øIS{¬Þ ‚`вD‘ÅbÕǪú¨¼»Â‹þà Á+ë…5ª*¾X=\•‹7ðï_¾cb\ÀuæaážX"J±jóîê—ůðt -¸*­åâ=\—×õâኆ8©íïíÕOW?~Ô;N†Ǩæ|bpýZ ™+Û>î§°º(¯µêîëÛ«Ï¿§rQ£º¢‹Ûû+ÉPUò…¨Üá‹Û5Œ·üi³{³½1ËþPIË—× JËæppwþÝ·Ý5Œ³lzÓvß¹G¯ÚwO›®}hwæ­Þ¿ôziÚnvîN³^ol›½¿Ûïõƒav+3Lû`Er6wÛÖ·¦Ùék×ô;ýóÝS³Ý˜¦½éï÷Â7û‡Ç¦kît;§‡×××°·?\}wë5Ìk‰8[ú½d¹”M`0¹B½6ÕÛsZåHVgXžn_Z¡c>iy¼D&ÖòÌÚüþصÊΔIØÕÜkŸ‰\~ä™]w“BZ"Y‹DêW­5º'cƒÞŠo­e=ªD{S: Ê)ªæšƒélrTJT³dÿõš V΂@ãŠY@ªlë¦÷«ÒlmË´,„´óSÛzu8ž=Iëz¶ù»î&5À(`!‰ -þy8ØÉ³û.L{ùÒ"Paž|nÁpolÔ.þ 4jˆU¶Úïå&ŒÙAɆ³K®h$ â)êA„fçY¸ÎŠ ·#18–äu"aß5¿µÝ¡Ùþýç|ñEÿÇc¦àQ`˜þ<¹I¢Î -DÂ~“¢@¹~…e9êûià J‰¹Ér‰¬£Ò–˜ÚiNXÛWtvœ„U€°*¤†¦> ÐÕÌ#ÑTe -ã™d³M 'Áž`¿¥ó6“OZÁ†ËçÑu6)"eaÆS›7£È>‹Ï”Å~ÚžÈü)h¡$'U¶ÄeÛT%†ôÚ¹õ÷× P¥N0Á•ßÛz~·Š•ê¹-£Ãc¬@Å‹Q -ÒR6¡ÌÔÞUC×ìs{»¹Cæê~ß½7=Ãø Ýó›ùFoº³µw´™æ×\Ð] -§vå=- t¾Ú: -ƒx’€è¨LÕo7æúÂò¦º§@ðW1hóùyY!® È–wò¥Œ2¨&<(ŠCu½n·^¢!7wƒÐá}Ž„æ¾XP¡JÝûæÁ-ÇÁJ¢×R=²·ŽK§[„“X™ä…`$à²BDWÐxôÕO-úæ^ÿþ›ú]3]º÷µp5ÌÚÐ0Lî ç· ™NÉéY*µ’µýÆ>ž -†~ádw -*!À -—‡u!Û¤É$O€!Ëý½»ú¶½ož¬Å¸{°yúÎÜ]Y»5S¶lÓ‰Ÿö:X[ŵI·^Š—0b­ -6æu?°ó¶°zãf{å¸ã€ ¶(©¥²ýObÇûÓÑ ÷].¬ˆ"ŒÀ²†å¸(s"g•G>y;U -xÒN!´xýcè^&ƒ¼;ä¢"‰ínRhªÀBb©_YLê?‚î…½ ðÓ™fẛœ…Úûê²Jf‘%<ÿ³ï3B{ßGèÐðÿ,€Ö˹ØVWˆV“lWª(ÙʘJÓÓ—ã†ôz àì|JH)›¬X*e†¢t7pÞ|SáBë-!Æ“"‘m·Â QöNŠ›{Ê“fµ ÈÆÏõY »ã[·;†%uýP˜ê®ne#ñ¾yŠQ¨T’‹$HÚ6¾0ïkþOá”2‘óÃy”ÿ)¸á¼…CV•¨¬'ËóL -ÈÓÜ"äÏ8ÿz»¨çpB:瀱x“8tƒNHç\0–®;.œrFkh †ãx9…”¯<6Ÿ‘RDX¸K-–ëãÄÈþ¸RTH”©C¶.W1òåN° -Ò²ÍÃãvv~ÈÎDÅ;õ@ØkKÔeä°mb9nnrIwýy–ý/èû€q’N’Œc}¦÷TÒ€± :iô6JÄö]³éš1XoîýY’#¼¢¤B&7‹¸®³Iq S'èR…ްM‡õ™M“õ–0ÄÓ@Z&›õ›­5”æL².1´o:“þª»®þ§›?Ú’]ëžvQ-ÌWP|Õ¨©‘5ÎjWÔѵýÛ`ÙæÐ7¦Ü¦oÞÅE+Ùûˆ«U#Cki |l|0üÜqL·¹Ì²X ˆØÀÿÿ -h5k ?âAA'V˜ÃV(N+Ø™ sÕÐÛ8XEžÄpZç ¦?Gf“j3‘¬ 8¥¢BO%8ïuù=s‚ŽÔ%¨R‘0ø4³‡eÛYôv Ë5×q +Õ!b’.L†©r m_“R&Q‰Sùr¢¢Y,å#pèÓL˜"üÀÁ„ ÷G!VÇÂ)ùëÍzÅÅžš0gøG*Â8¨GÜߨ7“¬ßѵ«ðëÔG4Æq:àþ þCøð|OøÈ+LÑšÀ Ë;Kô8®Oßì}öïõYÂpšiH– ¬c|Ÿ–NÓª¢/Їw¿ÞøÚ½],¹×š?+KŒìm£ŠÔô\ © ±„ýg -8BR‰p5d6YBPÏ- ‰ö›/­çfmãKåЀ¥D$8>¦h>¯ЀÚÐê8K†- ¨¯¾¿^({ØeCۢݚFŠêŽv» ªI–ßkŒN ¿Gxí3-èµ§ŒR{z@Cí醾µ‰Å6TоŒ2ê,¡§›9ñpJèeãÐ ¿·š õ(%§nULHÄÔÉü3À7÷γ±%Rz^Ñ,ˆ[¶„ªã&|ÇÏ&'0<ÔðíÓNq<Á§JstÁ H=‰3!~ÿcê8'ˆA‚¨ø"–EòÆâŒÿŒoÖ„ÔÊp6i{  Q»“^ç}˜Éõ rÑW ¦·I™ $ŽÀ1ú¢ï2F qžI¸Þ&'A%F%Ä×ñ$Òo3›Øë-ÅC§»Ú©Ÿ`BÀI1i¢®·É‰² -va<≎}Ys}if yA™~;5|—Ùæ‹K¯ªqŒ˜iÞŸDHŠ*yFEÕ¶Ã+å €¶FA¤ÊÀ]V]Ù.-øÎ.mÀ‚qÙÅê–X¶ì×–ÎÃç ”&ÝÿTâ’þÏ0ô0ÜJÖÉ ¾¶×¥Çt”W©ý¶ý}sèGø -iŽœº¸,e¶QÂ=­LÈûVU¥ôñ´BªÌHÚ`6Œ”¡‘nn²Ã3Œ$Î"%ªk’Huêž°o`<=mÔ¬"¾‰Pña¾)÷dž^Ð ÂZY§Šmî¶9BxºusóZy¢ŠŠRµfÓ9€bdsùA0h)øútðôBÁ^%“¯Ñ†!‹"O V_Ä=<Ú#…“”ìñµyñҀ©Lí3')dMNZ€›ø‹Œ¾wN@]ÇÝç6ŸY`1Ú|N:Jö ›¯‘gl>¶ýÈæƒ9,a=Y!'%…¶ÔYCQŒï>Ao—ç·ŸT:y¼ýDÂ=Ëwu+u -Ò™âÔ7Óì} ›Î³ÀG…$ÉüïG*;ú³:üɨþáÑ;œ0wZ*=ðñG]Û?u» ×/½,¡ÜE(Œ{7W˜¶ûó<:U_ `LÏ òk3Oøz3E”j(9ú_d9­¥>M˜óü,Õ¶0Ê”„ô\Ñ}COn°¯þ+êºendstream -endobj -115 0 obj -<< -/Type /Page -/Annots [ 116 0 R 117 0 R 118 0 R 119 0 R ] -/Resources 120 0 R -/MediaBox [ 0 0 595.276 841.89 ] -/Parent 2 0 R -/Contents 121 0 R ->> -endobj -116 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 500.994 340.801 542.975 351.649 ] -/Subtype /Link -/A << -/S /GoTo -/D (readable-iterator) ->> ->> -endobj -117 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 456.155 330.783 491.688 339.584 ] -/Subtype /Link -/A << -/S /GoTo -/D (readable-iterator) ->> ->> -endobj -118 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 503.318 316.492 542.975 327.341 ] -/Subtype /Link -/A << -/S /GoTo -/D (writable-iterator) ->> ->> -endobj -119 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 1 0 0 ] -/Rect [ 456.155 306.474 491.688 315.275 ] -/Subtype /Link -/A << -/S /GoTo -/D (writable-iterator) ->> ->> -endobj -120 0 obj -<< -/Font << -/F38 38 0 R -/F40 50 0 R -/F8 42 0 R -/F43 67 0 R -/F14 72 0 R ->> -/ProcSet [ /PDF /Text ] ->> -endobj -121 0 obj -<< -/Filter /FlateDecode -/Length 3418 ->> -stream -xœÝ\[s·~ׯ`_:RE·ÅÂuÜIÚ$£¼Ô±=Sw¬<ð&›ŠtHÚNþ}î ,¢Äµåñd2^-±ßÁÁùpppùý OjøOC¬–ÑJÔ4|2¿9«'oàÿŸ} Æĸ€çÌ•ûµÂ-¢«2¿Ÿ½žü¿. ä/g5¢²|„ça)'7gL´ˆanÿ^Ÿ½8ûõ^ß8 5TŽ‘ä¼P¹þ¬AæÉ–åT¶-*Á%¢B*q?¼<ûö'ÚN$’ ¼¼>kjj> 7|òrõÿ°Z¬.Åä|w‚ΗóƒùsµÝL×ðH[69y1‘+2½˜P29ÿ`þYv¿ÞÛOèäüÒ¼?,íGVìv§ À‡ÏÍ‹åïïW»åÍrcÄöNÀÕ¹¶qo¦‹Åê`_nýÛÃÖ¡ü P -UÅG¥Êï®S Á¾Ûp^ÑKÀ;=lwW`‹—¿œýøÒ72ç1ÒL:m|ŠÉT¿¨1t?õYIÚ§ì}„"Yêù‰&¦øPߣÕ¢ØõxLl×ûQ·ýïv˽1CÇ´iÛÂnØ$Ôq`'¬„˜ÀO”Ëòó¥íÆïM¯Þtú—êP¾S/ŒW¤*PnšqTpÂJ*УšÐD…{ˆ±cZר+ -5cËMýðÅòfêœÔZj¾ï«©X•b:ŽšNXIM|†%KÔü~¿· -Æø$/f¹®rúJÄ¡{Æú~ûÌ(»ÝªùvÔãªÀ £hý`Ìp"›€òms‡±L—o†ø¤‘-jëÆÕB©‘h¡¹ ôšZ‹­,y÷̓ A i¡ªI9×ÉéY9aUGZ &µŠ?"„‡Ýô :Óõ“WO?>üù.ÃŽ:êŸÒšžìÒæŒÈ#ð‹ë?U?5Õ`©þYî«™ö›µó'Ü ¾ZXû×Y3ˆ2vZtI¦«²¤$ÈIæqÂªŽ´žyh ¦Sã fˆ²65O†½9F-ÐÎ(°2D.PÝ´)Äé›á¡eœ.þ׺ ù1¸nî>UÎ(E”ÄÆ![¦iլ fÌP'ü³ØÞ¸@óûù\‡=åð4 -ª;á©yï¾~m*YÛn†vQ}ð€¦¶:õlóÁÊl`Ónh¯ª5~ó.߯Ó¨VºñW«ò|=5zª?Lô¯ž “¼_B9T+JÕ*ž7t£C)Í;Y†Á5xf`Sß«¨ð -Wäfk%.–kèðÖ„¡¾‡ˆ× crkÌ*X“ÖZ[õË<úÇÚWýöB·¤ð!¶¬*q©'JÐoÔôJÛÇc‘J0µ"`‚Èdníô΄;N³ÕµoQ¯£ùåz»^ë7Ð `}\™îòÆXþadí¬ä½”¨¦u–Ðûx]éJˆÂ¯¿"À}ªkAûÃôʘyá‹lÌc· -mnáç“zª Þ.ÝãÞ6ŠY±/êÅî—7ÁÝ”¡M±ÕÜV¡:¶òÞóËMî%ićél¿™Å¸â†û&Û7I „މþµÚ¦ÚJ}s2%ƒ5Wû¬À‚D - †9 † ÀÕp†8>qŒ²²ªŽ°Þ¥BoÕÑ×1tuØëøf±º¾^î–AõnÀ,¢t$¬NX,qO¸!‹ Sñ&AÀÅ=]÷Ü©”ñ&ÚäÙf ¾Ènùn×íÅû¥Ïvéò Æh> *1Óc|Ásèð¦ìVu[@}þ¿åÜ´?]»§ˆiÅ ÓªtÇugˆkXÐõíîFI"a¨'G™½ë“; æ¹oҜۤrέÁÉN`I|44é"ëçЋƋÌwÏÓ<šíU.ÛvunGõ8›Ö™Ò¦Ù´LfÐϤCšOáå™ÁLvÍæüBH‘M´µ h­NÞb'ÕTõ•ùìaºÜ˜‰6.)âF“ÁWK„©¼O¦ «¾ìTrJªÍJ+b&˜¢¨.íòÇûäÚXÈH*YE(ouš*Và–L°hUZÍWÐ}…Å¢縤D…Bð‘4vÒŠ:›´[¢òPÖMe×ΟElâµæ`ût˜5ù¶B/u1ŽÂC—úƒ’ÔÂØÎ|0ÀLPÔ0‘…lúŒ[´»ˆDJ%u}çž -üÐ\Ï%¼zÁ)àWòü±ÀYßO¡A„|Ÿ5ˆ‹ÚõÀ¤±&Í«‡xÊ´ù{Vø»•–¦ÕôO¹ -Ÿ=õßÕ~p*v_|»Z/;ªª\þÑ£VCæOq˜V/ïRá£Gù -]ËTÕ-îÔà°q}áØ@•–|™I¢9Ö©ï`ŠQÛ»¤¿:áW¿03 -šÏ›[fb x“›£M=1¥¼g±a^ÇÃ49?7oPÝÊî<-‘<-0^€=FDTjÇwQ3¼d»Q€9®K`å¸.‚5Hu‡™à+×¾‡›w=~›z/·_•¼¼#àQŸ!c¼­Jœ„`ÉéÇhÂ{¸ü—ŽŒ¹/…ÑÉ–]ú$ Fª£‚‘ þ´Á7 p½oFx ±È8Øœ{y÷Œ[2$ûÎSeÖûÅ(àï5Þ:•(Ïu(Ä5¢¸ÆÍH ý­7VǸE>ʈUë½"B;YÓËM/-Ý×éz}8`Dµ^ž.w%£ -FMM}¡YW¶Aeh‘$?ú¨®rã;m Lè-P…u8—@©cu…xCûÈŸ2Šõ½èõæ·ÛqcDb)º¶Ïõ1ºyº™¯ËѾ>½ælV©YlFÑÈ …ÖvƒC¬Ðß®r~[¤ðQ6cðqŸÁ™Úœ£´ jßÏjïž2Q¯¤—¨³¨÷»7öáùÏ]gÔ…«Néb"Ïín·Ûg†DÃVÃSŒ™Þ±çåðnY£FBOS´¹#8#\«^€x{ê¦é¯`üoÛü^Ç@Xê]ç]Jæ) -œ*…“¼=Nâ ÞOÀI£hä8©Ðþž“"…†9év£x–E…ÀRÃFñ,éa)ÚØMHXZ–¢0a̳C´cçÛhÊ”®:Åû<K4 ÿs1QÛIv«Ã4ôËQÂìv¿+G_3?+I=èRÎX,Q7xB1±K$G‹Ò¬nˆ¢:ÒÇ ¨l†¢b°÷ ¨ÜŒ ªgaÖ2Ûns 4댣°e°’mƒÅúf3vYÙ¯*“×8è=y•ð;öŠñ?ÉﻬÛ0ÿ2aVk9€KƒÙa£šþi»[,waW´¡#'Íó­§³»¹´Meœ†ù -ÙƒsDšbú›ˆµu/ýýôöÒGalŽ="°ŸŸ=FQرGÁ6ž="}g=jÏÄž+FÁ¸¢€ÖsE„öé—Ê£4ÌÁã®!F@ÑbJ†¨+d/ü´—ÆË±E?Êr -7GÜÏOãhìø¢`ϑ¹ÊEƒ¥Î8ˆ¿®å葌ֈóâÞ,B¬—§~r”“ñã8Y7çdÜÏïdãh윬`ïd‘Â]'{zœ“‚øÓ8ÙCdödòѪ”o6À’!˜¸Œ¨hÀíá¹ýfBTÅÇ5Ïí7t¤ Þl#<êfëµõOºÙÀ‘@Úœ9ˆÀÞrµAÓè³tÇ]m°³‡¹zʪMX  ©[DXiÈ:æN+¬êHë¯ò3h&Õ@ç–ú|‹=^ÖÃ'´ÌHðŒ¬2º– Æp¥ L™a¨ VD„DböÂÍÆãôcŒk8ù¾…»nÞ¯žp;DIQ+‹÷-`˜6IæÎ]\ºÃRËÝ6=~5[Ûeî ™K ‡‹l‰Õ …»Ç¬83o 2AÜ2Ü”°»ÇõLÔáz•|6×#°FÂmv`¬ÜÍúå‘çu¡?IveoFщòή ƒ*½*A¿|á&¹š$õ«gQG…ιT¹{¢½s³V§Ç:çÞ7æúÛÄÜžÕ‹¡3S²ÏGÛÞ&X{›ÀS¤ÖˆêNtz‡v¶—40KI¯×ø0W7 ¹êÿ;ÐöR´½T™…ýÖ=÷í •ÌyHgìÐ=îË_ö/òÐ?µö‘~2·,èò×[³î»Þ©Q«oÞ¸bá’W¡½ÂhÖ‘˜Ú‰”¹ -”Ûtþno¹‚u¶ødâ ËR]û‘]oö¼Šô•Of 16’™l DHŠ;û•ýzö:> -endobj -123 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 0 1 1 ] -/Rect [ 320.541 179.827 393.988 190.731 ] -/Subtype /Link -/A << -/Type /Action -/S /URI -/URI (http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1519.htm) ->> ->> -endobj -124 0 obj -<< -/Font << -/F8 42 0 R -/F40 50 0 R -/F38 38 0 R -/F39 46 0 R -/F14 72 0 R ->> -/ProcSet [ /PDF /Text ] ->> -endobj -125 0 obj -<< -/Filter /FlateDecode -/Length 3991 ->> -stream -xœí][sÛ6~÷¯`ÞìÝ!î@6õLwv·Ó¾l/Þ™vš<È’œhG–Inì¿$. "t¬SO§Ó -A‡ßÎ÷áàBðà ®jøW’!VëJ*„àÕâú¤®ÞÂÿßøŒ ĸ„ëÄ—3Nj¤„¨f ¿8yñ/Ui¤­.®NÜ=FRVË“_«ÓÃq~\U3\.á*5|Öþ½ºžoÏ*¢ªÓãza?CðW¬:ývëJß™ßSUÃåürsV™Ÿ¶¥î‹K¸0†V›]kñãó³êMuñdu@ˆ%A[t·¾TÇ j,|‘µ¿É|ë®væ~œW§ÿí¢Yý÷Wq ç®)÷Þ¡LbÓ5Âu€ös -G„b_$í£@œS_æîKóPùûþ2æá½üÇBl»X¥Œ1ŽÑ‘£ {3F5’Ú# >ÛÂÇÕ~~ÜííOþyá¹€±@„ ”B„`Äð‹7ðåHóÝI¨VÕG¸‡µ®®­WÍ›“ŸN~¼rÆfk ¯¢°%1EáŽ)ì÷óõñðê—ó—/—ë««Õ~µ]¸Öêc†°A´dk+‹˜PÓJ}Àwï“ÍÒ¢IÖ3J© Çe²ÁG,„ï6eRÁ݉/²_½ßGºaÿ5òc¦!Õ™»[/Ú»mó3+NÇæ/Z®lËá¹²ð¥í÷WîÊq¥¡‰£ æQ&§E8FŠ2 aË;Q¦Ð `tBËC'€pÜö¿ã'îþµ ¤s1×üª3íU[¼tÖ™’R*}ÐÑNeàºF\U’¤¤²UòÏÛV™ö«ÃÌÖÎ ß5ëþ°Þmdg ©"9Ü÷^8ky7 q"~´ñz¼iø•i¨‹³ -˜Ø”¹H1_R`r)œµ¬DQAûðõá°jÑ׎\/¾·´\ì¶Kûéqm>oýÚŽÍ7áCÿ8¨f¸Œ $¸™_éGa‹ ÊÉ~Øò#|Z! ¡’iU#©D%k‚¸ ùäzÐñå.nÇIÑ1þ¬ž9°˜C;+£ýe<Þ aóßÇÖw )1îAs¿sÇ˱¾LêÐS…êÏÕ¿‹ùB>>½ W¢Iü2A/ %Û8z}zûú,èÁ`™@ÏtÞC˜‰ô2àB¤÷À%"=ÆöûBÝÕù}⽌§Q¼«§ïpA`“‹w)aüN¸·_íw™èæËD®Jw±³9÷oí?6réÄeóïfå²øã.=n$+‡áçån·ÉªŒÏT™&ò¬Šœ6M3Lø1…æ c¥uº4I¡MMí|¸iªe uf'óͪC´¥÷«ÍÜdU6©²¨]*yï>_Û\.w×óu;(JŒ5žfšÈó4rÚà{}:ÿê«Ëu†æ²ß>k\o‹$HM¸&”w#µhéØV§gþr×|pÝ›BÏ2uöôÒ]*aôÁ³ôd5p÷»Ñg“ºÑ`¾ ={pSôŒà>=Ëøè™i"OÏÈé? =ËÔÙc÷žZ ¤prX¦4¢œV¤k7ìÿö*½|wÇ!î’ë˜ -À„™€y[ÕéŬ Ò:³cæB®ué¦#ŽïÌ•6º³ “ËÕÆ}öc³¼d«ëæ#ÈȾ^,Ü -ÑÁ}vqV™™ö–|ó^æu˜{sßúõÂöosó°â´m>®ÝjvSâj·ñËÕ6ÚÞºïæË¥Ïµ]ƒ -wÚ¯>ܬ£õ¬ë•[“r+œ3Q#&eo‰ãº…Ó[ÔjùàªÍëÊõÊ—HÁW -q=miI*Ä€2÷ -ÝÄo>Óâ •^ÔÐaLÀÙâ—šª¹—8¢¤¿š<¶¸0©¨:÷}ÐâRk-ëæ5ëùñ &®Auq!'œµ¬Dʦnc'þíAZ²†e£†<K ÈO«ÐR„wÀ£FÆŠûõâ0ô™J .ÕpÎZÖg -¾š^3ö9¹ªæïûýêÓËgœ FJyb¸ZcyŸ¾¬¼"”M6M}Ì$›œsF÷‡‚¯²#AKü`üa©¦c~l—ø Ò #`]°ÿÏLÓÉD—ƒNdÚ‡šŠ}öƒYg,Ð^œ»‹:Cù2øç3ø©Í’I„ÿÕØ~—äl“ßz²;6"ØN µ ¼\í;yG;ßÔM+6NF³ÂQ¦>ž¢rPh™]…äŒÂ_ô#óÕYn”j¥#X/#=´)éˆÐ>†v”ñ9hG¦…¼vDNßÄãî^âQÆ ¼xD|iêQ¦B"õ˜6ÅõÅ«‘Hìš®™ˆ xxœOI<‚õ2êÑC›Ríc¨GŸƒzdZÈ«Gäô$÷ZQnЊ \¯Üó/L+ÊTÈSÌ40GDfו9VHñÁºòù”L#X/£=´)­ˆÐ>†V”ñ9hE¦…¼VDNOGz­(7hE®×Šî—¦e*ä)jEMÆÙµm^ ÄëÁÚöy~mÛŠE0_F,zpSbÁ} ±(ãs‹Ly±ˆœ~ö:¥©­^1Š`ÆŠ?ªúÏü}À3¦kve©™fóÁ"õy~‘º%FÇ|žõá&xÃ}žòÙó,×DŽg±ÓÀ³DŸãYÌŸ…gO£?37#8ý¢ã™Â±¨Ab5¥?ë˜/óÜÏ"¸Á³2>žešÈó,rºÛŸOêÏÊ`þ“gã<Ò}™å™Ðˆ16˜ì˜ÔŸóexÖƒ›âY÷1xVÆçÀ³LyžENwû³óiýYÌO*o¤¼9c²+¶üψF\g×›Íf®á#³), Æ‚5°,ÖÓ¬‹¶÷,{Še Rd zRt!.-Ä×ö µçù~§ \?óÒ‡«†/Úø`ƒ—ðƒ†1ÛÌöVa _Þ‚K÷×Ü]øn¢S#ú»ù$b xŸ8mÁPÔo»Ù –ÁPîTƒ&)Lû›¨ní¶f_›ìæÇ䉠ûŒâ¯îbë.†ÁŇ’Dëá) ýcI4 •~r§wÿ×{í¦¤#!HÏõÛ‘¯5€%&Ä -Åé\ª)¢ù‡…™9üˆd׀Ƿc½ˆâæÐzÅà~Zr aô’›Ãè%7Â4÷îy«º9Í-„×knoJs#¸Šîdѽ›"ºÉc¸~‡è¦kˆîíDѽ{¨è -ÔÇÝŽX¤iÊSŸ™‡óß(§¨VÃNöÎcŒ’»}å;÷ç¯í«-u‰ìš§Û÷¸uÙg8Ú-éfûݶýôýÁ¬0Áśѭê0tC¢­Âþ wÚ—ˆ*}úf ¾¼ú¹ß”MkD8Ù"­÷/^¸XÛ¬Á'ûŒjîzÞ|ÇÜI^®dó\B{yœ¿u»ë^pW×ï7íÙzí({±™¼ û4B[[~dw8îoš3Üš¿Ö‰ÍfTªŠóŒË¤™‹ÌAaÖØ¬cmØ!(‰DmîHdÔŸØ5_Î/7‰N ø„Çe:cY„M‹*ÜCèÚòoNC— -n›I”k¦Ñƒè¨yÈ"®Öà{`M´¶fcÊ0Ï≰Ɋ¿!vk„ TÐéØG3l7û´]ìW׫í1ÝÆ¤†_R¢pö|›)QhÍ:Ö†QhÜææŽæÌªo©Ü òЋ2­±Dbm[¿œH` -†¨,T»ÎX:庑{Ô.« ¨T¡ÚuƲdõæéÉD페<”À”1$ë<¯vûóý2ÁÇ'P*¨qÎØ¬c-Á`‰¤4w„4SL‘aÂ`ÌÉÊ@tƲ ­Q ùjb‚#cÂH ‡V8—Álå1ƒôÔB÷0§…ÑvòEÀY[Yl*Ýœ";¹É©ÄˆèBMîŒå!JLžžhòÏÖóš| Î,q/×Ëõ~µ0;á’ÜpYƒ$7»Õç^YT°6žEq Ö)]œË¢Š@ôYT¢Ë¢bˆ úŽÊ¢4íG 9Ðn2¹^©YMç¬Dk,²R­xª^?Gˆ9d‰öF\1Gö0š6øf§TBêöоÍg§ÁÚxvJ5ª=Úùb±Jɰ'o |¼|ž¼¾)ä-Ñ“7Ñ‘7†˜ ï'¤‘ŠzÍBµëŒe¡S!  ¾Gí2è0•e :cYˆ@mDE²v?…{ˆæ\Ó/#åwÝ}ö)Äfþ­L|ã‘uf|ÍÜÔr‹®ïÒóöĺ‘xß@WwjŽ(§ATIöèµ)ºcÍ:Ö†ºƒkÄ¥nö\(fëøn&¯I!„ÖX!—HpÒCØ›÷ê¿Ø‹°È`æÔÎÂAš' ÜÑ(ïÝó~ëÎa~\^ט­ü ÇwÉ™FŒ8UV31l¾Ø¿µ?~ÓíÈÛÒ³NñÁjRÏb‹þ?ö€—ýÝÅðýƇøšõ1ÕLËkCíÍa»2Y€Z@GF±âÎ(„1 )8ƒ|o\CÐ?÷äs¬¡yÇBçZKw ¢¹²Ìsû­æ–Ó{÷ý±]~šò‚óÜY3}‡Š/‘~Ã=ϲ˜§´”EhDĤ£o2]Ÿ56ëXv}æ=!PXš÷ðàO²˜pòñB[[y|‚"h˜ž£ð«ŸÏ_¾üm¾¹I./Ö¹šoi³P[2˜ÝÅGí?®»ç‹­Ò ÷3¢Y“ߺdN݃þCßO³P§¤%ÖØ¬cm˜–PѬâ›m5Ú'£>eoc¬æµI³e•ëCì’t³Â’\‘ö‹î¡Èà<~èÓ¤ê¶D{3œ8€Â½¾mx·Nþ5eƨendstream -endobj -126 0 obj -<< -/Type /Page -/Annots [ 127 0 R ] -/Resources 128 0 R -/MediaBox [ 0 0 595.276 841.89 ] -/Parent 2 0 R -/Contents 134 0 R ->> -endobj -127 0 obj -<< -/Type /Annot -/Border [ 0 0 0 ] -/H /I -/C [ 0 1 1 ] -/Rect [ 260.354 488.876 287.807 499.725 ] -/Subtype /Link -/A << -/Type /Action -/S /URI -/URI (http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1519.htm) ->> ->> -endobj -128 0 obj -<< -/Font << -/F45 129 0 R -/F40 50 0 R -/F8 42 0 R -/F43 67 0 R -/F39 46 0 R ->> -/ProcSet [ /PDF /Text ] ->> -endobj -129 0 obj -<< -/Type /Font -/Subtype /Type1 -/Encoding 130 0 R -/FirstChar 45 -/LastChar 121 -/Widths 131 0 R -/BaseFont /LLOMPD+CMITT10 -/FontDescriptor 132 0 R ->> -endobj -130 0 obj -<< -/Type /Encoding -/Differences [ 0 /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /visiblespace /exclam /quotedbl /numbersign /sterling /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /dieresis /visiblespace 129 /.notdef 160 /space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi 171 /.notdef 173 /Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /visiblespace /dieresis 197 /.notdef ] ->> -endobj -131 0 obj -[ 525 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 525 0 525 525 525 525 525 525 525 0 0 525 525 0 525 525 0 525 525 525 0 525 0 0 525 ] -endobj -132 0 obj -<< -/Ascent 611 -/CapHeight 611 -/Descent -222 -/FontName /LLOMPD+CMITT10 -/ItalicAngle -14 -/StemV 69 -/XHeight 431 -/FontBBox [ 11 -233 669 696 ] -/Flags 4 -/CharSet (/hyphen/a/c/d/e/f/g/h/i/l/m/o/p/r/s/t/v/y) -/FontFile 133 0 R ->> -endobj -133 0 obj -<< -/Length1 1024 -/Length2 3799 -/Length3 532 -/Length 4487 -/Filter /FlateDecode ->> -stream -xÚí“i<”}ÛÇe Ù²d g–¬ÍbÍR²/Ù²–i†1ÃÌDv²Ë¾Œ,!EÖB–”%Kd-¡ÄX’,‰B²TS€4Õ¤ @µˆÀa1$D±€ÍpÔZHª“ÿSÿL~Ƀ1ƒyþ‘þÏ6ý‹æ‰Æþ[‚óôò% ñ€)Äcÿ)½‚üÓ)öõüç©!†Aõ±®$pª‚(ýGû\B‘ 4îð¾È_a$ñO#Ôîý²6117µÐ•ûk®¿N-`h,Ášä… Ë1ôo¦v &Ž¥ -©ï__Îÿ¨¦‡…ãh¬+  ¬Àðx‰…ºATR ‹@$‘ê ÂâÔ+µ37ÏòÇX•”°ÉË ‰ý#þ+Dö7©`øÿÀˆß -€‘¿¡Fý†ŠØõ7T¢Öú ©¥Ñ¿áYŒù ©u=ÿFꆂq¿!µ×oHÍŒÿ ©™}~CLø ©…üþFjfÒ/ü×1^¼ˆ#PKŸQPTTTÔ5•›ÿ[fƒE{û" ue¢ªªö+ -÷Åã‘X¯Ÿ‡º 1 -M])$’ˆ„³LŒáàî™õQ‚ôІÊd|Nf—Fô·F>ÎÖ-Ð8þß0hÙàŠärG—sf¬W€(åzíÀî+pä8W7LaŽÓø²ÓUÚžü®vÏ;1‹¢ó^ r_&Å¿Oûµ2T™,AUï -¬ÆÒ?x;¶¿äüjf‚5 !¾Áâœßl’Ž´ý4}»owEW„›(é9á”óû`B }jÄã=[¶Z\¾)© š¿˜5!`7LȇÂOÏœRLy–MàH*ÓŸWʲêáÉ创ÝÐÄ)Ê=WÕŒºÉÄûi÷OÝ¥jè` ù&,S-ÓÉ™zt4ÝÅô”(ÂÙŒ[‘­Q?g ïÕð£E§:õÒ« –qˆ,æÎwÝïì8e].)åå\ÑŠQzm命²(Çà­"@G Aå2ÉpŠí˜›+ÒîH˜‚9¸C.aCgêfX6ÏÓ -Ú\g¹‘ºùÔ°›žÅõy_°hƒAÈÁШ&¤£Ut¸ÂyuˆåƒQ‚´éï6JO=°sƒÝ6ß:pO œïœÀ%Q/!™ã¹Ü¢øRÚ?kÑâyX²ÇØYníÎfamrV×!ojöع¢£w¡~äàY‡* -)Yéíäîº*™Cn‚½øòx¤±»½µiw*.ŸÖ˜üô²•€*‡í¡ü«ÚHzŠù¢ÎCº¬äŸiÄmÎç÷>8•}Ö_F’5µÝ"sÄïÑç f"g„µ²ÓèðºÔYäÖÅQ~õÙ·®.fÀ9ž#ãë_ ö®²ûRÔÐóDÎj-ðª©Vö臧keK¤xÐg%Ñ4fÝãÀï7Ëo÷>®ﱬI~WÚLžyšj•é*V¿’ç`ò–Käžk„æËT'ƒUÙvNÇÃ笇ˆÄCò#¯gélSq&<µ-¢ã ±/Ë‹¬%93É%%"gÎñÉw‹5¶žØAWÖ¾E^¾yb[`rzÕ4¡!n·ÛÊ>ÆhtN˜jy'>×öä–ó±å§kt -nL!ÚS§CB¶+躚nå'ÎÙò‘r÷[w¾ù&ØFV½>f#CtwLŠÈƒwá$ßäÓ·'8ÉQ*:Ø5UfÍ [N¸Þ€Ö®#ù×:›0®i÷¾¾Šf¿ôáÙ?³ÞÑs ¡=úäòª7Æ™‘¦K¶´õ_ø:;ºóÊU/¡Èà‰ßgÉ®e÷Ȫã“ÑõG²3§è³z«SJà0´€×ÃÜsŽ(†&a%ÇîÒÙÇ×í&Ç'¥ÂË´Á:_b,·qí -˜\ŽFò„¿L뽌M©ç}m_{Gåd}hGºísˆ^윭®Ñâ‹›”7IŽÖÏ‹–PþïdWÅË çhó;'ÏË1±ž¶`«×JU¨¿8)˜X+%ÎÞb¶R“¨MžÙið?|Ù¶`Ê™4hëØ†‡?ëá2¶ ¾ì‹;Ü‹ñˆ#°a‰N· …ÞRëò67><sRø9Í¥¶Æíf½Waþœi5Ê}*O3ÃzûÉÔ׿ÈHWSÄ®—ƒ…ÒämÆmw[v ‰ëQ¢‹ ˜Îåf¤_P®xëæG·¡Ì„Þ[>bd1ÁÖBa×èžBÓÙœÝ3•µ‘Œ2BC$”³òÙBƒo¹T0¹©5n#ts…k;pè£Øu×mÂ4…\(뀅Ððî¤2ÖÜ–Þ%O²Br%]µª^P¶E‰_n©EZhÀ‰u’+J_ÏÒÙ½v`‡Ó?yÜc.ÿ6I|í FÚ2ÚRåÜüšéíjò„HWåáÀ$÷ýa8q0ÓèSŦ:”x‚ภZöåR¥c¢8÷Ù–w7Ž2ÑÊ_è¹{‰7²9OÐ@ *‚Bâ/{Ú`þ½¨îwÁ•„3ÕöŒ}ŽRbå]OôÎ|×ûi×ÌŠ»ýáŠæç©{4~ò2Â-­{Ì:eǾ;rA§÷j“ÈÛ;V ·ëæ“@ip»‚š|‰ME”afWç ødUE½p1´ÅÖû2äæŠG”ÈJ|)ÔÚîç„Ï3».ÆåIŸ 3¯½Û£ÈÅ1\)½t00Õ’J¹£¼Šñkøx“<^J䥹³$ùêáþ¦^+v~O=Ø}bÎç¥Y²Â•’ÔôôŽ÷* -=0í6C5_eþ6õ°É£ôxRÝcû$‹%.Ó1|¬IhX蔘f­žÑÖd08òÐ)LAà°Ï0÷ Ô¨Ž,³¼Ñ&Ãy¼m¤ÛÑÍ.±v}UÞš”õf‹ fœªs}‹~v½¬Æßã>oädúÇ ~St/¢DZZ:j­°Òj Š _k/¸]ÎK^e¿L,ã `“+ÙJ¿RŠ’— CH2‚ŽfÑ«ñôù4<-vé¯Ój÷ç³. 8uÖgnùÃÃÓ%ߣ ¶¦¸R´Ú y#Nó¡ºx>Xóc-£lÖxbOêžqCˆTN&»Yç{úšÖùíᕞ´Þ³Ž¢?̵ZìR¿ÝK‘Þw&… RuïÍ ®Ç…Ñ õž@aÉâÂSipšæ¤{óM -]Ý •÷E®‰19ÇlAÉe©ì:¦ ¶u,ü¦ðk ªU*ÃÆ×66Ä—Ø@ ¬MW´Î«É[µwŽgmœÒv#¦T@G(£ÅœlíK2‘üާùcä¿!+N'Ðd]`ºyJ3®ºÁ‚‡8t¸};3gSÕº÷e5\ÀÖÎZW¾'3AË[sí³©´EÔ•k¹¡Úu.ÌÑ5oEfíŒý-*¤W'¸ÆàßO´É?•rôÜ;7óxÉU²1×"sî«{œ—Òî8§í¹’¤Olî•øYˆ)ÚÁ~­J:Ú`µß]zq$sÅÙŠ»LmN¯þ”›ÛãÃäôp ,H.+¾§¬‰ÏzÝt Q!Ç^W¾óe±Cwa:Жßû¼ôxÕÞ§#ž›cÖªEŽ2Ž%½ÞغÅ=’w!ëÑ4ÙQÒÆ-Ìž €½m+¹"ñœgÇOîY‘ØaoqF|îjLÚdà•ÆÓBǹÓV„%¶,,ÿIðo‘ŽAÂðœ' ïÁò_Êóû¤endstream -endobj -134 0 obj -<< -/Filter /FlateDecode -/Length 1519 ->> -stream -xœ½YKoÛF¾ëWð(¸å¾w¶‡ —´*Z Î‘h™€DÚÀýõå>øE«]–äì·g盎Ÿ8JàŽ$C,Ñ‘T Á£Ía‘D;ø,ˆq 㑇±‰”Ài"ÎÌ× QÊ£X -Œ¤4&?­ß}`<‚Y‚Fëû…Öˆb9‹õvñW´Ü¤u¶+«—¸.ãºJ¿fÕ1ݯ¢ÏÑú£™´³1ƈ Cßμ[æuV¥uY9óŸ× áin–J–°y‚9Ÿááh\$ˆj}ƒ1hê.ö‹ßŸÚ7ó`q;[‡a5x9x¡¼>~ÿç77ç¹RAà½è<\=Ø$W*$’šŽoÄÝ*x_µS *b,Š] Ø9ß²*k7‹vÜ¡‚hô{µYEGKXÂÌB+à»´ÛîžšÍoî¦+X(ZîǘhAÄr3bJY´Ü6S3;õ.Á¬¹.²mc@5˜Þ7Êý¾\EDÁ{O·Åë‰`¤±þïrhçŸÕƒ3¹^ïÍæÅœðhùƒ›ë Á Æšsïµ{o“ü°qe3Ú”¬[ç_ö™¿U—Íœ—›*;dE6OÂSq'…¨¼2˜-TÜb†2V&ÊÄÜa­ìznë‰M Äˆmzk’ŸÄˆh6$˜î‚ÌbBÝ„Jo‡ª¬~® -ïý÷ï‚uAGÆÙþ6êâ­ réî/Œª´Ø–‡×%^EGB2®MS+nÁN]^å–/sï¹t³ÉŽ#j¥æa29‡5IŽq„°›Hò`§Ÿ‡ŸÃšäi’`>à×;Žá‘Ï b4îÎÅpÆfs$7 ¿ò|u`qíô|ÅPƒJz:lb&~lšaj1à7‘‰ˆV=ôLØ$Å à>Åt’ V`Þ4»|É·y•mê¼,Fó³×1”/œé¹„Ü¢W2TNJ˜‹•< à å)†^Ë=†Z?C^ñ| ƒ´ 'ÖL’iÑÎK~±ú7’™…bÌÅ ™>ÅÿW2÷eõ-­¶c'²=!©@‚^‰+î€[M=&¨˜ ”Â9É\üØ4AP‘¢tÀ°¯¨Ú!N*å¬ÃÃ!D‚Ã÷Êt`qmäØºØ¬(|‚] (J…’3Qt`Ó¥ù|‘CŠ]@vê-%’ÏõDÂÀIre¶ £E;Ÿ0Ìæ’ 4âOŸ9z°i†Ê¨$†}@AF0¬ y±ûü •a’ )¯¿P¶hç+Ä *|;ã1­ )GÊ£yØ9°iv vÊ즬$$:5E6Mê u@±+`¨*áé[*¸|®G%ìÅ•B -«™>;;hç¾;¹NƒâñõSÎêi‚lš ; -û §|²éSî•>Ž/á¸HÁÂóÔƒ´³õ 7­F~‰T\Fž‡¢OïSC4ö)^Xú^§8ÚΩ‚@«rW¥‡SEåû}|_6jªÙ6€ƒŽM>d¢éÚÂù-!AAÒØçñ«ªÝ¥Q5]ÐÚöIݯëŸ`§õš˜¢)‚ÒºáII-/Òª™ÿ²¶-Õ—Ç•I?75­„æy^û)»RY4÷7náÇæ*Ùö®m3ÓÓ-º$›Î.Ö&”Ç -!Œ(ÇÓ@Û­¹_íÜà×Ûn¡cãÖºÙûÎËð¬ -ÜðáX%rˆ#Ü'0h{“©eû(vÙwS˜”Æ?¿°[þaý|c=ˆ›$|Ì{]r»ep’{Ô>Þæ6&Âýú!Lk ª.ÊÓ³…éÝ<¸_Ø(DÚ ­ÒºÍR±“cå"ÇEˆ%“îó¿Sóñz ýü*íý»·újÑöÿï+Óʲcpœák/zAu¬;jêµÛ5¤]núý–çÍMýò˜é„B¤( ÑÙ?.@Ê!\††³ˆ[““È€cÛðqv-ŒOãd”#«}Züs8cendstream -endobj -135 0 obj -<< -/Type /Outlines -/First 136 0 R -/Last 151 0 R -/Count 6 ->> -endobj -136 0 obj -<< -/Title 137 0 R -/A 138 0 R -/Parent 135 0 R -/Next 139 0 R ->> -endobj -137 0 obj -(Table of Contents) -endobj -138 0 obj -<< -/S /GoTo -/D (table-of-contents.0) ->> -endobj -139 0 obj -<< -/Title 140 0 R -/A 141 0 R -/Parent 135 0 R -/Prev 136 0 R -/Next 142 0 R ->> -endobj -140 0 obj -(Motivation) -endobj -141 0 obj -<< -/S /GoTo -/D (motivation.0) ->> -endobj -142 0 obj -<< -/Title 143 0 R -/A 144 0 R -/Parent 135 0 R -/Prev 139 0 R -/Next 145 0 R -/First 199 0 R -/Last 199 0 R -/Count -1 ->> -endobj -143 0 obj -(Impact on the Standard) -endobj -144 0 obj -<< -/S /GoTo -/D (impact-on-the-standard.0) ->> -endobj -145 0 obj -<< -/Title 146 0 R -/A 147 0 R -/Parent 135 0 R -/Prev 142 0 R -/Next 148 0 R ->> -endobj -146 0 obj -(Design) -endobj -147 0 obj -<< -/S /GoTo -/D (design.0) ->> -endobj -148 0 obj -<< -/Title 149 0 R -/A 150 0 R -/Parent 135 0 R -/Prev 145 0 R -/Next 151 0 R -/First 154 0 R -/Last 160 0 R -/Count -3 ->> -endobj -149 0 obj -(Proposed Text) -endobj -150 0 obj -<< -/S /GoTo -/D (proposed-text.0) ->> -endobj -151 0 obj -<< -/Title 152 0 R -/A 153 0 R -/Parent 135 0 R -/Prev 148 0 R ->> -endobj -152 0 obj -(Footnotes) -endobj -153 0 obj -<< -/S /GoTo -/D (footnotes.0) ->> -endobj -154 0 obj -<< -/Title 155 0 R -/A 156 0 R -/Parent 148 0 R -/Next 157 0 R -/First 163 0 R -/Last 166 0 R -/Count -2 ->> -endobj -155 0 obj -(Addition to [lib.iterator.requirements]) -endobj -156 0 obj -<< -/S /GoTo -/D (addition-to-lib-iterator-requirements.1) ->> -endobj -157 0 obj -<< -/Title 158 0 R -/A 159 0 R -/Parent 148 0 R -/Prev 154 0 R -/Next 160 0 R ->> -endobj -158 0 obj -(Addition to [lib.iterator.synopsis]) -endobj -159 0 obj -<< -/S /GoTo -/D (addition-to-lib-iterator-synopsis.1) ->> -endobj -160 0 obj -<< -/Title 161 0 R -/A 162 0 R -/Parent 148 0 R -/Prev 157 0 R ->> -endobj -161 0 obj -(Addition to [lib.iterator.traits]) -endobj -162 0 obj -<< -/S /GoTo -/D (addition-to-lib-iterator-traits.1) ->> -endobj -163 0 obj -<< -/Title 164 0 R -/A 165 0 R -/Parent 154 0 R -/Next 166 0 R -/First 187 0 R -/Last 196 0 R -/Count -4 ->> -endobj -164 0 obj -(Iterator Value Access Concepts [lib.iterator.value.access]) -endobj -165 0 obj -<< -/S /GoTo -/D (iterator-value-access-concepts-lib-iterator-value-access.2) ->> -endobj -166 0 obj -<< -/Title 167 0 R -/A 168 0 R -/Parent 154 0 R -/Prev 163 0 R -/First 169 0 R -/Last 184 0 R -/Count -6 ->> -endobj -167 0 obj -(Iterator Traversal Concepts [lib.iterator.traversal]) -endobj -168 0 obj -<< -/S /GoTo -/D (iterator-traversal-concepts-lib-iterator-traversal.2) ->> -endobj -169 0 obj -<< -/Title 170 0 R -/A 171 0 R -/Parent 166 0 R -/Next 172 0 R ->> -endobj -170 0 obj -(Incrementable Iterators [lib.incrementable.iterators]) -endobj -171 0 obj -<< -/S /GoTo -/D (incrementable-iterators-lib-incrementable-iterators.3) ->> -endobj -172 0 obj -<< -/Title 173 0 R -/A 174 0 R -/Parent 166 0 R -/Prev 169 0 R -/Next 175 0 R ->> -endobj -173 0 obj -(Single Pass Iterators [lib.single.pass.iterators]) -endobj -174 0 obj -<< -/S /GoTo -/D (single-pass-iterators-lib-single-pass-iterators.3) ->> -endobj -175 0 obj -<< -/Title 176 0 R -/A 177 0 R -/Parent 166 0 R -/Prev 172 0 R -/Next 178 0 R ->> -endobj -176 0 obj -(Forward Traversal Iterators [lib.forward.traversal.iterators]) -endobj -177 0 obj -<< -/S /GoTo -/D (forward-traversal-iterators-lib-forward-traversal-iterators.3) ->> -endobj -178 0 obj -<< -/Title 179 0 R -/A 180 0 R -/Parent 166 0 R -/Prev 175 0 R -/Next 181 0 R ->> -endobj -179 0 obj -(Bidirectional Traversal Iterators [lib.bidirectional.traversal.iterators]) -endobj -180 0 obj -<< -/S /GoTo -/D (bidirectional-traversal-iterators-lib-bidirectional-traversal-iterators.3) ->> -endobj -181 0 obj -<< -/Title 182 0 R -/A 183 0 R -/Parent 166 0 R -/Prev 178 0 R -/Next 184 0 R ->> -endobj -182 0 obj -(Random Access Traversal Iterators [lib.random.access.traversal.iterators]) -endobj -183 0 obj -<< -/S /GoTo -/D (random-access-traversal-iterators-lib-random-access-traversal-iterators.3) ->> -endobj -184 0 obj -<< -/Title 185 0 R -/A 186 0 R -/Parent 166 0 R -/Prev 181 0 R ->> -endobj -185 0 obj -(Interoperable Iterators [lib.interoperable.iterators]) -endobj -186 0 obj -<< -/S /GoTo -/D (interoperable-iterators-lib-interoperable-iterators.3) ->> -endobj -187 0 obj -<< -/Title 188 0 R -/A 189 0 R -/Parent 163 0 R -/Next 190 0 R ->> -endobj -188 0 obj -(Readable Iterators [lib.readable.iterators]) -endobj -189 0 obj -<< -/S /GoTo -/D (readable-iterators-lib-readable-iterators.3) ->> -endobj -190 0 obj -<< -/Title 191 0 R -/A 192 0 R -/Parent 163 0 R -/Prev 187 0 R -/Next 193 0 R ->> -endobj -191 0 obj -(Writable Iterators [lib.writable.iterators]) -endobj -192 0 obj -<< -/S /GoTo -/D (writable-iterators-lib-writable-iterators.3) ->> -endobj -193 0 obj -<< -/Title 194 0 R -/A 195 0 R -/Parent 163 0 R -/Prev 190 0 R -/Next 196 0 R ->> -endobj -194 0 obj -(Swappable Iterators [lib.swappable.iterators]) -endobj -195 0 obj -<< -/S /GoTo -/D (swappable-iterators-lib-swappable-iterators.3) ->> -endobj -196 0 obj -<< -/Title 197 0 R -/A 198 0 R -/Parent 163 0 R -/Prev 193 0 R ->> -endobj -197 0 obj -(Lvalue Iterators [lib.lvalue.iterators]) -endobj -198 0 obj -<< -/S /GoTo -/D (lvalue-iterators-lib-lvalue-iterators.3) ->> -endobj -199 0 obj -<< -/Title 200 0 R -/A 201 0 R -/Parent 142 0 R -/First 202 0 R -/Last 208 0 R -/Count -3 ->> -endobj -200 0 obj -(Possible \(but not proposed\) Changes to the Working Paper) -endobj -201 0 obj -<< -/S /GoTo -/D (possible-but-not-proposed-changes-to-the-working-paper.1) ->> -endobj -202 0 obj -<< -/Title 203 0 R -/A 204 0 R -/Parent 199 0 R -/Next 205 0 R ->> -endobj -203 0 obj -(Changes to Algorithm Requirements) -endobj -204 0 obj -<< -/S /GoTo -/D (changes-to-algorithm-requirements.2) ->> -endobj -205 0 obj -<< -/Title 206 0 R -/A 207 0 R -/Parent 199 0 R -/Prev 202 0 R -/Next 208 0 R ->> -endobj -206 0 obj -(Deprecations) -endobj -207 0 obj -<< -/S /GoTo -/D (deprecations.2) ->> -endobj -208 0 obj -<< -/Title 209 0 R -/A 210 0 R -/Parent 199 0 R -/Prev 205 0 R ->> -endobj -209 0 obj -(vector) -endobj -210 0 obj -<< -/S /GoTo -/D (vector-bool.2) ->> -endobj -211 0 obj -<< -/Dests 212 0 R ->> -endobj -212 0 obj -<< -/Kids [ 213 0 R ] ->> -endobj -213 0 obj -<< -/Names [ (Doc-Start) 214 0 R (addition-to-lib-iterator-requirements) 215 0 R (addition-to-lib-iterator-requirements.1) 216 0 R (addition-to-lib-iterator-synopsis) 217 0 R (addition-to-lib-iterator-synopsis.1) 218 0 R (addition-to-lib-iterator-traits) 219 0 R (addition-to-lib-iterator-traits.1) 220 0 R (bidirectional-traversal-iterators-lib-bidirectional-traversal-iterators) 221 0 R (bidirectional-traversal-iterators-lib-bidirectional-traversal-iterators.3) 222 0 R (category-to-traversal) 223 0 R (changes-to-algorithm-requirements) 224 0 R (changes-to-algorithm-requirements.2) 225 0 R (deprecations) 226 0 R (deprecations.2) 227 0 R (design) 228 0 R (design.0) 229 0 R (footnotes) 230 0 R (footnotes.0) 231 0 R (forward-traversal-iterators-lib-forward-traversal-iterators) 232 0 R (forward-traversal-iterators-lib-forward-traversal-iterators.3) 233 0 R (impact-on-the-standard) 234 0 R (impact-on-the-standard.0) 235 0 R (incrementable-iterators-lib-incrementable-iterators) 236 0 R (incrementable-iterators-lib-incrementable-iterators.3) 237 0 R (interoperable-iterators-lib-interoperable-iterators) 238 0 R (interoperable-iterators-lib-interoperable-iterators.3) 239 0 R (iterator-traversal-concepts-lib-iterator-traversal) 240 0 R (iterator-traversal-concepts-lib-iterator-traversal.2) 241 0 R (iterator-value-access-concepts-lib-iterator-value-access) 242 0 R (iterator-value-access-concepts-lib-iterator-value-access.2) 243 0 R (lvalue-iterators-lib-lvalue-iterators) 244 0 R (lvalue-iterators-lib-lvalue-iterators.3) 245 0 R (motivation) 246 0 R (motivation.0) 247 0 R (page.1) 248 0 R (page.10) 249 0 R (page.11) 250 0 R (page.2) 251 0 R (page.3) 252 0 R (page.4) 253 0 R (page.5) 254 0 R (page.6) 255 0 R (page.7) 256 0 R (page.8) 257 0 R (page.9) 258 0 R (possible-but-not-proposed-changes-to-the-working-paper) 259 0 R (possible-but-not-proposed-changes-to-the-working-paper.1) 260 0 R (proposed-text) 261 0 R (proposed-text.0) 262 0 R (random-access-traversal-iterators-lib-random-access-traversal-iterators) 263 0 R (random-access-traversal-iterators-lib-random-access-traversal-iterators.3) 264 0 R (readable-iterator) 265 0 R (readable-iterators-lib-readable-iterators) 266 0 R (readable-iterators-lib-readable-iterators.3) 267 0 R (section*.1) 268 0 R (section*.10) 269 0 R (section*.11) 270 0 R (section*.12) 271 0 R (section*.13) 272 0 R (section*.14) 273 0 R (section*.15) 274 0 R (section*.16) 275 0 R (section*.17) 276 0 R (section*.18) 277 0 R (section*.19) 278 0 R (section*.2) 279 0 R (section*.20) 280 0 R (section*.21) 281 0 R (section*.22) 282 0 R (section*.23) 283 0 R (section*.24) 284 0 R (section*.25) 285 0 R (section*.3) 286 0 R (section*.4) 287 0 R (section*.5) 288 0 R (section*.6) 289 0 R (section*.7) 290 0 R (section*.8) 291 0 R (section*.9) 292 0 R (single-pass-iterators-lib-single-pass-iterators) 293 0 R (single-pass-iterators-lib-single-pass-iterators.3) 294 0 R (swappable-iterators-lib-swappable-iterators) 295 0 R (swappable-iterators-lib-swappable-iterators.3) 296 0 R (table-of-contents) 297 0 R (table-of-contents.0) 298 0 R (table.1) 299 0 R (table.10) 300 0 R (table.11) 301 0 R (table.12) 302 0 R (table.2) 303 0 R (table.3) 304 0 R (table.4) 305 0 R (table.5) 306 0 R (table.6) 307 0 R (table.7) 308 0 R (table.8) 309 0 R (table.9) 310 0 R (vector-bool) 311 0 R (vector-bool.2) 312 0 R (writable-iterator) 313 0 R (writable-iterators-lib-writable-iterators) 314 0 R (writable-iterators-lib-writable-iterators.3) 315 0 R ] -/Limits [ (Doc-Start) (writable-iterators-lib-writable-iterators.3) ] ->> -endobj -214 0 obj -<< -/D [ 3 0 R /XYZ 74.409 771.732 null ] ->> -endobj -215 0 obj -<< -/D [ 98 0 R /XYZ 74.409 572.707 null ] ->> -endobj -216 0 obj -<< -/D [ 98 0 R /XYZ 74.409 572.707 null ] ->> -endobj -217 0 obj -<< -/D [ 122 0 R /XYZ 74.409 380.976 null ] ->> -endobj -218 0 obj -<< -/D [ 122 0 R /XYZ 74.409 380.976 null ] ->> -endobj -219 0 obj -<< -/D [ 122 0 R /XYZ 74.409 226.603 null ] ->> -endobj -220 0 obj -<< -/D [ 122 0 R /XYZ 74.409 226.603 null ] ->> -endobj -221 0 obj -<< -/D [ 112 0 R /XYZ 74.409 399.127 null ] ->> -endobj -222 0 obj -<< -/D [ 112 0 R /XYZ 74.409 399.127 null ] ->> -endobj -223 0 obj -<< -/D [ 126 0 R /XYZ 299.753 741.844 null ] ->> -endobj -224 0 obj -<< -/D [ 78 0 R /XYZ 74.409 632.045 null ] ->> -endobj -225 0 obj -<< -/D [ 78 0 R /XYZ 74.409 632.045 null ] ->> -endobj -226 0 obj -<< -/D [ 90 0 R /XYZ 74.409 548.071 null ] ->> -endobj -227 0 obj -<< -/D [ 90 0 R /XYZ 74.409 548.071 null ] ->> -endobj -228 0 obj -<< -/D [ 90 0 R /XYZ 74.409 438.081 null ] ->> -endobj -229 0 obj -<< -/D [ 90 0 R /XYZ 74.409 438.081 null ] ->> -endobj -230 0 obj -<< -/D [ 126 0 R /XYZ 74.409 544.363 null ] ->> -endobj -231 0 obj -<< -/D [ 126 0 R /XYZ 74.409 544.363 null ] ->> -endobj -232 0 obj -<< -/D [ 112 0 R /XYZ 74.409 613.526 null ] ->> -endobj -233 0 obj -<< -/D [ 112 0 R /XYZ 74.409 613.526 null ] ->> -endobj -234 0 obj -<< -/D [ 56 0 R /XYZ 74.409 164.748 null ] ->> -endobj -235 0 obj -<< -/D [ 56 0 R /XYZ 74.409 164.748 null ] ->> -endobj -236 0 obj -<< -/D [ 102 0 R /XYZ 74.409 406.43 null ] ->> -endobj -237 0 obj -<< -/D [ 102 0 R /XYZ 74.409 406.43 null ] ->> -endobj -238 0 obj -<< -/D [ 115 0 R /XYZ 74.409 193.897 null ] ->> -endobj -239 0 obj -<< -/D [ 115 0 R /XYZ 74.409 193.897 null ] ->> -endobj -240 0 obj -<< -/D [ 102 0 R /XYZ 74.409 462.947 null ] ->> -endobj -241 0 obj -<< -/D [ 102 0 R /XYZ 74.409 462.947 null ] ->> -endobj -242 0 obj -<< -/D [ 98 0 R /XYZ 74.409 552.125 null ] ->> -endobj -243 0 obj -<< -/D [ 98 0 R /XYZ 74.409 552.125 null ] ->> -endobj -244 0 obj -<< -/D [ 102 0 R /XYZ 74.409 641.717 null ] ->> -endobj -245 0 obj -<< -/D [ 102 0 R /XYZ 74.409 641.717 null ] ->> -endobj -246 0 obj -<< -/D [ 56 0 R /XYZ 74.409 715.942 null ] ->> -endobj -247 0 obj -<< -/D [ 56 0 R /XYZ 74.409 715.942 null ] ->> -endobj -248 0 obj -<< -/D [ 3 0 R /XYZ 74.409 789.665 null ] ->> -endobj -249 0 obj -<< -/D [ 122 0 R /XYZ 74.409 789.665 null ] ->> -endobj -250 0 obj -<< -/D [ 126 0 R /XYZ 74.409 789.665 null ] ->> -endobj -251 0 obj -<< -/D [ 56 0 R /XYZ 74.409 789.665 null ] ->> -endobj -252 0 obj -<< -/D [ 78 0 R /XYZ 74.409 789.665 null ] ->> -endobj -253 0 obj -<< -/D [ 90 0 R /XYZ 74.409 789.665 null ] ->> -endobj -254 0 obj -<< -/D [ 93 0 R /XYZ 74.409 789.665 null ] ->> -endobj -255 0 obj -<< -/D [ 98 0 R /XYZ 74.409 789.665 null ] ->> -endobj -256 0 obj -<< -/D [ 102 0 R /XYZ 74.409 789.665 null ] ->> -endobj -257 0 obj -<< -/D [ 112 0 R /XYZ 74.409 789.665 null ] ->> -endobj -258 0 obj -<< -/D [ 115 0 R /XYZ 74.409 789.665 null ] ->> -endobj -259 0 obj -<< -/D [ 78 0 R /XYZ 74.409 690.191 null ] ->> -endobj -260 0 obj -<< -/D [ 78 0 R /XYZ 74.409 690.191 null ] ->> -endobj -261 0 obj -<< -/D [ 98 0 R /XYZ 74.409 615.817 null ] ->> -endobj -262 0 obj -<< -/D [ 98 0 R /XYZ 74.409 615.817 null ] ->> -endobj -263 0 obj -<< -/D [ 115 0 R /XYZ 74.409 698.407 null ] ->> -endobj -264 0 obj -<< -/D [ 115 0 R /XYZ 74.409 698.407 null ] ->> -endobj -265 0 obj -<< -/D [ 98 0 R /XYZ 443.801 512.815 null ] ->> -endobj -266 0 obj -<< -/D [ 98 0 R /XYZ 74.409 510.601 null ] ->> -endobj -267 0 obj -<< -/D [ 98 0 R /XYZ 74.409 510.601 null ] ->> -endobj -268 0 obj -<< -/D [ 3 0 R /XYZ 74.409 461.01 null ] ->> -endobj -269 0 obj -<< -/D [ 98 0 R /XYZ 74.409 552.125 null ] ->> -endobj -270 0 obj -<< -/D [ 98 0 R /XYZ 74.409 534.234 null ] ->> -endobj -271 0 obj -<< -/D [ 98 0 R /XYZ 74.409 477.994 null ] ->> -endobj -272 0 obj -<< -/D [ 98 0 R /XYZ 74.409 285.918 null ] ->> -endobj -273 0 obj -<< -/D [ 102 0 R /XYZ 74.409 752.845 null ] ->> -endobj -274 0 obj -<< -/D [ 102 0 R /XYZ 74.409 609.387 null ] ->> -endobj -275 0 obj -<< -/D [ 102 0 R /XYZ 74.409 430.064 null ] ->> -endobj -276 0 obj -<< -/D [ 102 0 R /XYZ 74.409 373.823 null ] ->> -endobj -277 0 obj -<< -/D [ 102 0 R /XYZ 74.409 207.245 null ] ->> -endobj -278 0 obj -<< -/D [ 112 0 R /XYZ 74.409 592.646 null ] ->> -endobj -279 0 obj -<< -/D [ 56 0 R /XYZ 74.409 673.13 null ] ->> -endobj -280 0 obj -<< -/D [ 112 0 R /XYZ 74.409 378.247 null ] ->> -endobj -281 0 obj -<< -/D [ 115 0 R /XYZ 74.409 677.527 null ] ->> -endobj -282 0 obj -<< -/D [ 115 0 R /XYZ 74.409 173.017 null ] ->> -endobj -283 0 obj -<< -/D [ 122 0 R /XYZ 74.409 343.664 null ] ->> -endobj -284 0 obj -<< -/D [ 122 0 R /XYZ 74.409 191.782 null ] ->> -endobj -285 0 obj -<< -/D [ 126 0 R /XYZ 74.409 503.765 null ] ->> -endobj -286 0 obj -<< -/D [ 78 0 R /XYZ 74.409 749.114 null ] ->> -endobj -287 0 obj -<< -/D [ 78 0 R /XYZ 74.409 654.904 null ] ->> -endobj -288 0 obj -<< -/D [ 78 0 R /XYZ 74.409 599.803 null ] ->> -endobj -289 0 obj -<< -/D [ 90 0 R /XYZ 74.409 516.294 null ] ->> -endobj -290 0 obj -<< -/D [ 90 0 R /XYZ 74.409 461.991 null ] ->> -endobj -291 0 obj -<< -/D [ 90 0 R /XYZ 74.409 392.48 null ] ->> -endobj -292 0 obj -<< -/D [ 98 0 R /XYZ 74.409 572.707 null ] ->> -endobj -293 0 obj -<< -/D [ 102 0 R /XYZ 74.409 226.188 null ] ->> -endobj -294 0 obj -<< -/D [ 102 0 R /XYZ 74.409 226.188 null ] ->> -endobj -295 0 obj -<< -/D [ 98 0 R /XYZ 74.409 177.281 null ] ->> -endobj -296 0 obj -<< -/D [ 98 0 R /XYZ 74.409 177.281 null ] ->> -endobj -297 0 obj -<< -/D [ 3 0 R /XYZ 74.409 493.276 null ] ->> -endobj -298 0 obj -<< -/D [ 3 0 R /XYZ 74.409 493.276 null ] ->> -endobj -299 0 obj -<< -/D [ 56 0 R /XYZ 74.409 563.596 null ] ->> -endobj -300 0 obj -<< -/D [ 115 0 R /XYZ 74.409 642.215 null ] ->> -endobj -301 0 obj -<< -/D [ 122 0 R /XYZ 74.409 747.601 null ] ->> -endobj -302 0 obj -<< -/D [ 122 0 R /XYZ 74.409 600.951 null ] ->> -endobj -303 0 obj -<< -/D [ 98 0 R /XYZ 74.409 442.682 null ] ->> -endobj -304 0 obj -<< -/D [ 98 0 R /XYZ 74.409 250.606 null ] ->> -endobj -305 0 obj -<< -/D [ 102 0 R /XYZ 74.409 729.488 null ] ->> -endobj -306 0 obj -<< -/D [ 102 0 R /XYZ 74.409 586.03 null ] ->> -endobj -307 0 obj -<< -/D [ 102 0 R /XYZ 74.409 350.467 null ] ->> -endobj -308 0 obj -<< -/D [ 102 0 R /XYZ 74.409 183.888 null ] ->> -endobj -309 0 obj -<< -/D [ 112 0 R /XYZ 74.409 557.334 null ] ->> -endobj -310 0 obj -<< -/D [ 112 0 R /XYZ 74.409 344.872 null ] ->> -endobj -311 0 obj -<< -/D [ 90 0 R /XYZ 74.409 492.384 null ] ->> -endobj -312 0 obj -<< -/D [ 90 0 R /XYZ 74.409 492.384 null ] ->> -endobj -313 0 obj -<< -/D [ 98 0 R /XYZ 74.409 320.739 null ] ->> -endobj -314 0 obj -<< -/D [ 98 0 R /XYZ 74.409 320.739 null ] ->> -endobj -315 0 obj -<< -/D [ 98 0 R /XYZ 74.409 320.739 null ] ->> -endobj -316 0 obj -<< -/S /GoTo -/D [ 3 0 R /Fit ] ->> -endobj -317 0 obj -<< -/Author (David Abrahams, Jeremy Siek, Thomas Witt) -/Title (New Iterator Concepts) -/Subject () -/Creator (LaTeX with hyperref package) -/Producer (pdfTeX-1.10b extended by PPower4 V0.9.4) -/Keywords () -/CreationDate (D:20040716154900) ->> -endobj -xref -0 318 -0000000000 65535 f -0000000009 00000 n -0000000236 00000 n -0000000371 00000 n -0000000688 00000 n -0000000887 00000 n -0000001077 00000 n -0000001272 00000 n -0000001469 00000 n -0000001656 00000 n -0000001849 00000 n -0000002044 00000 n -0000002205 00000 n -0000002378 00000 n -0000002584 00000 n -0000002768 00000 n -0000002932 00000 n -0000003095 00000 n -0000003252 00000 n -0000003416 00000 n -0000003606 00000 n -0000003815 00000 n -0000004009 00000 n -0000004203 00000 n -0000004399 00000 n -0000004588 00000 n -0000004790 00000 n -0000004994 00000 n -0000005194 00000 n -0000005406 00000 n -0000005630 00000 n -0000005854 00000 n -0000006058 00000 n -0000006175 00000 n -0000006332 00000 n -0000007444 00000 n -0000007596 00000 n -0000007816 00000 n -0000011527 00000 n -0000011685 00000 n -0000011972 00000 n -0000012332 00000 n -0000022473 00000 n -0000022630 00000 n -0000023027 00000 n -0000023519 00000 n -0000038957 00000 n -0000039115 00000 n -0000039377 00000 n -0000039693 00000 n -0000046969 00000 n -0000047127 00000 n -0000048311 00000 n -0000048617 00000 n -0000049031 00000 n -0000059033 00000 n -0000061954 00000 n -0000062145 00000 n -0000062330 00000 n -0000062514 00000 n -0000062674 00000 n -0000062904 00000 n -0000063134 00000 n -0000063363 00000 n -0000063587 00000 n -0000063813 00000 n -0000064042 00000 n -0000064171 00000 n -0000064329 00000 n -0000065443 00000 n -0000065691 00000 n -0000065974 00000 n -0000075026 00000 n -0000075184 00000 n -0000077006 00000 n -0000077210 00000 n -0000077436 00000 n -0000079083 00000 n -0000083909 00000 n -0000084025 00000 n -0000084154 00000 n -0000084311 00000 n -0000085472 00000 n -0000085496 00000 n -0000085702 00000 n -0000087414 00000 n -0000087572 00000 n -0000087596 00000 n -0000087804 00000 n -0000089505 00000 n -0000092435 00000 n -0000092551 00000 n -0000092692 00000 n -0000095386 00000 n -0000095502 00000 n -0000095642 00000 n -0000102355 00000 n -0000126772 00000 n -0000128635 00000 n -0000128772 00000 n -0000129001 00000 n -0000129119 00000 n -0000133234 00000 n -0000133421 00000 n -0000133592 00000 n -0000133762 00000 n -0000133933 00000 n -0000134104 00000 n -0000134274 00000 n -0000134445 00000 n -0000134615 00000 n -0000134721 00000 n -0000138716 00000 n -0000138835 00000 n -0000138953 00000 n -0000142504 00000 n -0000142667 00000 n -0000142838 00000 n -0000143009 00000 n -0000143180 00000 n -0000143351 00000 n -0000143469 00000 n -0000146961 00000 n -0000147100 00000 n -0000147333 00000 n -0000147451 00000 n -0000151516 00000 n -0000151655 00000 n -0000151888 00000 n -0000152007 00000 n -0000152170 00000 n -0000153357 00000 n -0000153568 00000 n -0000153808 00000 n -0000158410 00000 n -0000160003 00000 n -0000160080 00000 n -0000160159 00000 n -0000160196 00000 n -0000160253 00000 n -0000160346 00000 n -0000160376 00000 n -0000160426 00000 n -0000160558 00000 n -0000160600 00000 n -0000160662 00000 n -0000160755 00000 n -0000160781 00000 n -0000160827 00000 n -0000160959 00000 n -0000160992 00000 n -0000161045 00000 n -0000161124 00000 n -0000161153 00000 n -0000161202 00000 n -0000161320 00000 n -0000161379 00000 n -0000161456 00000 n -0000161549 00000 n -0000161604 00000 n -0000161677 00000 n -0000161756 00000 n -0000161809 00000 n -0000161880 00000 n -0000161998 00000 n -0000162076 00000 n -0000162172 00000 n -0000162290 00000 n -0000162362 00000 n -0000162452 00000 n -0000162531 00000 n -0000162604 00000 n -0000162695 00000 n -0000162788 00000 n -0000162857 00000 n -0000162944 00000 n -0000163037 00000 n -0000163118 00000 n -0000163217 00000 n -0000163310 00000 n -0000163403 00000 n -0000163514 00000 n -0000163607 00000 n -0000163700 00000 n -0000163811 00000 n -0000163890 00000 n -0000163963 00000 n -0000164054 00000 n -0000164133 00000 n -0000164196 00000 n -0000164277 00000 n -0000164370 00000 n -0000164433 00000 n -0000164514 00000 n -0000164607 00000 n -0000164672 00000 n -0000164755 00000 n -0000164834 00000 n -0000164893 00000 n -0000164970 00000 n -0000165074 00000 n -0000165152 00000 n -0000165246 00000 n -0000165325 00000 n -0000165378 00000 n -0000165451 00000 n -0000165544 00000 n -0000165576 00000 n -0000165628 00000 n -0000165707 00000 n -0000165739 00000 n -0000165790 00000 n -0000165828 00000 n -0000165869 00000 n -0000169442 00000 n -0000169503 00000 n -0000169565 00000 n -0000169627 00000 n -0000169690 00000 n -0000169753 00000 n -0000169816 00000 n -0000169879 00000 n -0000169942 00000 n -0000170005 00000 n -0000170069 00000 n -0000170131 00000 n -0000170193 00000 n -0000170255 00000 n -0000170317 00000 n -0000170379 00000 n -0000170441 00000 n -0000170504 00000 n -0000170567 00000 n -0000170630 00000 n -0000170693 00000 n -0000170755 00000 n -0000170817 00000 n -0000170879 00000 n -0000170941 00000 n -0000171004 00000 n -0000171067 00000 n -0000171130 00000 n -0000171193 00000 n -0000171255 00000 n -0000171317 00000 n -0000171380 00000 n -0000171443 00000 n -0000171505 00000 n -0000171567 00000 n -0000171628 00000 n -0000171691 00000 n -0000171754 00000 n -0000171816 00000 n -0000171878 00000 n -0000171940 00000 n -0000172002 00000 n -0000172064 00000 n -0000172127 00000 n -0000172190 00000 n -0000172253 00000 n -0000172315 00000 n -0000172377 00000 n -0000172439 00000 n -0000172501 00000 n -0000172564 00000 n -0000172627 00000 n -0000172690 00000 n -0000172752 00000 n -0000172814 00000 n -0000172874 00000 n -0000172936 00000 n -0000172998 00000 n -0000173060 00000 n -0000173122 00000 n -0000173185 00000 n -0000173248 00000 n -0000173311 00000 n -0000173374 00000 n -0000173437 00000 n -0000173500 00000 n -0000173561 00000 n -0000173624 00000 n -0000173687 00000 n -0000173750 00000 n -0000173813 00000 n -0000173876 00000 n -0000173939 00000 n -0000174001 00000 n -0000174063 00000 n -0000174125 00000 n -0000174187 00000 n -0000174249 00000 n -0000174310 00000 n -0000174372 00000 n -0000174435 00000 n -0000174498 00000 n -0000174560 00000 n -0000174622 00000 n -0000174683 00000 n -0000174744 00000 n -0000174806 00000 n -0000174869 00000 n -0000174932 00000 n -0000174995 00000 n -0000175057 00000 n -0000175119 00000 n -0000175182 00000 n -0000175244 00000 n -0000175307 00000 n -0000175370 00000 n -0000175433 00000 n -0000175496 00000 n -0000175558 00000 n -0000175620 00000 n -0000175682 00000 n -0000175744 00000 n -0000175806 00000 n -0000175856 00000 n -trailer -<< -/Size 318 -/Root 1 0 R -/Info 317 0 R ->> -startxref -176110 -%%EOF diff --git a/doc/new-iter-concepts.rst b/doc/new-iter-concepts.rst deleted file mode 100644 index 8853e3e..0000000 --- a/doc/new-iter-concepts.rst +++ /dev/null @@ -1,799 +0,0 @@ -++++++++++++++++++++++ - New Iterator Concepts -++++++++++++++++++++++ - -.. Version 1.25 of this ReStructuredText document is the same as - n1550_, the paper accepted by the LWG. - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, `Zephyr Associates, Inc.`_ -:date: $Date$ - -:Number: This is a revised version of n1550_\ =03-0133, which was - accepted for Technical Report 1 by the C++ standard - committee's library working group. This proposal is a - revision of paper n1297_, n1477_, and n1531_. - -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt - 2003. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Zephyr Associates, Inc.`: http://www.styleadvisor.com - -.. _`Institute for Transport Railway Operation and Construction`: - http://www.ive.uni-hannover.de - -:Abstract: We propose a new system of iterator concepts that treat - access and positioning independently. This allows the - concepts to more closely match the requirements - of algorithms and provides better categorizations - of iterators that are used in practice. - -.. contents:: Table of Contents - -.. _n1297: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2001/n1297.html -.. _n1477: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1477.html -.. _n1531: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1531.html -.. _n1550: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1550.html - -============ - Motivation -============ - -The standard iterator categories and requirements are flawed because -they use a single hierarchy of concepts to address two orthogonal -issues: *iterator traversal* and *value access*. As a result, many -algorithms with requirements expressed in terms of the iterator -categories are too strict. Also, many real-world iterators can not be -accurately categorized. A proxy-based iterator with random-access -traversal, for example, may only legally have a category of "input -iterator", so generic algorithms are unable to take advantage of its -random-access capabilities. The current iterator concept hierarchy is -geared towards iterator traversal (hence the category names), while -requirements that address value access sneak in at various places. The -following table gives a summary of the current value access -requirements in the iterator categories. - -+------------------------------------------------------------------------------+ -|Value Access Requirements in Existing Iterator Categories | -+========================+=====================================================+ -|Output Iterator |``*i = a`` | -+------------------------+-----------------------------------------------------+ -|Input Iterator |``*i`` is convertible to ``T`` | -+------------------------+-----------------------------------------------------+ -|Forward Iterator |``*i`` is ``T&`` (or ``const T&`` once `issue 200`_ | -| |is resolved) | -+------------------------+-----------------------------------------------------+ -|Random Access Iterator |``i[n]`` is convertible to ``T`` (also ``i[n] = t`` | -| |is required for mutable iterators once `issue 299`_ | -| |is resolved) | -+------------------------+-----------------------------------------------------+ - -.. _issue 200: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/lwg-active.html#200 -.. _issue 299: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/lwg-active.html#299 - - -Because iterator traversal and value access are mixed together in a -single hierarchy, many useful iterators can not be appropriately -categorized. For example, ``vector::iterator`` is almost a -random access iterator, but the return type is not ``bool&`` (see -`issue 96`_ and Herb Sutter's paper J16/99-0008 = WG21 -N1185). Therefore, the iterators of ``vector`` only meet the -requirements of input iterator and output iterator. This is so -nonintuitive that the C++ standard contradicts itself on this point. -In paragraph 23.2.4/1 it says that a ``vector`` is a sequence that -supports random access iterators. - -.. _issue 96: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/lwg-active.html#96 - -Another difficult-to-categorize iterator is the transform iterator, an -adaptor which applies a unary function object to the dereferenced -value of the some underlying iterator (see `transform_iterator`_). -For unary functions such as ``times``, the return type of -``operator*`` clearly needs to be the ``result_type`` of the function -object, which is typically not a reference. Because random access -iterators are required to return lvalues from ``operator*``, if you -wrap ``int*`` with a transform iterator, you do not get a random -access iterator as might be expected, but an input iterator. - -.. _`transform_iterator`: http://www.boost.org/libs/utility/transform_iterator.htm - -A third example is found in the vertex and edge iterators of the -`Boost Graph Library`_. These iterators return vertex and edge -descriptors, which are lightweight handles created on-the-fly. They -must be returned by-value. As a result, their current standard -iterator category is ``input_iterator_tag``, which means that, -strictly speaking, you could not use these iterators with algorithms -like ``min_element()``. As a temporary solution, the concept -`Multi-Pass Input Iterator`_ was introduced to describe the vertex and -edge descriptors, but as the design notes for the concept suggest, a -better solution is needed. - -.. _Boost Graph Library: http://www.boost.org/libs/graph/doc/table_of_contents.html -.. _Multi-Pass Input Iterator: http://www.boost.org/libs/utility/MultiPassInputIterator.html - -In short, there are many useful iterators that do not fit into the -current standard iterator categories. As a result, the following bad -things happen: - -- Iterators are often mis-categorized. - -- Algorithm requirements are more strict than necessary, because they - cannot separate the need for random access or bidirectional - traversal from the need for a true reference return type. - - -======================== - Impact on the Standard -======================== - -This proposal for TR1 is a pure extension. Further, the new iterator -concepts are backward-compatible with the old iterator requirements, -and old iterators are forward-compatible with the new iterator -concepts. That is to say, iterators that satisfy the old requirements -also satisfy appropriate concepts in the new system, and iterators -modeling the new concepts will automatically satisfy the appropriate -old requirements. - -.. I think we need to say something about the resolution to allow - convertibility to any of the old-style tags as a TR issue (hope it - made it). -DWA - -.. Hmm, not sure I understand. Are you talking about whether a - standards conforming input iterator is allowed to have - a tag that is not input_iterator_tag but that - is convertible to input_iterator_tag? -JGS - -Possible (but not proposed) Changes to the Working Paper -======================================================== - -The extensions in this paper suggest several changes we might make -to the working paper for the next standard. These changes are not -a formal part of this proposal for TR1. - -Changes to Algorithm Requirements -+++++++++++++++++++++++++++++++++ - -The algorithms in the standard library could benefit from the new -iterator concepts because the new concepts provide a more accurate way -to express their type requirements. The result is algorithms that are -usable in more situations and have fewer type requirements. - -For the next working paper (but not for TR1), the committee should -consider the following changes to the type requirements of algorithms. -These changes are phrased as textual substitutions, listing the -algorithms to which each textual substitution applies. - -Forward Iterator -> Forward Traversal Iterator and Readable Iterator - - ``find_end, adjacent_find, search, search_n, rotate_copy, - lower_bound, upper_bound, equal_range, binary_search, - min_element, max_element`` - -Forward Iterator (1) -> Single Pass Iterator and Readable Iterator, -Forward Iterator (2) -> Forward Traversal Iterator and Readable Iterator - - ``find_first_of`` - -Forward Iterator -> Readable Iterator and Writable Iterator - - ``iter_swap`` - -Forward Iterator -> Single Pass Iterator and Writable Iterator - - ``fill, generate`` - -Forward Iterator -> Forward Traversal Iterator and Swappable Iterator - - ``rotate`` - -Forward Iterator (1) -> Swappable Iterator and Single Pass Iterator, -Forward Iterator (2) -> Swappable Iterator and Incrementable Iterator - - ``swap_ranges`` - -Forward Iterator -> Forward Traversal Iterator and Readable Iterator and Writable Iterator - ``remove, remove_if, unique`` - -Forward Iterator -> Single Pass Iterator and Readable Iterator and Writable Iterator - - ``replace, replace_if`` - -Bidirectional Iterator -> Bidirectional Traversal Iterator and Swappable Iterator - ``reverse`` - -Bidirectional Iterator -> Bidirectional Traversal Iterator and Readable and Swappable Iterator - ``partition`` - -Bidirectional Iterator (1) -> Bidirectional Traversal Iterator and Readable Iterator, -Bidirectional Iterator (2) -> Bidirectional Traversal Iterator and Writable Iterator - - ``copy_backwards`` - -Bidirectional Iterator -> Bidirectional Traversal Iterator and Swappable Iterator and Readable Iterator - ``next_permutation, prev_permutation`` - -Bidirectional Iterator -> Bidirectional Traversal Iterator and Readable Iterator and Writable Iterator - ``stable_partition, inplace_merge`` - -Bidirectional Iterator -> Bidirectional Traversal Iterator and Readable Iterator - ``reverse_copy`` - -Random Access Iterator -> Random Access Traversal Iterator and Readable and Writable Iterator - ``random_shuffle, sort, stable_sort, partial_sort, nth_element, push_heap, pop_heap - make_heap, sort_heap`` - -Input Iterator (2) -> Incrementable Iterator and Readable Iterator - ``equal, mismatch`` - -Input Iterator (2) -> Incrementable Iterator and Readable Iterator - ``transform`` - -Deprecations -++++++++++++ - -For the next working paper (but not for TR1), the committee should -consider deprecating the old iterator tags, and -std::iterator_traits, since it will be superceded by individual -traits metafunctions. - -``vector`` -++++++++++++++++ - -For the next working paper (but not for TR1), the committee should -consider reclassifying ``vector::iterator`` as a Random -Access Traversal Iterator and Readable Iterator and Writable -Iterator. - -======== - Design -======== - -The iterator requirements are to be separated into two groups. One set -of concepts handles the syntax and semantics of value access: - -- Readable Iterator -- Writable Iterator -- Swappable Iterator -- Lvalue Iterator - -The access concepts describe requirements related to ``operator*`` and -``operator->``, including the ``value_type``, ``reference``, and -``pointer`` associated types. - -The other set of concepts handles traversal: - -- Incrementable Iterator -- Single Pass Iterator -- Forward Traversal Iterator -- Bidirectional Traversal Iterator -- Random Access Traversal Iterator - -The refinement relationships for the traversal concepts are in the -following diagram. - -.. image:: traversal.png - -In addition to the iterator movement operators, such as -``operator++``, the traversal concepts also include requirements on -position comparison such as ``operator==`` and ``operator<``. The -reason for the fine grain slicing of the concepts into the -Incrementable and Single Pass is to provide concepts that are exact -matches with the original input and output iterator requirements. - -This proposal also includes a concept for specifying when an iterator -is interoperable with another iterator, in the sense that ``int*`` is -interoperable with ``int const*``. - -- Interoperable Iterators - - -The relationship between the new iterator concepts and the old are -given in the following diagram. - -.. image:: oldeqnew.png - -Like the old iterator requirements, we provide tags for purposes of -dispatching based on the traversal concepts. The tags are related via -inheritance so that a tag is convertible to another tag if the concept -associated with the first tag is a refinement of the second tag. - -Our design reuses ``iterator_traits::iterator_category`` to -indicate an iterator's traversal capability. To specify -capabilities not captured by any old-style iterator category, an -iterator designer can use an ``iterator_category`` type that is -convertible to both the the most-derived old iterator category tag -which fits, and the appropriate new iterator traversal tag. - -.. dwa2003/1/2: Note that we are not *requiring* convertibility to - a new-style traversal tag in order to meet new concepts. - Old-style iterators still fit, after all. - -We do not provide tags for the purposes of dispatching based on the -access concepts, in part because we could not find a way to -automatically infer the right access tags for old-style iterators. -An iterator's writability may be dependent on the assignability of -its ``value_type`` and there's no known way to detect whether an -arbitrary type is assignable. Fortunately, the need for -dispatching based on access capability is not as great as the need -for dispatching based on traversal capability. - -A difficult design decision concerned the ``operator[]``. The direct -approach for specifying ``operator[]`` would have a return type of -``reference``; the same as ``operator*``. However, going in this -direction would mean that an iterator satisfying the old Random Access -Iterator requirements would not necessarily be a model of Readable or -Writable Lvalue Iterator. Instead we have chosen a design that -matches the preferred resolution of `issue 299`_: ``operator[]`` is -only required to return something convertible to the ``value_type`` -(for a Readable Iterator), and is required to support assignment -``i[n] = t`` (for a Writable Iterator). - - -=============== - Proposed Text -=============== - -Addition to [lib.iterator.requirements] -======================================= - -Iterator Value Access Concepts [lib.iterator.value.access] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -In the tables below, ``X`` is an iterator type, ``a`` is a constant -object of type ``X``, ``R`` is -``std::iterator_traits::reference``, ``T`` is -``std::iterator_traits::value_type``, and ``v`` is a constant -object of type ``T``. - -.. _Readable Iterator: - -Readable Iterators [lib.readable.iterators] -------------------------------------------- - -A class or built-in type ``X`` models the *Readable Iterator* concept -for value type ``T`` if, in addition to ``X`` being Assignable and -Copy Constructible, the following expressions are valid and respect -the stated semantics. ``U`` is the type of any specified member of -type ``T``. - -+-----------------------------------------------------------------------------------------------------------------------------+ -|Readable Iterator Requirements (in addition to Assignable and Copy Constructible) | -+-----------------------------------+------------------------+----------------------------------------------------------------+ -|Expression |Return Type |Note/Precondition | -+===================================+========================+================================================================+ -|``iterator_traits::value_type`` |``T`` |Any non-reference, | -| | |non-cv-qualified type | -+-----------------------------------+------------------------+----------------------------------------------------------------+ -|``*a`` | Convertible to ``T`` |pre: ``a`` is dereferenceable. If ``a == b`` then ``*a`` | -| | | is equivalent to ``*b``. | -+-----------------------------------+------------------------+----------------------------------------------------------------+ -|``a->m`` |``U&`` |pre: ``pre: (*a).m`` is well-defined. Equivalent to ``(*a).m``. | -+-----------------------------------+------------------------+----------------------------------------------------------------+ - -.. We won't say anything about iterator_traits::reference until the DR is resolved. -JGS - -.. _Writable Iterator: - -Writable Iterators [lib.writable.iterators] -------------------------------------------- - -A class or built-in type ``X`` models the *Writable Iterator* concept -if, in addition to ``X`` being Copy Constructible, the following -expressions are valid and respect the stated semantics. Writable -Iterators have an associated *set of value types*. - -+---------------------------------------------------------------------+ -|Writable Iterator Requirements (in addition to Copy Constructible) | -+-------------------------+--------------+----------------------------+ -|Expression |Return Type |Precondition | -+=========================+==============+============================+ -|``*a = o`` | | pre: The type of ``o`` | -| | | is in the set of | -| | | value types of ``X`` | -+-------------------------+--------------+----------------------------+ - -Swappable Iterators [lib.swappable.iterators] ---------------------------------------------- - -A class or built-in type ``X`` models the *Swappable Iterator* concept -if, in addition to ``X`` being Copy Constructible, the following -expressions are valid and respect the stated semantics. - -+---------------------------------------------------------------------+ -|Swappable Iterator Requirements (in addition to Copy Constructible) | -+-------------------------+-------------+-----------------------------+ -|Expression |Return Type |Postcondition | -+=========================+=============+=============================+ -|``iter_swap(a, b)`` |``void`` |the pointed to values are | -| | |exchanged | -+-------------------------+-------------+-----------------------------+ - -[*Note:* An iterator that is a model of the `Readable Iterator`_ and -`Writable Iterator`_ concepts is also a model of *Swappable -Iterator*. *--end note*] - - -Lvalue Iterators [lib.lvalue.iterators] ---------------------------------------- - -The *Lvalue Iterator* concept adds the requirement that the return -type of ``operator*`` type be a reference to the value type of the -iterator. - -+-------------------------------------------------------------+ -| Lvalue Iterator Requirements | -+-------------+-----------+-----------------------------------+ -|Expression |Return Type|Note/Assertion | -+=============+===========+===================================+ -|``*a`` | ``T&`` |``T`` is *cv* | -| | |``iterator_traits::value_type`` | -| | |where *cv* is an optional | -| | |cv-qualification. pre: ``a`` is | -| | |dereferenceable. | -+-------------+-----------+-----------------------------------+ - -If ``X`` is a `Writable Iterator`_ then ``a == b`` if and only if -``*a`` is the same object as ``*b``. If ``X`` is a `Readable -Iterator`_ then ``a == b`` implies ``*a`` is the same object as -``*b``. - - -Iterator Traversal Concepts [lib.iterator.traversal] -++++++++++++++++++++++++++++++++++++++++++++++++++++ - -In the tables below, ``X`` is an iterator type, ``a`` and ``b`` are -constant objects of type ``X``, ``r`` and ``s`` are mutable objects of -type ``X``, ``T`` is ``std::iterator_traits::value_type``, and -``v`` is a constant object of type ``T``. - -Incrementable Iterators [lib.incrementable.iterators] ------------------------------------------------------ - -A class or built-in type ``X`` models the *Incrementable Iterator* -concept if, in addition to ``X`` being Assignable and Copy -Constructible, the following expressions are valid and respect the -stated semantics. - -+------------------------------------------------------------------------------------+ -|Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible) | -| | -+--------------------------------+-------------------------------+-------------------+ -|Expression |Return Type |Assertion | -+================================+===============================+===================+ -|``++r`` |``X&`` |``&r == &++r`` | -+--------------------------------+-------------------------------+-------------------+ -|``r++`` | | | -+--------------------------------+-------------------------------+-------------------+ -|``*r++`` | | | -+--------------------------------+-------------------------------+-------------------+ -|``iterator_traversal::type`` |Convertible to | | -| |``incrementable_traversal_tag``| | -+--------------------------------+-------------------------------+-------------------+ - - -If ``X`` is a `Writable Iterator`_ then ``X a(r++);`` is equivalent -to ``X a(r); ++r;`` and ``*r++ = o`` is equivalent -to ``*r = o; ++r``. -If ``X`` is a `Readable Iterator`_ then ``T z(*r++);`` is equivalent -to ``T z(*r); ++r;``. - -.. TR1: incrementable_iterator_tag changed to - incrementable_traversal_tag for consistency. - -Single Pass Iterators [lib.single.pass.iterators] -------------------------------------------------- - -A class or built-in type ``X`` models the *Single Pass Iterator* -concept if the following expressions are valid and respect the stated -semantics. - - -+--------------------------------------------------------------------------------------------------------+ -|Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality | -|Comparable) | -+--------------------------------+-----------------------------+-------------+---------------------------+ -|Expression |Return Type | Operational |Assertion/ | -| | | Semantics |Pre-/Post-condition | -+================================+=============================+=============+===========================+ -|``++r`` |``X&`` | |pre: ``r`` is | -| | | |dereferenceable; post: | -| | | |``r`` is dereferenceable or| -| | | |``r`` is past-the-end | -+--------------------------------+-----------------------------+-------------+---------------------------+ -|``a == b`` |convertible to ``bool`` | |``==`` is an equivalence | -| | | |relation over its domain | -+--------------------------------+-----------------------------+-------------+---------------------------+ -|``a != b`` |convertible to ``bool`` |``!(a == b)``| | -+--------------------------------+-----------------------------+-------------+---------------------------+ -|``iterator_traversal::type`` |Convertible to | | | -| |``single_pass_traversal_tag``| | | -+--------------------------------+-----------------------------+-------------+---------------------------+ - -.. TR1: single_pass_iterator_tag changed to - single_pass_traversal_tag for consistency - - -Forward Traversal Iterators [lib.forward.traversal.iterators] -------------------------------------------------------------- - -A class or built-in type ``X`` models the *Forward Traversal Iterator* -concept if, in addition to ``X`` meeting the requirements of Default -Constructible and Single Pass Iterator, the following expressions are -valid and respect the stated semantics. - -+--------------------------------------------------------------------------------------------------------+ -|Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator) | -+---------------------------------------+-----------------------------------+----------------------------+ -|Expression |Return Type |Assertion/Note | -+=======================================+===================================+============================+ -|``X u;`` |``X&`` |note: ``u`` may have a | -| | |singular value. | -+---------------------------------------+-----------------------------------+----------------------------+ -|``++r`` |``X&`` |``r == s`` and ``r`` is | -| | |dereferenceable implies | -| | |``++r == ++s.`` | -+---------------------------------------+-----------------------------------+----------------------------+ -|``iterator_traits::difference_type``|A signed integral type representing| | -| |the distance between iterators | | -| | | | -+---------------------------------------+-----------------------------------+----------------------------+ -|``iterator_traversal::type`` |Convertible to | | -| |``forward_traversal_tag`` | | -+---------------------------------------+-----------------------------------+----------------------------+ - - - -.. TR1: forward_traversal_iterator_tag changed to - forward_traversal_tag for consistency - - -Bidirectional Traversal Iterators [lib.bidirectional.traversal.iterators] -------------------------------------------------------------------------- - -A class or built-in type ``X`` models the *Bidirectional Traversal -Iterator* concept if, in addition to ``X`` meeting the requirements of -Forward Traversal Iterator, the following expressions are valid and -respect the stated semantics. - -+-----------------------------------------------------------------------------------------------------+ -|Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal | -|Iterator) | -+--------------------------------+-------------------------------+--------------+---------------------+ -|Expression |Return Type | Operational |Assertion/ | -| | | Semantics |Pre-/Post-condition | -+================================+===============================+==============+=====================+ -|``--r`` |``X&`` | |pre: there exists | -| | | |``s`` such that ``r | -| | | |== ++s``. post: | -| | | |``s`` is | -| | | |dereferenceable. | -| | | | | -| | | |``++(--r) == r``. | -| | | |``--r == --s`` | -| | | |implies ``r == | -| | | |s``. ``&r == &--r``. | -+--------------------------------+-------------------------------+--------------+---------------------+ -|``r--`` |convertible to ``const X&`` |:: | | -| | | | | -| | | { | | -| | | X tmp = r; | | -| | | --r; | | -| | | return tmp;| | -| | | } | | -+--------------------------------+-------------------------------+--------------+---------------------+ -|``iterator_traversal::type`` |Convertible to | | | -| |``bidirectional_traversal_tag``| | | -| | | | | -+--------------------------------+-------------------------------+--------------+---------------------+ - -.. TR1: bidirectional_traversal_iterator_tag changed to - bidirectional_traversal_tag for consistency - -Random Access Traversal Iterators [lib.random.access.traversal.iterators] -------------------------------------------------------------------------- - -A class or built-in type ``X`` models the *Random Access Traversal -Iterator* concept if the following expressions are valid and respect -the stated semantics. In the table below, ``Distance`` is -``iterator_traits::difference_type`` and ``n`` represents a -constant object of type ``Distance``. - -+------------------------------------------------------------------------------------------------------------------+ -|Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal Iterator) | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|Expression |Return Type |Operational Semantics |Assertion/ | -| | | |Precondition | -+===============================+=================================+=========================+======================+ -|``r += n`` |``X&`` |:: | | -| | | | | -| | | { | | -| | | Distance m = n; | | -| | | if (m >= 0) | | -| | | while (m--) | | -| | | ++r; | | -| | | else | | -| | | while (m++) | | -| | | --r; | | -| | | return r; | | -| | | } | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a + n``, ``n + a`` |``X`` |``{ X tmp = a; return tmp| | -| | |+= n; }`` | | -| | | | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``r -= n`` |``X&`` |``return r += -n`` | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a - n`` |``X`` |``{ X tmp = a; return tmp| | -| | |-= n; }`` | | -| | | | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``b - a`` |``Distance`` |``a < b ? distance(a,b) |pre: there exists a | -| | |: -distance(b,a)`` |value ``n`` of | -| | | |``Distance`` such that| -| | | |``a + n == b``. ``b | -| | | |== a + (b - a)``. | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a[n]`` |convertible to T |``*(a + n)`` |pre: a is a `Readable | -| | | |Iterator`_ | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a[n] = v`` |convertible to T |``*(a + n) = v`` |pre: a is a `Writable | -| | | |Iterator`_ | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a < b`` |convertible to ``bool`` |``b - a > 0`` |``<`` is a total | -| | | |ordering relation | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a > b`` |convertible to ``bool`` |``b < a`` |``>`` is a total | -| | | |ordering relation | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a >= b`` |convertible to ``bool`` |``!(a < b)`` | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a <= b`` |convertible to ``bool`` |``!(a > b)`` | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``iterator_traversal::type``|Convertible to | | | -| |``random_access_traversal_tag`` | | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ - -.. TR1: random_access_traversal_iterator_tag changed to - random_access_traversal_tag for consistency - - -Interoperable Iterators [lib.interoperable.iterators] ------------------------------------------------------ - -A class or built-in type ``X`` that models Single Pass Iterator is -*interoperable with* a class or built-in type ``Y`` that also models -Single Pass Iterator if the following expressions are valid and -respect the stated semantics. In the tables below, ``x`` is an object -of type ``X``, ``y`` is an object of type ``Y``, ``Distance`` is -``iterator_traits::difference_type``, and ``n`` represents a -constant object of type ``Distance``. - -+-----------+-----------------------+---------------------------------------------------+ -|Expression |Return Type |Assertion/Precondition/Postcondition | -+===========+=======================+===================================================+ -|``y = x`` |``Y`` |post: ``y == x`` | -+-----------+-----------------------+---------------------------------------------------+ -|``Y(x)`` |``Y`` |post: ``Y(x) == x`` | -+-----------+-----------------------+---------------------------------------------------+ -|``x == y`` |convertible to ``bool``|``==`` is an equivalence relation over its domain. | -+-----------+-----------------------+---------------------------------------------------+ -|``y == x`` |convertible to ``bool``|``==`` is an equivalence relation over its domain. | -+-----------+-----------------------+---------------------------------------------------+ -|``x != y`` |convertible to ``bool``|``bool(a==b) != bool(a!=b)`` over its domain. | -+-----------+-----------------------+---------------------------------------------------+ -|``y != x`` |convertible to ``bool``|``bool(a==b) != bool(a!=b)`` over its domain. | -+-----------+-----------------------+---------------------------------------------------+ - -If ``X`` and ``Y`` both model Random Access Traversal Iterator then -the following additional requirements must be met. - -+-----------+-----------------------+---------------------+--------------------------------------+ -|Expression |Return Type |Operational Semantics|Assertion/ Precondition | -+===========+=======================+=====================+======================================+ -|``x < y`` |convertible to ``bool``|``y - x > 0`` |``<`` is a total ordering relation | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y < x`` |convertible to ``bool``|``x - y > 0`` |``<`` is a total ordering relation | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``x > y`` |convertible to ``bool``|``y < x`` |``>`` is a total ordering relation | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y > x`` |convertible to ``bool``|``x < y`` |``>`` is a total ordering relation | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``x >= y`` |convertible to ``bool``|``!(x < y)`` | | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y >= x`` |convertible to ``bool``|``!(y < x)`` | | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``x <= y`` |convertible to ``bool``|``!(x > y)`` | | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y <= x`` |convertible to ``bool``|``!(y > x)`` | | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y - x`` |``Distance`` |``distance(Y(x),y)`` |pre: there exists a value ``n`` of | -| | | |``Distance`` such that ``x + n == y``.| -| | | |``y == x + (y - x)``. | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``x - y`` |``Distance`` |``distance(y,Y(x))`` |pre: there exists a value ``n`` of | -| | | |``Distance`` such that ``y + n == x``.| -| | | |``x == y + (x - y)``. | -+-----------+-----------------------+---------------------+--------------------------------------+ - - - -Addition to [lib.iterator.synopsis] -=================================== - - -:: - - // lib.iterator.traits, traits and tags - template struct is_readable_iterator; - template struct iterator_traversal; - - struct incrementable_traversal_tag { }; - struct single_pass_traversal_tag : incrementable_traversal_tag { }; - struct forward_traversal_tag : single_pass_traversal_tag { }; - struct bidirectional_traversal_tag : forward_traversal_tag { }; - struct random_access_traversal_tag : bidirectional_traversal_tag { }; - -Addition to [lib.iterator.traits] -================================= - -The ``is_readable_iterator`` class -template satisfies the UnaryTypeTrait_ requirements. - -Given an iterator type ``X``, ``is_readable_iterator::value`` -yields ``true`` if, for an object ``a`` of type ``X``, ``*a`` is -convertible to ``iterator_traits::value_type``, and ``false`` -otherwise. - -``iterator_traversal::type`` is - -.. parsed-literal:: - - *category-to-traversal*\ (iterator_traits::iterator_category) - -where *category-to-traversal* is defined as follows - -.. _`category-to-traversal`: - -.. parsed-literal:: - - *category-to-traversal*\ (C) = - if (C is convertible to incrementable_traversal_tag) - return C; - else if (C is convertible to random_access_iterator_tag) - return random_access_traversal_tag; - else if (C is convertible to bidirectional_iterator_tag) - return bidirectional_traversal_tag; - else if (C is convertible to forward_iterator_tag) - return forward_traversal_tag; - else if (C is convertible to input_iterator_tag) - return single_pass_traversal_tag; - else if (C is convertible to output_iterator_tag) - return incrementable_traversal_tag; - else - *the program is ill-formed* - - -=========== - Footnotes -=========== - -.. _UnaryTypeTrait: n1519_ - -The UnaryTypeTrait concept is defined in n1519_; the LWG is -considering adding the requirement that specializations are derived -from their nested ``::type``. - -.. _n1519: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1519.htm - -.. - LocalWords: Abrahams Siek Witt const bool Sutter's WG int UL LI href Lvalue - LocalWords: ReadableIterator WritableIterator SwappableIterator cv pre iter - LocalWords: ConstantLvalueIterator MutableLvalueIterator CopyConstructible TR - LocalWords: ForwardTraversalIterator BidirectionalTraversalIterator lvalue - LocalWords: RandomAccessTraversalIterator dereferenceable Incrementable tmp - LocalWords: incrementable xxx min prev inplace png oldeqnew AccessTag struct - LocalWords: TraversalTag typename lvalues DWA Hmm JGS mis enum diff --git a/doc/oldeqnew.png b/doc/oldeqnew.png deleted file mode 100644 index 30cd159..0000000 Binary files a/doc/oldeqnew.png and /dev/null differ diff --git a/doc/permutation_iterator.html b/doc/permutation_iterator.html deleted file mode 100644 index 456940a..0000000 --- a/doc/permutation_iterator.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - -Permutation Iterator - - - - - - - -
-

Permutation Iterator

- --- - - - - - - - - - - - -
Author:Toon Knapen, David Abrahams, Roland Richter, Jeremy Siek
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu
Organization:Boost Consulting, Indiana University Open Systems -Lab
Date:2004-01-13
Copyright:Copyright Toon Knapen, David Abrahams, Roland Richter, and Jeremy Siek 2003. All rights reserved
- --- - - - -
abstract:The permutation iterator adaptor provides a permuted view of a given -range. That is, the view includes every element of the given range but -in a potentially different order.
- -
-

Introduction

-

The adaptor takes two arguments:

-
-
    -
  • an iterator to the range V on which the permutation -will be applied
  • -
  • the reindexing scheme that defines how the -elements of V will be permuted.
  • -
-
-

Note that the permutation iterator is not limited to strict -permutations of the given range V. The distance between begin and end -of the reindexing iterators is allowed to be smaller compared to the -size of the range V, in which case the permutation iterator only -provides a permutation of a subrange of V. The indexes neither need -to be unique. In this same context, it must be noted that the past the -end permutation iterator is completely defined by means of the -past-the-end iterator to the indices.

-
-
-

Reference

-
-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)
-
-
-
-

Example

-
-using namespace boost;
-int i = 0;
-
-typedef std::vector< int > element_range_type;
-typedef std::list< int > index_type;
-
-static const int element_range_size = 10;
-static const int index_size = 4;
-
-element_range_type elements( element_range_size );
-for(element_range_type::iterator el_it = elements.begin() ; el_it != elements.end() ; ++el_it)
-  *el_it = std::distance(elements.begin(), el_it);
-
-index_type indices( index_size );
-for(index_type::iterator i_it = indices.begin() ; i_it != indices.end() ; ++i_it ) 
-  *i_it = element_range_size - index_size + std::distance(indices.begin(), i_it);
-std::reverse( indices.begin(), indices.end() );
-
-typedef permutation_iterator< element_range_type::iterator, index_type::iterator > permutation_type;
-permutation_type begin = make_permutation_iterator( elements.begin(), indices.begin() );
-permutation_type it = begin;
-permutation_type end = make_permutation_iterator( elements.begin(), indices.end() );
-
-std::cout << "The original range is : ";
-std::copy( elements.begin(), elements.end(), std::ostream_iterator< int >( std::cout, " " ) );
-std::cout << "\n";
-
-std::cout << "The reindexing scheme is : ";
-std::copy( indices.begin(), indices.end(), std::ostream_iterator< int >( std::cout, " " ) );
-std::cout << "\n";
-
-std::cout << "The permutated range is : ";
-std::copy( begin, end, std::ostream_iterator< int >( std::cout, " " ) );
-std::cout << "\n";
-
-std::cout << "Elements at even indices in the permutation : ";
-it = begin;
-for(i = 0; i < index_size / 2 ; ++i, it+=2 ) std::cout << *it << " ";
-std::cout << "\n";
-
-std::cout << "Permutation backwards : ";
-it = begin + (index_size);
-assert( it != begin );
-for( ; it-- != begin ; ) std::cout << *it << " ";
-std::cout << "\n";
-
-std::cout << "Iterate backward with stride 2 : ";
-it = begin + (index_size - 1);
-for(i = 0 ; i < index_size / 2 ; ++i, it-=2 ) std::cout << *it << " ";
-std::cout << "\n";
-
-

The output is:

-
-The original range is : 0 1 2 3 4 5 6 7 8 9 
-The reindexing scheme is : 9 8 7 6 
-The permutated range is : 9 8 7 6 
-Elements at even indices in the permutation : 9 7 
-Permutation backwards : 6 7 8 9 
-Iterate backward with stride 2 : 6 8 
-
-

The source code for this example can be found here.

-
-
- - - - diff --git a/doc/permutation_iterator.pdf b/doc/permutation_iterator.pdf deleted file mode 100755 index 509e8b4..0000000 Binary files a/doc/permutation_iterator.pdf and /dev/null differ diff --git a/doc/permutation_iterator.rst b/doc/permutation_iterator.rst deleted file mode 100644 index 11fa6e1..0000000 --- a/doc/permutation_iterator.rst +++ /dev/null @@ -1,37 +0,0 @@ -++++++++++++++++++++++ - Permutation Iterator -++++++++++++++++++++++ - -:Author: Toon Knapen, David Abrahams, Roland Richter, Jeremy Siek -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_ -:date: $Date$ -:copyright: Copyright Toon Knapen, David Abrahams, Roland Richter, and Jeremy Siek 2003. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu - -:abstract: - - .. include:: permutation_iterator_abstract.rst - -.. contents:: Table of Contents - - -Introduction -============ - -.. include:: permutation_iterator_body.rst - - -Reference -========= - -.. include:: permutation_iterator_ref.rst - - -Example -======= - -.. include:: permutation_iterator_eg.rst diff --git a/doc/permutation_iterator_abstract.rst b/doc/permutation_iterator_abstract.rst deleted file mode 100644 index 578b3ed..0000000 --- a/doc/permutation_iterator_abstract.rst +++ /dev/null @@ -1,4 +0,0 @@ -The permutation iterator adaptor provides a permuted view of a given -range. That is, the view includes every element of the given range but -in a potentially different order. - diff --git a/doc/permutation_iterator_body.rst b/doc/permutation_iterator_body.rst deleted file mode 100644 index 0f838e7..0000000 --- a/doc/permutation_iterator_body.rst +++ /dev/null @@ -1,15 +0,0 @@ -The adaptor takes two arguments: - - * an iterator to the range V on which the permutation - will be applied - * the reindexing scheme that defines how the - elements of V will be permuted. - -Note that the permutation iterator is not limited to strict -permutations of the given range V. The distance between begin and end -of the reindexing iterators is allowed to be smaller compared to the -size of the range V, in which case the permutation iterator only -provides a permutation of a subrange of V. The indexes neither need -to be unique. In this same context, it must be noted that the past the -end permutation iterator is completely defined by means of the -past-the-end iterator to the indices. diff --git a/doc/permutation_iterator_eg.rst b/doc/permutation_iterator_eg.rst deleted file mode 100644 index b493c7a..0000000 --- a/doc/permutation_iterator_eg.rst +++ /dev/null @@ -1,67 +0,0 @@ -:: - - using namespace boost; - int i = 0; - - typedef std::vector< int > element_range_type; - typedef std::list< int > index_type; - - static const int element_range_size = 10; - static const int index_size = 4; - - element_range_type elements( element_range_size ); - for(element_range_type::iterator el_it = elements.begin() ; el_it != elements.end() ; ++el_it) - *el_it = std::distance(elements.begin(), el_it); - - index_type indices( index_size ); - for(index_type::iterator i_it = indices.begin() ; i_it != indices.end() ; ++i_it ) - *i_it = element_range_size - index_size + std::distance(indices.begin(), i_it); - std::reverse( indices.begin(), indices.end() ); - - typedef permutation_iterator< element_range_type::iterator, index_type::iterator > permutation_type; - permutation_type begin = make_permutation_iterator( elements.begin(), indices.begin() ); - permutation_type it = begin; - permutation_type end = make_permutation_iterator( elements.begin(), indices.end() ); - - std::cout << "The original range is : "; - std::copy( elements.begin(), elements.end(), std::ostream_iterator< int >( std::cout, " " ) ); - std::cout << "\n"; - - std::cout << "The reindexing scheme is : "; - std::copy( indices.begin(), indices.end(), std::ostream_iterator< int >( std::cout, " " ) ); - std::cout << "\n"; - - std::cout << "The permutated range is : "; - std::copy( begin, end, std::ostream_iterator< int >( std::cout, " " ) ); - std::cout << "\n"; - - std::cout << "Elements at even indices in the permutation : "; - it = begin; - for(i = 0; i < index_size / 2 ; ++i, it+=2 ) std::cout << *it << " "; - std::cout << "\n"; - - std::cout << "Permutation backwards : "; - it = begin + (index_size); - assert( it != begin ); - for( ; it-- != begin ; ) std::cout << *it << " "; - std::cout << "\n"; - - std::cout << "Iterate backward with stride 2 : "; - it = begin + (index_size - 1); - for(i = 0 ; i < index_size / 2 ; ++i, it-=2 ) std::cout << *it << " "; - std::cout << "\n"; - - -The output is:: - - The original range is : 0 1 2 3 4 5 6 7 8 9 - The reindexing scheme is : 9 8 7 6 - The permutated range is : 9 8 7 6 - Elements at even indices in the permutation : 9 7 - Permutation backwards : 6 7 8 9 - Iterate backward with stride 2 : 6 8 - - -The source code for this example can be found `here`__. - -__ ../example/permutation_iterator_example.cpp diff --git a/doc/permutation_iterator_ref.rst b/doc/permutation_iterator_ref.rst deleted file mode 100644 index c29f285..0000000 --- a/doc/permutation_iterator_ref.rst +++ /dev/null @@ -1,126 +0,0 @@ -.. 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 const& r - , typename enable_if_convertible::type* = 0 - , typename enable_if_convertible::type* = 0 - ); - reference operator*() const; - permutation_iterator& operator++(); - ElementIterator const& base() const; - private: - ElementIterator m_elt; // exposition only - IndexIterator m_order; // exposition only - }; - - template - permutation_iterator - 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`` is interoperable -with ``permutation_iterator`` 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 const& r - , typename enable_if_convertible::type* = 0 - , typename enable_if_convertible::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 - permutation_iterator - make_permutation_iterator(ElementIterator e, IndexIterator i); - -:Returns: ``permutation_iterator(e, i)`` - diff --git a/doc/pointee.html b/doc/pointee.html deleted file mode 100755 index 63d2261..0000000 --- a/doc/pointee.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - -pointee and indirect_reference - - - - - - - -
-

pointee and indirect_reference

- --- - - - - - - - - - - - -
Author:David Abrahams
Contact:dave@boost-consulting.com
Organization:Boost Consulting
Date:2004-01-29
Copyright:Copyright David Abrahams 2004. All rights reserved
- --- - - - -
abstract:Provides the capability to deduce the referent types of -pointers, smart pointers and iterators in generic code.
-
-

Overview

-

Have you ever wanted to write a generic function that can operate -on any kind of dereferenceable object? If you have, you've -probably run into the problem of how to determine the type that the -object "points at":

-
-template <class Dereferenceable>
-void f(Dereferenceable p)
-{
-    what-goes-here? value = *p;
-    ...
-}
-
-
-

pointee

-

It turns out to be impossible to come up with a fully-general -algorithm to do determine what-goes-here directly, but it is -possible to require that pointee<Dereferenceable>::type is -correct. Naturally, pointee has the same difficulty: it can't -determine the appropriate ::type reliably for all -Dereferenceables, but it makes very good guesses (it works -for all pointers, standard and boost smart pointers, and -iterators), and when it guesses wrongly, it can be specialized as -neccessary:

-
-namespace boost
-{
-  template <class T>
-  struct pointee<third_party_lib::smart_pointer<T> >
-  {
-      typedef T type;
-  };
-}
-
-
-
-

indirect_reference

-

indirect_reference<T>::type is rather more specialized than -pointee, and is meant to be used to forward the result of -dereferencing an object of its argument type. Most dereferenceable -types just return a reference to their pointee, but some return -proxy references or return the pointee by value. When that -information is needed, call on indirect_reference.

-

Both of these templates are essential to the correct functioning of -indirect_iterator.

-
-
-
-

Reference

-
-

pointee

- - - -
-template <class Dereferenceable>
-struct pointee
-{
-    typedef /* see below */ type;
-};
-
- --- - - - -
Requires:For an object x of type Dereferenceable, *x -is well-formed. If ++x is ill-formed it shall neither be -ambiguous nor shall it violate access control, and -Dereferenceable::element_type shall be an accessible type. -Otherwise iterator_traits<Dereferenceable>::value_type shall -be well formed. [Note: These requirements need not apply to -explicit or partial specializations of pointee]
-

type is determined according to the following algorithm, where -x is an object of type Dereferenceable:

-
-if ( ++x is ill-formed )
-{
-    return ``Dereferenceable::element_type``
-}
-else if (``*x`` is a mutable reference to
-         std::iterator_traits<Dereferenceable>::value_type)
-{
-    return iterator_traits<Dereferenceable>::value_type
-}
-else
-{
-    return iterator_traits<Dereferenceable>::value_type const
-}
-
-
-
-

indirect_reference

- - - -
-template <class Dereferenceable>
-struct indirect_reference
-{
-    typedef /* see below */ type;
-};
-
- --- - - - -
Requires:For an object x of type Dereferenceable, *x -is well-formed. If ++x is ill-formed it shall neither be -ambiguous nor shall it violate access control, and -pointee<Dereferenceable>::type& shall be well-formed. -Otherwise iterator_traits<Dereferenceable>::reference shall -be well formed. [Note: These requirements need not apply to -explicit or partial specializations of indirect_reference]
-

type is determined according to the following algorithm, where -x is an object of type Dereferenceable:

-
-if ( ++x is ill-formed )
-    return ``pointee<Dereferenceable>::type&``
-else
-    std::iterator_traits<Dereferenceable>::reference
-
-
-
-
- - - - diff --git a/doc/pointee.pdf b/doc/pointee.pdf deleted file mode 100755 index dcf28b9..0000000 Binary files a/doc/pointee.pdf and /dev/null differ diff --git a/doc/pointee.rst b/doc/pointee.rst deleted file mode 100755 index 8e0e6e4..0000000 --- a/doc/pointee.rst +++ /dev/null @@ -1,84 +0,0 @@ -++++++++++++++++++++++++++++++++++++++++ - ``pointee`` and ``indirect_reference`` -++++++++++++++++++++++++++++++++++++++++ - -:Author: David Abrahams -:Contact: dave@boost-consulting.com -:organization: `Boost Consulting`_ -:date: $Date$ -:copyright: Copyright David Abrahams 2004. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com - -:abstract: Provides the capability to deduce the referent types of - pointers, smart pointers and iterators in generic code. - -Overview -======== - -Have you ever wanted to write a generic function that can operate -on any kind of dereferenceable object? If you have, you've -probably run into the problem of how to determine the type that the -object "points at": - -.. parsed-literal:: - - template - void f(Dereferenceable p) - { - *what-goes-here?* value = \*p; - ... - } - - -``pointee`` ------------ - -It turns out to be impossible to come up with a fully-general -algorithm to do determine *what-goes-here* directly, but it is -possible to require that ``pointee::type`` is -correct. Naturally, ``pointee`` has the same difficulty: it can't -determine the appropriate ``::type`` reliably for all -``Dereferenceable``\ s, but it makes very good guesses (it works -for all pointers, standard and boost smart pointers, and -iterators), and when it guesses wrongly, it can be specialized as -neccessary:: - - namespace boost - { - template - struct pointee > - { - typedef T type; - }; - } - -``indirect_reference`` ----------------------- - -``indirect_reference::type`` is rather more specialized than -``pointee``, and is meant to be used to forward the result of -dereferencing an object of its argument type. Most dereferenceable -types just return a reference to their pointee, but some return -proxy references or return the pointee by value. When that -information is needed, call on ``indirect_reference``. - -Both of these templates are essential to the correct functioning of -|indirect_iterator|_. - -.. |indirect_iterator| replace:: ``indirect_iterator`` -.. _indirect_iterator: indirect_iterator.html - -Reference -========= - -``pointee`` ------------ - -.. include:: pointee_ref.rst - -``indirect_reference`` ----------------------- - -.. include:: indirect_reference_ref.rst - diff --git a/doc/pointee_ref.rst b/doc/pointee_ref.rst deleted file mode 100755 index 19aed24..0000000 --- a/doc/pointee_ref.rst +++ /dev/null @@ -1,38 +0,0 @@ -.. Copyright David Abrahams 2004. 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) - -:: - - template - struct pointee - { - typedef /* see below */ type; - }; - -:Requires: For an object ``x`` of type ``Dereferenceable``, ``*x`` - is well-formed. If ``++x`` is ill-formed it shall neither be - ambiguous nor shall it violate access control, and - ``Dereferenceable::element_type`` shall be an accessible type. - Otherwise ``iterator_traits::value_type`` shall - be well formed. [Note: These requirements need not apply to - explicit or partial specializations of ``pointee``] - -``type`` is determined according to the following algorithm, where -``x`` is an object of type ``Dereferenceable``:: - - if ( ++x is ill-formed ) - { - return ``Dereferenceable::element_type`` - } - else if (``*x`` is a mutable reference to - std::iterator_traits::value_type) - { - return iterator_traits::value_type - } - else - { - return iterator_traits::value_type const - } - - \ No newline at end of file diff --git a/doc/ref_problem.html b/doc/ref_problem.html deleted file mode 100755 index 5cafc68..0000000 --- a/doc/ref_problem.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - -Problem with reference and old/new iterator category correspondance - - - -
-

Problem with reference and old/new iterator category correspondance

- --- - - - - - - - - - - - -
Author:David Abrahams and Jeremy Siek
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu
Organization:Boost Consulting, Indiana University Bloomington
date:$Date$
Copyright:Copyright David Abrahams, Jeremy Siek 2003. 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)
-
-

Introduction

-

The new iterator categories are intended to correspond to the old -iterator categories, as specified in a diagram in N1550. For example, -an iterator categorized as a mutable Forward Iterator under the old -scheme is now a Writable, Lvalue, and Foward Traversal iterator. -However, there is a problem with this correspondance, the new iterator -categories place requirements on the iterator_traits<X>::reference -type whereas the standard iterator requirements say nothing about the -reference type . In particular, the new Readable Iterator -requirements say that the return type of *a must be -iterator_traits<X>::reference and the Lvalue Iterator requirements -says that iterator_traits<X>::reference must be T& or const -T&.

-
-
-

Proposed Resolution

-

Change the standard requirements to match the requirements of the new -iterators. (more details to come)

-
-
-

Rationale

-

The lack of specification in the standard of the reference type is -certainly a defect. Without specification, it is entirely useless in a -generic function. The current practice in the community is generally -to assume there are requirements on the reference type, such as -those proposed in the new iterator categories.

-

There is some danger in adding requirements to existing concepts. -This will mean that some existing iterator types will no longer meet -the iterator requirements. However, we feel that the impact of this is -small enough to warrant going ahead with this change.

-

An alternative solution would be to leave the standard requirements as -is, and to remove the requirements for the reference type in the -new iterator concepts. We are not in favor of this approach because it -extends what we see as a defect further into the future.

-
-
- - diff --git a/doc/ref_problem.rst b/doc/ref_problem.rst deleted file mode 100644 index 2f2908a..0000000 --- a/doc/ref_problem.rst +++ /dev/null @@ -1,63 +0,0 @@ -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - Problem with ``reference`` and old/new iterator category correspondance -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -.. _N1550: http://www.boost-consulting.com/writing/n1550.html -.. _N1530: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1530.html - -:Author: David Abrahams and Jeremy Siek -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu -:Organization: `Boost Consulting`_, Indiana University Bloomington -:date: $Date$ -:Copyright: Copyright David Abrahams, Jeremy Siek 2003. 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) - -.. _`Boost Consulting`: http://www.boost-consulting.com - -============== - Introduction -============== - -The new iterator categories are intended to correspond to the old -iterator categories, as specified in a diagram in N1550_. For example, -an iterator categorized as a mutable Forward Iterator under the old -scheme is now a Writable, Lvalue, and Foward Traversal iterator. -However, there is a problem with this correspondance, the new iterator -categories place requirements on the ``iterator_traits::reference`` -type whereas the standard iterator requirements say nothing about the -``reference`` type . In particular, the new Readable Iterator -requirements say that the return type of ``*a`` must be -``iterator_traits::reference`` and the Lvalue Iterator requirements -says that ``iterator_traits::reference`` must be ``T&`` or ``const -T&``. - - -==================== - Proposed Resolution -==================== - -Change the standard requirements to match the requirements of the new -iterators. (more details to come) - - -========== - Rationale -========== - -The lack of specification in the standard of the ``reference`` type is -certainly a defect. Without specification, it is entirely useless in a -generic function. The current practice in the community is generally -to assume there are requirements on the ``reference`` type, such as -those proposed in the new iterator categories. - -There is some danger in *adding* requirements to existing concepts. -This will mean that some existing iterator types will no longer meet -the iterator requirements. However, we feel that the impact of this is -small enough to warrant going ahead with this change. - -An alternative solution would be to leave the standard requirements as -is, and to remove the requirements for the ``reference`` type in the -new iterator concepts. We are not in favor of this approach because it -extends what we see as a defect further into the future. diff --git a/doc/reverse_iterator.html b/doc/reverse_iterator.html deleted file mode 100644 index a867521..0000000 --- a/doc/reverse_iterator.html +++ /dev/null @@ -1,281 +0,0 @@ - - - - - - -Reverse Iterator - - - - - - - -
-

Reverse Iterator

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization:Boost Consulting, Indiana University Open Systems -Lab, University of Hanover Institute for Transport -Railway Operation and Construction
Date:2004-01-13
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved
- --- - - - -
abstract:The reverse iterator adaptor iterates through the adapted iterator -range in the opposite direction.
- -
-

reverse_iterator synopsis

-
-template <class Iterator>
-class reverse_iterator
-{
-public:
-  typedef iterator_traits<Iterator>::value_type value_type;
-  typedef iterator_traits<Iterator>::reference reference;
-  typedef iterator_traits<Iterator>::pointer pointer;
-  typedef iterator_traits<Iterator>::difference_type difference_type;
-  typedef /* see below */ iterator_category;
-
-  reverse_iterator() {}
-  explicit reverse_iterator(Iterator x) ;
-
-  template<class OtherIterator>
-  reverse_iterator(
-      reverse_iterator<OtherIterator> const& r
-    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-  );
-  Iterator const& base() const;
-  reference operator*() const;
-  reverse_iterator& operator++();
-  reverse_iterator& operator--();
-private:
-  Iterator m_iterator; // exposition
-};
-
-

If Iterator models Random Access Traversal Iterator and Readable -Lvalue Iterator, then iterator_category is convertible to -random_access_iterator_tag. Otherwise, if -Iterator models Bidirectional Traversal Iterator and Readable -Lvalue Iterator, then iterator_category is convertible to -bidirectional_iterator_tag. Otherwise, iterator_category is -convertible to input_iterator_tag.

-
-
-

reverse_iterator requirements

-

Iterator must be a model of Bidirectional Traversal Iterator. The -type iterator_traits<Iterator>::reference must be the type of -*i, where i is an object of type Iterator.

-
-
-

reverse_iterator models

-

A specialization of reverse_iterator models the same iterator -traversal and iterator access concepts modeled by its Iterator -argument. In addition, it may model old iterator concepts -specified in the following table:

- ---- - - - - - - - - - - - - - - - - - - - -
If I modelsthen reverse_iterator<I> models
Readable Lvalue Iterator, -Bidirectional Traversal IteratorBidirectional Iterator
Writable Lvalue Iterator, -Bidirectional Traversal IteratorMutable Bidirectional Iterator
Readable Lvalue Iterator, -Random Access Traversal IteratorRandom Access Iterator
Writable Lvalue Iterator, -Random Access Traversal IteratorMutable Random Access Iterator
-

reverse_iterator<X> is interoperable with -reverse_iterator<Y> if and only if X is interoperable with -Y.

-
-
-

reverse_iterator operations

-

In addition to the operations required by the concepts modeled by -reverse_iterator, reverse_iterator provides the following -operations.

-

reverse_iterator();

- --- - - - - - -
Requires:Iterator must be Default Constructible.
Effects:Constructs an instance of reverse_iterator with m_iterator -default constructed.
-

explicit reverse_iterator(Iterator x);

- --- - - - -
Effects:Constructs an instance of reverse_iterator with -m_iterator copy constructed from x.
-
-template<class OtherIterator>
-reverse_iterator(
-    reverse_iterator<OtherIterator> const& r
-  , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-);
-
- --- - - - - - -
Requires:OtherIterator is implicitly convertible to Iterator.
Effects:Constructs instance of reverse_iterator whose -m_iterator subobject is constructed from y.base().
-

Iterator const& base() const;

- --- - - - -
Returns:m_iterator
-

reference operator*() const;

- --- - - - -
Effects:
-
-Iterator tmp = m_iterator;
-return *--tmp;
-
-

reverse_iterator& operator++();

- --- - - - - - -
Effects:--m_iterator
Returns:*this
-

reverse_iterator& operator--();

- --- - - - - - -
Effects:++m_iterator
Returns:*this
-
-template <class BidirectionalIterator>
-reverse_iterator<BidirectionalIterator>n
-make_reverse_iterator(BidirectionalIterator x);
-
- --- - - - -
Returns:An instance of reverse_iterator<BidirectionalIterator> -with a current constructed from x.
-
-
-

Example

-

The following example prints an array of characters in reverse order -using reverse_iterator.

-
-char letters_[] = "hello world!";
-const int N = sizeof(letters_)/sizeof(char) - 1;
-typedef char* base_iterator;
-base_iterator letters(letters_);
-std::cout << "original sequence of letters:\t\t\t" << letters_ << std::endl;
-
-boost::reverse_iterator<base_iterator>
-  reverse_letters_first(letters + N),
-  reverse_letters_last(letters);
-
-std::cout << "sequence in reverse order:\t\t\t";
-std::copy(reverse_letters_first, reverse_letters_last,
-          std::ostream_iterator<char>(std::cout));
-std::cout << std::endl;
-
-std::cout << "sequence in double-reversed (normal) order:\t";
-std::copy(boost::make_reverse_iterator(reverse_letters_last),
-          boost::make_reverse_iterator(reverse_letters_first),
-          std::ostream_iterator<char>(std::cout));
-std::cout << std::endl;
-
-

The output is:

-
-original sequence of letters:                   hello world!
-sequence in reverse order:                      !dlrow olleh
-sequence in double-reversed (normal) order:     hello world!
-
-

The source code for this example can be found here.

-
-
- - - - diff --git a/doc/reverse_iterator.pdf b/doc/reverse_iterator.pdf deleted file mode 100755 index 041a4b2..0000000 Binary files a/doc/reverse_iterator.pdf and /dev/null differ diff --git a/doc/reverse_iterator.rst b/doc/reverse_iterator.rst deleted file mode 100644 index 0f4979b..0000000 --- a/doc/reverse_iterator.rst +++ /dev/null @@ -1,29 +0,0 @@ -++++++++++++++++++ - Reverse Iterator -++++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, University of Hanover `Institute for Transport - Railway Operation and Construction`_ -:date: $Date$ -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de - -:abstract: - - .. include:: reverse_iterator_abstract.rst - -.. contents:: Table of Contents - -``reverse_iterator`` synopsis -............................. - -.. include:: reverse_iterator_ref.rst -.. include:: make_reverse_iterator.rst - -.. include:: reverse_iterator_eg.rst diff --git a/doc/reverse_iterator_abstract.rst b/doc/reverse_iterator_abstract.rst deleted file mode 100644 index a4caee5..0000000 --- a/doc/reverse_iterator_abstract.rst +++ /dev/null @@ -1,9 +0,0 @@ - -The reverse iterator adaptor iterates through the adapted iterator -range in the opposite direction. - - - - - - diff --git a/doc/reverse_iterator_eg.rst b/doc/reverse_iterator_eg.rst deleted file mode 100644 index 7923f2f..0000000 --- a/doc/reverse_iterator_eg.rst +++ /dev/null @@ -1,42 +0,0 @@ - -Example -....... - -The following example prints an array of characters in reverse order -using ``reverse_iterator``. - -:: - - char letters_[] = "hello world!"; - const int N = sizeof(letters_)/sizeof(char) - 1; - typedef char* base_iterator; - base_iterator letters(letters_); - std::cout << "original sequence of letters:\t\t\t" << letters_ << std::endl; - - boost::reverse_iterator - reverse_letters_first(letters + N), - reverse_letters_last(letters); - - std::cout << "sequence in reverse order:\t\t\t"; - std::copy(reverse_letters_first, reverse_letters_last, - std::ostream_iterator(std::cout)); - std::cout << std::endl; - - std::cout << "sequence in double-reversed (normal) order:\t"; - std::copy(boost::make_reverse_iterator(reverse_letters_last), - boost::make_reverse_iterator(reverse_letters_first), - std::ostream_iterator(std::cout)); - std::cout << std::endl; - - - -The output is:: - - original sequence of letters: hello world! - sequence in reverse order: !dlrow olleh - sequence in double-reversed (normal) order: hello world! - - -The source code for this example can be found `here`__. - -__ ../example/reverse_iterator_example.cpp diff --git a/doc/reverse_iterator_ref.rst b/doc/reverse_iterator_ref.rst deleted file mode 100644 index 36b93d6..0000000 --- a/doc/reverse_iterator_ref.rst +++ /dev/null @@ -1,137 +0,0 @@ -:: - - template - class reverse_iterator - { - public: - typedef iterator_traits::value_type value_type; - typedef iterator_traits::reference reference; - typedef iterator_traits::pointer pointer; - typedef iterator_traits::difference_type difference_type; - typedef /* see below */ iterator_category; - - reverse_iterator() {} - explicit reverse_iterator(Iterator x) ; - - template - reverse_iterator( - reverse_iterator const& r - , typename enable_if_convertible::type* = 0 // exposition - ); - Iterator const& base() const; - reference operator*() const; - reverse_iterator& operator++(); - reverse_iterator& operator--(); - private: - Iterator m_iterator; // exposition - }; - - -If ``Iterator`` models Random Access Traversal Iterator and Readable -Lvalue Iterator, then ``iterator_category`` is convertible to -``random_access_iterator_tag``. Otherwise, if -``Iterator`` models Bidirectional Traversal Iterator and Readable -Lvalue Iterator, then ``iterator_category`` is convertible to -``bidirectional_iterator_tag``. Otherwise, ``iterator_category`` is -convertible to ``input_iterator_tag``. - - - -``reverse_iterator`` requirements -................................. - -``Iterator`` must be a model of Bidirectional Traversal Iterator. The -type ``iterator_traits::reference`` must be the type of -``*i``, where ``i`` is an object of type ``Iterator``. - - - -``reverse_iterator`` models -........................... - -A specialization of ``reverse_iterator`` models the same iterator -traversal and iterator access concepts modeled by its ``Iterator`` -argument. In addition, it may model old iterator concepts -specified in the following table: - -+---------------------------------------+-----------------------------------+ -| If ``I`` models |then ``reverse_iterator`` models| -+=======================================+===================================+ -| Readable Lvalue Iterator, | Bidirectional Iterator | -| Bidirectional Traversal Iterator | | -+---------------------------------------+-----------------------------------+ -| Writable Lvalue Iterator, | Mutable Bidirectional Iterator | -| Bidirectional Traversal Iterator | | -+---------------------------------------+-----------------------------------+ -| Readable Lvalue Iterator, | Random Access Iterator | -| Random Access Traversal Iterator | | -+---------------------------------------+-----------------------------------+ -| Writable Lvalue Iterator, | Mutable Random Access Iterator | -| Random Access Traversal Iterator | | -+---------------------------------------+-----------------------------------+ - - -``reverse_iterator`` is interoperable with -``reverse_iterator`` if and only if ``X`` is interoperable with -``Y``. - -``reverse_iterator`` operations -............................... - -In addition to the operations required by the concepts modeled by -``reverse_iterator``, ``reverse_iterator`` provides the following -operations. - - - -``reverse_iterator();`` - -:Requires: ``Iterator`` must be Default Constructible. -:Effects: Constructs an instance of ``reverse_iterator`` with ``m_iterator`` - default constructed. - -``explicit reverse_iterator(Iterator x);`` - -:Effects: Constructs an instance of ``reverse_iterator`` with - ``m_iterator`` copy constructed from ``x``. - - -:: - - template - reverse_iterator( - reverse_iterator const& r - , typename enable_if_convertible::type* = 0 // exposition - ); - -:Requires: ``OtherIterator`` is implicitly convertible to ``Iterator``. -:Effects: Constructs instance of ``reverse_iterator`` whose - ``m_iterator`` subobject is constructed from ``y.base()``. - - - -``Iterator const& base() const;`` - -:Returns: ``m_iterator`` - - -``reference operator*() const;`` - -:Effects: - -:: - - Iterator tmp = m_iterator; - return *--tmp; - - -``reverse_iterator& operator++();`` - -:Effects: ``--m_iterator`` -:Returns: ``*this`` - - -``reverse_iterator& operator--();`` - -:Effects: ``++m_iterator`` -:Returns: ``*this`` diff --git a/doc/rst2html b/doc/rst2html deleted file mode 100755 index bd8dc8f..0000000 --- a/doc/rst2html +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -PYTHONPATH="c:/src/docutils/docutils;c:/src/docutils/docutils/extras" -export PYTHONPATH -python c:/src/docutils/docutils/tools/html.py -gs $1 `echo $1 | sed 's/\(.*\)\..*/\1.html/'` - - - diff --git a/doc/rst2latex b/doc/rst2latex deleted file mode 100755 index 795610c..0000000 --- a/doc/rst2latex +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -PYTHONPATH="c:/src/docutils/docutils;c:/src/docutils/docutils/extras" -export PYTHONPATH -python c:/src/docutils/docutils/tools/rst2latex.py --documentoptions pdftex --stylesheet=docutils.sty --embed-stylesheet $1 `echo $1 | sed 's/\(.*\)\..*/\1.tex/'` diff --git a/doc/scanrst.py b/doc/scanrst.py deleted file mode 100644 index 484d879..0000000 --- a/doc/scanrst.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright David Abrahams 2004. 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) - -# This script accepts a list of .rst files to be processed and -# generates Makefile dependencies for .html and .rst files to stdout. -import os,sys -import re - -include = re.compile(r' *\.\. +(include|image):: +(.*)', re.MULTILINE) - -def deps(path, found): - dir = os.path.split(path)[0] - for m in re.findall(include, open(path).read()): - - dependency = os.path.normpath(os.path.join(dir,m[1])) - if dependency not in found: - found[dependency] = 1 - - if m[0] == 'include': - deps(dependency, found) - - return found - -for file in sys.argv[1:]: - found = deps(file, {}) - if found: - base = os.path.splitext(os.path.basename(file))[0] - print '%s.tex %s.html: %s' % (base, base, ' '.join(found.keys())) diff --git a/doc/sources.py b/doc/sources.py deleted file mode 100644 index 5f954a5..0000000 --- a/doc/sources.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright David Abrahams 2004. 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) - -sources = [ -'counting_iterator.rst', -'facade-and-adaptor.rst', -'filter_iterator.rst', -'function_output_iterator.rst', -'index.rst', -'indirect_iterator.rst', -'pointee.rst', -'iterator_adaptor.rst', -'iterator_facade.rst', -'new-iter-concepts.rst', -'permutation_iterator.rst', -'reverse_iterator.rst', -'transform_iterator.rst', -'zip_iterator.rst', -'iterator_archetypes.rst', -'iterator_concepts.rst', -'iterator_traits.rst' - ] - diff --git a/doc/syscmd.py b/doc/syscmd.py deleted file mode 100644 index e6a8dca..0000000 --- a/doc/syscmd.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright David Abrahams 2004. 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) - -import os -import sys - -def syscmd(s): - print 'executing: ', repr(s) - sys.stdout.flush() - err = os.system(s) - if err: - raise SystemError, 'command: %s returned %s' % ( - repr(s), err) diff --git a/doc/transform_iterator.html b/doc/transform_iterator.html deleted file mode 100644 index 5200a7d..0000000 --- a/doc/transform_iterator.html +++ /dev/null @@ -1,330 +0,0 @@ - - - - - - -Transform Iterator - - - - - - - -

Transform Iterator

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization:Boost Consulting, Indiana University Open Systems -Lab, University of Hanover Institute for Transport -Railway Operation and Construction
Date:2004-01-13
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved
-
- --- - - - -
abstract:The transform iterator adapts an iterator by modifying the -operator* to apply a function object to the result of -dereferencing the iterator and returning the result.
- -
-

transform_iterator synopsis

- -
-template <class UnaryFunction,
-          class Iterator, 
-          class Reference = use_default, 
-          class Value = use_default>
-class transform_iterator
-{
-public:
-  typedef /* see below */ value_type;
-  typedef /* see below */ reference;
-  typedef /* see below */ pointer;
-  typedef iterator_traits<Iterator>::difference_type difference_type;
-  typedef /* see below */ iterator_category;
-
-  transform_iterator();
-  transform_iterator(Iterator const& x, UnaryFunction f);
-
-  template<class F2, class I2, class R2, class V2>
-  transform_iterator(
-        transform_iterator<F2, I2, R2, V2> const& t
-      , typename enable_if_convertible<I2, Iterator>::type* = 0      // exposition only
-      , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
-  );
-  UnaryFunction functor() const;
-  Iterator const& base() const;
-  reference operator*() const;
-  transform_iterator& operator++();
-  transform_iterator& operator--();
-private:
-  Iterator m_iterator; // exposition only
-  UnaryFunction m_f;   // exposition only
-};
-
-

If Reference is use_default then the reference member of -transform_iterator is -result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type. -Otherwise, reference is Reference.

-

If Value is use_default then the value_type member is -remove_cv<remove_reference<reference> >::type. Otherwise, -value_type is Value.

-

If Iterator models Readable Lvalue Iterator and if Iterator -models Random Access Traversal Iterator, then iterator_category is -convertible to random_access_iterator_tag. Otherwise, if -Iterator models Bidirectional Traversal Iterator, then -iterator_category is convertible to -bidirectional_iterator_tag. Otherwise iterator_category is -convertible to forward_iterator_tag. If Iterator does not -model Readable Lvalue Iterator then iterator_category is -convertible to input_iterator_tag.

-
-
-

transform_iterator requirements

-

The type UnaryFunction must be Assignable, Copy Constructible, and -the expression f(*i) must be valid where f is an object of -type UnaryFunction, i is an object of type Iterator, and -where the type of f(*i) must be -result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type.

-

The argument Iterator shall model Readable Iterator.

-
-
-

transform_iterator models

-

The resulting transform_iterator models the most refined of the -following that is also modeled by Iterator.

-
-
    -
  • Writable Lvalue Iterator if transform_iterator::reference is a non-const reference.
  • -
  • Readable Lvalue Iterator if transform_iterator::reference is a const reference.
  • -
  • Readable Iterator otherwise.
  • -
-
-

The transform_iterator models the most refined standard traversal -concept that is modeled by the Iterator argument.

-

If transform_iterator is a model of Readable Lvalue Iterator then -it models the following original iterator concepts depending on what -the Iterator argument models.

- ---- - - - - - - - - - - - - - - - - - - - -
If Iterator modelsthen transform_iterator models
Single Pass IteratorInput Iterator
Forward Traversal IteratorForward Iterator
Bidirectional Traversal IteratorBidirectional Iterator
Random Access Traversal IteratorRandom Access Iterator
-

If transform_iterator models Writable Lvalue Iterator then it is a -mutable iterator (as defined in the old iterator requirements).

-

transform_iterator<F1, X, R1, V1> is interoperable with -transform_iterator<F2, Y, R2, V2> if and only if X is -interoperable with Y.

-
-
-

transform_iterator operations

-

In addition to the operations required by the concepts modeled by -transform_iterator, transform_iterator provides the following -operations.

-

transform_iterator();

- --- - - - -
Returns:An instance of transform_iterator with m_f -and m_iterator default constructed.
-

transform_iterator(Iterator const& x, UnaryFunction f);

- --- - - - -
Returns:An instance of transform_iterator with m_f -initialized to f and m_iterator initialized to x.
-
-template<class F2, class I2, class R2, class V2>
-transform_iterator(
-      transform_iterator<F2, I2, R2, V2> const& t
-    , typename enable_if_convertible<I2, Iterator>::type* = 0      // exposition only
-    , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
-);
-
- --- - - - - - -
Returns:An instance of transform_iterator with m_f -initialized to t.functor() and m_iterator initialized to -t.base().
Requires:OtherIterator is implicitly convertible to Iterator.
-

UnaryFunction functor() const;

- --- - - - -
Returns:m_f
-

Iterator const& base() const;

- --- - - - -
Returns:m_iterator
-

reference operator*() const;

- --- - - - -
Returns:m_f(*m_iterator)
-

transform_iterator& operator++();

- --- - - - - - -
Effects:++m_iterator
Returns:*this
-

transform_iterator& operator--();

- --- - - - - - -
Effects:--m_iterator
Returns:*this
-
-template <class UnaryFunction, class Iterator>
-transform_iterator<UnaryFunction, Iterator>
-make_transform_iterator(Iterator it, UnaryFunction fun);
-
- --- - - - -
Returns:An instance of transform_iterator<UnaryFunction, Iterator> with m_f -initialized to f and m_iterator initialized to x.
-
-template <class UnaryFunction, class Iterator>
-transform_iterator<UnaryFunction, Iterator>
-make_transform_iterator(Iterator it);
-
- --- - - - -
Returns:An instance of transform_iterator<UnaryFunction, Iterator> with m_f -default constructed and m_iterator initialized to x.
-
-
-

Example

-

This is a simple example of using the transform_iterators class to -generate iterators that multiply (or add to) the value returned by -dereferencing the iterator. It would be cooler to use lambda library -in this example.

-
-int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
-const int N = sizeof(x)/sizeof(int);
-
-typedef boost::binder1st< std::multiplies<int> > Function;
-typedef boost::transform_iterator<Function, int*> doubling_iterator;
-
-doubling_iterator i(x, boost::bind1st(std::multiplies<int>(), 2)),
-  i_end(x + N, boost::bind1st(std::multiplies<int>(), 2));
-
-std::cout << "multiplying the array by 2:" << std::endl;
-while (i != i_end)
-  std::cout << *i++ << " ";
-std::cout << std::endl;
-
-std::cout << "adding 4 to each element in the array:" << std::endl;
-std::copy(boost::make_transform_iterator(x, boost::bind1st(std::plus<int>(), 4)),
-          boost::make_transform_iterator(x + N, boost::bind1st(std::plus<int>(), 4)),
-          std::ostream_iterator<int>(std::cout, " "));
-std::cout << std::endl;
-
-

The output is:

-
-multiplying the array by 2:
-2 4 6 8 10 12 14 16 
-adding 4 to each element in the array:
-5 6 7 8 9 10 11 12
-
-

The source code for this example can be found here.

-
-
- - - - diff --git a/doc/transform_iterator.pdf b/doc/transform_iterator.pdf deleted file mode 100755 index b178155..0000000 Binary files a/doc/transform_iterator.pdf and /dev/null differ diff --git a/doc/transform_iterator.rst b/doc/transform_iterator.rst deleted file mode 100644 index 362db85..0000000 --- a/doc/transform_iterator.rst +++ /dev/null @@ -1,28 +0,0 @@ -++++++++++++++++++++ - Transform Iterator -++++++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, University of Hanover `Institute for Transport - Railway Operation and Construction`_ -:date: $Date$ -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de - -:abstract: - - .. include:: transform_iterator_abstract.rst - -.. contents:: Table of Contents - -``transform_iterator`` synopsis -............................... - -.. include:: transform_iterator_ref.rst -.. include:: make_transform_iterator.rst -.. include:: transform_iterator_eg.rst diff --git a/doc/transform_iterator_abstract.rst b/doc/transform_iterator_abstract.rst deleted file mode 100644 index 4d40536..0000000 --- a/doc/transform_iterator_abstract.rst +++ /dev/null @@ -1,3 +0,0 @@ -The transform iterator adapts an iterator by modifying the -``operator*`` to apply a function object to the result of -dereferencing the iterator and returning the result. diff --git a/doc/transform_iterator_eg.rst b/doc/transform_iterator_eg.rst deleted file mode 100755 index a6629ca..0000000 --- a/doc/transform_iterator_eg.rst +++ /dev/null @@ -1,42 +0,0 @@ -Example -....... - -This is a simple example of using the transform_iterators class to -generate iterators that multiply (or add to) the value returned by -dereferencing the iterator. It would be cooler to use lambda library -in this example. - -:: - - int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; - const int N = sizeof(x)/sizeof(int); - - typedef boost::binder1st< std::multiplies > Function; - typedef boost::transform_iterator doubling_iterator; - - doubling_iterator i(x, boost::bind1st(std::multiplies(), 2)), - i_end(x + N, boost::bind1st(std::multiplies(), 2)); - - std::cout << "multiplying the array by 2:" << std::endl; - while (i != i_end) - std::cout << *i++ << " "; - std::cout << std::endl; - - std::cout << "adding 4 to each element in the array:" << std::endl; - std::copy(boost::make_transform_iterator(x, boost::bind1st(std::plus(), 4)), - boost::make_transform_iterator(x + N, boost::bind1st(std::plus(), 4)), - std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - -The output is:: - - multiplying the array by 2: - 2 4 6 8 10 12 14 16 - adding 4 to each element in the array: - 5 6 7 8 9 10 11 12 - - -The source code for this example can be found `here`__. - -__ ../example/transform_iterator_example.cpp diff --git a/doc/transform_iterator_ref.diff b/doc/transform_iterator_ref.diff deleted file mode 100644 index 0f2d704..0000000 --- a/doc/transform_iterator_ref.diff +++ /dev/null @@ -1,202 +0,0 @@ -Index: transform_iterator_ref.rst -=================================================================== -RCS file: /cvsroot/boost/boost/libs/iterator/doc/transform_iterator_ref.rst,v -retrieving revision 1.3 -retrieving revision 1.15 -diff -w -d -u -b -r1.3 -r1.15 ---- transform_iterator_ref.rst 21 Sep 2003 11:13:46 -0000 1.3 -+++ transform_iterator_ref.rst 15 Jan 2004 00:06:57 -0000 1.15 -@@ -1,3 +1,5 @@ -+.. Version 1.3 of this document was accepted for TR1 -+ - :: - - template - class transform_iterator - -Issue 9.37x - -- : public iterator_adaptor - { -- friend class iterator_core_access; - public: -+ typedef /* see below */ value_type; -+ typedef /* see below */ reference; -+ typedef /* see below */ pointer; -+ typedef iterator_traits::difference_type difference_type; -+ typedef /* see below */ iterator_category; -+ - transform_iterator(); - transform_iterator(Iterator const& x, UnaryFunction f); - - -Issue 9.43x - -- template -+ template - transform_iterator( -- transform_iterator const& t -- , typename enable_if_convertible::type* = 0 // exposition -+ transform_iterator const& t -+ , typename enable_if_convertible::type* = 0 // exposition only -+ , typename enable_if_convertible::type* = 0 // exposition only - ); -- - -Issues 9.37x and 9.12 - -+ Iterator const& base() const; -+ reference operator*() const; -+ transform_iterator& operator++(); -+ transform_iterator& operator--(); - private: -- typename transform_iterator::value_type dereference() const; -- UnaryFunction m_f; -+ Iterator m_iterator; // exposition only -+ UnaryFunction m_f; // exposition only - }; - - -Issue 9.41x - -+If ``Reference`` is ``use_default`` then the ``reference`` member of -+``transform_iterator`` is -+``result_of::reference)>::type``. -+Otherwise, ``reference`` is ``Reference``. -+ -+If ``Value`` is ``use_default`` then the ``value_type`` member is -+``remove_cv >::type``. Otherwise, -+``value_type`` is ``Value``. -+ -+ - -Issue 9.37x - -+If ``Iterator`` models Readable Lvalue Iterator and if ``Iterator`` -+models Random Access Traversal Iterator, then ``iterator_category`` is -+convertible to ``random_access_iterator_tag``. Otherwise, if -+``Iterator`` models Bidirectional Traversal Iterator, then -+``iterator_category`` is convertible to -+``bidirectional_iterator_tag``. Otherwise ``iterator_category`` is -+convertible to ``forward_iterator_tag``. If ``Iterator`` does not -+model Readable Lvalue Iterator then ``iterator_category`` is -+convertible to ``input_iterator_tag``. -+ -+ - ``transform_iterator`` requirements - ................................... - -@@ -34,27 +65,55 @@ - where the type of ``f(*i)`` must be - ``result_of::reference)>::type``. - - -Issue 9.37x - --The type ``Iterator`` must at least model Readable Iterator. The --resulting ``transform_iterator`` models the most refined of the -+The argument ``Iterator`` shall model Readable Iterator. -+ -+ -+``transform_iterator`` models -+............................. -+ -+The resulting ``transform_iterator`` models the most refined of the - following options that is also modeled by ``Iterator``. - -- * Writable Lvalue Iterator if ``result_of::reference)>::type`` is a non-const reference. -+ * Writable Lvalue Iterator if ``transform_iterator::reference`` is a non-const reference. - -- * Readable Lvalue Iterator if ``result_of::reference)>::type`` is a const -- reference. -+ * Readable Lvalue Iterator if ``transform_iterator::reference`` is a const reference. - - * Readable Iterator otherwise. - -- - The ``transform_iterator`` models the most refined standard traversal --concept that is modeled by ``Iterator``. -+concept that is modeled by the ``Iterator`` argument. - -Issue 9.41x - --The ``reference`` type of ``transform_iterator`` is --``result_of::reference)>::type``. --The ``value_type`` is ``remove_cv >::type``. - -Issue 9.37x. - -+If ``transform_iterator`` is a model of Readable Lvalue Iterator then -+it models the following original iterator concepts depending on what -+the ``Iterator`` argument models. - --``transform_iterator`` public operations --........................................ -++-----------------------------------+---------------------------------+ -+| If ``Iterator`` models | then ``filter_iterator`` models | -++===================================+=================================+ -+| Single Pass Iterator | Input Iterator | -++-----------------------------------+---------------------------------+ -+| Forward Traversal Iterator | Forward Iterator | -++-----------------------------------+---------------------------------+ -+| Bidirectional Traversal Iterator | Bidirectional Iterator | -++-----------------------------------+---------------------------------+ -+| Random Access Traversal Iterator | Random Access Iterator | -++-----------------------------------+---------------------------------+ -+ -+If ``transform_iterator`` models Writable Lvalue Iterator then it is a -+mutable iterator (as defined in the old iterator requirements). -+ -+``transform_iterator`` is interoperable with -+``transform_iterator`` if and only if ``X`` is -+interoperable with ``Y``. -+ -+ -+ -+``transform_iterator`` operations -+................................. -+ -+In addition to the operations required by the concepts modeled by -+``transform_iterator``, ``transform_iterator`` provides the following -+operations. - - - ``transform_iterator();`` -@@ -80,14 +139,30 @@ - :Returns: An instance of ``transform_iterator`` that is a copy of ``t``. - :Requires: ``OtherIterator`` is implicitly convertible to ``Iterator``. - -+ -+``Iterator const& base() const;`` -+ -+:Returns: ``m_iterator`` -+ -+ - ``UnaryFunction functor() const;`` - - :Returns: ``m_f`` - --``transform_iterator`` private operations --......................................... - --``typename transform_iterator::value_type dereference() const;`` -+``reference operator*() const;`` - --:Returns: ``m_f(transform_iterator::dereference());`` -+:Returns: ``m_f(*m_iterator)`` -+ -+ -+``transform_iterator& operator++();`` -+ -+:Effects: ``++m_iterator`` -+:Returns: ``*this`` -+ -+ -+``transform_iterator& operator--();`` -+ -+:Effects: ``--m_iterator`` -+:Returns: ``*this`` - diff --git a/doc/transform_iterator_ref.rst b/doc/transform_iterator_ref.rst deleted file mode 100644 index 58f6f26..0000000 --- a/doc/transform_iterator_ref.rst +++ /dev/null @@ -1,171 +0,0 @@ -.. Version 1.3 of this document was accepted for TR1 - -:: - - template - class transform_iterator - { - public: - typedef /* see below */ value_type; - typedef /* see below */ reference; - typedef /* see below */ pointer; - typedef iterator_traits::difference_type difference_type; - typedef /* see below */ iterator_category; - - transform_iterator(); - transform_iterator(Iterator const& x, UnaryFunction f); - - template - transform_iterator( - transform_iterator const& t - , typename enable_if_convertible::type* = 0 // exposition only - , typename enable_if_convertible::type* = 0 // exposition only - ); - UnaryFunction functor() const; - Iterator const& base() const; - reference operator*() const; - transform_iterator& operator++(); - transform_iterator& operator--(); - private: - Iterator m_iterator; // exposition only - UnaryFunction m_f; // exposition only - }; - - -If ``Reference`` is ``use_default`` then the ``reference`` member of -``transform_iterator`` is -``result_of::reference)>::type``. -Otherwise, ``reference`` is ``Reference``. - -If ``Value`` is ``use_default`` then the ``value_type`` member is -``remove_cv >::type``. Otherwise, -``value_type`` is ``Value``. - - -If ``Iterator`` models Readable Lvalue Iterator and if ``Iterator`` -models Random Access Traversal Iterator, then ``iterator_category`` is -convertible to ``random_access_iterator_tag``. Otherwise, if -``Iterator`` models Bidirectional Traversal Iterator, then -``iterator_category`` is convertible to -``bidirectional_iterator_tag``. Otherwise ``iterator_category`` is -convertible to ``forward_iterator_tag``. If ``Iterator`` does not -model Readable Lvalue Iterator then ``iterator_category`` is -convertible to ``input_iterator_tag``. - - -``transform_iterator`` requirements -................................... - -The type ``UnaryFunction`` must be Assignable, Copy Constructible, and -the expression ``f(*i)`` must be valid where ``f`` is an object of -type ``UnaryFunction``, ``i`` is an object of type ``Iterator``, and -where the type of ``f(*i)`` must be -``result_of::reference)>::type``. - -The argument ``Iterator`` shall model Readable Iterator. - - -``transform_iterator`` models -............................. - -The resulting ``transform_iterator`` models the most refined of the -following that is also modeled by ``Iterator``. - - * Writable Lvalue Iterator if ``transform_iterator::reference`` is a non-const reference. - - * Readable Lvalue Iterator if ``transform_iterator::reference`` is a const reference. - - * Readable Iterator otherwise. - -The ``transform_iterator`` models the most refined standard traversal -concept that is modeled by the ``Iterator`` argument. - -If ``transform_iterator`` is a model of Readable Lvalue Iterator then -it models the following original iterator concepts depending on what -the ``Iterator`` argument models. - -+-----------------------------------+---------------------------------------+ -| If ``Iterator`` models | then ``transform_iterator`` models | -+===================================+=======================================+ -| Single Pass Iterator | Input Iterator | -+-----------------------------------+---------------------------------------+ -| Forward Traversal Iterator | Forward Iterator | -+-----------------------------------+---------------------------------------+ -| Bidirectional Traversal Iterator | Bidirectional Iterator | -+-----------------------------------+---------------------------------------+ -| Random Access Traversal Iterator | Random Access Iterator | -+-----------------------------------+---------------------------------------+ - -If ``transform_iterator`` models Writable Lvalue Iterator then it is a -mutable iterator (as defined in the old iterator requirements). - -``transform_iterator`` is interoperable with -``transform_iterator`` if and only if ``X`` is -interoperable with ``Y``. - - - -``transform_iterator`` operations -................................. - -In addition to the operations required by the concepts modeled by -``transform_iterator``, ``transform_iterator`` provides the following -operations. - - -``transform_iterator();`` - -:Returns: An instance of ``transform_iterator`` with ``m_f`` - and ``m_iterator`` default constructed. - - -``transform_iterator(Iterator const& x, UnaryFunction f);`` - -:Returns: An instance of ``transform_iterator`` with ``m_f`` - initialized to ``f`` and ``m_iterator`` initialized to ``x``. - - -:: - - template - transform_iterator( - transform_iterator const& t - , typename enable_if_convertible::type* = 0 // exposition only - , typename enable_if_convertible::type* = 0 // exposition only - ); - -:Returns: An instance of ``transform_iterator`` with ``m_f`` - initialized to ``t.functor()`` and ``m_iterator`` initialized to - ``t.base()``. -:Requires: ``OtherIterator`` is implicitly convertible to ``Iterator``. - - -``UnaryFunction functor() const;`` - -:Returns: ``m_f`` - - -``Iterator const& base() const;`` - -:Returns: ``m_iterator`` - - -``reference operator*() const;`` - -:Returns: ``m_f(*m_iterator)`` - - -``transform_iterator& operator++();`` - -:Effects: ``++m_iterator`` -:Returns: ``*this`` - - -``transform_iterator& operator--();`` - -:Effects: ``--m_iterator`` -:Returns: ``*this`` - diff --git a/doc/traversal.png b/doc/traversal.png deleted file mode 100644 index a9bbe98..0000000 Binary files a/doc/traversal.png and /dev/null differ diff --git a/doc/zip_iterator.html b/doc/zip_iterator.html deleted file mode 100755 index 060bd13..0000000 --- a/doc/zip_iterator.html +++ /dev/null @@ -1,352 +0,0 @@ - - - - - - -Zip Iterator - - - - - - - -
-

Zip Iterator

- --- - - - - - - - - - - - -
Author:David Abrahams, Thomas Becker
Contact:dave@boost-consulting.com, thomas@styleadvisor.com
Organization:Boost Consulting, Zephyr Associates, Inc.
Date:2004-01-27
Copyright:Copyright David Abrahams and Thomas Becker 2003. All rights reserved
- --- - - - -
abstract:The zip iterator provides the ability to parallel-iterate -over several controlled sequences simultaneously. A zip -iterator is constructed from a tuple of iterators. Moving -the zip iterator moves all the iterators in parallel. -Dereferencing the zip iterator returns a tuple that contains -the results of dereferencing the individual iterators.
- -
-

zip_iterator synopsis

-
-template<typename IteratorTuple>
-class zip_iterator
-{  
-
-public:
-  typedef /* see below */ reference;
-  typedef reference value_type;
-  typedef value_type* pointer;
-  typedef /* see below */ difference_type;
-  typedef /* see below */ iterator_category;
-
-  zip_iterator();
-  zip_iterator(IteratorTuple iterator_tuple);
-
-  template<typename OtherIteratorTuple>
-  zip_iterator(
-        const zip_iterator<OtherIteratorTuple>& other
-      , typename enable_if_convertible<
-              OtherIteratorTuple
-            , IteratorTuple>::type* = 0     // exposition only
-  );
-
-  const IteratorTuple& get_iterator_tuple() const;
-
-private:
-  IteratorTuple m_iterator_tuple;     // exposition only
-};
-
-template<typename IteratorTuple> 
-zip_iterator<IteratorTuple> 
-make_zip_iterator(IteratorTuple t);
-
-

The reference member of zip_iterator is the type of the tuple -made of the reference types of the iterator types in the IteratorTuple -argument.

-

The difference_type member of zip_iterator is the difference_type -of the first of the iterator types in the IteratorTuple argument.

-

The iterator_category member of zip_iterator is convertible to the -minimum of the traversal categories of the iterator types in the IteratorTuple -argument. For example, if the zip_iterator holds only vector -iterators, then iterator_category is convertible to -boost::random_access_traversal_tag. If you add a list iterator, then -iterator_category will be convertible to boost::bidirectional_traversal_tag, -but no longer to boost::random_access_traversal_tag.

-
-
-

zip_iterator requirements

-

All iterator types in the argument IteratorTuple shall model Readable Iterator.

-
-
-

zip_iterator models

-

The resulting zip_iterator models Readable Iterator.

-

The fact that the zip_iterator models only Readable Iterator does not -prevent you from modifying the values that the individual iterators point -to. The tuple returned by the zip_iterator's operator* is a tuple -constructed from the reference types of the individual iterators, not -their value types. For example, if zip_it is a zip_iterator whose -first member iterator is an std::vector<double>::iterator, then the -following line will modify the value which the first member iterator of -zip_it currently points to:

-
-zip_it->get<0>() = 42.0;
-
-

Consider the set of standard traversal concepts obtained by taking -the most refined standard traversal concept modeled by each individual -iterator type in the IteratorTuple argument.The zip_iterator -models the least refined standard traversal concept in this set.

-

zip_iterator<IteratorTuple1> is interoperable with -zip_iterator<IteratorTuple2> if and only if IteratorTuple1 -is interoperable with IteratorTuple2.

-
-
-

zip_iterator operations

-

In addition to the operations required by the concepts modeled by -zip_iterator, zip_iterator provides the following -operations.

-

zip_iterator();

- --- - - - -
Returns:An instance of zip_iterator with m_iterator_tuple -default constructed.
-

zip_iterator(IteratorTuple iterator_tuple);

- --- - - - -
Returns:An instance of zip_iterator with m_iterator_tuple -initialized to iterator_tuple.
-
-template<typename OtherIteratorTuple>
-zip_iterator(
-      const zip_iterator<OtherIteratorTuple>& other
-    , typename enable_if_convertible<
-            OtherIteratorTuple
-          , IteratorTuple>::type* = 0     // exposition only
-);
-
- --- - - - - - -
Returns:An instance of zip_iterator that is a copy of other.
Requires:OtherIteratorTuple is implicitly convertible to IteratorTuple.
-

const IteratorTuple& get_iterator_tuple() const;

- --- - - - -
Returns:m_iterator_tuple
-

reference operator*() const;

- --- - - - -
Returns:A tuple consisting of the results of dereferencing all iterators in -m_iterator_tuple.
-

zip_iterator& operator++();

- --- - - - - - -
Effects:Increments each iterator in m_iterator_tuple.
Returns:*this
-

zip_iterator& operator--();

- --- - - - - - -
Effects:Decrements each iterator in m_iterator_tuple.
Returns:*this
-
-template<typename IteratorTuple> 
-zip_iterator<IteratorTuple> 
-make_zip_iterator(IteratorTuple t);
-
- --- - - - -
Returns:An instance of zip_iterator<IteratorTuple> with m_iterator_tuple -initialized to t.
-
-template<typename IteratorTuple> 
-zip_iterator<IteratorTuple> 
-make_zip_iterator(IteratorTuple t);
-
- --- - - - -
Returns:An instance of zip_iterator<IteratorTuple> with m_iterator_tuple -initialized to t.
-
-
-

Examples

-

There are two main types of applications of the zip_iterator. The first -one concerns runtime efficiency: If one has several controlled sequences -of the same length that must be somehow processed, e.g., with the -for_each algorithm, then it is more efficient to perform just -one parallel-iteration rather than several individual iterations. For an -example, assume that vect_of_doubles and vect_of_ints -are two vectors of equal length containing doubles and ints, respectively, -and consider the following two iterations:

-
-std::vector<double>::const_iterator beg1 = vect_of_doubles.begin();
-std::vector<double>::const_iterator end1 = vect_of_doubles.end();
-std::vector<int>::const_iterator beg2 = vect_of_ints.begin();
-std::vector<int>::const_iterator end2 = vect_of_ints.end();
-
-std::for_each(beg1, end1, func_0());
-std::for_each(beg2, end2, func_1());
-
-

These two iterations can now be replaced with a single one as follows:

-
-std::for_each(
-  boost::make_zip_iterator(
-    boost::make_tuple(beg1, beg2)
-    ),
-  boost::make_zip_iterator(
-    boost::make_tuple(end1, end2)
-    ),
-  zip_func()
-  );
-
-

A non-generic implementation of zip_func could look as follows:

-
-struct zip_func : 
-  public std::unary_function<const boost::tuple<const double&, const int&>&, void>
-{
-  void operator()(const boost::tuple<const double&, const int&>& t) const
-  {
-    m_f0(t.get<0>());
-    m_f1(t.get<1>());
-  }
-
-private:
-  func_0 m_f0;
-  func_1 m_f1;
-};
-
-

The second important application of the zip_iterator is as a building block -to make combining iterators. A combining iterator is an iterator -that parallel-iterates over several controlled sequences and, upon -dereferencing, returns the result of applying a functor to the values of the -sequences at the respective positions. This can now be achieved by using the -zip_iterator in conjunction with the transform_iterator.

-

Suppose, for example, that you have two vectors of doubles, say -vect_1 and vect_2, and you need to expose to a client -a controlled sequence containing the products of the elements of -vect_1 and vect_2. Rather than placing these products -in a third vector, you can use a combining iterator that calculates the -products on the fly. Let us assume that tuple_multiplies is a -functor that works like std::multiplies, except that it takes -its two arguments packaged in a tuple. Then the two iterators -it_begin and it_end defined below delimit a controlled -sequence containing the products of the elements of vect_1 and -vect_2:

-
-typedef boost::tuple<
-  std::vector<double>::const_iterator,
-  std::vector<double>::const_iterator
-  > the_iterator_tuple;
-
-typedef boost::zip_iterator<
-  the_iterator_tuple
-  > the_zip_iterator;
-
-typedef boost::transform_iterator<
-  tuple_multiplies<double>,
-  the_zip_iterator
-  > the_transform_iterator;
-
-the_transform_iterator it_begin(
-  the_zip_iterator(
-    the_iterator_tuple(
-      vect_1.begin(),
-      vect_2.begin()
-      )
-    ),
-  tuple_multiplies<double>()
-  );
-
-the_transform_iterator it_end(
-  the_zip_iterator(
-    the_iterator_tuple(
-      vect_1.end(),
-      vect_2.end()
-      )
-    ),
-  tuple_multiplies<double>()
-  );
-
-

The source code for these examples can be found here.

-
-
- - - - diff --git a/doc/zip_iterator.pdf b/doc/zip_iterator.pdf deleted file mode 100755 index 424815d..0000000 Binary files a/doc/zip_iterator.pdf and /dev/null differ diff --git a/doc/zip_iterator.rst b/doc/zip_iterator.rst deleted file mode 100755 index cf9327c..0000000 --- a/doc/zip_iterator.rst +++ /dev/null @@ -1,25 +0,0 @@ -+++++++++++++ - Zip Iterator -+++++++++++++ - -:Author: David Abrahams, Thomas Becker -:Contact: dave@boost-consulting.com, thomas@styleadvisor.com -:organization: `Boost Consulting`_, `Zephyr Associates, Inc.`_ -:date: $Date$ -:copyright: Copyright David Abrahams and Thomas Becker 2003. All rights reserved - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Zephyr Associates, Inc.`: http://www.styleadvisor.com - -:abstract: - - .. include:: zip_iterator_abstract.rst - -.. contents:: Table of Contents - -``zip_iterator`` synopsis -............................... - -.. include:: zip_iterator_ref.rst -.. include:: make_zip_iterator.rst -.. include:: zip_iterator_eg.rst diff --git a/doc/zip_iterator_abstract.rst b/doc/zip_iterator_abstract.rst deleted file mode 100755 index 0d1cf11..0000000 --- a/doc/zip_iterator_abstract.rst +++ /dev/null @@ -1,6 +0,0 @@ -The zip iterator provides the ability to parallel-iterate -over several controlled sequences simultaneously. A zip -iterator is constructed from a tuple of iterators. Moving -the zip iterator moves all the iterators in parallel. -Dereferencing the zip iterator returns a tuple that contains -the results of dereferencing the individual iterators. diff --git a/doc/zip_iterator_eg.rst b/doc/zip_iterator_eg.rst deleted file mode 100755 index 77e23ab..0000000 --- a/doc/zip_iterator_eg.rst +++ /dev/null @@ -1,117 +0,0 @@ -Examples -........ - -There are two main types of applications of the ``zip_iterator``. The first -one concerns runtime efficiency: If one has several controlled sequences -of the same length that must be somehow processed, e.g., with the -``for_each`` algorithm, then it is more efficient to perform just -one parallel-iteration rather than several individual iterations. For an -example, assume that ``vect_of_doubles`` and ``vect_of_ints`` -are two vectors of equal length containing doubles and ints, respectively, -and consider the following two iterations: - -:: - - - std::vector::const_iterator beg1 = vect_of_doubles.begin(); - std::vector::const_iterator end1 = vect_of_doubles.end(); - std::vector::const_iterator beg2 = vect_of_ints.begin(); - std::vector::const_iterator end2 = vect_of_ints.end(); - - std::for_each(beg1, end1, func_0()); - std::for_each(beg2, end2, func_1()); - -These two iterations can now be replaced with a single one as follows: - -:: - - - std::for_each( - boost::make_zip_iterator( - boost::make_tuple(beg1, beg2) - ), - boost::make_zip_iterator( - boost::make_tuple(end1, end2) - ), - zip_func() - ); - -A non-generic implementation of ``zip_func`` could look as follows: - -:: - - - struct zip_func : - public std::unary_function&, void> - { - void operator()(const boost::tuple& t) const - { - m_f0(t.get<0>()); - m_f1(t.get<1>()); - } - - private: - func_0 m_f0; - func_1 m_f1; - }; - -The second important application of the ``zip_iterator`` is as a building block -to make combining iterators. A combining iterator is an iterator -that parallel-iterates over several controlled sequences and, upon -dereferencing, returns the result of applying a functor to the values of the -sequences at the respective positions. This can now be achieved by using the -``zip_iterator`` in conjunction with the ``transform_iterator``. - -Suppose, for example, that you have two vectors of doubles, say -``vect_1`` and ``vect_2``, and you need to expose to a client -a controlled sequence containing the products of the elements of -``vect_1`` and ``vect_2``. Rather than placing these products -in a third vector, you can use a combining iterator that calculates the -products on the fly. Let us assume that ``tuple_multiplies`` is a -functor that works like ``std::multiplies``, except that it takes -its two arguments packaged in a tuple. Then the two iterators -``it_begin`` and ``it_end`` defined below delimit a controlled -sequence containing the products of the elements of ``vect_1`` and -``vect_2``: - -:: - - - typedef boost::tuple< - std::vector::const_iterator, - std::vector::const_iterator - > the_iterator_tuple; - - typedef boost::zip_iterator< - the_iterator_tuple - > the_zip_iterator; - - typedef boost::transform_iterator< - tuple_multiplies, - the_zip_iterator - > the_transform_iterator; - - the_transform_iterator it_begin( - the_zip_iterator( - the_iterator_tuple( - vect_1.begin(), - vect_2.begin() - ) - ), - tuple_multiplies() - ); - - the_transform_iterator it_end( - the_zip_iterator( - the_iterator_tuple( - vect_1.end(), - vect_2.end() - ) - ), - tuple_multiplies() - ); - - -The source code for these examples can be found `here`__. - -__ ../example/zip_iterator_examples.cpp diff --git a/doc/zip_iterator_ref.rst b/doc/zip_iterator_ref.rst deleted file mode 100755 index 340fdc8..0000000 --- a/doc/zip_iterator_ref.rst +++ /dev/null @@ -1,152 +0,0 @@ - -:: - - template - class zip_iterator - { - - public: - typedef /* see below */ reference; - typedef reference value_type; - typedef value_type* pointer; - typedef /* see below */ difference_type; - typedef /* see below */ iterator_category; - - zip_iterator(); - zip_iterator(IteratorTuple iterator_tuple); - - template - zip_iterator( - const zip_iterator& other - , typename enable_if_convertible< - OtherIteratorTuple - , IteratorTuple>::type* = 0 // exposition only - ); - - const IteratorTuple& get_iterator_tuple() const; - - private: - IteratorTuple m_iterator_tuple; // exposition only - }; - - template - zip_iterator - make_zip_iterator(IteratorTuple t); - - -The ``reference`` member of ``zip_iterator`` is the type of the tuple -made of the reference types of the iterator types in the ``IteratorTuple`` -argument. - -The ``difference_type`` member of ``zip_iterator`` is the ``difference_type`` -of the first of the iterator types in the ``IteratorTuple`` argument. - -The ``iterator_category`` member of ``zip_iterator`` is convertible to the -minimum of the traversal categories of the iterator types in the ``IteratorTuple`` -argument. For example, if the ``zip_iterator`` holds only vector -iterators, then ``iterator_category`` is convertible to -``boost::random_access_traversal_tag``. If you add a list iterator, then -``iterator_category`` will be convertible to ``boost::bidirectional_traversal_tag``, -but no longer to ``boost::random_access_traversal_tag``. - - -``zip_iterator`` requirements -................................... - -All iterator types in the argument ``IteratorTuple`` shall model Readable Iterator. - - -``zip_iterator`` models -............................. - -The resulting ``zip_iterator`` models Readable Iterator. - -The fact that the ``zip_iterator`` models only Readable Iterator does not -prevent you from modifying the values that the individual iterators point -to. The tuple returned by the ``zip_iterator``'s ``operator*`` is a tuple -constructed from the reference types of the individual iterators, not -their value types. For example, if ``zip_it`` is a ``zip_iterator`` whose -first member iterator is an ``std::vector::iterator``, then the -following line will modify the value which the first member iterator of -``zip_it`` currently points to: - -:: - - zip_it->get<0>() = 42.0; - - -Consider the set of standard traversal concepts obtained by taking -the most refined standard traversal concept modeled by each individual -iterator type in the ``IteratorTuple`` argument.The ``zip_iterator`` -models the least refined standard traversal concept in this set. - -``zip_iterator`` is interoperable with -``zip_iterator`` if and only if ``IteratorTuple1`` -is interoperable with ``IteratorTuple2``. - - - -``zip_iterator`` operations -................................. - -In addition to the operations required by the concepts modeled by -``zip_iterator``, ``zip_iterator`` provides the following -operations. - - -``zip_iterator();`` - -:Returns: An instance of ``zip_iterator`` with ``m_iterator_tuple`` - default constructed. - - -``zip_iterator(IteratorTuple iterator_tuple);`` - -:Returns: An instance of ``zip_iterator`` with ``m_iterator_tuple`` - initialized to ``iterator_tuple``. - - -:: - - template - zip_iterator( - const zip_iterator& other - , typename enable_if_convertible< - OtherIteratorTuple - , IteratorTuple>::type* = 0 // exposition only - ); - -:Returns: An instance of ``zip_iterator`` that is a copy of ``other``. -:Requires: ``OtherIteratorTuple`` is implicitly convertible to ``IteratorTuple``. - - -``const IteratorTuple& get_iterator_tuple() const;`` - -:Returns: ``m_iterator_tuple`` - - -``reference operator*() const;`` - -:Returns: A tuple consisting of the results of dereferencing all iterators in - ``m_iterator_tuple``. - - -``zip_iterator& operator++();`` - -:Effects: Increments each iterator in ``m_iterator_tuple``. -:Returns: ``*this`` - - -``zip_iterator& operator--();`` - -:Effects: Decrements each iterator in ``m_iterator_tuple``. -:Returns: ``*this`` - -:: - - template - zip_iterator - make_zip_iterator(IteratorTuple t); - -:Returns: An instance of ``zip_iterator`` with ``m_iterator_tuple`` - initialized to ``t``. diff --git a/example/Jamfile b/example/Jamfile deleted file mode 100644 index cb49f1a..0000000 --- a/example/Jamfile +++ /dev/null @@ -1,20 +0,0 @@ -subproject libs/iterator/example ; - -import testing ; - -# Make tests run by default. -DEPENDS all : test ; - -test-suite iterator_examples - : [ run reverse_iterator.cpp ] - [ run node_iterator1.cpp ] - [ run node_iterator2.cpp ] - [ run node_iterator3.cpp ] - [ run counting_iterator_example.cpp ] - [ run filter_iterator_example.cpp ] - [ run function_output_iterator_example.cpp ] - [ run indirect_iterator_example.cpp ] - [ run permutation_iterator_example.cpp ] - [ run reverse_iterator_example.cpp ] - [ run transform_iterator_example.cpp ] - ; diff --git a/example/counting_iterator_example.cpp b/example/counting_iterator_example.cpp deleted file mode 100644 index 4113075..0000000 --- a/example/counting_iterator_example.cpp +++ /dev/null @@ -1,54 +0,0 @@ -// (C) Copyright Jeremy Siek 2000-2004. -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all -// copies. This software is provided "as is" without express or -// implied warranty, and with no claim as to its suitability for any -// purpose. - - -#include -#include -#include -#include -#include -#include -#include -#include - -int main(int, char*[]) -{ - // Example of using counting_iterator - std::cout << "counting from 0 to 4:" << std::endl; - boost::counting_iterator first(0), last(4); - std::copy(first, last, std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - // Example of using counting iterator to create an array of pointers. - int N = 7; - std::vector numbers; - typedef std::vector::iterator n_iter; - // Fill "numbers" array with [0,N) - std::copy( - boost::counting_iterator(0) - , boost::counting_iterator(N) - , std::back_inserter(numbers)); - - std::vector::iterator> pointers; - - // Use counting iterator to fill in the array of pointers. - // causes an ICE with MSVC6 - std::copy(boost::make_counting_iterator(numbers.begin()), - boost::make_counting_iterator(numbers.end()), - std::back_inserter(pointers)); - - // Use indirect iterator to print out numbers by accessing - // them through the array of pointers. - std::cout << "indirectly printing out the numbers from 0 to " - << N << std::endl; - std::copy(boost::make_indirect_iterator(pointers.begin()), - boost::make_indirect_iterator(pointers.end()), - std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - return boost::exit_success; -} diff --git a/example/filter_iterator_example.cpp b/example/filter_iterator_example.cpp deleted file mode 100644 index 5748daa..0000000 --- a/example/filter_iterator_example.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// (C) Copyright Jeremy Siek 1999-2004. -// Permission to copy, use, modify, -// sell and distribute this software is granted provided this -// copyright notice appears in all copies. This software is provided -// "as is" without express or implied warranty, and with no claim as -// to its suitability for any purpose. - -#include -#include -#include -#include -#include -#include // for exit_success - -struct is_positive_number { - bool operator()(int x) { return 0 < x; } -}; - -int main() -{ - int numbers_[] = { 0, -1, 4, -3, 5, 8, -2 }; - const int N = sizeof(numbers_)/sizeof(int); - - typedef int* base_iterator; - base_iterator numbers(numbers_); - - // Example using make_filter_iterator() - std::copy(boost::make_filter_iterator(numbers, numbers + N), - boost::make_filter_iterator(numbers + N, numbers + N), - std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - // Example using filter_iterator - typedef boost::filter_iterator - FilterIter; - - is_positive_number predicate; - FilterIter filter_iter_first(predicate, numbers, numbers + N); - FilterIter filter_iter_last(predicate, numbers + N, numbers + N); - - std::copy(filter_iter_first, filter_iter_last, std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - // Another example using make_filter_iterator() - std::copy( - boost::make_filter_iterator( - std::bind2nd(std::greater(), -2) - , numbers, numbers + N) - - , boost::make_filter_iterator( - std::bind2nd(std::greater(), -2) - , numbers + N, numbers + N) - - , std::ostream_iterator(std::cout, " ") - ); - - std::cout << std::endl; - - return boost::exit_success; -} diff --git a/example/function_output_iterator_example.cpp b/example/function_output_iterator_example.cpp deleted file mode 100644 index de0feae..0000000 --- a/example/function_output_iterator_example.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// (C) Copyright Jeremy Siek 2001-2004. -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all -// copies. This software is provided "as is" without express or -// implied warranty, and with no claim as to its suitability for any -// purpose. - -// Revision History: - -// 27 Feb 2001 Jeremy Siek -// Initial checkin. - -#include -#include -#include - -#include - -struct string_appender -{ - string_appender(std::string& s) - : m_str(&s) - {} - - void operator()(const std::string& x) const - { - *m_str += x; - } - - std::string* m_str; -}; - -int main(int, char*[]) -{ - std::vector x; - x.push_back("hello"); - x.push_back(" "); - x.push_back("world"); - x.push_back("!"); - - std::string s = ""; - std::copy(x.begin(), x.end(), - boost::make_function_output_iterator(string_appender(s))); - - std::cout << s << std::endl; - - return 0; -} diff --git a/example/indirect_iterator_example.cpp b/example/indirect_iterator_example.cpp deleted file mode 100644 index 7d74072..0000000 --- a/example/indirect_iterator_example.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// (C) Copyright Jeremy Siek 2000-2004. -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all -// copies. This software is provided "as is" without express or -// implied warranty, and with no claim as to its suitability for any -// purpose. - -#include -#include -#include -#include -#include -#include -#include - -int main(int, char*[]) -{ - char characters[] = "abcdefg"; - const int N = sizeof(characters)/sizeof(char) - 1; // -1 since characters has a null char - char* pointers_to_chars[N]; // at the end. - for (int i = 0; i < N; ++i) - pointers_to_chars[i] = &characters[i]; - - // Example of using indirect_iterator - - boost::indirect_iterator - indirect_first(pointers_to_chars), indirect_last(pointers_to_chars + N); - - std::copy(indirect_first, indirect_last, std::ostream_iterator(std::cout, ",")); - std::cout << std::endl; - - - // Example of making mutable and constant indirect iterators - - char mutable_characters[N]; - char* pointers_to_mutable_chars[N]; - for (int j = 0; j < N; ++j) - pointers_to_mutable_chars[j] = &mutable_characters[j]; - - boost::indirect_iterator mutable_indirect_first(pointers_to_mutable_chars), - mutable_indirect_last(pointers_to_mutable_chars + N); - boost::indirect_iterator const_indirect_first(pointers_to_chars), - const_indirect_last(pointers_to_chars + N); - - std::transform(const_indirect_first, const_indirect_last, - mutable_indirect_first, std::bind1st(std::plus(), 1)); - - std::copy(mutable_indirect_first, mutable_indirect_last, - std::ostream_iterator(std::cout, ",")); - std::cout << std::endl; - - - // Example of using make_indirect_iterator() - - std::copy(boost::make_indirect_iterator(pointers_to_chars), - boost::make_indirect_iterator(pointers_to_chars + N), - std::ostream_iterator(std::cout, ",")); - std::cout << std::endl; - - return 0; -} diff --git a/example/node.hpp b/example/node.hpp deleted file mode 100755 index 4e80d96..0000000 --- a/example/node.hpp +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright David Abrahams 2004. 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) -#ifndef NODE_DWA2004110_HPP -# define NODE_DWA2004110_HPP - -# include - -// Polymorphic list node base class - -struct node_base -{ - node_base() : m_next(0) {} - - virtual ~node_base() - { - delete m_next; - } - - node_base* next() const - { - return m_next; - } - - virtual void print(std::ostream& s) const = 0; - virtual void double_me() = 0; - - void append(node_base* p) - { - if (m_next) - m_next->append(p); - else - m_next = p; - } - - private: - node_base* m_next; -}; - -inline std::ostream& operator<<(std::ostream& s, node_base const& n) -{ - n.print(s); - return s; -} - -template -struct node : node_base -{ - node(T x) - : m_value(x) - {} - - void print(std::ostream& s) const { s << this->m_value; } - void double_me() { m_value += m_value; } - - private: - T m_value; -}; - -#endif // NODE_DWA2004110_HPP diff --git a/example/node_iterator1.cpp b/example/node_iterator1.cpp deleted file mode 100755 index 6411b03..0000000 --- a/example/node_iterator1.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright David Abrahams 2004. 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) - -#include "node_iterator1.hpp" -#include -#include -#include -#include -#include - -int main() -{ - std::auto_ptr > nodes(new node(42)); - nodes->append(new node(" is greater than ")); - nodes->append(new node(13)); - - std::copy( - node_iterator(nodes.get()), node_iterator() - , std::ostream_iterator(std::cout, " ") - ); - std::cout << std::endl; - - std::for_each( - node_iterator(nodes.get()), node_iterator() - , std::mem_fun_ref(&node_base::double_me) - ); - - std::copy( - node_iterator(nodes.get()), node_iterator() - , std::ostream_iterator(std::cout, "/") - ); - std::cout << std::endl; -} diff --git a/example/node_iterator1.hpp b/example/node_iterator1.hpp deleted file mode 100755 index 1188c7c..0000000 --- a/example/node_iterator1.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright David Abrahams 2004. 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) -#ifndef NODE_ITERATOR1_DWA2004110_HPP -# define NODE_ITERATOR1_DWA2004110_HPP - -# include "node.hpp" -# include - -class node_iterator - : public boost::iterator_facade< - node_iterator - , node_base - , boost::forward_traversal_tag - > -{ - public: - node_iterator() - : m_node(0) - {} - - explicit node_iterator(node_base* p) - : m_node(p) - {} - - private: - friend class boost::iterator_core_access; - - void increment() - { m_node = m_node->next(); } - - bool equal(node_iterator const& other) const - { return this->m_node == other.m_node; } - - node_base& dereference() const - { return *m_node; } - - node_base* m_node; -}; - - -#endif // NODE_ITERATOR1_DWA2004110_HPP diff --git a/example/node_iterator2.cpp b/example/node_iterator2.cpp deleted file mode 100755 index 62211b2..0000000 --- a/example/node_iterator2.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright David Abrahams 2004. 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) - -#include "node_iterator2.hpp" -#include -#include -#include -#include -#include -#include - -int main() -{ - std::auto_ptr > nodes(new node(42)); - nodes->append(new node(" is greater than ")); - nodes->append(new node(13)); - - // Check interoperability - assert(node_iterator(nodes.get()) == node_const_iterator(nodes.get())); - assert(node_const_iterator(nodes.get()) == node_iterator(nodes.get())); - - assert(node_iterator(nodes.get()) != node_const_iterator()); - assert(node_const_iterator(nodes.get()) != node_iterator()); - - std::copy( - node_iterator(nodes.get()), node_iterator() - , std::ostream_iterator(std::cout, " ") - ); - std::cout << std::endl; - - std::for_each( - node_iterator(nodes.get()), node_iterator() - , boost::mem_fn(&node_base::double_me) - ); - - std::copy( - node_const_iterator(nodes.get()), node_const_iterator() - , std::ostream_iterator(std::cout, "/") - ); - std::cout << std::endl; - return 0; -} diff --git a/example/node_iterator2.hpp b/example/node_iterator2.hpp deleted file mode 100755 index 6aa0a4c..0000000 --- a/example/node_iterator2.hpp +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright David Abrahams 2004. 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) -#ifndef NODE_ITERATOR2_DWA2004110_HPP -# define NODE_ITERATOR2_DWA2004110_HPP - -# include "node.hpp" -# include - -# ifndef BOOST_NO_SFINAE -# include -# include -# endif - -template -class node_iter - : public boost::iterator_facade< - node_iter - , Value - , boost::forward_traversal_tag - > -{ - private: - struct enabler {}; // a private type avoids misuse - - public: - node_iter() - : m_node(0) {} - - explicit node_iter(Value* p) - : m_node(p) {} - - template - node_iter( - node_iter const& other -# ifndef BOOST_NO_SFINAE - , typename boost::enable_if< - boost::is_convertible - , enabler - >::type = enabler() -# endif - ) - : m_node(other.m_node) {} - - -# if !BOOST_WORKAROUND(__GNUC__, == 2) - private: // GCC2 can't grant friendship to template member functions - friend class boost::iterator_core_access; -# endif - - template - bool equal(node_iter const& other) const - { - return this->m_node == other.m_node; - } - - void increment() { m_node = m_node->next(); } - - Value& dereference() const { return *m_node; } - -# ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS - public: -# else - private: - template friend class node_iter; -# endif - Value* m_node; -}; - -typedef node_iter node_iterator; -typedef node_iter node_const_iterator; - -#endif // NODE_ITERATOR2_DWA2004110_HPP diff --git a/example/node_iterator3.cpp b/example/node_iterator3.cpp deleted file mode 100755 index 331cc93..0000000 --- a/example/node_iterator3.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright David Abrahams 2004. 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) - -#include "node_iterator3.hpp" -#include -#include -#include -#include -#include -#include - -int main() -{ - std::auto_ptr > nodes(new node(42)); - nodes->append(new node(" is greater than ")); - nodes->append(new node(13)); - - // Check interoperability - assert(node_iterator(nodes.get()) == node_const_iterator(nodes.get())); - assert(node_const_iterator(nodes.get()) == node_iterator(nodes.get())); - - assert(node_iterator(nodes.get()) != node_const_iterator()); - assert(node_const_iterator(nodes.get()) != node_iterator()); - - std::copy( - node_iterator(nodes.get()), node_iterator() - , std::ostream_iterator(std::cout, " ") - ); - std::cout << std::endl; - - std::for_each( - node_iterator(nodes.get()), node_iterator() - , boost::mem_fn(&node_base::double_me) - ); - - std::copy( - node_const_iterator(nodes.get()), node_const_iterator() - , std::ostream_iterator(std::cout, "/") - ); - std::cout << std::endl; - return 0; -} diff --git a/example/node_iterator3.hpp b/example/node_iterator3.hpp deleted file mode 100755 index 85127e1..0000000 --- a/example/node_iterator3.hpp +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright David Abrahams 2004. 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) -#ifndef NODE_ITERATOR3_DWA2004110_HPP -# define NODE_ITERATOR3_DWA2004110_HPP - -# include "node.hpp" -# include - -# ifndef BOOST_NO_SFINAE -# include -# include -# endif - -template -class node_iter - : public boost::iterator_adaptor< - node_iter // Derived - , Value* // Base - , boost::use_default // Value - , boost::forward_traversal_tag // CategoryOrTraversal - > -{ - private: - struct enabler {}; // a private type avoids misuse - - typedef boost::iterator_adaptor< - node_iter, Value*, boost::use_default, boost::forward_traversal_tag - > super_t; - - public: - node_iter() - : super_t(0) {} - - explicit node_iter(Value* p) - : super_t(p) {} - - template - node_iter( - node_iter const& other -# ifndef BOOST_NO_SFINAE - , typename boost::enable_if< - boost::is_convertible - , enabler - >::type = enabler() -# endif - ) - : super_t(other.base()) {} - -# if !BOOST_WORKAROUND(__GNUC__, == 2) - private: // GCC2 can't grant friendship to template member functions - friend class boost::iterator_core_access; -# endif - void increment() { this->base_reference() = this->base()->next(); } -}; - -typedef node_iter node_iterator; -typedef node_iter node_const_iterator; - -#endif // NODE_ITERATOR3_DWA2004110_HPP diff --git a/example/permutation_iterator_example.cpp b/example/permutation_iterator_example.cpp deleted file mode 100644 index 7e8ec57..0000000 --- a/example/permutation_iterator_example.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include -#include -#include -#include -#include -#include - - -int main() { - using namespace boost; - int i = 0; - - typedef std::vector< int > element_range_type; - typedef std::deque< int > index_type; - - static const int element_range_size = 10; - static const int index_size = 4; - - element_range_type elements( element_range_size ); - for(element_range_type::iterator el_it = elements.begin() ; el_it != elements.end() ; ++el_it) - *el_it = std::distance(elements.begin(), el_it); - - index_type indices( index_size ); - for(index_type::iterator i_it = indices.begin() ; i_it != indices.end() ; ++i_it ) - *i_it = element_range_size - index_size + std::distance(indices.begin(), i_it); - std::reverse( indices.begin(), indices.end() ); - - typedef permutation_iterator< element_range_type::iterator, index_type::iterator > permutation_type; - permutation_type begin = make_permutation_iterator( elements.begin(), indices.begin() ); - permutation_type it = begin; - permutation_type end = make_permutation_iterator( elements.begin(), indices.end() ); - - std::cout << "The original range is : "; - std::copy( elements.begin(), elements.end(), std::ostream_iterator< int >( std::cout, " " ) ); - std::cout << "\n"; - - std::cout << "The reindexing scheme is : "; - std::copy( indices.begin(), indices.end(), std::ostream_iterator< int >( std::cout, " " ) ); - std::cout << "\n"; - - std::cout << "The permutated range is : "; - std::copy( begin, end, std::ostream_iterator< int >( std::cout, " " ) ); - std::cout << "\n"; - - std::cout << "Elements at even indices in the permutation : "; - it = begin; - for(i = 0; i < index_size / 2 ; ++i, it+=2 ) std::cout << *it << " "; - std::cout << "\n"; - - std::cout << "Permutation backwards : "; - it = begin + (index_size); - assert( it != begin ); - for( ; it-- != begin ; ) std::cout << *it << " "; - std::cout << "\n"; - - std::cout << "Iterate backward with stride 2 : "; - it = begin + (index_size - 1); - for(i = 0 ; i < index_size / 2 ; ++i, it-=2 ) std::cout << *it << " "; - std::cout << "\n"; - - return boost::exit_success; -} diff --git a/example/reverse_iterator.cpp b/example/reverse_iterator.cpp deleted file mode 100644 index 522cb9f..0000000 --- a/example/reverse_iterator.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include -#include -#include - -int main() -{ - int x[] = { 1, 2, 3, 4 }; - boost::reverse_iterator first(x + 4), last(x); - std::copy(first, last, std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - return 0; -} diff --git a/example/reverse_iterator_example.cpp b/example/reverse_iterator_example.cpp deleted file mode 100644 index 34c14a8..0000000 --- a/example/reverse_iterator_example.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// (C) Copyright Jeremy Siek 2000-2004. -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all -// copies. This software is provided "as is" without express or -// implied warranty, and with no claim as to its suitability for any -// purpose. - -#include -#include -#include -#include -#include - -int main(int, char*[]) -{ - char letters_[] = "hello world!"; - const int N = sizeof(letters_)/sizeof(char) - 1; - typedef char* base_iterator; - base_iterator letters(letters_); - - std::cout << "original sequence of letters:\t\t\t" - << letters_ << std::endl; - - // Use reverse_iterator to print a sequence of letters in reverse - // order. - - boost::reverse_iterator - reverse_letters_first(letters + N), - reverse_letters_last(letters); - - std::cout << "sequence in reverse order:\t\t\t"; - std::copy(reverse_letters_first, reverse_letters_last, - std::ostream_iterator(std::cout)); - std::cout << std::endl; - - std::cout << "sequence in double-reversed (normal) order:\t"; - std::copy(boost::make_reverse_iterator(reverse_letters_last), - boost::make_reverse_iterator(reverse_letters_first), - std::ostream_iterator(std::cout)); - std::cout << std::endl; - - return boost::exit_success; -} diff --git a/example/transform_iterator_example.cpp b/example/transform_iterator_example.cpp deleted file mode 100644 index 4733997..0000000 --- a/example/transform_iterator_example.cpp +++ /dev/null @@ -1,78 +0,0 @@ -// (C) Copyright Jeremy Siek 2000-2004. -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all -// copies. This software is provided "as is" without express or -// implied warranty, and with no claim as to its suitability for any -// purpose. - - -#include -#include -#include -#include - -// What a bummer. We can't use std::binder1st with transform iterator -// because it does not have a default constructor. Here's a version -// that does. - -namespace boost { - - template - class binder1st - : public std::unary_function { - protected: - Operation op; - typename Operation::first_argument_type value; - public: - binder1st() { } // this had to be added! - binder1st(const Operation& x, - const typename Operation::first_argument_type& y) - : op(x), value(y) {} - typename Operation::result_type - operator()(const typename Operation::second_argument_type& x) const { - return op(value, x); - } - }; - - template - inline binder1st bind1st(const Operation& op, const T& x) { - typedef typename Operation::first_argument_type arg1_type; - return binder1st(op, arg1_type(x)); - } - -} // namespace boost - -int -main(int, char*[]) -{ - // This is a simple example of using the transform_iterators class to - // generate iterators that multiply the value returned by dereferencing - // the iterator. In this case we are multiplying by 2. - // Would be cooler to use lambda library in this example. - - int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; - const int N = sizeof(x)/sizeof(int); - - typedef boost::binder1st< std::multiplies > Function; - typedef boost::transform_iterator doubling_iterator; - - doubling_iterator i(x, boost::bind1st(std::multiplies(), 2)), - i_end(x + N, boost::bind1st(std::multiplies(), 2)); - - std::cout << "multiplying the array by 2:" << std::endl; - while (i != i_end) - std::cout << *i++ << " "; - std::cout << std::endl; - - std::cout << "adding 4 to each element in the array:" << std::endl; - - std::copy(boost::make_transform_iterator(x, boost::bind1st(std::plus(), 4)), - boost::make_transform_iterator(x + N, boost::bind1st(std::plus(), 4)), - std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - return 0; -} - - diff --git a/index.html b/index.html deleted file mode 100755 index 40f1ae1..0000000 --- a/index.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - -Automatically loading index page... if nothing happens, please go to -doc/index.html. - - diff --git a/test/Jamfile b/test/Jamfile deleted file mode 100644 index a21c906..0000000 --- a/test/Jamfile +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright David Abrahams 2003. Permission to copy, use, -# modify, sell and distribute this software is granted provided this -# copyright notice appears in all copies. This software is provided -# "as is" without express or implied warranty, and with no claim as -# to its suitability for any purpose. - -subproject libs/iterator/test ; - -import testing ; - -test-suite iterator - : - # These first two tests will run last, and are expected to fail - # for many less-capable compilers. - - [ compile-fail interoperable_fail.cpp ] - # test uses expected success, so that we catch unrelated - # compilation problems. - [ run is_convertible_fail.cpp ] - - [ run zip_iterator_test.cpp - : : : - - # stlport's debug mode generates long symbols which overwhelm - # vc6 - <*>release - ] - - # These tests should work for just about everything. - [ compile is_lvalue_iterator.cpp ] - [ compile is_readable_iterator.cpp ] - [ compile pointee.cpp ] - - [ run unit_tests.cpp ] - [ run concept_tests.cpp ] - [ run iterator_adaptor_cc.cpp ] - [ run iterator_adaptor_test.cpp ] - [ compile iterator_archetype_cc.cpp ] - [ compile-fail iterator_archetype_default_ctor.cpp ] - [ compile-fail lvalue_concept_fail_expected.cpp ] - [ run transform_iterator_test.cpp ] - [ run indirect_iterator_test.cpp ] - [ compile indirect_iterator_member_types.cpp ] - [ run filter_iterator_test.cpp ] - [ run iterator_facade.cpp ] - [ run reverse_iterator_test.cpp ] - [ run counting_iterator_test.cpp ] - [ run interoperable.cpp ] - [ run permutation_iterator_test.cpp : : : # on - ] - - [ run ../../utility/iterator_adaptor_examples.cpp ] - [ run ../../utility/counting_iterator_example.cpp ] - [ run ../../utility/filter_iterator_example.cpp ] - [ run ../../utility/fun_out_iter_example.cpp ] - [ run ../../utility/indirect_iterator_example.cpp ] - [ run ../../utility/projection_iterator_example.cpp ] - [ run ../../utility/reverse_iterator_example.cpp ] - [ run ../../utility/transform_iterator_example.cpp ] - [ run ../../utility/iterator_traits_test.cpp ] - [ run ../../utility/shared_iterator_test.cpp ] -; diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 deleted file mode 100644 index a3172f7..0000000 --- a/test/Jamfile.v2 +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright David Abrahams 2003. Permission to copy, use, -# modify, sell and distribute this software is granted provided this -# copyright notice appears in all copies. This software is provided -# "as is" without express or implied warranty, and with no claim as -# to its suitability for any purpose. - -test-suite iterator - : - # These first two tests will run last, and are expected to fail - # for many less-capable compilers. - - [ compile-fail interoperable_fail.cpp ] - # test uses expected success, so that we catch unrelated - # compilation problems. - [ run is_convertible_fail.cpp ] - - [ run zip_iterator_test.cpp - : : : - - # stlport's debug mode generates long symbols which overwhelm - # vc6 - #<*>release - ] - - # These tests should work for just about everything. - [ compile is_lvalue_iterator.cpp ] - [ compile is_readable_iterator.cpp ] - [ compile pointee.cpp ] - - [ run unit_tests.cpp ] - [ run concept_tests.cpp ] - [ run iterator_adaptor_cc.cpp ] - [ run iterator_adaptor_test.cpp ] - [ compile iterator_archetype_cc.cpp ] - [ compile-fail iterator_archetype_default_ctor.cpp ] - [ compile-fail lvalue_concept_fail_expected.cpp ] - [ run transform_iterator_test.cpp ] - [ run indirect_iterator_test.cpp ] - [ compile indirect_iterator_member_types.cpp ] - [ run filter_iterator_test.cpp ] - [ run reverse_iterator_test.cpp ] - [ run counting_iterator_test.cpp ] - [ run interoperable.cpp ] - [ run permutation_iterator_test.cpp : : : # on - ] - - [ run ../../utility/iterator_adaptor_examples.cpp ] - [ run ../../utility/counting_iterator_example.cpp ] - [ run ../../utility/filter_iterator_example.cpp ] - [ run ../../utility/fun_out_iter_example.cpp ] - [ run ../../utility/indirect_iterator_example.cpp ] - [ run ../../utility/projection_iterator_example.cpp ] - [ run ../../utility/reverse_iterator_example.cpp ] - [ run ../../utility/transform_iterator_example.cpp ] - [ run ../../utility/iterator_traits_test.cpp ] - [ run ../../utility/shared_iterator_test.cpp ] -; diff --git a/test/concept_tests.cpp b/test/concept_tests.cpp deleted file mode 100644 index dd99600..0000000 --- a/test/concept_tests.cpp +++ /dev/null @@ -1,95 +0,0 @@ -// (C) Copyright Jeremy Siek 2002. Permission to copy, use, modify, -// sell and distribute this software is granted provided this -// copyright notice appears in all copies. This software is provided -// "as is" without express or implied warranty, and with no claim as -// to its suitability for any purpose. - -#include -#include -#include - -struct new_random_access - : std::random_access_iterator_tag - , boost::random_access_traversal_tag -{}; - -struct new_iterator - : public boost::iterator< new_random_access, int > -{ - int& operator*() const { return *m_x; } - new_iterator& operator++() { return *this; } - new_iterator operator++(int) { return *this; } - new_iterator& operator--() { return *this; } - new_iterator operator--(int) { return *this; } - new_iterator& operator+=(std::ptrdiff_t) { return *this; } - new_iterator operator+(std::ptrdiff_t) { return *this; } - new_iterator& operator-=(std::ptrdiff_t) { return *this; } - std::ptrdiff_t operator-(const new_iterator&) const { return 0; } - new_iterator operator-(std::ptrdiff_t) const { return *this; } - bool operator==(const new_iterator&) const { return false; } - bool operator!=(const new_iterator&) const { return false; } - bool operator<(const new_iterator&) const { return false; } - int* m_x; -}; -new_iterator operator+(std::ptrdiff_t, new_iterator x) { return x; } - -struct old_iterator - : public boost::iterator -{ - int& operator*() const { return *m_x; } - old_iterator& operator++() { return *this; } - old_iterator operator++(int) { return *this; } - old_iterator& operator--() { return *this; } - old_iterator operator--(int) { return *this; } - old_iterator& operator+=(std::ptrdiff_t) { return *this; } - old_iterator operator+(std::ptrdiff_t) { return *this; } - old_iterator& operator-=(std::ptrdiff_t) { return *this; } - old_iterator operator-(std::ptrdiff_t) const { return *this; } - std::ptrdiff_t operator-(const old_iterator&) const { return 0; } - bool operator==(const old_iterator&) const { return false; } - bool operator!=(const old_iterator&) const { return false; } - bool operator<(const old_iterator&) const { return false; } - int* m_x; -}; -old_iterator operator+(std::ptrdiff_t, old_iterator x) { return x; } - -int -main() -{ - boost::iterator_traversal::type tc; - boost::random_access_traversal_tag derived = tc; - (void)derived; - - boost::function_requires< - boost_concepts::WritableIteratorConcept >(); - boost::function_requires< - boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< - boost_concepts::RandomAccessTraversalConcept >(); - - boost::function_requires< - boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< - boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< - boost_concepts::RandomAccessTraversalConcept >(); - - boost::function_requires< - boost_concepts::WritableIteratorConcept >(); - boost::function_requires< - boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< - boost_concepts::RandomAccessTraversalConcept >(); - - boost::function_requires< - boost_concepts::WritableIteratorConcept >(); - boost::function_requires< - boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< - boost_concepts::RandomAccessTraversalConcept >(); - - boost::function_requires< - boost_concepts::InteroperableIteratorConcept >(); - - return 0; -} diff --git a/test/counting_iterator_test.cpp b/test/counting_iterator_test.cpp deleted file mode 100644 index 73f69f9..0000000 --- a/test/counting_iterator_test.cpp +++ /dev/null @@ -1,295 +0,0 @@ -// (C) Copyright David Abrahams 2001. Permission to copy, use, modify, sell and -// distribute this software is granted provided this copyright notice appears in -// all copies. This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -// See http://www.boost.org for most recent version including documentation. -// -// Revision History -// 16 Feb 2001 Added a missing const. Made the tests run (somewhat) with -// plain MSVC again. (David Abrahams) -// 11 Feb 2001 #if 0'd out use of counting_iterator on non-numeric types in -// MSVC without STLport, so that the other tests may proceed -// (David Abrahams) -// 04 Feb 2001 Added use of iterator_tests.hpp (David Abrahams) -// 28 Jan 2001 Removed not_an_iterator detritus (David Abrahams) -// 24 Jan 2001 Initial revision (David Abrahams) - -#include - -#ifdef __BORLANDC__ // Borland mis-detects our custom iterators -# pragma warn -8091 // template argument ForwardIterator passed to '...' is a output iterator -# pragma warn -8071 // Conversion may lose significant digits (due to counting_iterator += n). -#endif - -#ifdef BOOST_MSVC -# pragma warning(disable:4786) // identifier truncated in debug info -#endif - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#ifndef __BORLANDC__ -# include -#endif -#include -#include -#include -#ifndef BOOST_NO_SLIST -# include -#endif - - -#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -template -struct signed_assert_nonnegative -{ - static void test(T x) { assert(x >= 0); } -}; - -template -struct unsigned_assert_nonnegative -{ - static void test(T x) {} -}; - -template -struct assert_nonnegative - : boost::mpl::if_c< - std::numeric_limits::is_signed - , signed_assert_nonnegative - , unsigned_assert_nonnegative - >::type -{ -}; -#endif - -// Special tests for RandomAccess CountingIterators. -template -void category_test( - CountingIterator start, - CountingIterator finish, - Value, - std::random_access_iterator_tag) -{ - typedef typename - boost::detail::iterator_traits::difference_type - difference_type; - difference_type distance = boost::detail::distance(start, finish); - - // Pick a random position internal to the range - difference_type offset = (unsigned)rand() % distance; - -#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS - assert(offset >= 0); -#else - assert_nonnegative::test(offset); -#endif - - CountingIterator internal = start; - std::advance(internal, offset); - - // Try some binary searches on the range to show that it's ordered - assert(std::binary_search(start, finish, *internal)); - - // #including tuple crashed borland, so I had to give up on tie(). - std::pair xy( - std::equal_range(start, finish, *internal)); - CountingIterator x = xy.first, y = xy.second; - - assert(boost::detail::distance(x, y) == 1); - - // Show that values outside the range can't be found - assert(!std::binary_search(start, boost::prior(finish), *finish)); - - // Do the generic random_access_iterator_test - typedef typename CountingIterator::value_type value_type; - std::vector v; - for (value_type z = *start; !(z == *finish); ++z) - v.push_back(z); - - // Note that this test requires a that the first argument is - // dereferenceable /and/ a valid iterator prior to the first argument - boost::random_access_iterator_test(start, v.size(), v.begin()); -} - -// Special tests for bidirectional CountingIterators -template -void category_test(CountingIterator start, Value v1, std::bidirectional_iterator_tag) -{ - Value v2 = v1; - ++v2; - - // Note that this test requires a that the first argument is - // dereferenceable /and/ a valid iterator prior to the first argument - boost::bidirectional_iterator_test(start, v1, v2); -} - -template -void category_test(CountingIterator start, CountingIterator finish, Value v1, std::forward_iterator_tag) -{ - Value v2 = v1; - ++v2; - if (finish != start && finish != boost::next(start)) - boost::forward_readable_iterator_test(start, finish, v1, v2); -} - -template -void test_aux(CountingIterator start, CountingIterator finish, Value v1) -{ - typedef typename CountingIterator::iterator_category category; - typedef typename CountingIterator::value_type value_type; - - // If it's a RandomAccessIterator we can do a few delicate tests - category_test(start, finish, v1, category()); - - // Okay, brute force... - for (CountingIterator p = start - ; p != finish && boost::next(p) != finish - ; ++p) - { - assert(boost::next(*p) == *boost::next(p)); - } - - // prove that a reference can be formed to these values - typedef typename CountingIterator::value_type value; - const value* q = &*start; - (void)q; // suppress unused variable warning -} - -template -void test(Incrementable start, Incrementable finish) -{ - test_aux(boost::make_counting_iterator(start), boost::make_counting_iterator(finish), start); -} - -template -void test_integer(Integer* = 0) // default arg works around MSVC bug -{ - Integer start = 0; - Integer finish = 120; - test(start, finish); -} - -template -void test_integer3(Integer* = 0, Category* = 0, Difference* = 0) // default arg works around MSVC bug -{ - Integer start = 0; - Integer finish = 120; - typedef boost::counting_iterator iterator; - test_aux(iterator(start), iterator(finish), start); -} - -template -void test_container(Container* = 0) // default arg works around MSVC bug -{ - Container c(1 + (unsigned)rand() % 1673); - - const typename Container::iterator start = c.begin(); - - // back off by 1 to leave room for dereferenceable value at the end - typename Container::iterator finish = start; - std::advance(finish, c.size() - 1); - - test(start, finish); - - typedef typename Container::const_iterator const_iterator; - test(const_iterator(start), const_iterator(finish)); -} - -class my_int1 { -public: - my_int1() { } - my_int1(int x) : m_int(x) { } - my_int1& operator++() { ++m_int; return *this; } - bool operator==(const my_int1& x) const { return m_int == x.m_int; } -private: - int m_int; -}; - -class my_int2 { -public: - typedef void value_type; - typedef void pointer; - typedef void reference; - typedef std::ptrdiff_t difference_type; - typedef std::bidirectional_iterator_tag iterator_category; - - my_int2() { } - my_int2(int x) : m_int(x) { } - my_int2& operator++() { ++m_int; return *this; } - my_int2& operator--() { --m_int; return *this; } - bool operator==(const my_int2& x) const { return m_int == x.m_int; } -private: - int m_int; -}; - -class my_int3 { -public: - typedef void value_type; - typedef void pointer; - typedef void reference; - typedef std::ptrdiff_t difference_type; - typedef std::random_access_iterator_tag iterator_category; - - my_int3() { } - my_int3(int x) : m_int(x) { } - my_int3& operator++() { ++m_int; return *this; } - my_int3& operator+=(std::ptrdiff_t n) { m_int += n; return *this; } - std::ptrdiff_t operator-(const my_int3& x) const { return m_int - x.m_int; } - my_int3& operator--() { --m_int; return *this; } - bool operator==(const my_int3& x) const { return m_int == x.m_int; } - bool operator!=(const my_int3& x) const { return m_int != x.m_int; } - bool operator<(const my_int3& x) const { return m_int < x.m_int; } -private: - int m_int; -}; - -int main() -{ - // Test the built-in integer types. - test_integer(); - test_integer(); - test_integer(); - test_integer(); - test_integer(); - test_integer(); - test_integer(); - test_integer(); - test_integer(); - test_integer(); -#if defined(BOOST_HAS_LONG_LONG) - test_integer(); - test_integer(); -#endif - - // Test user-defined type. - - test_integer3(); - test_integer(); - test_integer(); - - // Some tests on container iterators, to prove we handle a few different categories - test_container >(); - test_container >(); -# ifndef BOOST_NO_SLIST - test_container >(); -# endif - - // Also prove that we can handle raw pointers. - int array[2000]; - test(boost::make_counting_iterator(array), boost::make_counting_iterator(array+2000-1)); - - return 0; -} diff --git a/test/filter_iterator_test.cpp b/test/filter_iterator_test.cpp deleted file mode 100644 index 11c260c..0000000 --- a/test/filter_iterator_test.cpp +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright David Abrahams 2003, Jeremy Siek 2004. - -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all -// copies. This software is provided "as is" without express or -// implied warranty, and with no claim as to its suitability for any -// purpose. - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -using boost::dummyT; - -struct one_or_four -{ - bool operator()(dummyT x) const - { - return x.foo() == 1 || x.foo() == 4; - } -}; - -template struct undefined; - -template struct see_type; - -// Test filter iterator -int main() -{ - // Concept checks - // Adapting old-style iterators - { - typedef boost::filter_iterator > Iter; - boost::function_requires< boost::InputIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::SinglePassIteratorConcept >(); - } - { - typedef boost::filter_iterator > Iter; - boost::function_requires< boost::InputIteratorConcept >(); - boost::function_requires< boost::OutputIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::SinglePassIteratorConcept >(); - } - { - typedef boost::filter_iterator > Iter; - boost::function_requires< boost::ForwardIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::ForwardTraversalConcept >(); - } - { - typedef boost::filter_iterator > Iter; - boost::function_requires< boost::Mutable_ForwardIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::ForwardTraversalConcept >(); - } - // Adapting new-style iterators - { - typedef boost::iterator_archetype< - const dummyT - , boost::iterator_archetypes::readable_iterator_t - , boost::single_pass_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - boost::function_requires< boost::InputIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::SinglePassIteratorConcept >(); - } -#if !BOOST_WORKAROUND(BOOST_MSVC, == 1200) // Causes Internal Error in linker. - { - typedef boost::iterator_archetype< - dummyT - , boost::iterator_archetypes::readable_writable_iterator_t - , boost::single_pass_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - - boost::function_requires< boost::InputIteratorConcept >(); - boost::function_requires< boost::OutputIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::SinglePassIteratorConcept >(); - } -#endif - { - typedef boost::iterator_archetype< - const dummyT - , boost::iterator_archetypes::readable_iterator_t - , boost::forward_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - boost::function_requires< boost::InputIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::ForwardTraversalConcept >(); - } - -#if !BOOST_WORKAROUND(BOOST_MSVC, == 1200) // Causes Internal Error in linker. - { - typedef boost::iterator_archetype< - dummyT - , boost::iterator_archetypes::readable_writable_iterator_t - , boost::forward_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::ForwardTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - const dummyT - , boost::iterator_archetypes::readable_lvalue_iterator_t - , boost::forward_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - boost::function_requires< boost::ForwardIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::ForwardTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - dummyT - , boost::iterator_archetypes::writable_lvalue_iterator_t - , boost::forward_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - boost::function_requires< boost::Mutable_ForwardIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::ForwardTraversalConcept >(); - } -#endif - - // Run-time tests - - dummyT array[] = { dummyT(0), dummyT(1), dummyT(2), - dummyT(3), dummyT(4), dummyT(5) }; - const int N = sizeof(array)/sizeof(dummyT); - - typedef boost::filter_iterator filter_iter; - - boost::bidirectional_readable_iterator_test( - filter_iter(one_or_four(), array, array+N) - , dummyT(1), dummyT(4)); - - BOOST_STATIC_ASSERT( - (!boost::is_convertible< - boost::iterator_traversal::type - , boost::random_access_traversal_tag - >::value - )); - - //# endif - - // On compilers not supporting partial specialization, we can do more type - // deduction with deque iterators than with pointers... unless the library - // is broken ;-( - std::deque array2; - std::copy(array+0, array+N, std::back_inserter(array2)); - boost::bidirectional_readable_iterator_test( - boost::make_filter_iterator(one_or_four(), array2.begin(), array2.end()), - dummyT(1), dummyT(4)); - - boost::bidirectional_readable_iterator_test( - boost::make_filter_iterator(one_or_four(), array2.begin(), array2.end()), - dummyT(1), dummyT(4)); - - boost::bidirectional_readable_iterator_test( - boost::make_filter_iterator( - one_or_four() - , boost::make_reverse_iterator(array2.end()) - , boost::make_reverse_iterator(array2.begin()) - ), - dummyT(4), dummyT(1)); - - boost::bidirectional_readable_iterator_test( - filter_iter(array+0, array+N), - dummyT(1), dummyT(4)); - - boost::bidirectional_readable_iterator_test( - filter_iter(one_or_four(), array, array + N), - dummyT(1), dummyT(4)); - - - std::cout << "test successful " << std::endl; - return boost::exit_success; -} diff --git a/test/indirect_iterator_member_types.cpp b/test/indirect_iterator_member_types.cpp deleted file mode 100644 index b4013ad..0000000 --- a/test/indirect_iterator_member_types.cpp +++ /dev/null @@ -1,89 +0,0 @@ -// (C) Copyright Jeremy Siek 2004. Permission to copy, use, modify, -// sell and distribute this software is granted provided this -// copyright notice appears in all copies. This software is provided -// "as is" without express or implied warranty, and with no claim as -// to its suitability for any purpose. - -// Revision History -// 03 Jan 2004 Jeremy Siek -// First draft. - - -#include -#include - -#include -#include -#include "static_assert_same.hpp" -#include - -struct zow { }; - -struct my_ptr { - typedef zow const element_type; -// typedef const zow& reference; -// typedef const zow* pointer; -// typedef void difference_type; -// typedef boost::no_traversal_tag iterator_category; -}; - -BOOST_TT_BROKEN_COMPILER_SPEC(my_ptr) -BOOST_TT_BROKEN_COMPILER_SPEC(zow) - -// Borland 5.6.4 and earlier drop const all over the place, so this -// test will fail in the lines marked with (**) - -int main() -{ - { - typedef boost::indirect_iterator Iter; - STATIC_ASSERT_SAME(Iter::value_type, int); - STATIC_ASSERT_SAME(Iter::reference, int&); - STATIC_ASSERT_SAME(Iter::pointer, int*); - STATIC_ASSERT_SAME(Iter::difference_type, std::ptrdiff_t); - - BOOST_STATIC_ASSERT((boost::is_convertible::value)); - BOOST_STATIC_ASSERT((boost::is_convertible::type, - boost::random_access_traversal_tag>::value)); - } - { - typedef boost::indirect_iterator Iter; - STATIC_ASSERT_SAME(Iter::value_type, int); - STATIC_ASSERT_SAME(Iter::reference, const int&); - STATIC_ASSERT_SAME(Iter::pointer, const int*); // (**) - } - { - typedef boost::indirect_iterator Iter; - STATIC_ASSERT_SAME(Iter::value_type, int); - STATIC_ASSERT_SAME(Iter::reference, int&); - STATIC_ASSERT_SAME(Iter::pointer, int*); - } - { - typedef boost::indirect_iterator Iter; - STATIC_ASSERT_SAME(Iter::value_type, int); - STATIC_ASSERT_SAME(Iter::reference, const int&); - STATIC_ASSERT_SAME(Iter::pointer, const int*); // (**) - } - { - typedef boost::indirect_iterator Iter; - STATIC_ASSERT_SAME(Iter::value_type, zow); - STATIC_ASSERT_SAME(Iter::reference, const zow&); // (**) - STATIC_ASSERT_SAME(Iter::pointer, const zow*); // (**) - - STATIC_ASSERT_SAME(Iter::difference_type, std::ptrdiff_t); - - BOOST_STATIC_ASSERT((boost::is_convertible::value)); - BOOST_STATIC_ASSERT((boost::is_convertible::type, - boost::random_access_traversal_tag>::value)); - } - { - typedef boost::indirect_iterator Iter; - STATIC_ASSERT_SAME(Iter::value_type, int); - STATIC_ASSERT_SAME(Iter::reference, long&); - STATIC_ASSERT_SAME(Iter::pointer, int*); - STATIC_ASSERT_SAME(Iter::difference_type, short); - } - return 0; -} diff --git a/test/indirect_iterator_test.cpp b/test/indirect_iterator_test.cpp deleted file mode 100644 index 781c226..0000000 --- a/test/indirect_iterator_test.cpp +++ /dev/null @@ -1,220 +0,0 @@ -// (C) Copyright Jeremy Siek 1999. Permission to copy, use, modify, -// sell and distribute this software is granted provided this -// copyright notice appears in all copies. This software is provided -// "as is" without express or implied warranty, and with no claim as -// to its suitability for any purpose. - -// Revision History -// 22 Nov 2002 Thomas Witt -// Added interoperability check. -// 08 Mar 2001 Jeremy Siek -// Moved test of indirect iterator into its own file. It to -// to be in iterator_adaptor_test.cpp. - -#include -#include -#include - -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -#if !defined(__SGI_STL_PORT) \ - && (defined(BOOST_MSVC_STD_ITERATOR) \ - || BOOST_WORKAROUND(_CPPLIB_VER, <= 310) \ - || BOOST_WORKAROUND(__GNUC__, <= 2)) - -// std container random-access iterators don't support mutable/const -// interoperability (but may support const/mutable interop). -# define NO_MUTABLE_CONST_STD_SET_ITERATOR_INTEROPERABILITY - -#endif - - -template struct see_type; -template struct see_val; - -struct my_iterator_tag : public std::random_access_iterator_tag { }; - -using boost::dummyT; -BOOST_TT_BROKEN_COMPILER_SPEC(boost::shared_ptr) - -typedef std::vector storage; -typedef std::vector pointer_ra_container; -typedef std::set iterator_set; - -template -struct indirect_iterator_pair_generator -{ - typedef boost::indirect_iterator iterator; - - typedef boost::indirect_iterator< - typename Container::iterator - , typename iterator::value_type const - > const_iterator; -}; - -void more_indirect_iterator_tests() -{ - storage store(1000); - std::generate(store.begin(), store.end(), rand); - - pointer_ra_container ptr_ra_container; - iterator_set iter_set; - - for (storage::iterator p = store.begin(); p != store.end(); ++p) - { - ptr_ra_container.push_back(&*p); - iter_set.insert(p); - } - - typedef indirect_iterator_pair_generator indirect_ra_container; - - indirect_ra_container::iterator db(ptr_ra_container.begin()); - indirect_ra_container::iterator de(ptr_ra_container.end()); - assert(static_cast(de - db) == store.size()); - assert(db + store.size() == de); - indirect_ra_container::const_iterator dci = db; - - assert(dci == db); - -#ifndef NO_MUTABLE_CONST_RA_ITERATOR_INTEROPERABILITY - assert(db == dci); -#endif - - assert(dci != de); - assert(dci < de); - assert(dci <= de); - -#ifndef NO_MUTABLE_CONST_RA_ITERATOR_INTEROPERABILITY - assert(de >= dci); - assert(de > dci); -#endif - - dci = de; - assert(dci == de); - - boost::random_access_iterator_test(db + 1, store.size() - 1, boost::next(store.begin())); - - *db = 999; - assert(store.front() == 999); - - // Borland C++ is getting very confused about the typedefs here - typedef boost::indirect_iterator indirect_set_iterator; - typedef boost::indirect_iterator< - iterator_set::iterator - , iterator_set::iterator::value_type const - > const_indirect_set_iterator; - - indirect_set_iterator sb(iter_set.begin()); - indirect_set_iterator se(iter_set.end()); - const_indirect_set_iterator sci(iter_set.begin()); - assert(sci == sb); - -# ifndef NO_MUTABLE_CONST_STD_SET_ITERATOR_INTEROPERABILITY - assert(se != sci); -# endif - - assert(sci != se); - sci = se; - assert(sci == se); - - *boost::prior(se) = 888; - assert(store.back() == 888); - assert(std::equal(sb, se, store.begin())); - - boost::bidirectional_iterator_test(boost::next(sb), store[1], store[2]); - assert(std::equal(db, de, store.begin())); -} - -// element_type detector; defaults to true so the test passes when -// has_xxx isn't implemented -BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_element_type, element_type, true) - -int -main() -{ - dummyT array[] = { dummyT(0), dummyT(1), dummyT(2), - dummyT(3), dummyT(4), dummyT(5) }; - const int N = sizeof(array)/sizeof(dummyT); - -# if BOOST_WORKAROUND(BOOST_MSVC, == 1200) - boost::shared_ptr zz((dummyT*)0); // Why? I don't know, but it suppresses a bad instantiation. -# endif - - typedef std::vector > shared_t; - shared_t shared; - - // Concept checks - { - typedef boost::indirect_iterator iter_t; - - BOOST_STATIC_ASSERT( - has_element_type< - boost::detail::iterator_traits::value_type - >::value - ); - - typedef boost::indirect_iterator< - shared_t::iterator - , boost::iterator_value::type const - > c_iter_t; - -# ifndef NO_MUTABLE_CONST_RA_ITERATOR_INTEROPERABILITY - boost::function_requires< boost_concepts::InteroperableIteratorConcept >(); -# endif - } - - // Test indirect_iterator_generator - { - for (int jj = 0; jj < N; ++jj) - shared.push_back(boost::shared_ptr(new dummyT(jj))); - - dummyT* ptr[N]; - for (int k = 0; k < N; ++k) - ptr[k] = array + k; - - typedef boost::indirect_iterator indirect_iterator; - - typedef boost::indirect_iterator - const_indirect_iterator; - - indirect_iterator i(ptr); - boost::random_access_iterator_test(i, N, array); - - boost::random_access_iterator_test( - boost::indirect_iterator(shared.begin()) - , N, array); - - boost::random_access_iterator_test(boost::make_indirect_iterator(ptr), N, array); - - // check operator-> - assert((*i).m_x == i->foo()); - - const_indirect_iterator j(ptr); - boost::random_access_iterator_test(j, N, array); - - dummyT const*const* const_ptr = ptr; - boost::random_access_iterator_test(boost::make_indirect_iterator(const_ptr), N, array); - - boost::const_nonconst_iterator_test(i, ++j); - - more_indirect_iterator_tests(); - } - std::cout << "test successful " << std::endl; - return 0; -} diff --git a/test/interoperable.cpp b/test/interoperable.cpp deleted file mode 100755 index c228b9c..0000000 --- a/test/interoperable.cpp +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright David Abrahams 2004. 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) - -#include -#include -#include - -struct mutable_it : boost::iterator_adaptor -{ - typedef boost::iterator_adaptor super_t; - - mutable_it(); - explicit mutable_it(int* p) : super_t(p) {} - - bool equal(mutable_it const& rhs) const - { - return this->base() == rhs.base(); - } -}; - -struct constant_it : boost::iterator_adaptor -{ - typedef boost::iterator_adaptor super_t; - - constant_it(); - explicit constant_it(int* p) : super_t(p) {} - constant_it(mutable_it const& x) : super_t(x.base()) {} - - bool equal(constant_it const& rhs) const - { - return this->base() == rhs.base(); - } -}; - -int main() -{ - int data[] = { 49, 77 }; - - mutable_it i(data); - constant_it j(data + 1); - assert(i < j); - assert(j > i); - assert(i <= j); - assert(j >= i); - assert(j - i == 1); - assert(i - j == -1); - - constant_it k = i; - - assert(!(i < k)); - assert(!(k > i)); - assert(i <= k); - assert(k >= i); - assert(k - i == 0); - assert(i - k == 0); - - return 0; -} diff --git a/test/interoperable_fail.cpp b/test/interoperable_fail.cpp deleted file mode 100644 index d3d869d..0000000 --- a/test/interoperable_fail.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright Thomas Witt 2003. Permission to copy, use, -// modify, sell and distribute this software is granted provided this -// copyright notice appears in all copies. This software is provided -// "as is" without express or implied warranty, and with no claim as -// to its suitability for any purpose. -#include -#include -#include -#include -#include - -int main() -{ - { - typedef boost::reverse_iterator::iterator> rev_iter; - typedef boost::indirect_iterator::iterator> ind_iter; - - ind_iter() == rev_iter(); - } - - return boost::exit_success; -} diff --git a/test/is_convertible_fail.cpp b/test/is_convertible_fail.cpp deleted file mode 100644 index 7d3c9b1..0000000 --- a/test/is_convertible_fail.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -int main() -{ - typedef boost::reverse_iterator rev_iter1; - typedef boost::reverse_iterator rev_iter2; - - return boost::is_convertible::value - ? boost::exit_failure : boost::exit_success; -} diff --git a/test/is_lvalue_iterator.cpp b/test/is_lvalue_iterator.cpp deleted file mode 100755 index fdace52..0000000 --- a/test/is_lvalue_iterator.cpp +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright David Abrahams 2003. 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) - -#include -#include -#include -#include -#include -#include -#include -#include - -// Last, for BOOST_NO_LVALUE_RETURN_DETECTION -#include - -struct v -{ - v(); - ~v(); -}; - -BOOST_TT_BROKEN_COMPILER_SPEC(v) - -struct value_iterator : boost::iterator -{ - v operator*() const; -}; - -struct noncopyable_iterator : boost::iterator -{ - boost::noncopyable const& operator*() const; -}; - -template -struct proxy_iterator - : boost::iterator -{ - typedef T value_type; - -#if BOOST_WORKAROUND(__GNUC__, == 2) - typedef boost::iterator base; - typedef base::iterator_category iterator_category; - typedef base::difference_type difference_type; - typedef base::pointer pointer; - typedef base::reference reference; -#endif - - struct proxy - { - operator value_type&() const; - proxy& operator=(value_type) const; - }; - - proxy operator*() const; -}; - -template -struct lvalue_iterator -{ - typedef T value_type; - typedef T& reference; - typedef T difference_type; - typedef std::input_iterator_tag iterator_category; - typedef T* pointer; - - T& operator*() const; - lvalue_iterator& operator++(); - lvalue_iterator operator++(int); -}; - -template -struct constant_lvalue_iterator -{ - typedef T value_type; - typedef T const& reference; - typedef T difference_type; - typedef std::input_iterator_tag iterator_category; - typedef T const* pointer; - - T const& operator*() const; - constant_lvalue_iterator& operator++(); - constant_lvalue_iterator operator++(int); -}; - -BOOST_TT_BROKEN_COMPILER_SPEC(proxy_iterator::proxy) -BOOST_TT_BROKEN_COMPILER_SPEC(proxy_iterator::proxy) - -int main() -{ - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator::iterator>::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator::const_iterator>::value); - BOOST_STATIC_ASSERT(!boost::is_lvalue_iterator > >::value); - BOOST_STATIC_ASSERT(!boost::is_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(!boost::is_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(!boost::is_lvalue_iterator >::value); -#ifndef BOOST_NO_LVALUE_RETURN_DETECTION - BOOST_STATIC_ASSERT(!boost::is_lvalue_iterator::value); -#endif - // Make sure inaccessible copy constructor doesn't prevent - // reference binding - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator::value); - - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator >::value); - - - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator >::value); - - - - BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator::value); - BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator::iterator>::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator::const_iterator>::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator > >::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator >::value); -#ifndef BOOST_NO_LVALUE_RETURN_DETECTION - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator::value); -#endif - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator::value); - - BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator >::value); -#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) - BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator >::value); -#endif - BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator >::value); - - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator >::value); - - return 0; -} diff --git a/test/is_readable_iterator.cpp b/test/is_readable_iterator.cpp deleted file mode 100755 index 15ed099..0000000 --- a/test/is_readable_iterator.cpp +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright David Abrahams 2003. 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) - -#include -#include -#include -#include -#include -#include -#include -#include - -// Last, for BOOST_NO_LVALUE_RETURN_DETECTION -#include - -struct v -{ - v(); - ~v(); -}; - -BOOST_TT_BROKEN_COMPILER_SPEC(v) - -struct value_iterator : boost::iterator -{ - v operator*() const; -}; - -struct noncopyable_iterator : boost::iterator -{ - boost::noncopyable const& operator*() const; -}; - -struct proxy_iterator : boost::iterator -{ -#if BOOST_WORKAROUND(__GNUC__, == 2) - typedef boost::iterator base; - typedef base::iterator_category iterator_category; - typedef base::value_type value_type; - typedef base::difference_type difference_type; - typedef base::pointer pointer; - typedef base::reference reference; -#endif - - struct proxy - { - operator v&(); - proxy& operator=(v) const; - }; - - proxy operator*() const; -}; - -struct proxy_iterator2 : boost::iterator -{ -#if BOOST_WORKAROUND(__GNUC__, == 2) - typedef boost::iterator base; - typedef base::iterator_category iterator_category; - typedef base::value_type value_type; - typedef base::difference_type difference_type; - typedef base::pointer pointer; - typedef base::reference reference; -#endif - - struct proxy - { - proxy& operator=(v) const; - }; - - proxy operator*() const; -}; - -BOOST_TT_BROKEN_COMPILER_SPEC(proxy_iterator::proxy) - -int main() -{ - BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); - BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); - BOOST_STATIC_ASSERT(boost::is_readable_iterator::iterator>::value); - BOOST_STATIC_ASSERT(boost::is_readable_iterator::const_iterator>::value); - BOOST_STATIC_ASSERT(!boost::is_readable_iterator > >::value); - BOOST_STATIC_ASSERT(!boost::is_readable_iterator >::value); - BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); - BOOST_STATIC_ASSERT(!boost::is_readable_iterator::value); - BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); - - // Make sure inaccessible copy constructor doesn't prevent - // readability - BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); - - return 0; -} diff --git a/test/iterator_adaptor_cc.cpp b/test/iterator_adaptor_cc.cpp deleted file mode 100644 index 67683f0..0000000 --- a/test/iterator_adaptor_cc.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include -#include -#include -#include - -int main() -{ - { - typedef boost::reverse_iterator rev_iter; - typedef boost::reverse_iterator c_rev_iter; - - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::RandomAccessTraversalConcept >(); - boost::function_requires< boost::RandomAccessIteratorConcept >(); - boost::function_requires< boost_concepts::InteroperableIteratorConcept >(); - } - - // Many compilers' builtin container iterators don't interoperate well, though - // STLport fixes that problem. -#if defined(__SGI_STL_PORT) \ - || !BOOST_WORKAROUND(__GNUC__, <= 2) \ - && !(BOOST_WORKAROUND(__GNUC__, == 3) && BOOST_WORKAROUND(__GNUC_MINOR__, <= 1)) \ - && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) \ - && !BOOST_WORKAROUND(__LIBCOMO_VERSION__, BOOST_TESTED_AT(29)) \ - && !BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, <= 1) - { - typedef boost::reverse_iterator::iterator> rev_iter; - typedef boost::reverse_iterator::const_iterator> c_rev_iter; - - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - boost::function_requires< boost::BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::InteroperableIteratorConcept >(); - } -#endif - - return boost::exit_success; -} diff --git a/test/iterator_adaptor_test.cpp b/test/iterator_adaptor_test.cpp deleted file mode 100644 index ca39a87..0000000 --- a/test/iterator_adaptor_test.cpp +++ /dev/null @@ -1,323 +0,0 @@ -// (C) Copyright Thomas Witt 2003. Permission to copy, use, modify, -// sell and distribute this software is granted provided this -// copyright notice appears in all copies. This software is provided -// "as is" without express or implied warranty, and with no claim as -// to its suitability for any purpose. - -// See http://www.boost.org for most recent version including documentation. - -#include -#include - -#include -#include -#include - -#include -#if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407) -# include -# include -#endif -#include - -# include - -#include -#include -#include -#include -#include - -#include "static_assert_same.hpp" - -#include - -using boost::dummyT; - -struct mult_functor { - typedef int result_type; - typedef int argument_type; - // Functors used with transform_iterator must be - // DefaultConstructible, as the transform_iterator must be - // DefaultConstructible to satisfy the requirements for - // TrivialIterator. - mult_functor() { } - mult_functor(int aa) : a(aa) { } - int operator()(int b) const { return a * b; } - int a; -}; - -template -struct select1st_ - : public std::unary_function -{ - const typename Pair::first_type& operator()(const Pair& x) const { - return x.first; - } - typename Pair::first_type& operator()(Pair& x) const { - return x.first; - } -}; - -struct one_or_four { - bool operator()(dummyT x) const { - return x.foo() == 1 || x.foo() == 4; - } -}; - -typedef std::deque storage; -typedef std::deque pointer_deque; -typedef std::set iterator_set; - -template struct foo; - -void blah(int) { } - -struct my_gen -{ - typedef int result_type; - my_gen() : n(0) { } - int operator()() { return ++n; } - int n; -}; - -template -struct ptr_iterator - : boost::iterator_adaptor< - ptr_iterator - , V* - , V - , boost::random_access_traversal_tag -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) - , V& -#endif - > -{ -private: - typedef boost::iterator_adaptor< - ptr_iterator - , V* - , V - , boost::random_access_traversal_tag -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) - , V& -#endif - > super_t; - -public: - ptr_iterator() { } - ptr_iterator(V* d) : super_t(d) { } - - template - ptr_iterator( - const ptr_iterator& x - , typename boost::enable_if_convertible::type* = 0 - ) - : super_t(x.base()) - {} -}; - -// Non-functional iterator for category modification checking -template -struct modify_traversal - : boost::iterator_adaptor< - modify_traversal - , Iter - , boost::use_default - , Traversal - > -{}; - -template -struct fwd_iterator - : boost::iterator_adaptor< - fwd_iterator - , boost::forward_iterator_archetype - > -{ -private: - typedef boost::iterator_adaptor< - fwd_iterator - , boost::forward_iterator_archetype - > super_t; - -public: - fwd_iterator() { } - fwd_iterator(boost::forward_iterator_archetype d) : super_t(d) { } -}; - -template -struct in_iterator - : boost::iterator_adaptor< - in_iterator - , boost::input_iterator_archetype_no_proxy - > -{ -private: - typedef boost::iterator_adaptor< - in_iterator - , boost::input_iterator_archetype_no_proxy - > super_t; - -public: - in_iterator() { } - in_iterator(boost::input_iterator_archetype_no_proxy d) : super_t(d) { } -}; - -template -struct constant_iterator - : boost::iterator_adaptor< - constant_iterator - , Iter - , typename std::iterator_traits::value_type const - > -{ - typedef boost::iterator_adaptor< - constant_iterator - , Iter - , typename std::iterator_traits::value_type const - > base_t; - - constant_iterator() {} - constant_iterator(Iter it) - : base_t(it) {} -}; - -char (& traversal2(boost::incrementable_traversal_tag) )[1]; -char (& traversal2(boost::single_pass_traversal_tag ) )[2]; -char (& traversal2(boost::forward_traversal_tag ) )[3]; -char (& traversal2(boost::bidirectional_traversal_tag) )[4]; -char (& traversal2(boost::random_access_traversal_tag) )[5]; - -template -struct traversal3 -{ - static typename boost::iterator_category_to_traversal::type x; - BOOST_STATIC_CONSTANT(std::size_t, value = sizeof(traversal2(x))); - typedef char (&type)[value]; -}; - -template -typename traversal3::type traversal(Cat); - -template -int static_assert_traversal(Iter* = 0, Trav* = 0) -{ - typedef typename boost::iterator_category_to_traversal< - BOOST_DEDUCED_TYPENAME Iter::iterator_category - >::type t2; - - return static_assert_same::value; -} - -int -main() -{ - dummyT array[] = { dummyT(0), dummyT(1), dummyT(2), - dummyT(3), dummyT(4), dummyT(5) }; - const int N = sizeof(array)/sizeof(dummyT); - - // sanity check, if this doesn't pass the test is buggy - boost::random_access_iterator_test(array, N, array); - - // Test the iterator_adaptor - { - ptr_iterator i(array); - boost::random_access_iterator_test(i, N, array); - - ptr_iterator j(array); - boost::random_access_iterator_test(j, N, array); - boost::const_nonconst_iterator_test(i, ++j); - } - - int test; - // Test the iterator_traits - { - // Test computation of defaults - typedef ptr_iterator Iter1; - // don't use std::iterator_traits here to avoid VC++ problems - test = static_assert_same::value; - test = static_assert_same::value; - test = static_assert_same::value; - test = static_assert_same::value; -#if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407) - BOOST_STATIC_ASSERT((boost::is_convertible::value)); -#endif - } - - { - // Test computation of default when the Value is const - typedef ptr_iterator Iter1; - test = static_assert_same::value; - test = static_assert_same::value; - -#if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407) - BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); -# ifndef BOOST_NO_LVALUE_RETURN_DETECTION - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator::value); -# endif -#endif - -#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) // borland drops constness - test = static_assert_same::value; -#endif - } - - { - // Test constant iterator idiom - typedef ptr_iterator BaseIter; - typedef constant_iterator Iter; - - test = static_assert_same::value; - test = static_assert_same::value; -#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) // borland drops constness - test = static_assert_same::value; -#endif - -#ifndef BOOST_NO_LVALUE_RETURN_DETECTION - BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator::value); -#endif - - typedef modify_traversal IncrementableIter; - - static_assert_traversal(); - static_assert_traversal(); - } - - // Test the iterator_adaptor - { - ptr_iterator i(array); - boost::random_access_iterator_test(i, N, array); - - ptr_iterator j(array); - boost::random_access_iterator_test(j, N, array); - boost::const_nonconst_iterator_test(i, ++j); - } - - // check operator-> with a forward iterator - { - boost::forward_iterator_archetype forward_iter; - - typedef fwd_iterator adaptor_type; - - adaptor_type i(forward_iter); - int zero = 0; - if (zero) // don't do this, just make sure it compiles - assert((*i).m_x == i->foo()); - } - - // check operator-> with an input iterator - { - boost::input_iterator_archetype_no_proxy input_iter; - typedef in_iterator adaptor_type; - adaptor_type i(input_iter); - int zero = 0; - if (zero) // don't do this, just make sure it compiles - assert((*i).m_x == i->foo()); - } - - std::cout << "test successful " << std::endl; - (void)test; - return 0; -} diff --git a/test/iterator_archetype_cc.cpp b/test/iterator_archetype_cc.cpp deleted file mode 100644 index 6a71551..0000000 --- a/test/iterator_archetype_cc.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// -// Copyright Thomas Witt 2003. Permission to copy, use, -// modify, sell and distribute this software is granted provided this -// copyright notice appears in all copies. This software is provided -// "as is" without express or implied warranty, and with no claim as -// to its suitability for any purpose. -// -#include -#include -#include -#include -#include - -int main() -{ - { - typedef boost::iterator_archetype< - int - , boost::iterator_archetypes::readable_iterator_t - , boost::random_access_traversal_tag - > iter; - - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::RandomAccessTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - int - , boost::iterator_archetypes::readable_writable_iterator_t - , boost::random_access_traversal_tag - > iter; - - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::RandomAccessTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - const int // I don't like adding const to Value. It is redundant. -JGS - , boost::iterator_archetypes::readable_lvalue_iterator_t - , boost::random_access_traversal_tag - > iter; - - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::RandomAccessTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - int - , boost::iterator_archetypes::writable_lvalue_iterator_t - , boost::random_access_traversal_tag - > iter; - - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::RandomAccessTraversalConcept >(); - } - - return boost::exit_success; -} - diff --git a/test/iterator_archetype_default_ctor.cpp b/test/iterator_archetype_default_ctor.cpp deleted file mode 100755 index fd10b35..0000000 --- a/test/iterator_archetype_default_ctor.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright Thomas Witt 2004. Permission to copy, use, -// modify, sell and distribute this software is granted provided this -// copyright notice appears in all copies. This software is provided -// "as is" without express or implied warranty, and with no claim as -// to its suitability for any purpose. -// -#include - - -int main() -{ - typedef boost::iterator_archetype< - int - , boost::iterator_archetypes::readable_iterator_t - , boost::single_pass_traversal_tag - > iter; - - // single_pass_traversal iterators are not required to be - // default constructible - iter it; -} diff --git a/test/iterator_facade.cpp b/test/iterator_facade.cpp deleted file mode 100755 index b478b9c..0000000 --- a/test/iterator_facade.cpp +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright David Abrahams 2004. 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) - -// This is really an incomplete test; should be fleshed out. - -#include -#include -#include - -// This is a really, really limited test so far. All we're doing -// right now is checking that the postfix++ proxy for single-pass -// iterators works properly. -template -class counter_iterator - : public boost::iterator_facade< - counter_iterator - , int const - , boost::single_pass_traversal_tag - , Ref - > -{ - public: - counter_iterator() {} - counter_iterator(int* state) : state(state) {} - - void increment() - { - ++*state; - } - - Ref - dereference() const - { - return *state; - } - - bool equal(counter_iterator const& y) const - { - return *this->state == *y.state; - } - - int* state; -}; - -struct proxy -{ - proxy(int& x) : state(x) {} - - operator int const&() const - { - return state; - } - - int& operator=(int x) { state = x; return state; } - - int& state; -}; - -int main() -{ - int state = 0; - boost::readable_iterator_test(counter_iterator(&state), 0); - state = 3; - boost::readable_iterator_test(counter_iterator(&state), 3); - boost::writable_iterator_test(counter_iterator(&state), 9, 7); - BOOST_ASSERT(state == 7); - return 0; -} diff --git a/test/lvalue_concept_fail_expected.cpp b/test/lvalue_concept_fail_expected.cpp deleted file mode 100644 index b52c52d..0000000 --- a/test/lvalue_concept_fail_expected.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include -#include - -int main() -{ - typedef boost::iterator_archetype< - int - , boost::iterator_archetypes::readable_iterator_t - , boost::single_pass_traversal_tag - > Iter; - boost::function_requires< - boost_concepts::LvalueIteratorConcept >(); - return boost::exit_success; -} diff --git a/test/permutation_iterator_test.cpp b/test/permutation_iterator_test.cpp deleted file mode 100644 index ad23300..0000000 --- a/test/permutation_iterator_test.cpp +++ /dev/null @@ -1,85 +0,0 @@ -// (C) Copyright Toon Knapen 2001. -// (C) Copyright Roland Richter 2003. -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. - -#include -#include - -#include -#include - -#include -#include - -#include - - -void permutation_test() -{ - // Example taken from documentation of old permutation_iterator. - typedef std::vector< double > element_range_type; - typedef std::list< int > index_type; - - const int element_range_size = 10; - const int index_size = 7; - - BOOST_STATIC_ASSERT(index_size <= element_range_size); - element_range_type elements( element_range_size ); - for( element_range_type::iterator el_it = elements.begin(); el_it != elements.end(); ++el_it ) - { *el_it = std::distance(elements.begin(), el_it); } - - index_type indices( index_size ); - for( index_type::iterator i_it = indices.begin(); i_it != indices.end(); ++i_it ) - { *i_it = element_range_size - index_size + std::distance(indices.begin(), i_it); } - std::reverse( indices.begin(), indices.end() ); - - typedef boost::permutation_iterator< element_range_type::iterator, index_type::iterator > permutation_type; - permutation_type begin = boost::make_permutation_iterator( elements.begin(), indices.begin() ); - permutation_type it = begin; - permutation_type end = boost::make_permutation_iterator( elements.begin(), indices.end() ); - - BOOST_CHECK( it == begin ); - BOOST_CHECK( it != end ); - - BOOST_CHECK( std::distance( begin, end ) == index_size ); - - for( index_type::iterator i_it1 = indices.begin(); it != end; ++i_it1, ++it ) - { - BOOST_CHECK( *it == elements[ *i_it1 ] ); - } - - it = begin; - for( int i1 = 0; i1 < index_size - 1 ; ++++i1, ++++it ) - { - index_type::iterator i_it2 = indices.begin(); - std::advance( i_it2, i1 ); - BOOST_CHECK( *it == elements[ *i_it2 ] ); - } - - it = begin; - std::advance(it, index_size); - for( index_type::iterator i_it3 = indices.end(); it != begin; ) - { - BOOST_CHECK( *--it == elements[ *--i_it3 ] ); - } - - it = begin; - std::advance(it, index_size); - for( int i2 = 0; i2 < index_size - 1; i2+=2, --it ) - { - index_type::iterator i_it4 = --indices.end(); - std::advance( i_it4, -i2 ); - BOOST_CHECK( *--it == elements[ *i_it4 ] ); - } - -} - - -int test_main(int, char *[]) -{ - permutation_test(); - return 0; -} diff --git a/test/pointee.cpp b/test/pointee.cpp deleted file mode 100755 index b39fce1..0000000 --- a/test/pointee.cpp +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright David Abrahams 2004. 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) - -#include -#include -#include "static_assert_same.hpp" -#include -#include - -template -struct proxy_ptr -{ - typedef T element_type; - struct proxy - { - operator Ref() const; - }; - proxy operator*() const; -}; - -template -struct proxy_ref_ptr : proxy_ptr -{ -}; - -template -struct proxy_value_ptr : proxy_ptr -{ - typedef typename boost::add_const::type element_type; -}; - -struct X { - template X(T const&); - template operator T&() const; -}; - -BOOST_TT_BROKEN_COMPILER_SPEC(X) - -int main() -{ - STATIC_ASSERT_SAME(boost::pointee >::type, int); - STATIC_ASSERT_SAME(boost::pointee >::type, X); - - STATIC_ASSERT_SAME(boost::pointee >::type, int const); - STATIC_ASSERT_SAME(boost::pointee >::type, X const); - - STATIC_ASSERT_SAME(boost::pointee >::type, int const); - STATIC_ASSERT_SAME(boost::pointee >::type, X const); - - STATIC_ASSERT_SAME(boost::pointee >::type, int const); - STATIC_ASSERT_SAME(boost::pointee >::type, X const); - - STATIC_ASSERT_SAME(boost::pointee::type, int); - STATIC_ASSERT_SAME(boost::pointee::type, int const); - - STATIC_ASSERT_SAME(boost::pointee::type, X); - STATIC_ASSERT_SAME(boost::pointee::type, X const); - - STATIC_ASSERT_SAME(boost::pointee >::type, int); - STATIC_ASSERT_SAME(boost::pointee >::type, X); - - STATIC_ASSERT_SAME(boost::pointee >::type, int const); - STATIC_ASSERT_SAME(boost::pointee >::type, X const); - - STATIC_ASSERT_SAME(boost::pointee::iterator >::type, int); - STATIC_ASSERT_SAME(boost::pointee::iterator >::type, X); - - STATIC_ASSERT_SAME(boost::pointee::const_iterator >::type, int const); - STATIC_ASSERT_SAME(boost::pointee::const_iterator >::type, X const); - return 0; -} diff --git a/test/reverse_iterator_test.cpp b/test/reverse_iterator_test.cpp deleted file mode 100644 index 6686d30..0000000 --- a/test/reverse_iterator_test.cpp +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright Thomas Witt 2003, Jeremy Siek 2004. - -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all -// copies. This software is provided "as is" without express or -// implied warranty, and with no claim as to its suitability for any -// purpose. - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using boost::dummyT; - -// Test reverse iterator -int main() -{ - dummyT array[] = { dummyT(0), dummyT(1), dummyT(2), - dummyT(3), dummyT(4), dummyT(5) }; - const int N = sizeof(array)/sizeof(dummyT); - - // Concept checks - // Adapting old-style iterators - { - typedef boost::reverse_iterator > Iter; - boost::function_requires< boost::BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - { - typedef boost::reverse_iterator > Iter; - boost::function_requires< boost::Mutable_BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - // Adapting new-style iterators - { - typedef boost::iterator_archetype< - const dummyT - , boost::iterator_archetypes::readable_iterator_t - , boost::bidirectional_traversal_tag - > iter; - typedef boost::reverse_iterator Iter; - boost::function_requires< boost::InputIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } -#if 0 - // It does not seem feasible to make this work. Need to change docs to - // require at lease Readable for the base iterator. -Jeremy - { - typedef boost::iterator_archetype< - dummyT - , boost::iterator_archetypes::writable_iterator_t - , boost::bidirectional_traversal_tag - > iter; - typedef boost::reverse_iterator Iter; - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } -#endif -#if !BOOST_WORKAROUND(BOOST_MSVC, == 1200) // Causes Internal Error in linker. - { - typedef boost::iterator_archetype< - dummyT - , boost::iterator_archetypes::readable_writable_iterator_t - , boost::bidirectional_traversal_tag - > iter; - typedef boost::reverse_iterator Iter; - boost::function_requires< boost::InputIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - const dummyT - , boost::iterator_archetypes::readable_lvalue_iterator_t - , boost::bidirectional_traversal_tag - > iter; - typedef boost::reverse_iterator Iter; - boost::function_requires< boost::BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - dummyT - , boost::iterator_archetypes::writable_lvalue_iterator_t - , boost::bidirectional_traversal_tag - > iter; - typedef boost::reverse_iterator Iter; - boost::function_requires< boost::BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } -#endif - - // Test reverse_iterator - { - dummyT reversed[N]; - std::copy(array, array + N, reversed); - std::reverse(reversed, reversed + N); - - typedef boost::reverse_iterator reverse_iterator; - - reverse_iterator i(reversed + N); - boost::random_access_iterator_test(i, N, array); - - boost::random_access_iterator_test(boost::make_reverse_iterator(reversed + N), N, array); - - typedef boost::reverse_iterator const_reverse_iterator; - - const_reverse_iterator j(reversed + N); - boost::random_access_iterator_test(j, N, array); - - const dummyT* const_reversed = reversed; - - boost::random_access_iterator_test(boost::make_reverse_iterator(const_reversed + N), N, array); - - boost::const_nonconst_iterator_test(i, ++j); - } - - // Test reverse_iterator again, with traits fully deducible on all platforms - { - std::deque reversed_container; - std::reverse_copy(array, array + N, std::back_inserter(reversed_container)); - const std::deque::iterator reversed = reversed_container.begin(); - - - typedef boost::reverse_iterator< - std::deque::iterator> reverse_iterator; - typedef boost::reverse_iterator< - std::deque::const_iterator> const_reverse_iterator; - - // MSVC/STLport gives an INTERNAL COMPILER ERROR when any computation - // (e.g. "reversed + N") is used in the constructor below. - const std::deque::iterator finish = reversed_container.end(); - reverse_iterator i(finish); - - boost::random_access_iterator_test(i, N, array); - boost::random_access_iterator_test(boost::make_reverse_iterator(reversed + N), N, array); - - const_reverse_iterator j = reverse_iterator(finish); - boost::random_access_iterator_test(j, N, array); - - const std::deque::const_iterator const_reversed = reversed; - boost::random_access_iterator_test(boost::make_reverse_iterator(const_reversed + N), N, array); - - // Many compilers' builtin deque iterators don't interoperate well, though - // STLport fixes that problem. -#if defined(__SGI_STL_PORT) \ - || !BOOST_WORKAROUND(__GNUC__, <= 2) \ - && !(BOOST_WORKAROUND(__GNUC__, == 3) && BOOST_WORKAROUND(__GNUC_MINOR__, <= 1)) \ - && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) \ - && !BOOST_WORKAROUND(__LIBCOMO_VERSION__, BOOST_TESTED_AT(29)) \ - && !BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, <= 1) - - boost::const_nonconst_iterator_test(i, ++j); - -#endif - } - - std::cout << "test successful " << std::endl; - return boost::exit_success; -} diff --git a/test/static_assert_same.hpp b/test/static_assert_same.hpp deleted file mode 100644 index 0b4b04c..0000000 --- a/test/static_assert_same.hpp +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright David Abrahams 2003. Permission to copy, use, -// modify, sell and distribute this software is granted provided this -// copyright notice appears in all copies. This software is provided -// "as is" without express or implied warranty, and with no claim as -// to its suitability for any purpose. -#ifndef STATIC_ASSERT_SAME_DWA2003530_HPP -# define STATIC_ASSERT_SAME_DWA2003530_HPP - -# include -# include - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -template -struct static_assert_same_base; - -template -struct static_assert_same_base -{ - enum { value = 1 }; -}; - -template -struct static_assert_same : static_assert_same_base {}; - -#else -# include -# include -# include - -template -struct static_assert_same - : boost::mpl::if_,boost::mpl::true_,void>::type -{}; -#endif - -#define STATIC_ASSERT_SAME( T1,T2 ) \ - enum { BOOST_JOIN(boost_static_assert_enum_, __LINE__) \ - = static_assert_same::value } - -#endif // STATIC_ASSERT_SAME_DWA2003530_HPP diff --git a/test/transform_iterator_test.cpp b/test/transform_iterator_test.cpp deleted file mode 100644 index f7432cc..0000000 --- a/test/transform_iterator_test.cpp +++ /dev/null @@ -1,249 +0,0 @@ -// (C) Copyright Jeremy Siek 2002. Permission to copy, use, modify, -// sell and distribute this software is granted provided this -// copyright notice appears in all copies. This software is provided -// "as is" without express or implied warranty, and with no claim as -// to its suitability for any purpose. - -// Revision History -// 22 Nov 2002 Thomas Witt -// Added interoperability check. -// 28 Oct 2002 Jeremy Siek -// Updated for new iterator adaptors. -// 08 Mar 2001 Jeremy Siek -// Moved test of transform iterator into its own file. It to -// to be in iterator_adaptor_test.cpp. - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -namespace boost { namespace detail -{ - template<> struct function_object_result - { - typedef int type; - }; -}} -#endif - -struct mult_functor { - // Functors used with transform_iterator must be - // DefaultConstructible, as the transform_iterator must be - // DefaultConstructible to satisfy the requirements for - // TrivialIterator. - mult_functor() { } - mult_functor(int aa) : a(aa) { } - int operator()(int b) const { return a * b; } - int a; -}; - -struct adaptable_mult_functor - : mult_functor -{ - typedef int result_type; - typedef int argument_type; - // Functors used with transform_iterator must be - // DefaultConstructible, as the transform_iterator must be - // DefaultConstructible to satisfy the requirements for - // TrivialIterator. - adaptable_mult_functor() { } - adaptable_mult_functor(int aa) : mult_functor(aa) { } -}; - - -struct const_select_first -{ - typedef int const& result_type; - - int const& operator()(std::pairconst& p) const - { - return p.first; - } -}; - -struct select_first - : const_select_first // derivation to allow conversions -{ - typedef int& result_type; - - int& operator()(std::pair& p) const - { - return p.first; - } -}; - -struct select_second -{ - typedef int& result_type; - - int& operator()(std::pair& p) const - { - return p.second; - } -}; - -struct value_select_first -{ - typedef int result_type; - - int operator()(std::pairconst& p) const - { - return p.first; - } -}; - -int mult_2(int arg) -{ - return arg*2; -} - - -int -main() -{ - const int N = 10; - - // Concept checks - { - typedef boost::transform_iterator iter_t; - typedef boost::transform_iterator c_iter_t; - - boost::function_requires< boost_concepts::InteroperableIteratorConcept >(); - } - - // Test transform_iterator - { - int x[N], y[N]; - for (int k = 0; k < N; ++k) - x[k] = k; - std::copy(x, x + N, y); - - for (int k2 = 0; k2 < N; ++k2) - x[k2] = x[k2] * 2; - - typedef boost::transform_iterator iter_t; - iter_t i(y, adaptable_mult_functor(2)); - boost::input_iterator_test(i, x[0], x[1]); - boost::input_iterator_test(iter_t(&y[0], adaptable_mult_functor(2)), x[0], x[1]); - - boost::random_access_readable_iterator_test(i, N, x); - } - - // Test transform_iterator non adaptable functor - { - int x[N], y[N]; - for (int k = 0; k < N; ++k) - x[k] = k; - std::copy(x, x + N, y); - - for (int k2 = 0; k2 < N; ++k2) - x[k2] = x[k2] * 2; - - typedef boost::transform_iterator iter_t; - iter_t i(y, mult_functor(2)); - boost::input_iterator_test(i, x[0], x[1]); - boost::input_iterator_test(iter_t(&y[0], mult_functor(2)), x[0], x[1]); - - boost::random_access_readable_iterator_test(i, N, x); - } - - // Test transform_iterator default argument handling - { - { - typedef boost::transform_iterator iter_t; - BOOST_STATIC_ASSERT((boost::is_same::value)); - BOOST_STATIC_ASSERT((boost::is_same::value)); - } - - { - typedef boost::transform_iterator iter_t; - BOOST_STATIC_ASSERT((boost::is_same::value)); - BOOST_STATIC_ASSERT((boost::is_same::value)); - } - - { - typedef boost::transform_iterator iter_t; - BOOST_STATIC_ASSERT((boost::is_same::value)); - BOOST_STATIC_ASSERT((boost::is_same::value)); - } - } - - // Test transform_iterator with function pointers - { - int x[N], y[N]; - for (int k = 0; k < N; ++k) - x[k] = k; - std::copy(x, x + N, y); - - for (int k2 = 0; k2 < N; ++k2) - x[k2] = x[k2] * 2; - - boost::input_iterator_test( - boost::make_transform_iterator(y, mult_2), x[0], x[1]); - - boost::input_iterator_test( - boost::make_transform_iterator(&y[0], mult_2), x[0], x[1]); - - boost::random_access_readable_iterator_test( - boost::make_transform_iterator(y, mult_2), N, x); - - } - - // Test transform_iterator as projection iterator - { - typedef std::pair pair_t; - - int x[N]; - int y[N]; - pair_t values[N]; - - for(int i = 0; i < N; ++i) { - - x[i] = i; - y[i] = N - (i + 1); - - } - - std::copy( - x - , x + N - , boost::make_transform_iterator((pair_t*)values, select_first()) - ); - - std::copy( - y - , y + N - , boost::make_transform_iterator((pair_t*)values, select_second()) - ); - - boost::random_access_readable_iterator_test( - boost::make_transform_iterator((pair_t*)values, value_select_first()) - , N - , x - ); - - boost::random_access_readable_iterator_test( - boost::make_transform_iterator((pair_t*)values, const_select_first()) - , N, x - ); - - boost::constant_lvalue_iterator_test( - boost::make_transform_iterator((pair_t*)values, const_select_first()), x[0]); - - boost::non_const_lvalue_iterator_test( - boost::make_transform_iterator((pair_t*)values, select_first()), x[0], 17); - - boost::const_nonconst_iterator_test( - ++boost::make_transform_iterator((pair_t*)values, select_first()) - , boost::make_transform_iterator((pair_t*)values, const_select_first()) - ); - } - - return 0; -} diff --git a/test/unit_tests.cpp b/test/unit_tests.cpp deleted file mode 100644 index c4077eb..0000000 --- a/test/unit_tests.cpp +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright David Abrahams 2003. Permission to copy, use, -// modify, sell and distribute this software is granted provided this -// copyright notice appears in all copies. This software is provided -// "as is" without express or implied warranty, and with no claim as -// to its suitability for any purpose. -#include -#include - -#include "static_assert_same.hpp" - -#include - -#include - -struct X { int a; }; - -BOOST_TT_BROKEN_COMPILER_SPEC(X) - -struct Xiter : boost::iterator_adaptor -{ - Xiter(); - Xiter(X* p) : boost::iterator_adaptor(p) {} -}; - -void take_xptr(X*) {} -void operator_arrow_test() -{ - // check that the operator-> result is a pointer for lvalue iterators - X x; - take_xptr(Xiter(&x).operator->()); -} - -template -struct static_assert_min_cat - : static_assert_same< - typename boost::detail::minimum_category::type, Min - > -{}; - -void category_test() -{ - using namespace boost; - using namespace boost::detail; - - BOOST_STATIC_ASSERT(( - !boost::is_convertible< - std::input_iterator_tag - , input_output_iterator_tag>::value)); - - BOOST_STATIC_ASSERT(( - !boost::is_convertible< - std::output_iterator_tag - , input_output_iterator_tag>::value)); - - BOOST_STATIC_ASSERT(( - boost::is_convertible< - input_output_iterator_tag - , std::input_iterator_tag>::value)); - - BOOST_STATIC_ASSERT(( - boost::is_convertible< - input_output_iterator_tag - , std::output_iterator_tag>::value)); - -#if 0 // This seems wrong; we're not advertising - // input_output_iterator_tag are we? - BOOST_STATIC_ASSERT(( - boost::is_convertible< - std::forward_iterator_tag - , input_output_iterator_tag>::value)); -#endif - - int test = static_assert_min_cat< - std::input_iterator_tag,input_output_iterator_tag, std::input_iterator_tag - >::value; - - test = static_assert_min_cat< - input_output_iterator_tag,std::input_iterator_tag, std::input_iterator_tag - >::value; - -#if 0 - test = static_assert_min_cat< - input_output_iterator_tag,std::forward_iterator_tag, input_output_iterator_tag - >::value; -#endif - - test = static_assert_min_cat< - std::input_iterator_tag,std::forward_iterator_tag, std::input_iterator_tag - >::value; - - test = static_assert_min_cat< - std::input_iterator_tag,std::random_access_iterator_tag, std::input_iterator_tag - >::value; - -#if 0 // This would be wrong: a random access iterator is not - // neccessarily writable, as is an output iterator. - test = static_assert_min_cat< - std::output_iterator_tag,std::random_access_iterator_tag, std::output_iterator_tag - >::value; -#endif - - (void)test; -} - -int main() -{ - category_test(); - operator_arrow_test(); - return 0; -} - diff --git a/test/zip_iterator_test.cpp b/test/zip_iterator_test.cpp deleted file mode 100755 index 9561f83..0000000 --- a/test/zip_iterator_test.cpp +++ /dev/null @@ -1,831 +0,0 @@ -// (C) Copyright Dave Abrahams and Thomas Becker 2003. Permission to -// copy, use, modify, sell and distribute this software is granted -// provided this copyright notice appears in all copies. This software -// is provided "as is" without express or implied warranty, and with -// no claim as to its suitability for any purpose. -// - -// File: -// ===== -// zip_iterator_test_main.cpp - -// Author: -// ======= -// Thomas Becker - -// Created: -// ======== -// Jul 15, 2003 - -// Purpose: -// ======== -// Test driver for zip_iterator.hpp - -// Compilers Tested: -// ================= -// Metrowerks Codewarrior Pro 7.2, 8.3 -// gcc 2.95.3 -// gcc 3.2 -// Microsoft VC 6sp5 (test fails due to some compiler bug) -// Microsoft VC 7 (works) -// Microsoft VC 7.1 -// Intel 5 -// Intel 6 -// Intel 7.1 -// Intel 8 -// Borland 5.5.1 (broken due to lack of support from Boost.Tuples) - -///////////////////////////////////////////////////////////////////////////// -// -// Includes -// -///////////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -template -struct pure_traversal - : boost::detail::pure_traversal_tag< - typename boost::iterator_traversal::type - > -{}; - -///////////////////////////////////////////////////////////////////////////// -// -// Das Main Funktion -// -///////////////////////////////////////////////////////////////////////////// - -int main( void ) -{ - - std::cout << "\n" - << "***********************************************\n" - << "* *\n" - << "* Test driver for boost::zip_iterator *\n" - << "* Copyright Thomas Becker 2003 *\n" - << "* *\n" - << "***********************************************\n\n" - << std::flush; - - size_t num_successful_tests = 0; - size_t num_failed_tests = 0; - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator construction and dereferencing - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator construction and dereferencing: " - << std::flush; - - std::vector vect1(3); - vect1[0] = 42.; - vect1[1] = 43.; - vect1[2] = 44.; - - std::set intset; - intset.insert(52); - intset.insert(53); - intset.insert(54); - // - - boost::zip_iterator< - boost::tuples::tuple< - std::set::iterator - , std::vector::iterator - > - > - zip_it_mixed( - boost::make_tuple( - intset.begin() - , vect1.begin() - ) - ); - - boost::tuples::tuple val_tuple( - *zip_it_mixed); - - boost::tuples::tuple ref_tuple( - *zip_it_mixed); - - double dblOldVal = boost::tuples::get<1>(ref_tuple); - boost::tuples::get<1>(ref_tuple) -= 41.; - - if( 52 == boost::tuples::get<0>(val_tuple) && - 42. == boost::tuples::get<1>(val_tuple) && - 52 == boost::tuples::get<0>(ref_tuple) && - 1. == boost::tuples::get<1>(ref_tuple) && - 1. == *vect1.begin() - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - // Undo change to vect1 - boost::tuples::get<1>(ref_tuple) = dblOldVal; - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator with 12 components - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterators with 12 components: " - << std::flush; - - // Declare 12 containers - // - std::list li1; - li1.push_back(1); - std::set se1; - se1.insert(2); - std::vector ve1; - ve1.push_back(3); - // - std::list li2; - li2.push_back(4); - std::set se2; - se2.insert(5); - std::vector ve2; - ve2.push_back(6); - // - std::list li3; - li3.push_back(7); - std::set se3; - se3.insert(8); - std::vector ve3; - ve3.push_back(9); - // - std::list li4; - li4.push_back(10); - std::set se4; - se4.insert(11); - std::vector ve4; - ve4.push_back(12); - - // typedefs for cons lists of iterators. - typedef boost::tuples::cons< - std::set::iterator, - boost::tuples::tuple< - std::vector::iterator, - std::list::iterator, - std::set::iterator, - std::vector::iterator, - std::list::iterator, - std::set::iterator, - std::vector::iterator, - std::list::iterator, - std::set::iterator, - std::vector::const_iterator - >::inherited - > cons_11_its_type; - // - typedef boost::tuples::cons< - std::list::const_iterator, - cons_11_its_type - > cons_12_its_type; - - // typedefs for cons lists for dereferencing the zip iterator - // made from the cons list above. - typedef boost::tuples::cons< - const int&, - boost::tuples::tuple< - int&, - int&, - const int&, - int&, - int&, - const int&, - int&, - int&, - const int&, - const int& - >::inherited - > cons_11_refs_type; - // - typedef boost::tuples::cons< - const int&, - cons_11_refs_type - > cons_12_refs_type; - - // typedef for zip iterator with 12 elements - typedef boost::zip_iterator zip_it_12_type; - - // Declare a 12-element zip iterator. - zip_it_12_type zip_it_12( - cons_12_its_type( - li1.begin(), - cons_11_its_type( - se1.begin(), - boost::make_tuple( - ve1.begin(), - li2.begin(), - se2.begin(), - ve2.begin(), - li3.begin(), - se3.begin(), - ve3.begin(), - li4.begin(), - se4.begin(), - ve4.begin() - ) - ) - ) - ); - - // Dereference, mess with the result a little. - cons_12_refs_type zip_it_12_dereferenced(*zip_it_12); - boost::tuples::get<9>(zip_it_12_dereferenced) = 42; - - // Make a copy and move it a little to force some instantiations. - zip_it_12_type zip_it_12_copy(zip_it_12); - ++zip_it_12_copy; - - if( boost::tuples::get<11>(zip_it_12.get_iterator_tuple()) == ve4.begin() && - boost::tuples::get<11>(zip_it_12_copy.get_iterator_tuple()) == ve4.end() && - 1 == boost::tuples::get<0>(zip_it_12_dereferenced) && - 12 == boost::tuples::get<11>(zip_it_12_dereferenced) && - 42 == *(li4.begin()) - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator incrementing and dereferencing - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator ++ and *: " - << std::flush; - - std::vector vect2(3); - vect2[0] = 2.2; - vect2[1] = 3.3; - vect2[2] = 4.4; - - boost::zip_iterator< - boost::tuples::tuple< - std::vector::const_iterator, - std::vector::const_iterator - > - > - zip_it_begin( - boost::make_tuple( - vect1.begin(), - vect2.begin() - ) - ); - - boost::zip_iterator< - boost::tuples::tuple< - std::vector::const_iterator, - std::vector::const_iterator - > - > - zip_it_run( - boost::make_tuple( - vect1.begin(), - vect2.begin() - ) - ); - - boost::zip_iterator< - boost::tuples::tuple< - std::vector::const_iterator, - std::vector::const_iterator - > - > - zip_it_end( - boost::make_tuple( - vect1.end(), - vect2.end() - ) - ); - - if( zip_it_run == zip_it_begin && - 42. == boost::tuples::get<0>(*zip_it_run) && - 2.2 == boost::tuples::get<1>(*zip_it_run) && - 43. == boost::tuples::get<0>(*(++zip_it_run)) && - 3.3 == boost::tuples::get<1>(*zip_it_run) && - 44. == boost::tuples::get<0>(*(++zip_it_run)) && - 4.4 == boost::tuples::get<1>(*zip_it_run) && - zip_it_end == ++zip_it_run - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator decrementing and dereferencing - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator -- and *: " - << std::flush; - - if( zip_it_run == zip_it_end && - zip_it_end == zip_it_run-- && - 44. == boost::tuples::get<0>(*zip_it_run) && - 4.4 == boost::tuples::get<1>(*zip_it_run) && - 43. == boost::tuples::get<0>(*(--zip_it_run)) && - 3.3 == boost::tuples::get<1>(*zip_it_run) && - 42. == boost::tuples::get<0>(*(--zip_it_run)) && - 2.2 == boost::tuples::get<1>(*zip_it_run) && - zip_it_begin == zip_it_run - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator copy construction and equality - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator copy construction and equality: " - << std::flush; - - boost::zip_iterator< - boost::tuples::tuple< - std::vector::const_iterator, - std::vector::const_iterator - > - > zip_it_run_copy(zip_it_run); - - if(zip_it_run == zip_it_run && zip_it_run == zip_it_run_copy) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator inequality - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator inequality: " - << std::flush; - - if(!(zip_it_run != zip_it_run_copy) && zip_it_run != ++zip_it_run_copy) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator less than - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator less than: " - << std::flush; - - // Note: zip_it_run_copy == zip_it_run + 1 - // - if( zip_it_run < zip_it_run_copy && - !( zip_it_run < --zip_it_run_copy) && - zip_it_run == zip_it_run_copy - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator less than or equal - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "zip iterator less than or equal: " - << std::flush; - - // Note: zip_it_run_copy == zip_it_run - // - ++zip_it_run; - zip_it_run_copy += 2; - - if( zip_it_run <= zip_it_run_copy && - zip_it_run <= --zip_it_run_copy && - !( zip_it_run <= --zip_it_run_copy) && - zip_it_run <= zip_it_run - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator greater than - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator greater than: " - << std::flush; - - // Note: zip_it_run_copy == zip_it_run - 1 - // - if( zip_it_run > zip_it_run_copy && - !( zip_it_run > ++zip_it_run_copy) && - zip_it_run == zip_it_run_copy - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator greater than or equal - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator greater than or equal: " - << std::flush; - - ++zip_it_run; - - // Note: zip_it_run == zip_it_run_copy + 1 - // - if( zip_it_run >= zip_it_run_copy && - --zip_it_run >= zip_it_run_copy && - ! (zip_it_run >= ++zip_it_run_copy) - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator + int - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator + int: " - << std::flush; - - // Note: zip_it_run == zip_it_run_copy - 1 - // - zip_it_run = zip_it_run + 2; - ++zip_it_run_copy; - - if( zip_it_run == zip_it_run_copy && zip_it_run == zip_it_begin + 3 ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator - int - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator - int: " - << std::flush; - - // Note: zip_it_run == zip_it_run_copy, and both are at end position - // - zip_it_run = zip_it_run - 2; - --zip_it_run_copy; - --zip_it_run_copy; - - if( zip_it_run == zip_it_run_copy && (zip_it_run - 1) == zip_it_begin ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator += - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator +=: " - << std::flush; - - // Note: zip_it_run == zip_it_run_copy, and both are at begin + 1 - // - zip_it_run += 2; - if( zip_it_run == zip_it_begin + 3 ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator -= - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator -=: " - << std::flush; - - // Note: zip_it_run is at end position, zip_it_run_copy is at - // begin plus one. - // - zip_it_run -= 2; - if( zip_it_run == zip_it_run_copy ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator getting member iterators - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator member iterators: " - << std::flush; - - // Note: zip_it_run and zip_it_run_copy are both at - // begin plus one. - // - if( boost::tuples::get<0>(zip_it_run.get_iterator_tuple()) == vect1.begin() + 1 && - boost::tuples::get<1>(zip_it_run.get_iterator_tuple()) == vect2.begin() + 1 - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Making zip iterators - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Making zip iterators: " - << std::flush; - - std::vector > - vect_of_tuples(3); - - std::copy( - boost::make_zip_iterator( - boost::make_tuple( - vect1.begin(), - vect2.begin() - ) - ), - boost::make_zip_iterator( - boost::make_tuple( - vect1.end(), - vect2.end() - ) - ), - vect_of_tuples.begin() - ); - - if( 42. == boost::tuples::get<0>(*vect_of_tuples.begin()) && - 2.2 == boost::tuples::get<1>(*vect_of_tuples.begin()) && - 43. == boost::tuples::get<0>(*(vect_of_tuples.begin() + 1)) && - 3.3 == boost::tuples::get<1>(*(vect_of_tuples.begin() + 1)) && - 44. == boost::tuples::get<0>(*(vect_of_tuples.begin() + 2)) && - 4.4 == boost::tuples::get<1>(*(vect_of_tuples.begin() + 2)) - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator non-const --> const conversion - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator non-const to const conversion: " - << std::flush; - - boost::zip_iterator< - boost::tuples::tuple< - std::set::const_iterator, - std::vector::const_iterator - > - > - zip_it_const( - boost::make_tuple( - intset.begin(), - vect2.begin() - ) - ); - // - boost::zip_iterator< - boost::tuples::tuple< - std::set::iterator, - std::vector::const_iterator - > - > - zip_it_half_const( - boost::make_tuple( - intset.begin(), - vect2.begin() - ) - ); - // - boost::zip_iterator< - boost::tuples::tuple< - std::set::iterator, - std::vector::iterator - > - > - zip_it_non_const( - boost::make_tuple( - intset.begin(), - vect2.begin() - ) - ); - - zip_it_half_const = ++zip_it_non_const; - zip_it_const = zip_it_half_const; - ++zip_it_const; -// zip_it_non_const = ++zip_it_const; // Error: can't convert from const to non-const - - if( 54 == boost::tuples::get<0>(*zip_it_const) && - 4.4 == boost::tuples::get<1>(*zip_it_const) && - 53 == boost::tuples::get<0>(*zip_it_half_const) && - 3.3 == boost::tuples::get<1>(*zip_it_half_const) - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator categories - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator categories: " - << std::flush; - - // The big iterator of the previous test has vector, list, and set iterators. - // Therefore, it must be bidirectional, but not random access. - bool bBigItIsBidirectionalIterator = boost::is_convertible< - boost::iterator_traversal::type - , boost::bidirectional_traversal_tag - >::value; - - bool bBigItIsRandomAccessIterator = boost::is_convertible< - boost::iterator_traversal::type - , boost::random_access_traversal_tag - >::value; - - // A combining iterator with all vector iterators must have random access - // traversal. - // - typedef boost::zip_iterator< - boost::tuples::tuple< - std::vector::const_iterator, - std::vector::const_iterator - > - > all_vects_type; - - bool bAllVectsIsRandomAccessIterator = boost::is_convertible< - boost::iterator_traversal::type - , boost::random_access_traversal_tag - >::value; - - // The big test. - if( bBigItIsBidirectionalIterator && - ! bBigItIsRandomAccessIterator && - bAllVectsIsRandomAccessIterator - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests = 0; - std::cout << "not OK" << std::endl; - } - - // Done - // - std::cout << "\nTest Result:" - << "\n============" - << "\nNumber of successful tests: " << static_cast(num_successful_tests) - << "\nNumber of failed tests: " << static_cast(num_failed_tests) - << std::endl; - - return num_failed_tests; -} -