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/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/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/issues.html b/doc/issues.html index 122a9c3..f8ab29c 100755 --- a/doc/issues.html +++ b/doc/issues.html @@ -3,68 +3,354 @@ - + Problem with is_writable and is_swappable in N1550 - + + + + + -

Problem with is_writable and is_swappable in N1550

- --+

Problem with is_writable and is_swappable in N1550

+
++ - - - - - - - - - + + + + + + + + + - +at http://www.boost.org/LICENSE_1_0.txt)
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 +
Author:David Abrahams and Jeremy Siek
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu
Organization:Boost Consulting, Indiana University Bloomington
Date:2003-11-19
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)
-
-

Table of Contents

+ -
-

Introduction

-

The is_writable and is_swappable traits classes in N1550 +

+

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

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

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

 class B {
@@ -74,31 +360,31 @@ 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.

+

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

+
+

Proposed Resolution

    -
  1. Remove the is_writable and is_swappable traits, and remove the +

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

  3. -
  4. 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 +

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

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

  6. -
  7. Remove the iterator_tag class.

    +
  8. Remove the iterator_tag class.

  9. -
  10. Change the specification of traversal_category to:

    +
  11. Change the specification of traversal_category to:

     traversal-category(Iterator) =
         let cat = iterator_traits<Iterator>::iterator_category
    @@ -120,14 +406,14 @@ traversal-category(Iterator) =
     
-
-

Rationale

+
+

Rationale

    -
  1. There are two reasons for removing is_writable -and is_swappable. The first is that we do not know of +
  2. 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 +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. @@ -137,34 +423,29 @@ 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.
  3. -
  4. 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 +
  5. 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.
  6. -
  7. The purpose of the iterator_tag class was to +is_readable so that it works for any iterator type.
  8. +
  9. 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, +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 +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 +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 +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.
  10. -
  11. The changes to the specification of traversal_category are a -direct result of the removal of iterator_tag.
  12. +for the iterator_category. +
  13. The changes to the specification of traversal_category are a +direct result of the removal of iterator_tag.
- - 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_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/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/example/counting_iterator_example.cpp b/example/counting_iterator_example.cpp deleted file mode 100644 index c7d8add..0000000 --- a/example/counting_iterator_example.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// (C) Copyright Jeremy Siek 2000-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) - - -#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 8880c8d..0000000 --- a/example/filter_iterator_example.cpp +++ /dev/null @@ -1,58 +0,0 @@ -// (C) Copyright Jeremy Siek 1999-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) - -#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/func_output_iter_example.cpp b/example/func_output_iter_example.cpp deleted file mode 100644 index 9c06319..0000000 --- a/example/func_output_iter_example.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// (C) Copyright Jeremy Siek 2001-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) - -// 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 abbf46c..0000000 --- a/example/indirect_iterator_example.cpp +++ /dev/null @@ -1,59 +0,0 @@ -// (C) Copyright Jeremy Siek 2000-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) - -#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 c3ed315..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 5e068b4..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_iter_example.cpp b/example/permutation_iter_example.cpp deleted file mode 100644 index e6ff889..0000000 --- a/example/permutation_iter_example.cpp +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (C) 2004 Jeremy Siek -// 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) - -#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 b5f10f7..0000000 --- a/example/reverse_iterator.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (C) 2004 Jeremy Siek -// 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) - -#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 61b8c4f..0000000 --- a/example/reverse_iterator_example.cpp +++ /dev/null @@ -1,41 +0,0 @@ -// (C) Copyright Jeremy Siek 2000-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) - -#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 6f51f01..0000000 --- a/example/transform_iterator_example.cpp +++ /dev/null @@ -1,76 +0,0 @@ -// (C) Copyright Jeremy Siek 2000-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) - - -#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/include/boost/function_output_iterator.hpp b/include/boost/function_output_iterator.hpp deleted file mode 100644 index 9720f3f..0000000 --- a/include/boost/function_output_iterator.hpp +++ /dev/null @@ -1,56 +0,0 @@ -// (C) Copyright Jeremy Siek 2001. -// 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) - -// Revision History: - -// 27 Feb 2001 Jeremy Siek -// Initial checkin. - -#ifndef BOOST_FUNCTION_OUTPUT_ITERATOR_HPP -#define BOOST_FUNCTION_OUTPUT_ITERATOR_HPP - -#include - -namespace boost { - - template - class function_output_iterator { - typedef function_output_iterator self; - 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) - : m_f(f) {} - - struct output_proxy { - output_proxy(UnaryFunction& f) : m_f(f) { } - template output_proxy& operator=(const T& value) { - m_f(value); - return *this; - } - UnaryFunction& m_f; - }; - output_proxy operator*() { return output_proxy(m_f); } - self& operator++() { return *this; } - self& operator++(int) { return *this; } - private: - UnaryFunction m_f; - }; - - template - inline function_output_iterator - make_function_output_iterator(const UnaryFunction& f = UnaryFunction()) { - return function_output_iterator(f); - } - -} // namespace boost - -#endif // BOOST_FUNCTION_OUTPUT_ITERATOR_HPP diff --git a/include/boost/iterator.hpp b/include/boost/iterator.hpp deleted file mode 100644 index a43cfe1..0000000 --- a/include/boost/iterator.hpp +++ /dev/null @@ -1,59 +0,0 @@ -// interator.hpp workarounds for non-conforming standard libraries ---------// - -// (C) Copyright Beman Dawes 2000. 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) - -// See http://www.boost.org/libs/utility for documentation. - -// Revision History -// 12 Jan 01 added for std::ptrdiff_t (Jens Maurer) -// 28 Jun 00 Workarounds to deal with known MSVC bugs (David Abrahams) -// 26 Jun 00 Initial version (Jeremy Siek) - -#ifndef BOOST_ITERATOR_HPP -#define BOOST_ITERATOR_HPP - -#include -#include // std::ptrdiff_t -#include - -namespace boost -{ -# if defined(BOOST_NO_STD_ITERATOR) && !defined(BOOST_MSVC_STD_ITERATOR) - template - struct iterator - { - typedef T value_type; - typedef Distance difference_type; - typedef Pointer pointer; - typedef Reference reference; - typedef Category iterator_category; - }; -# else - - // declare iterator_base in namespace detail to work around MSVC bugs which - // prevent derivation from an identically-named class in a different namespace. - namespace detail { - template -# if !defined(BOOST_MSVC_STD_ITERATOR) - struct iterator_base : std::iterator {}; -# else - struct iterator_base : std::iterator - { - typedef Reference reference; - typedef Pointer pointer; - typedef Distance difference_type; - }; -# endif - } - - template - struct iterator : boost::detail::iterator_base {}; -# endif -} // namespace boost - -#endif // BOOST_ITERATOR_HPP diff --git a/include/boost/iterator/counting_iterator.hpp b/include/boost/iterator/counting_iterator.hpp deleted file mode 100644 index 1298a31..0000000 --- a/include/boost/iterator/counting_iterator.hpp +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright David Abrahams 2003. -// 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) -#ifndef COUNTING_ITERATOR_DWA200348_HPP -# define COUNTING_ITERATOR_DWA200348_HPP - -# include -# include -# include -# include -# include -# include - -namespace boost { - -template < - class Incrementable - , class CategoryOrTraversal - , class Difference -> -class counting_iterator; - -namespace detail -{ - // Try to detect numeric types at compile time in ways compatible - // with the limitations of the compiler and library. - template - struct is_numeric_impl - { - // For a while, this wasn't true, but we rely on it below. This is a regression assert. - BOOST_STATIC_ASSERT(::boost::is_integral::value); - -# ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS - - BOOST_STATIC_CONSTANT(bool, value = std::numeric_limits::is_specialized); - -# else - -# if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) - BOOST_STATIC_CONSTANT( - bool, value = ( - boost::is_convertible::value - && boost::is_convertible::value - )); -# else - BOOST_STATIC_CONSTANT(bool, value = ::boost::is_arithmetic::value); -# endif - -# endif - }; - - template - struct is_numeric - : mpl::bool_<(::boost::detail::is_numeric_impl::value)> - {}; - -# if defined(BOOST_HAS_LONG_LONG) - template <> - struct is_numeric< ::boost::long_long_type> - : mpl::true_ {}; - - template <> - struct is_numeric< ::boost::ulong_long_type> - : mpl::true_ {}; -# endif - - // Some compilers fail to have a numeric_limits specialization - template <> - struct is_numeric - : mpl::true_ {}; - - template - struct numeric_difference - { - typedef typename boost::detail::numeric_traits::difference_type type; - }; - - BOOST_STATIC_ASSERT(is_numeric::value); - - template - struct counting_iterator_base - { - typedef typename detail::ia_dflt_help< - CategoryOrTraversal - , mpl::eval_if< - is_numeric - , mpl::identity - , iterator_traversal - > - >::type traversal; - - typedef typename detail::ia_dflt_help< - Difference - , mpl::eval_if< - is_numeric - , numeric_difference - , iterator_difference - > - >::type difference; - - typedef iterator_adaptor< - counting_iterator // self - , Incrementable // Base - , Incrementable // Value -# ifndef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY - const // MSVC won't strip this. Instead we enable Thomas' - // criterion (see boost/iterator/detail/facade_iterator_category.hpp) -# endif - , traversal - , Incrementable const& // reference - , difference - > type; - }; - - // Template class distance_policy_select -- choose a policy for computing the - // distance between counting_iterators at compile-time based on whether or not - // the iterator wraps an integer or an iterator, using "poor man's partial - // specialization". - - template struct distance_policy_select; - - // A policy for wrapped iterators - template - struct iterator_distance - { - static Difference distance(Incrementable1 x, Incrementable2 y) - { - return y - x; - } - }; - - // A policy for wrapped numbers - template - struct number_distance - { - static Difference distance(Incrementable1 x, Incrementable2 y) - { - return numeric_distance(x, y); - } - }; -} - -template < - class Incrementable - , class CategoryOrTraversal = use_default - , class Difference = use_default -> -class counting_iterator - : public detail::counting_iterator_base< - Incrementable, CategoryOrTraversal, Difference - >::type -{ - typedef typename detail::counting_iterator_base< - Incrementable, CategoryOrTraversal, Difference - >::type super_t; - - friend class iterator_core_access; - - public: - typedef typename super_t::difference_type difference_type; - - counting_iterator() { } - - counting_iterator(counting_iterator const& rhs) : super_t(rhs.base()) {} - - counting_iterator(Incrementable x) - : super_t(x) - { - } - -# if 0 - template - counting_iterator( - counting_iterator const& t - , typename enable_if_convertible::type* = 0 - ) - : super_t(t.base()) - {} -# endif - - private: - - typename super_t::reference dereference() const - { - return this->base_reference(); - } - - template - difference_type - distance_to(counting_iterator const& y) const - { - typedef typename mpl::if_< - detail::is_numeric - , detail::number_distance - , detail::iterator_distance - >::type d; - - return d::distance(this->base(), y.base()); - } -}; - -// Manufacture a counting iterator for an arbitrary incrementable type -template -inline counting_iterator -make_counting_iterator(Incrementable x) -{ - typedef counting_iterator result_t; - return result_t(x); -} - - -} // namespace boost::iterator - -#endif // COUNTING_ITERATOR_DWA200348_HPP diff --git a/include/boost/iterator/detail/any_conversion_eater.hpp b/include/boost/iterator/detail/any_conversion_eater.hpp deleted file mode 100755 index 25fa644..0000000 --- a/include/boost/iterator/detail/any_conversion_eater.hpp +++ /dev/null @@ -1,19 +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) -#ifndef ANY_CONVERSION_EATER_DWA20031117_HPP -# define ANY_CONVERSION_EATER_DWA20031117_HPP - -namespace boost { namespace detail { - -// This type can be used in traits to "eat" up the one user-defined -// implicit conversion allowed. -struct any_conversion_eater -{ - template - any_conversion_eater(T const&); -}; - -}} // namespace boost::detail - -#endif // ANY_CONVERSION_EATER_DWA20031117_HPP diff --git a/include/boost/iterator/detail/config_def.hpp b/include/boost/iterator/detail/config_def.hpp deleted file mode 100644 index 3aba895..0000000 --- a/include/boost/iterator/detail/config_def.hpp +++ /dev/null @@ -1,135 +0,0 @@ -// (C) Copyright David Abrahams 2002. -// (C) Copyright Jeremy Siek 2002. -// (C) Copyright Thomas Witt 2002. -// 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) - -// no include guard multiple inclusion intended - -// -// This is a temporary workaround until the bulk of this is -// available in boost config. -// 23/02/03 thw -// - -#include // for prior -#include - -#ifdef BOOST_ITERATOR_CONFIG_DEF -# error you have nested config_def #inclusion. -#else -# define BOOST_ITERATOR_CONFIG_DEF -#endif - -// We enable this always now. Otherwise, the simple case in -// libs/iterator/test/constant_iterator_arrow.cpp fails to compile -// because the operator-> return is improperly deduced as a non-const -// pointer. -#if 1 || defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ - || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x531)) - -// Recall that in general, compilers without partial specialization -// can't strip constness. Consider counting_iterator, which normally -// passes a const Value to iterator_facade. As a result, any code -// which makes a std::vector of the iterator's value_type will fail -// when its allocator declares functions overloaded on reference and -// const_reference (the same type). -// -// Furthermore, Borland 5.5.1 drops constness in enough ways that we -// end up using a proxy for operator[] when we otherwise shouldn't. -// Using reference constness gives it an extra hint that it can -// return the value_type from operator[] directly, but is not -// strictly necessary. Not sure how best to resolve this one. - -# define BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY 1 - -#endif - -#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \ - || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x531)) \ - || (BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 700) && defined(_MSC_VER)) \ - || BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042)) -# define BOOST_NO_LVALUE_RETURN_DETECTION - -# if 0 // test code - struct v {}; - - typedef char (&no)[3]; - - template - no foo(T const&, ...); - - template - char foo(T&, int); - - - struct value_iterator - { - v operator*() const; - }; - - template - struct lvalue_deref_helper - { - static T& x; - enum { value = (sizeof(foo(*x,0)) == 1) }; - }; - - int z2[(lvalue_deref_helper::value == 1) ? 1 : -1]; - int z[(lvalue_deref_helper::value) == 1 ? -1 : 1 ]; -# endif - -#endif - -#if BOOST_WORKAROUND(__MWERKS__, <=0x2407) -# define BOOST_NO_IS_CONVERTIBLE // "is_convertible doesn't work for simple types" -#endif - -#if BOOST_WORKAROUND(__GNUC__, == 2) \ - || BOOST_WORKAROUND(__GNUC__, == 3) && BOOST_WORKAROUND(__GNUC_MINOR__, < 4) && !defined(__EDG_VERSION__) \ - || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) -# define BOOST_NO_IS_CONVERTIBLE_TEMPLATE // The following program fails to compile: - -# if 0 // test code - #include - template - struct foo - { - foo(T); - - template - foo(foo const& other) : p(other.p) { } - - T p; - }; - - bool x = boost::is_convertible, foo >::value; -# endif - -#endif - - -#if !defined(BOOST_MSVC) && (defined(BOOST_NO_SFINAE) || defined(BOOST_NO_IS_CONVERTIBLE) || defined(BOOST_NO_IS_CONVERTIBLE_TEMPLATE)) -# define BOOST_NO_STRICT_ITERATOR_INTEROPERABILITY -#endif - -# if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) -# define BOOST_ARG_DEPENDENT_TYPENAME typename -# else -# define BOOST_ARG_DEPENDENT_TYPENAME -# endif - -# if BOOST_WORKAROUND(__GNUC__, == 2) && BOOST_WORKAROUND(__GNUC_MINOR__, BOOST_TESTED_AT(95)) \ - || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) - -// GCC-2.95 eagerly instantiates templated constructors and conversion -// operators in convertibility checks, causing premature errors. -// -// Borland's problems are harder to diagnose due to lack of an -// instantiation stack backtrace. They may be due in part to the fact -// that it drops cv-qualification willy-nilly in templates. -# define BOOST_NO_ONE_WAY_ITERATOR_INTEROP -# endif - -// no include guard; multiple inclusion intended diff --git a/include/boost/iterator/detail/config_undef.hpp b/include/boost/iterator/detail/config_undef.hpp deleted file mode 100644 index 9dcd1d5..0000000 --- a/include/boost/iterator/detail/config_undef.hpp +++ /dev/null @@ -1,25 +0,0 @@ -// (C) Copyright Thomas Witt 2002. -// 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) - -// no include guard multiple inclusion intended - -// -// This is a temporary workaround until the bulk of this is -// available in boost config. -// 23/02/03 thw -// - -#undef BOOST_NO_IS_CONVERTIBLE -#undef BOOST_NO_IS_CONVERTIBLE_TEMPLATE -#undef BOOST_NO_STRICT_ITERATOR_INTEROPERABILITY -#undef BOOST_ARG_DEPENDENT_TYPENAME -#undef BOOST_NO_LVALUE_RETURN_DETECTION -#undef BOOST_NO_ONE_WAY_ITERATOR_INTEROP - -#ifdef BOOST_ITERATOR_CONFIG_DEF -# undef BOOST_ITERATOR_CONFIG_DEF -#else -# error missing or nested #include config_def -#endif diff --git a/include/boost/iterator/detail/enable_if.hpp b/include/boost/iterator/detail/enable_if.hpp deleted file mode 100644 index 0fd36fc..0000000 --- a/include/boost/iterator/detail/enable_if.hpp +++ /dev/null @@ -1,86 +0,0 @@ -// (C) Copyright David Abrahams 2002. -// (C) Copyright Jeremy Siek 2002. -// (C) Copyright Thomas Witt 2002. -// 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) -#ifndef BOOST_ENABLE_IF_23022003THW_HPP -#define BOOST_ENABLE_IF_23022003THW_HPP - -#include -#include - -#include - -// -// Boost iterators uses its own enable_if cause we need -// special semantics for deficient compilers. -// 23/02/03 thw -// - -namespace boost -{ - - namespace iterators - { - // - // Base machinery for all kinds of enable if - // - template - struct enabled - { - template - struct base - { - typedef T type; - }; - }; - - // - // For compilers that don't support "Substitution Failure Is Not An Error" - // enable_if falls back to always enabled. See comments - // on operator implementation for consequences. - // - template<> - struct enabled - { - template - struct base - { -#ifdef BOOST_NO_SFINAE - - typedef T type; - - // This way to do it would give a nice error message containing - // invalid overload, but has the big disadvantage that - // there is no reference to user code in the error message. - // - // struct invalid_overload; - // typedef invalid_overload type; - // -#endif - }; - }; - - - template - struct enable_if -# if !defined(BOOST_NO_SFINAE) && !defined(BOOST_NO_IS_CONVERTIBLE) - : enabled<(Cond::value)>::template base -# else - : mpl::identity -# endif - { -# if BOOST_WORKAROUND(BOOST_MSVC, < 1300) - typedef Return type; -# endif - }; - - } // namespace iterators - -} // namespace boost - -#include - -#endif // BOOST_ENABLE_IF_23022003THW_HPP diff --git a/include/boost/iterator/detail/facade_iterator_category.hpp b/include/boost/iterator/detail/facade_iterator_category.hpp deleted file mode 100755 index 2c4771d..0000000 --- a/include/boost/iterator/detail/facade_iterator_category.hpp +++ /dev/null @@ -1,200 +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) -#ifndef FACADE_ITERATOR_CATEGORY_DWA20031118_HPP -# define FACADE_ITERATOR_CATEGORY_DWA20031118_HPP - -# include - -# include // used in iterator_tag inheritance logic -# include -# include -# include -# include -# include - -# include -# include -# include -# include - -# include - -# include // try to keep this last - -# ifdef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY -# include -# endif - -// -// iterator_category deduction for iterator_facade -// - -// forward declaration -namespace boost { struct use_default; } - -namespace boost { namespace detail { - -struct input_output_iterator_tag - : std::input_iterator_tag -{ - // Using inheritance for only input_iterator_tag helps to avoid - // ambiguities when a stdlib implementation dispatches on a - // function which is overloaded on both input_iterator_tag and - // output_iterator_tag, as STLPort does, in its __valid_range - // function. I claim it's better to avoid the ambiguity in these - // cases. - operator std::output_iterator_tag() const - { - return std::output_iterator_tag(); - } -}; - -// -// True iff the user has explicitly disabled writability of this -// iterator. Pass the iterator_facade's Value parameter and its -// nested ::reference type. -// -template -struct iterator_writability_disabled -# ifdef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY // Adding Thomas' logic? - : mpl::or_< - is_const - , boost::detail::indirect_traits::is_reference_to_const - , is_const - > -# else - : is_const -# endif -{}; - - -// -// Convert an iterator_facade's traversal category, Value parameter, -// and ::reference type to an appropriate old-style category. -// -// If writability has been disabled per the above metafunction, the -// result will not be convertible to output_iterator_tag. -// -// Otherwise, if Traversal == single_pass_traversal_tag, the following -// conditions will result in a tag that is convertible both to -// input_iterator_tag and output_iterator_tag: -// -// 1. Reference is a reference to non-const -// 2. Reference is not a reference and is convertible to Value -// -template -struct iterator_facade_default_category - : mpl::eval_if< - mpl::and_< - is_reference - , is_convertible - > - , mpl::eval_if< - is_convertible - , mpl::identity - , mpl::if_< - is_convertible - , std::bidirectional_iterator_tag - , std::forward_iterator_tag - > - > - , typename mpl::eval_if< - mpl::and_< - is_convertible - - // check for readability - , is_convertible - > - , mpl::identity - , mpl::identity - > - > -{ -}; - -// True iff T is convertible to an old-style iterator category. -template -struct is_iterator_category - : mpl::or_< - is_convertible - , is_convertible - > -{ -}; - -template -struct is_iterator_traversal - : is_convertible -{}; - -// -// A composite iterator_category tag convertible to Category (a pure -// old-style category) and Traversal (a pure traversal tag). -// Traversal must be a strict increase of the traversal power given by -// Category. -// -template -struct iterator_category_with_traversal - : Category, Traversal -{ -# if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) - // Make sure this isn't used to build any categories where - // convertibility to Traversal is redundant. Should just use the - // Category element in that case. - BOOST_MPL_ASSERT_NOT(( - is_convertible< - typename iterator_category_to_traversal::type - , Traversal - >)); - - BOOST_MPL_ASSERT((is_iterator_category)); - BOOST_MPL_ASSERT_NOT((is_iterator_category)); - BOOST_MPL_ASSERT_NOT((is_iterator_traversal)); -# if !BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310)) - BOOST_MPL_ASSERT((is_iterator_traversal)); -# endif -# endif -}; - -// Computes an iterator_category tag whose traversal is Traversal and -// which is appropriate for an iterator -template -struct facade_iterator_category_impl -{ -# if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) - BOOST_MPL_ASSERT_NOT((is_iterator_category)); -# endif - - typedef typename iterator_facade_default_category< - Traversal,ValueParam,Reference - >::type category; - - typedef typename mpl::if_< - is_same< - Traversal - , typename iterator_category_to_traversal::type - > - , category - , iterator_category_with_traversal - >::type type; -}; - -// -// Compute an iterator_category for iterator_facade -// -template -struct facade_iterator_category - : mpl::eval_if< - is_iterator_category - , mpl::identity // old-style categories are fine as-is - , facade_iterator_category_impl - > -{ -}; - -}} // namespace boost::detail - -# include - -#endif // FACADE_ITERATOR_CATEGORY_DWA20031118_HPP diff --git a/include/boost/iterator/detail/minimum_category.hpp b/include/boost/iterator/detail/minimum_category.hpp deleted file mode 100755 index 96501dd..0000000 --- a/include/boost/iterator/detail/minimum_category.hpp +++ /dev/null @@ -1,116 +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) -#ifndef MINIMUM_CATEGORY_DWA20031119_HPP -# define MINIMUM_CATEGORY_DWA20031119_HPP - -# include -# include - -# include - -namespace boost { namespace detail { -// -// Returns the minimum category type or error_type -// if T1 and T2 are unrelated. -// -// For compilers not supporting is_convertible this only -// works with the new boost return and traversal category -// types. The exact boost _types_ are required. No derived types -// will work. -// -// -template -struct minimum_category_impl -# if BOOST_WORKAROUND(BOOST_MSVC, < 1300) -{ - template struct apply - { - typedef T2 type; - }; - typedef void type; -} -# endif -; - -template -struct error_not_related_by_convertibility; - -template <> -struct minimum_category_impl -{ - template struct apply - { - typedef T2 type; - }; -}; - -template <> -struct minimum_category_impl -{ - template struct apply - { - typedef T1 type; - }; -}; - -template <> -struct minimum_category_impl -{ - template struct apply - { - BOOST_STATIC_ASSERT((is_same::value)); - typedef T1 type; - }; -}; - -template <> -struct minimum_category_impl -{ - template struct apply - : error_not_related_by_convertibility - { - }; -}; - -template -struct minimum_category -{ - typedef minimum_category_impl< -# if BOOST_WORKAROUND(BOOST_MSVC, < 1300) // ETI workaround - is_same::value || -# endif - ::boost::is_convertible::value - , ::boost::is_convertible::value -# if BOOST_WORKAROUND(BOOST_MSVC, < 1300) // ETI workaround - || is_same::value -# endif - > outer; - - typedef typename outer::template apply inner; - typedef typename inner::type type; - - BOOST_MPL_AUX_LAMBDA_SUPPORT(2,minimum_category,(T1,T2)) -}; - -template <> -struct minimum_category -{ - template - struct apply : minimum_category - {}; - - BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2,minimum_category,(mpl::_1,mpl::_2)) -}; - -# if BOOST_WORKAROUND(BOOST_MSVC, < 1300) // ETI workaround -template <> -struct minimum_category -{ - typedef int type; -}; -# endif - -}} // namespace boost::detail - -#endif // MINIMUM_CATEGORY_DWA20031119_HPP diff --git a/include/boost/iterator/filter_iterator.hpp b/include/boost/iterator/filter_iterator.hpp deleted file mode 100644 index 14d640b..0000000 --- a/include/boost/iterator/filter_iterator.hpp +++ /dev/null @@ -1,135 +0,0 @@ -// (C) Copyright David Abrahams 2002. -// (C) Copyright Jeremy Siek 2002. -// (C) Copyright Thomas Witt 2002. -// 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) -#ifndef BOOST_FILTER_ITERATOR_23022003THW_HPP -#define BOOST_FILTER_ITERATOR_23022003THW_HPP - -#include -#include -#include - -#include -#include - -namespace boost -{ - template - class filter_iterator; - - namespace detail - { - template - struct filter_iterator_base - { - typedef iterator_adaptor< - filter_iterator - , Iterator - , use_default - , typename mpl::if_< - is_convertible< - typename iterator_traversal::type - , random_access_traversal_tag - > - , bidirectional_traversal_tag - , use_default - >::type - > type; - }; - } - - template - class filter_iterator - : public detail::filter_iterator_base::type - { - typedef typename detail::filter_iterator_base< - Predicate, Iterator - >::type super_t; - - friend class iterator_core_access; - - public: - filter_iterator() { } - - filter_iterator(Predicate f, Iterator x, Iterator end_ = Iterator()) - : super_t(x), m_predicate(f), m_end(end_) - { - satisfy_predicate(); - } - - filter_iterator(Iterator x, Iterator end_ = Iterator()) - : super_t(x), m_predicate(), m_end(end_) - { - // Pro8 is a little too aggressive about instantiating the - // body of this function. -#if !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) - // Don't allow use of this constructor if Predicate is a - // function pointer type, since it will be 0. - BOOST_STATIC_ASSERT(is_class::value); -#endif - satisfy_predicate(); - } - - template - filter_iterator( - filter_iterator const& t - , typename enable_if_convertible::type* = 0 - ) - : super_t(t.base()), m_predicate(t.predicate()), m_end(t.end()) {} - - Predicate predicate() const { return m_predicate; } - - Iterator end() const { return m_end; } - - private: - void increment() - { - ++(this->base_reference()); - satisfy_predicate(); - } - - void decrement() - { - while(!this->m_predicate(*--(this->base_reference()))){}; - } - - void satisfy_predicate() - { - while (this->base() != this->m_end && !this->m_predicate(*this->base())) - ++(this->base_reference()); - } - - // Probably should be the initial base class so it can be - // optimized away via EBO if it is an empty class. - Predicate m_predicate; - Iterator m_end; - }; - - template - filter_iterator - make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator()) - { - return filter_iterator(f,x,end); - } - - template - filter_iterator - make_filter_iterator( - typename iterators::enable_if< - is_class - , Iterator - >::type x - , Iterator end = Iterator() -#if BOOST_WORKAROUND(BOOST_MSVC, < 1300) - , Predicate* = 0 -#endif - ) - { - return filter_iterator(x,end); - } - -} // namespace boost - -#endif // BOOST_FILTER_ITERATOR_23022003THW_HPP diff --git a/include/boost/iterator/indirect_iterator.hpp b/include/boost/iterator/indirect_iterator.hpp deleted file mode 100644 index f181107..0000000 --- a/include/boost/iterator/indirect_iterator.hpp +++ /dev/null @@ -1,139 +0,0 @@ -// (C) Copyright David Abrahams 2002. -// (C) Copyright Jeremy Siek 2002. -// (C) Copyright Thomas Witt 2002. -// 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) -#ifndef BOOST_INDIRECT_ITERATOR_23022003THW_HPP -#define BOOST_INDIRECT_ITERATOR_23022003THW_HPP - -#include -#include - -#include -#include -#include - -#include - -#include -#include - -#include -#include -#include -#include -#include - -#ifdef BOOST_MPL_CFG_NO_HAS_XXX -# include -# include -# include -# include -#endif - -#include // must be last #include - -namespace boost -{ - template - class indirect_iterator; - - namespace detail - { - template - struct indirect_base - { - typedef typename iterator_traits::value_type dereferenceable; - - typedef iterator_adaptor< - indirect_iterator - , Iter - , typename ia_dflt_help< - Value, pointee - >::type - , Category - , typename ia_dflt_help< - Reference - , mpl::eval_if< - is_same - , indirect_reference - , add_reference - > - >::type - , Difference - > type; - }; - - template <> - struct indirect_base {}; - } // namespace detail - - - template < - class Iterator - , class Value = use_default - , class Category = use_default - , class Reference = use_default - , class Difference = use_default - > - class indirect_iterator - : public detail::indirect_base< - Iterator, Value, Category, Reference, Difference - >::type - { - typedef typename detail::indirect_base< - Iterator, Value, Category, Reference, Difference - >::type super_t; - - friend class iterator_core_access; - - public: - indirect_iterator() {} - - indirect_iterator(Iterator iter) - : super_t(iter) {} - - 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 - ) - : super_t(y.base()) - {} - - private: - typename super_t::reference dereference() const - { -# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) - return const_cast(**this->base()); -# else - return **this->base(); -# endif - } - }; - - template - inline - indirect_iterator make_indirect_iterator(Iter x) - { - return indirect_iterator(x); - } - - template - inline - indirect_iterator make_indirect_iterator(Iter x, Traits* = 0) - { - return indirect_iterator(x); - } - -} // namespace boost - -#include - -#endif // BOOST_INDIRECT_ITERATOR_23022003THW_HPP diff --git a/include/boost/iterator/interoperable.hpp b/include/boost/iterator/interoperable.hpp deleted file mode 100644 index c13dd9b..0000000 --- a/include/boost/iterator/interoperable.hpp +++ /dev/null @@ -1,50 +0,0 @@ -// (C) Copyright David Abrahams 2002. -// (C) Copyright Jeremy Siek 2002. -// (C) Copyright Thomas Witt 2002. -// 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) -#ifndef BOOST_INTEROPERABLE_23022003THW_HPP -# define BOOST_INTEROPERABLE_23022003THW_HPP - -# include -# include - -# include - -# include // must appear last - -namespace boost -{ - - // - // Meta function that determines whether two - // iterator types are considered interoperable. - // - // Two iterator types A,B are considered interoperable if either - // A is convertible to B or vice versa. - // This interoperability definition is in sync with the - // standards requirements on constant/mutable container - // iterators (23.1 [lib.container.requirements]). - // - // For compilers that don't support is_convertible - // is_interoperable gives false positives. See comments - // on operator implementation for consequences. - // - template - struct is_interoperable -# ifdef BOOST_NO_STRICT_ITERATOR_INTEROPERABILITY - : mpl::true_ -# else - : mpl::or_< - is_convertible< A, B > - , is_convertible< B, A > > -# endif - { - }; - -} // namespace boost - -# include - -#endif // BOOST_INTEROPERABLE_23022003THW_HPP diff --git a/include/boost/iterator/is_lvalue_iterator.hpp b/include/boost/iterator/is_lvalue_iterator.hpp deleted file mode 100755 index 3beb90d..0000000 --- a/include/boost/iterator/is_lvalue_iterator.hpp +++ /dev/null @@ -1,150 +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) -#ifndef IS_LVALUE_ITERATOR_DWA2003112_HPP -# define IS_LVALUE_ITERATOR_DWA2003112_HPP - -#include - -#include -#include - -#include - -// should be the last #includes -#include -#include - -#ifndef BOOST_NO_IS_CONVERTIBLE - -namespace boost { - -namespace detail -{ -#ifndef BOOST_NO_LVALUE_RETURN_DETECTION - // Calling lvalue_preserver( , 0 ) returns a reference - // to the expression's result if is an lvalue, or - // not_an_lvalue() otherwise. - struct not_an_lvalue {}; - - template - T& lvalue_preserver(T&, int); - - template - not_an_lvalue lvalue_preserver(U const&, ...); - -# define BOOST_LVALUE_PRESERVER(expr) detail::lvalue_preserver(expr,0) - -#else - -# define BOOST_LVALUE_PRESERVER(expr) expr - -#endif - - // Guts of is_lvalue_iterator. Value is the iterator's value_type - // and the result is computed in the nested rebind template. - template - struct is_lvalue_iterator_impl - { - // Eat implicit conversions so we don't report true for things - // convertible to Value const& - struct conversion_eater - { - conversion_eater(Value&); - }; - - static char tester(conversion_eater, int); - static char (& tester(any_conversion_eater, ...) )[2]; - - template - struct rebind - { - static It& x; - - BOOST_STATIC_CONSTANT( - bool - , value = ( - sizeof( - is_lvalue_iterator_impl::tester( - BOOST_LVALUE_PRESERVER(*x), 0 - ) - ) == 1 - ) - ); - }; - }; - -#undef BOOST_LVALUE_PRESERVER - - // - // void specializations to handle std input and output iterators - // - template <> - struct is_lvalue_iterator_impl - { - template - struct rebind : boost::mpl::false_ - {}; - }; - -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS - template <> - struct is_lvalue_iterator_impl - { - template - struct rebind : boost::mpl::false_ - {}; - }; - - template <> - struct is_lvalue_iterator_impl - { - template - struct rebind : boost::mpl::false_ - {}; - }; - - template <> - struct is_lvalue_iterator_impl - { - template - struct rebind : boost::mpl::false_ - {}; - }; -#endif - - // - // This level of dispatching is required for Borland. We might save - // an instantiation by removing it for others. - // - template - struct is_readable_lvalue_iterator_impl - : is_lvalue_iterator_impl< - BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::value_type const - >::template rebind - {}; - - template - struct is_non_const_lvalue_iterator_impl - : is_lvalue_iterator_impl< - BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::value_type - >::template rebind - {}; -} // namespace detail - -// Define the trait with full mpl lambda capability and various broken -// compiler workarounds -BOOST_TT_AUX_BOOL_TRAIT_DEF1( - is_lvalue_iterator,T,::boost::detail::is_readable_lvalue_iterator_impl::value) - -BOOST_TT_AUX_BOOL_TRAIT_DEF1( - is_non_const_lvalue_iterator,T,::boost::detail::is_non_const_lvalue_iterator_impl::value) - -} // namespace boost - -#endif - -#include -#include - -#endif // IS_LVALUE_ITERATOR_DWA2003112_HPP diff --git a/include/boost/iterator/is_readable_iterator.hpp b/include/boost/iterator/is_readable_iterator.hpp deleted file mode 100755 index 60d6ff0..0000000 --- a/include/boost/iterator/is_readable_iterator.hpp +++ /dev/null @@ -1,108 +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) -#ifndef IS_READABLE_ITERATOR_DWA2003112_HPP -# define IS_READABLE_ITERATOR_DWA2003112_HPP - -#include -#include - -#include -#include - -// should be the last #include -#include - -#ifndef BOOST_NO_IS_CONVERTIBLE - -namespace boost { - -namespace detail -{ - // Guts of is_readable_iterator. Value is the iterator's value_type - // and the result is computed in the nested rebind template. - template - struct is_readable_iterator_impl - { - static char tester(Value&, int); - static char (& tester(any_conversion_eater, ...) )[2]; - - template - struct rebind - { - static It& x; - - BOOST_STATIC_CONSTANT( - bool - , value = ( - sizeof( - is_readable_iterator_impl::tester(*x, 1) - ) == 1 - ) - ); - }; - }; - -#undef BOOST_READABLE_PRESERVER - - // - // void specializations to handle std input and output iterators - // - template <> - struct is_readable_iterator_impl - { - template - struct rebind : boost::mpl::false_ - {}; - }; - -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS - template <> - struct is_readable_iterator_impl - { - template - struct rebind : boost::mpl::false_ - {}; - }; - - template <> - struct is_readable_iterator_impl - { - template - struct rebind : boost::mpl::false_ - {}; - }; - - template <> - struct is_readable_iterator_impl - { - template - struct rebind : boost::mpl::false_ - {}; - }; -#endif - - // - // This level of dispatching is required for Borland. We might save - // an instantiation by removing it for others. - // - template - struct is_readable_iterator_impl2 - : is_readable_iterator_impl< - BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::value_type const - >::template rebind - {}; -} // namespace detail - -// Define the trait with full mpl lambda capability and various broken -// compiler workarounds -BOOST_TT_AUX_BOOL_TRAIT_DEF1( - is_readable_iterator,T,::boost::detail::is_readable_iterator_impl2::value) - -} // namespace boost - -#endif - -#include - -#endif // IS_READABLE_ITERATOR_DWA2003112_HPP diff --git a/include/boost/iterator/iterator_adaptor.hpp b/include/boost/iterator/iterator_adaptor.hpp deleted file mode 100644 index 457c439..0000000 --- a/include/boost/iterator/iterator_adaptor.hpp +++ /dev/null @@ -1,366 +0,0 @@ -// (C) Copyright David Abrahams 2002. -// (C) Copyright Jeremy Siek 2002. -// (C) Copyright Thomas Witt 2002. -// 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) -#ifndef BOOST_ITERATOR_ADAPTOR_23022003THW_HPP -#define BOOST_ITERATOR_ADAPTOR_23022003THW_HPP - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include -#include - -#ifdef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY -# include -#else -# include -#endif - -#include - -#include - -namespace boost -{ - // Used as a default template argument internally, merely to - // indicate "use the default", this can also be passed by users - // explicitly in order to specify that the default should be used. - struct use_default; - -# ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - // the incompleteness of use_default causes massive problems for - // is_convertible (naturally). This workaround is fortunately not - // needed for vc6/vc7. - template - struct is_convertible - : mpl::false_ {}; -# endif - - namespace detail - { - - // - // Result type used in enable_if_convertible meta function. - // This can be an incomplete type, as only pointers to - // enable_if_convertible< ... >::type are used. - // We could have used void for this, but conversion to - // void* is just to easy. - // - struct enable_type; - } - - - // - // enable_if for use in adapted iterators constructors. - // - // In order to provide interoperability between adapted constant and - // mutable iterators, adapted iterators will usually provide templated - // conversion constructors of the following form - // - // template - // class adapted_iterator : - // public iterator_adaptor< adapted_iterator, Iterator > - // { - // public: - // - // ... - // - // template - // adapted_iterator( - // OtherIterator const& it - // , typename enable_if_convertible::type* = 0); - // - // ... - // }; - // - // enable_if_convertible is used to remove those overloads from the overload - // set that cannot be instantiated. For all practical purposes only overloads - // for constant/mutable interaction will remain. This has the advantage that - // meta functions like boost::is_convertible do not return false positives, - // as they can only look at the signature of the conversion constructor - // and not at the actual instantiation. - // - // enable_if_interoperable can be safely used in user code. It falls back to - // always enabled for compilers that don't support enable_if or is_convertible. - // There is no need for compiler specific workarounds in user code. - // - // The operators implementation relies on boost::is_convertible not returning - // false positives for user/library defined iterator types. See comments - // on operator implementation for consequences. - // -# if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) - - template - struct enable_if_convertible - { - typedef typename mpl::if_< - mpl::or_< - is_same - , is_convertible - > - , detail::enable_type - , int& - >::type type; - }; - -# elif defined(BOOST_NO_IS_CONVERTIBLE) || defined(BOOST_NO_SFINAE) - - template - struct enable_if_convertible - { - typedef detail::enable_type type; - }; - -# elif BOOST_WORKAROUND(_MSC_FULL_VER, BOOST_TESTED_AT(13102292)) && BOOST_MSVC > 1300 - - // For some reason vc7.1 needs us to "cut off" instantiation - // of is_convertible in a few cases. - template - struct enable_if_convertible - : iterators::enable_if< - mpl::or_< - is_same - , is_convertible - > - , detail::enable_type - > - {}; - -# else - - template - struct enable_if_convertible - : iterators::enable_if< - is_convertible - , detail::enable_type - > - {}; - -# endif - - // - // Default template argument handling for iterator_adaptor - // - namespace detail - { - // If T is use_default, return the result of invoking - // DefaultNullaryFn, otherwise return T. - template - struct ia_dflt_help - : mpl::eval_if< - is_same - , DefaultNullaryFn - , mpl::identity - > - { - }; - - // A metafunction which computes an iterator_adaptor's base class, - // a specialization of iterator_facade. - template < - class Derived - , class Base - , class Value - , class Traversal - , class Reference - , class Difference - > - struct iterator_adaptor_base - { - typedef iterator_facade< - Derived - -# ifdef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY - , typename detail::ia_dflt_help< - Value - , mpl::eval_if< - is_same - , iterator_value - , remove_reference - > - >::type -# else - , typename detail::ia_dflt_help< - Value, iterator_value - >::type -# endif - - , typename detail::ia_dflt_help< - Traversal - , iterator_traversal - >::type - - , typename detail::ia_dflt_help< - Reference - , mpl::eval_if< - is_same - , iterator_reference - , add_reference - > - >::type - - , typename detail::ia_dflt_help< - Difference, iterator_difference - >::type - > - type; - }; - - // workaround for aC++ CR JAGaf33512 - template - inline void iterator_adaptor_assert_traversal () - { - BOOST_STATIC_ASSERT((is_convertible::value)); - } - } - - // - // Iterator Adaptor - // - // The parameter ordering changed slightly with respect to former - // versions of iterator_adaptor The idea is that when the user needs - // to fiddle with the reference type it is highly likely that the - // iterator category has to be adjusted as well. Any of the - // following four template arguments may be ommitted or explicitly - // replaced by use_default. - // - // Value - if supplied, the value_type of the resulting iterator, unless - // const. If const, a conforming compiler strips constness for the - // value_type. If not supplied, iterator_traits::value_type is used - // - // Category - the traversal category of the resulting iterator. If not - // supplied, iterator_traversal::type is used. - // - // Reference - the reference type of the resulting iterator, and in - // particular, the result type of operator*(). If not supplied but - // Value is supplied, Value& is used. Otherwise - // iterator_traits::reference is used. - // - // Difference - the difference_type of the resulting iterator. If not - // supplied, iterator_traits::difference_type is used. - // - template < - class Derived - , class Base - , class Value = use_default - , class Traversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class iterator_adaptor - : public detail::iterator_adaptor_base< - Derived, Base, Value, Traversal, Reference, Difference - >::type - { - friend class iterator_core_access; - - protected: - typedef typename detail::iterator_adaptor_base< - Derived, Base, Value, Traversal, Reference, Difference - >::type super_t; - public: - iterator_adaptor() {} - - explicit iterator_adaptor(Base const &iter) - : m_iterator(iter) - { - } - - typedef Base base_type; - - Base const& base() const - { return m_iterator; } - - protected: - // for convenience in derived classes - typedef iterator_adaptor iterator_adaptor_; - - // - // lvalue access to the Base object for Derived - // - Base const& base_reference() const - { return m_iterator; } - - Base& base_reference() - { return m_iterator; } - - private: - // - // Core iterator interface for iterator_facade. This is private - // to prevent temptation for Derived classes to use it, which - // will often result in an error. Derived classes should use - // base_reference(), above, to get direct access to m_iterator. - // - typename super_t::reference dereference() const - { return *m_iterator; } - - template < - class OtherDerived, class OtherIterator, class V, class C, class R, class D - > - bool equal(iterator_adaptor const& x) const - { - // Maybe readd with same_distance - // BOOST_STATIC_ASSERT( - // (detail::same_category_and_difference::value) - // ); - return m_iterator == x.base(); - } - - typedef typename iterator_category_to_traversal< - typename super_t::iterator_category - >::type my_traversal; - -# define BOOST_ITERATOR_ADAPTOR_ASSERT_TRAVERSAL(cat) \ - detail::iterator_adaptor_assert_traversal(); - - void advance(typename super_t::difference_type n) - { - BOOST_ITERATOR_ADAPTOR_ASSERT_TRAVERSAL(random_access_traversal_tag) - m_iterator += n; - } - - void increment() { ++m_iterator; } - - void decrement() - { - BOOST_ITERATOR_ADAPTOR_ASSERT_TRAVERSAL(bidirectional_traversal_tag) - --m_iterator; - } - - template < - class OtherDerived, class OtherIterator, class V, class C, class R, class D - > - typename super_t::difference_type distance_to( - iterator_adaptor const& y) const - { - BOOST_ITERATOR_ADAPTOR_ASSERT_TRAVERSAL(random_access_traversal_tag) - // Maybe readd with same_distance - // BOOST_STATIC_ASSERT( - // (detail::same_category_and_difference::value) - // ); - return y.base() - m_iterator; - } - -# undef BOOST_ITERATOR_ADAPTOR_ASSERT_TRAVERSAL - - private: // data members - Base m_iterator; - }; - -} // namespace boost - -#include - -#endif // BOOST_ITERATOR_ADAPTOR_23022003THW_HPP diff --git a/include/boost/iterator/iterator_archetypes.hpp b/include/boost/iterator/iterator_archetypes.hpp deleted file mode 100644 index 039de1c..0000000 --- a/include/boost/iterator/iterator_archetypes.hpp +++ /dev/null @@ -1,515 +0,0 @@ -// (C) Copyright Jeremy Siek 2002. -// 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) - -#ifndef BOOST_ITERATOR_ARCHETYPES_HPP -#define BOOST_ITERATOR_ARCHETYPES_HPP - -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -namespace boost { - -template -struct access_archetype; - -template -struct traversal_archetype; - -namespace iterator_archetypes -{ - enum { - readable_iterator_bit = 1 - , writable_iterator_bit = 2 - , swappable_iterator_bit = 4 - , lvalue_iterator_bit = 8 - }; - - // Not quite tags, since dispatching wouldn't work. - typedef mpl::int_::type readable_iterator_t; - typedef mpl::int_::type writable_iterator_t; - - typedef mpl::int_< - (readable_iterator_bit|writable_iterator_bit) - >::type readable_writable_iterator_t; - - typedef mpl::int_< - (readable_iterator_bit|lvalue_iterator_bit) - >::type readable_lvalue_iterator_t; - - typedef mpl::int_< - (lvalue_iterator_bit|writable_iterator_bit) - >::type writable_lvalue_iterator_t; - - typedef mpl::int_::type swappable_iterator_t; - typedef mpl::int_::type lvalue_iterator_t; - - template - struct has_access - : mpl::equal_to< - mpl::bitand_ - , Base - > - {}; -} - -namespace detail -{ - template - struct assign_proxy - { - assign_proxy& operator=(T) { return *this; } - }; - - template - struct read_proxy - { - operator T() { return static_object::get(); } - }; - - template - struct read_write_proxy - : read_proxy // Use to inherit from assign_proxy, but that doesn't work. -JGS - { - read_write_proxy& operator=(T) { return *this; } - }; - - template - struct arrow_proxy - { - T const* operator->() const { return 0; } - }; - - struct no_operator_brackets {}; - - template - struct readable_operator_brackets - { - read_proxy operator[](std::ptrdiff_t n) const { return read_proxy(); } - }; - - template - struct writable_operator_brackets - { - read_write_proxy operator[](std::ptrdiff_t n) const { return read_write_proxy(); } - }; - - template - struct operator_brackets - : mpl::aux::msvc_eti_base< - typename mpl::eval_if< - is_convertible - , mpl::eval_if< - iterator_archetypes::has_access< - AccessCategory - , iterator_archetypes::writable_iterator_t - > - , mpl::identity > - , mpl::if_< - iterator_archetypes::has_access< - AccessCategory - , iterator_archetypes::readable_iterator_t - > - , readable_operator_brackets - , no_operator_brackets - > - > - , mpl::identity - >::type - >::type - {}; - - template - struct traversal_archetype_impl - { - template struct archetype; - }; - - // Constructor argument for those iterators that - // are not default constructible - struct ctor_arg {}; - - template - struct traversal_archetype_ - : mpl::aux::msvc_eti_base< - typename traversal_archetype_impl::template archetype - >::type - { - typedef typename - traversal_archetype_impl::template archetype - base; - - traversal_archetype_() {} - - traversal_archetype_(ctor_arg arg) - : base(arg) - {} - }; - - template <> - struct traversal_archetype_impl - { - template - struct archetype - { - explicit archetype(ctor_arg) {} - - struct bogus { }; // This use to be void, but that causes trouble for iterator_facade. Need more research. -JGS - typedef bogus difference_type; - - Derived& operator++() { return (Derived&)static_object::get(); } - Derived operator++(int) const { return (Derived&)static_object::get(); } - }; - }; - - template <> - struct traversal_archetype_impl - { - template - struct archetype - : public equality_comparable< traversal_archetype_ >, - public traversal_archetype_ - { - explicit archetype(ctor_arg arg) - : traversal_archetype_(arg) - {} - - typedef std::ptrdiff_t difference_type; - }; - }; - - template - bool operator==(traversal_archetype_ const&, - traversal_archetype_ const&) { return true; } - -#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) - // doesn't seem to pick up != from equality_comparable - template - bool operator!=(traversal_archetype_ const&, - traversal_archetype_ const&) { return true; } -#endif - template <> - struct traversal_archetype_impl - { - template - struct archetype - : public traversal_archetype_ - { - archetype() - : traversal_archetype_(ctor_arg()) - {} - }; - }; - - template <> - struct traversal_archetype_impl - { - template - struct archetype - : public traversal_archetype_ - { - Derived& operator--() { return static_object::get(); } - Derived operator--(int) const { return static_object::get(); } - }; - }; - - template <> - struct traversal_archetype_impl - { - template - struct archetype - : public traversal_archetype_ - { - Derived& operator+=(std::ptrdiff_t) { return static_object::get(); } - Derived& operator-=(std::ptrdiff_t) { return static_object::get(); } - }; - }; - - template - Derived& operator+(traversal_archetype_ const&, - std::ptrdiff_t) { return static_object::get(); } - - template - Derived& operator+(std::ptrdiff_t, - traversal_archetype_ const&) - { return static_object::get(); } - - template - Derived& operator-(traversal_archetype_ const&, - std::ptrdiff_t) - { return static_object::get(); } - - template - std::ptrdiff_t operator-(traversal_archetype_ const&, - traversal_archetype_ const&) - { return 0; } - - template - bool operator<(traversal_archetype_ const&, - traversal_archetype_ const&) - { return true; } - - template - bool operator>(traversal_archetype_ const&, - traversal_archetype_ const&) - { return true; } - - template - bool operator<=(traversal_archetype_ const&, - traversal_archetype_ const&) - { return true; } - - template - bool operator>=(traversal_archetype_ const&, - traversal_archetype_ const&) - { return true; } - - struct bogus_type; - - template - struct convertible_type - : mpl::if_< is_const, - typename remove_const::type, - bogus_type > - {}; - -} // namespace detail - - -template struct undefined; - -template -struct iterator_access_archetype_impl -{ - template struct archetype; -}; - -template -struct iterator_access_archetype - : mpl::aux::msvc_eti_base< - typename iterator_access_archetype_impl< - AccessCategory - >::template archetype - >::type -{ -}; - -template <> -struct iterator_access_archetype_impl< - iterator_archetypes::readable_iterator_t -> -{ - template - struct archetype - { - typedef typename remove_cv::type value_type; - typedef Value reference; - typedef Value* pointer; - - value_type operator*() const { return static_object::get(); } - - detail::arrow_proxy operator->() const { return detail::arrow_proxy(); } - }; -}; - -template <> -struct iterator_access_archetype_impl< - iterator_archetypes::writable_iterator_t -> -{ - template - struct archetype - { -# if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) - BOOST_STATIC_ASSERT(!is_const::value); -# endif - typedef void value_type; - typedef void reference; - typedef void pointer; - - detail::assign_proxy operator*() const { return detail::assign_proxy(); } - }; -}; - -template <> -struct iterator_access_archetype_impl< - iterator_archetypes::readable_writable_iterator_t -> -{ - template - struct archetype - : public virtual iterator_access_archetype< - Value, iterator_archetypes::readable_iterator_t - > - { - typedef detail::read_write_proxy reference; - - detail::read_write_proxy operator*() const { return detail::read_write_proxy(); } - }; -}; - -template <> -struct iterator_access_archetype_impl -{ - template - struct archetype - : public virtual iterator_access_archetype< - Value, iterator_archetypes::readable_iterator_t - > - { - typedef Value& reference; - - Value& operator*() const { return static_object::get(); } - Value* operator->() const { return 0; } - }; -}; - -template <> -struct iterator_access_archetype_impl -{ - template - struct archetype - : public virtual iterator_access_archetype< - Value, iterator_archetypes::readable_lvalue_iterator_t - > - { -# if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) - BOOST_STATIC_ASSERT((!is_const::value)); -# endif - }; -}; - - -template -struct iterator_archetype; - -template -struct traversal_archetype_base - : detail::operator_brackets< - typename remove_cv::type - , AccessCategory - , TraversalCategory - > - , detail::traversal_archetype_< - iterator_archetype - , Value - , TraversalCategory - > -{ -}; - -namespace detail -{ - template - struct iterator_archetype_base - : iterator_access_archetype - , traversal_archetype_base - { - typedef iterator_access_archetype access; - - typedef typename detail::facade_iterator_category< - TraversalCategory - , typename mpl::eval_if< - iterator_archetypes::has_access< - AccessCategory, iterator_archetypes::writable_iterator_t - > - , remove_const - , add_const - >::type - , typename access::reference - >::type iterator_category; - - // Needed for some broken libraries (see below) - typedef boost::iterator< - iterator_category - , Value - , typename traversal_archetype_base< - Value, AccessCategory, TraversalCategory - >::difference_type - , typename access::pointer - , typename access::reference - > workaround_iterator_base; - }; -} - -template -struct iterator_archetype - : public detail::iterator_archetype_base - - // These broken libraries require derivation from std::iterator - // (or related magic) in order to handle iter_swap and other - // iterator operations -# if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, < 310) \ - || BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(0x20101)) - , public detail::iterator_archetype_base< - Value, AccessCategory, TraversalCategory - >::workaround_iterator_base -# endif -{ - // Derivation from std::iterator above caused references to nested - // types to be ambiguous, so now we have to redeclare them all - // here. -# if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, < 310) \ - || BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(0x20101)) - - typedef detail::iterator_archetype_base< - Value,AccessCategory,TraversalCategory - > base; - - typedef typename base::value_type value_type; - typedef typename base::reference reference; - typedef typename base::pointer pointer; - typedef typename base::difference_type difference_type; - typedef typename base::iterator_category iterator_category; -# endif - - iterator_archetype() { } - iterator_archetype(iterator_archetype const& x) - : detail::iterator_archetype_base< - Value - , AccessCategory - , TraversalCategory - >(x) - {} - - iterator_archetype& operator=(iterator_archetype const&) - { return *this; } - -# if 0 - // Optional conversion from mutable - iterator_archetype( - iterator_archetype< - typename detail::convertible_type::type - , AccessCategory - , TraversalCategory> const& - ); -# endif -}; - -} // namespace boost - - -#endif // BOOST_ITERATOR_ARCHETYPES_HPP diff --git a/include/boost/iterator/iterator_categories.hpp b/include/boost/iterator/iterator_categories.hpp deleted file mode 100644 index 564ae50..0000000 --- a/include/boost/iterator/iterator_categories.hpp +++ /dev/null @@ -1,188 +0,0 @@ -// (C) Copyright Jeremy Siek 2002. -// 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) - -#ifndef BOOST_ITERATOR_CATEGORIES_HPP -# define BOOST_ITERATOR_CATEGORIES_HPP - -# include -# include -# include - -# include - -# include -# include -# include -# include - -# include - -# include - -namespace boost { - -// -// Traversal Categories -// - -struct no_traversal_tag {}; - -struct incrementable_traversal_tag - : no_traversal_tag -{ -// incrementable_traversal_tag() {} -// incrementable_traversal_tag(std::output_iterator_tag const&) {}; -}; - -struct single_pass_traversal_tag - : incrementable_traversal_tag -{ -// single_pass_traversal_tag() {} -// single_pass_traversal_tag(std::input_iterator_tag const&) {}; -}; - -struct forward_traversal_tag - : single_pass_traversal_tag -{ -// forward_traversal_tag() {} -// forward_traversal_tag(std::forward_iterator_tag const&) {}; -}; - -struct bidirectional_traversal_tag - : forward_traversal_tag -{ -// bidirectional_traversal_tag() {}; -// bidirectional_traversal_tag(std::bidirectional_iterator_tag const&) {}; -}; - -struct random_access_traversal_tag - : bidirectional_traversal_tag -{ -// random_access_traversal_tag() {}; -// random_access_traversal_tag(std::random_access_iterator_tag const&) {}; -}; - -namespace detail -{ - // - // Convert a "strictly old-style" iterator category to a traversal - // tag. This is broken out into a separate metafunction to reduce - // the cost of instantiating iterator_category_to_traversal, below, - // for new-style types. - // - template - struct old_category_to_traversal - : mpl::eval_if< - is_convertible - , mpl::identity - , mpl::eval_if< - is_convertible - , mpl::identity - , mpl::eval_if< - is_convertible - , mpl::identity - , mpl::eval_if< - is_convertible - , mpl::identity - , mpl::eval_if< - is_convertible - , mpl::identity - , void - > - > - > - > - > - {}; - -# if BOOST_WORKAROUND(BOOST_MSVC, < 1300) - template <> - struct old_category_to_traversal - { - typedef int type; - }; -# endif - - template - struct pure_traversal_tag - : mpl::eval_if< - is_convertible - , mpl::identity - , mpl::eval_if< - is_convertible - , mpl::identity - , mpl::eval_if< - is_convertible - , mpl::identity - , mpl::eval_if< - is_convertible - , mpl::identity - , mpl::eval_if< - is_convertible - , mpl::identity - , void - > - > - > - > - > - { - }; - -# if BOOST_WORKAROUND(BOOST_MSVC, < 1300) - template <> - struct pure_traversal_tag - { - typedef int type; - }; -# endif - -} // namespace detail - - -// -// Convert an iterator category into a traversal tag -// -template -struct iterator_category_to_traversal - : mpl::eval_if< // if already convertible to a traversal tag, we're done. - is_convertible - , mpl::identity - , detail::old_category_to_traversal - > -{}; - -// Trait to get an iterator's traversal category -template -struct iterator_traversal - : iterator_category_to_traversal< - typename boost::detail::iterator_traits::iterator_category - > -{}; - -# ifdef BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT -// Hack because BOOST_MPL_AUX_LAMBDA_SUPPORT doesn't seem to work -// out well. Instantiating the nested apply template also -// requires instantiating iterator_traits on the -// placeholder. Instead we just specialize it as a metafunction -// class. -template <> -struct iterator_traversal -{ - template - struct apply : iterator_traversal - {}; -}; -template <> -struct iterator_traversal - : iterator_traversal -{}; -# endif - -} // namespace boost - -#include - -#endif // BOOST_ITERATOR_CATEGORIES_HPP diff --git a/include/boost/iterator/iterator_concepts.hpp b/include/boost/iterator/iterator_concepts.hpp deleted file mode 100644 index 71b08e2..0000000 --- a/include/boost/iterator/iterator_concepts.hpp +++ /dev/null @@ -1,297 +0,0 @@ -// (C) Copyright Jeremy Siek 2002. -// 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) - -#ifndef BOOST_ITERATOR_CONCEPTS_HPP -#define BOOST_ITERATOR_CONCEPTS_HPP - -// Revision History -// 26 Apr 2003 thw -// Adapted to new iterator concepts -// 22 Nov 2002 Thomas Witt -// Added interoperable concept. - -#include -#include - -// Use boost::detail::iterator_traits to work around some MSVC/Dinkumware problems. -#include - -#include -#include - -#include -#include -#include -#include - -#include - -// Use boost/limits to work around missing limits headers on some compilers -#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 - - BOOST_concept(ReadableIterator,(Iterator)) - : boost::Assignable - , boost::CopyConstructible - - { - typedef BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::value_type value_type; - typedef BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::reference reference; - - ~ReadableIterator() - { - - value_type v = *i; - boost::ignore_unused_variable_warning(v); - } - private: - Iterator i; - }; - - template < - typename Iterator - , typename ValueType = BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::value_type - > - struct WritableIterator - : boost::CopyConstructible - { - ~WritableIterator() - { - *i = v; - } - private: - ValueType v; - Iterator i; - }; - - template < - typename Iterator - , typename ValueType = BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::value_type - > - struct WritableIteratorConcept : WritableIterator {}; - - BOOST_concept(SwappableIterator,(Iterator)) - { - ~SwappableIterator() - { - std::iter_swap(i1, i2); - } - private: - Iterator i1; - Iterator i2; - }; - - BOOST_concept(LvalueIterator,(Iterator)) - { - typedef typename boost::detail::iterator_traits::value_type value_type; - - ~LvalueIterator() - { - value_type& r = const_cast(*i); - boost::ignore_unused_variable_warning(r); - } - private: - Iterator i; - }; - - - //=========================================================================== - // Iterator Traversal Concepts - - BOOST_concept(IncrementableIterator,(Iterator)) - : boost::Assignable - , boost::CopyConstructible - { - typedef typename boost::iterator_traversal::type traversal_category; - - ~IncrementableIterator() - { - BOOST_CONCEPT_ASSERT(( - boost::Convertible< - traversal_category - , boost::incrementable_traversal_tag - >)); - - ++i; - (void)i++; - } - private: - Iterator i; - }; - - BOOST_concept(SinglePassIterator,(Iterator)) - : IncrementableIterator - , boost::EqualityComparable - - { - ~SinglePassIterator() - { - BOOST_CONCEPT_ASSERT(( - boost::Convertible< - BOOST_DEDUCED_TYPENAME SinglePassIterator::traversal_category - , boost::single_pass_traversal_tag - > )); - } - }; - - BOOST_concept(ForwardTraversal,(Iterator)) - : SinglePassIterator - , boost::DefaultConstructible - { - typedef typename boost::detail::iterator_traits::difference_type difference_type; - - ~ForwardTraversal() - { - BOOST_MPL_ASSERT((boost::is_integral)); - BOOST_MPL_ASSERT_RELATION(std::numeric_limits::is_signed, ==, true); - - BOOST_CONCEPT_ASSERT(( - boost::Convertible< - BOOST_DEDUCED_TYPENAME ForwardTraversal::traversal_category - , boost::forward_traversal_tag - > )); - } - }; - - BOOST_concept(BidirectionalTraversal,(Iterator)) - : ForwardTraversal - { - ~BidirectionalTraversal() - { - BOOST_CONCEPT_ASSERT(( - boost::Convertible< - BOOST_DEDUCED_TYPENAME BidirectionalTraversal::traversal_category - , boost::bidirectional_traversal_tag - > )); - - --i; - (void)i--; - } - private: - Iterator i; - }; - - BOOST_concept(RandomAccessTraversal,(Iterator)) - : BidirectionalTraversal - { - public: - ~RandomAccessTraversal() - { - BOOST_CONCEPT_ASSERT(( - boost::Convertible< - BOOST_DEDUCED_TYPENAME RandomAccessTraversal::traversal_category - , boost::random_access_traversal_tag - > )); - - i += n; - i = i + n; - i = n + i; - i -= n; - i = i - n; - n = i - j; - } - - private: - typename BidirectionalTraversal::difference_type n; - Iterator i, j; - }; - - //=========================================================================== - // Iterator Interoperability - - namespace detail - { - template - void interop_single_pass_constraints(Iterator1 const& i1, Iterator2 const& i2) - { - bool b; - b = i1 == i2; - b = i1 != i2; - - b = i2 == i1; - b = i2 != i1; - boost::ignore_unused_variable_warning(b); - } - - template - void interop_rand_access_constraints( - Iterator1 const& i1, Iterator2 const& i2, - boost::random_access_traversal_tag, boost::random_access_traversal_tag) - { - bool b; - typename boost::detail::iterator_traits::difference_type n; - b = i1 < i2; - b = i1 <= i2; - b = i1 > i2; - b = i1 >= i2; - n = i1 - i2; - - b = i2 < i1; - b = i2 <= i1; - b = i2 > i1; - b = i2 >= i1; - n = i2 - i1; - boost::ignore_unused_variable_warning(b); - boost::ignore_unused_variable_warning(n); - } - - template - void interop_rand_access_constraints( - Iterator1 const&, Iterator2 const&, - boost::single_pass_traversal_tag, boost::single_pass_traversal_tag) - { } - - } // namespace detail - - BOOST_concept(InteroperableIterator,(Iterator)(ConstIterator)) - { - private: - typedef typename boost::detail::pure_traversal_tag< - typename boost::iterator_traversal< - Iterator - >::type - >::type traversal_category; - - typedef typename boost::detail::pure_traversal_tag< - typename boost::iterator_traversal< - ConstIterator - >::type - >::type const_traversal_category; - - public: - ~InteroperableIterator() - { - BOOST_CONCEPT_ASSERT((SinglePassIterator)); - BOOST_CONCEPT_ASSERT((SinglePassIterator)); - - detail::interop_single_pass_constraints(i, ci); - detail::interop_rand_access_constraints(i, ci, traversal_category(), const_traversal_category()); - - ci = i; - } - - private: - Iterator i; - ConstIterator ci; - }; - -} // namespace boost_concepts - -#include - -#endif // BOOST_ITERATOR_CONCEPTS_HPP diff --git a/include/boost/iterator/iterator_facade.hpp b/include/boost/iterator/iterator_facade.hpp deleted file mode 100644 index 462bd8b..0000000 --- a/include/boost/iterator/iterator_facade.hpp +++ /dev/null @@ -1,879 +0,0 @@ -// (C) Copyright David Abrahams 2002. -// (C) Copyright Jeremy Siek 2002. -// (C) Copyright Thomas Witt 2002. -// 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) -#ifndef BOOST_ITERATOR_FACADE_23022003THW_HPP -#define BOOST_ITERATOR_FACADE_23022003THW_HPP - -#include -#include -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include // this goes last - -namespace boost -{ - // This forward declaration is required for the friend declaration - // in iterator_core_access - template class iterator_facade; - - namespace detail - { - // A binary metafunction class that always returns bool. VC6 - // ICEs on mpl::always, probably because of the default - // parameters. - struct always_bool2 - { - template - struct apply - { - typedef bool type; - }; - }; - - // - // enable if for use in operator implementation. - // - template < - class Facade1 - , class Facade2 - , class Return - > - struct enable_if_interoperable -#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) - { - typedef typename mpl::if_< - mpl::or_< - is_convertible - , is_convertible - > - , Return - , int[3] - >::type type; - }; -#else - : ::boost::iterators::enable_if< - mpl::or_< - is_convertible - , is_convertible - > - , Return - > - {}; -#endif - - // - // Generates associated types for an iterator_facade with the - // given parameters. - // - template < - class ValueParam - , class CategoryOrTraversal - , class Reference - , class Difference - > - struct iterator_facade_types - { - typedef typename facade_iterator_category< - CategoryOrTraversal, ValueParam, Reference - >::type iterator_category; - - typedef typename remove_const::type value_type; - - typedef typename mpl::eval_if< - detail::iterator_writability_disabled - , add_pointer - , add_pointer - >::type pointer; - -# if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ - && (BOOST_WORKAROUND(_STLPORT_VERSION, BOOST_TESTED_AT(0x452)) \ - || BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, BOOST_TESTED_AT(310))) \ - || BOOST_WORKAROUND(BOOST_RWSTD_VER, BOOST_TESTED_AT(0x20101)) \ - || BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, <= 310) - - // To interoperate with some broken library/compiler - // combinations, user-defined iterators must be derived from - // std::iterator. It is possible to implement a standard - // library for broken compilers without this limitation. -# define BOOST_ITERATOR_FACADE_NEEDS_ITERATOR_BASE 1 - - typedef - iterator - base; -# endif - }; - - // iterators whose dereference operators reference the same value - // for all iterators into the same sequence (like many input - // iterators) need help with their postfix ++: the referenced - // value must be read and stored away before the increment occurs - // so that *a++ yields the originally referenced element and not - // the next one. - template - class postfix_increment_proxy - { - typedef typename iterator_value::type value_type; - public: - explicit postfix_increment_proxy(Iterator const& x) - : stored_value(*x) - {} - - // Returning a mutable reference allows nonsense like - // (*r++).mutate(), but it imposes fewer assumptions about the - // behavior of the value_type. In particular, recall taht - // (*r).mutate() is legal if operator* returns by value. - value_type& - operator*() const - { - return this->stored_value; - } - private: - mutable value_type stored_value; - }; - - // - // In general, we can't determine that such an iterator isn't - // writable -- we also need to store a copy of the old iterator so - // that it can be written into. - template - class writable_postfix_increment_proxy - { - typedef typename iterator_value::type value_type; - public: - explicit writable_postfix_increment_proxy(Iterator const& x) - : stored_value(*x) - , stored_iterator(x) - {} - - // Dereferencing must return a proxy so that both *r++ = o and - // value_type(*r++) can work. In this case, *r is the same as - // *r++, and the conversion operator below is used to ensure - // readability. - writable_postfix_increment_proxy const& - operator*() const - { - return *this; - } - - // Provides readability of *r++ - operator value_type&() const - { - return stored_value; - } - - // Provides writability of *r++ - template - T const& operator=(T const& x) const - { - *this->stored_iterator = x; - return x; - } - - // This overload just in case only non-const objects are writable - template - T& operator=(T& x) const - { - *this->stored_iterator = x; - return x; - } - - // Provides X(r++) - operator Iterator const&() const - { - return stored_iterator; - } - - private: - mutable value_type stored_value; - Iterator stored_iterator; - }; - -# ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - - template - struct is_non_proxy_reference_impl - { - static Reference r; - - template - static typename mpl::if_< - is_convertible< - R const volatile* - , Value const volatile* - > - , char[1] - , char[2] - >::type& helper(R const&); - - BOOST_STATIC_CONSTANT(bool, value = sizeof(helper(r)) == 1); - }; - - template - struct is_non_proxy_reference - : mpl::bool_< - is_non_proxy_reference_impl::value - > - {}; -# else - template - struct is_non_proxy_reference - : is_convertible< - typename remove_reference::type - const volatile* - , Value const volatile* - > - {}; -# endif - - // A metafunction to choose the result type of postfix ++ - // - // Because the C++98 input iterator requirements say that *r++ has - // type T (value_type), implementations of some standard - // algorithms like lexicographical_compare may use constructions - // like: - // - // *r++ < *s++ - // - // If *r++ returns a proxy (as required if r is writable but not - // multipass), this sort of expression will fail unless the proxy - // supports the operator<. Since there are any number of such - // operations, we're not going to try to support them. Therefore, - // even if r++ returns a proxy, *r++ will only return a proxy if - // *r also returns a proxy. - template - struct postfix_increment_result - : mpl::eval_if< - mpl::and_< - // A proxy is only needed for readable iterators - is_convertible - - // No multipass iterator can have values that disappear - // before positions can be re-visited - , mpl::not_< - is_convertible< - typename iterator_category_to_traversal::type - , forward_traversal_tag - > - > - > - , mpl::if_< - is_non_proxy_reference - , postfix_increment_proxy - , writable_postfix_increment_proxy - > - , mpl::identity - > - {}; - - // operator->() needs special support for input iterators to strictly meet the - // standard's requirements. If *i is not a reference type, we must still - // produce a (constant) lvalue to which a pointer can be formed. We do that by - // returning an instantiation of this special proxy class template. - template - struct operator_arrow_proxy - { - operator_arrow_proxy(T const* px) : m_value(*px) {} - const T* operator->() const { return &m_value; } - // This function is needed for MWCW and BCC, which won't call operator-> - // again automatically per 13.3.1.2 para 8 - operator const T*() const { return &m_value; } - T m_value; - }; - - // A metafunction that gets the result type for operator->. Also - // has a static function make() which builds the result from a - // Reference - template - struct operator_arrow_result - { - // CWPro8.3 won't accept "operator_arrow_result::type", and we - // need that type below, so metafunction forwarding would be a - // losing proposition here. - typedef typename mpl::if_< - is_reference - , Pointer - , operator_arrow_proxy - >::type type; - - static type make(Reference x) - { - return implicit_cast(&x); - } - }; - -# if BOOST_WORKAROUND(BOOST_MSVC, < 1300) - // Deal with ETI - template<> - struct operator_arrow_result - { - typedef int type; - }; -# endif - - // A proxy return type for operator[], needed to deal with - // iterators that may invalidate referents upon destruction. - // Consider the temporary iterator in *(a + n) - template - class operator_brackets_proxy - { - // Iterator is actually an iterator_facade, so we do not have to - // go through iterator_traits to access the traits. - typedef typename Iterator::reference reference; - typedef typename Iterator::value_type value_type; - - public: - operator_brackets_proxy(Iterator const& iter) - : m_iter(iter) - {} - - operator reference() const - { - return *m_iter; - } - - operator_brackets_proxy& operator=(value_type const& val) - { - *m_iter = val; - return *this; - } - - private: - Iterator m_iter; - }; - - // A metafunction that determines whether operator[] must return a - // proxy, or whether it can simply return a copy of the value_type. - template - struct use_operator_brackets_proxy - : mpl::not_< - mpl::and_< - // Really we want an is_copy_constructible trait here, - // but is_POD will have to suffice in the meantime. - boost::is_POD - , iterator_writability_disabled - > - > - {}; - - template - struct operator_brackets_result - { - typedef typename mpl::if_< - use_operator_brackets_proxy - , operator_brackets_proxy - , Value - >::type type; - }; - - template - operator_brackets_proxy make_operator_brackets_result(Iterator const& iter, mpl::true_) - { - return operator_brackets_proxy(iter); - } - - template - typename Iterator::value_type make_operator_brackets_result(Iterator const& iter, mpl::false_) - { - return *iter; - } - - struct choose_difference_type - { - template - struct apply - : -# ifdef BOOST_NO_ONE_WAY_ITERATOR_INTEROP - iterator_difference -# elif BOOST_WORKAROUND(BOOST_MSVC, < 1300) - mpl::if_< - is_convertible - , typename I1::difference_type - , typename I2::difference_type - > -# else - mpl::eval_if< - is_convertible - , iterator_difference - , iterator_difference - > -# endif - {}; - - }; - } // namespace detail - - - // Macros which describe the declarations of binary operators -# ifdef BOOST_NO_STRICT_ITERATOR_INTEROPERABILITY -# define BOOST_ITERATOR_FACADE_INTEROP_HEAD(prefix, op, result_type) \ - template < \ - class Derived1, class V1, class TC1, class R1, class D1 \ - , class Derived2, class V2, class TC2, class R2, class D2 \ - > \ - prefix typename mpl::apply2::type \ - operator op( \ - iterator_facade const& lhs \ - , iterator_facade const& rhs) -# else -# define BOOST_ITERATOR_FACADE_INTEROP_HEAD(prefix, op, result_type) \ - template < \ - class Derived1, class V1, class TC1, class R1, class D1 \ - , class Derived2, class V2, class TC2, class R2, class D2 \ - > \ - prefix typename detail::enable_if_interoperable< \ - Derived1, Derived2 \ - , typename mpl::apply2::type \ - >::type \ - operator op( \ - iterator_facade const& lhs \ - , iterator_facade const& rhs) -# endif - -# define BOOST_ITERATOR_FACADE_PLUS_HEAD(prefix,args) \ - template \ - prefix Derived operator+ args - - // - // Helper class for granting access to the iterator core interface. - // - // The simple core interface is used by iterator_facade. The core - // interface of a user/library defined iterator type should not be made public - // so that it does not clutter the public interface. Instead iterator_core_access - // should be made friend so that iterator_facade can access the core - // interface through iterator_core_access. - // - class iterator_core_access - { -# if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) \ - || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) - // Tasteless as this may seem, making all members public allows member templates - // to work in the absence of member template friends. - public: -# else - - template friend class iterator_facade; - -# define BOOST_ITERATOR_FACADE_RELATION(op) \ - BOOST_ITERATOR_FACADE_INTEROP_HEAD(friend,op, detail::always_bool2); - - BOOST_ITERATOR_FACADE_RELATION(==) - BOOST_ITERATOR_FACADE_RELATION(!=) - - BOOST_ITERATOR_FACADE_RELATION(<) - BOOST_ITERATOR_FACADE_RELATION(>) - BOOST_ITERATOR_FACADE_RELATION(<=) - BOOST_ITERATOR_FACADE_RELATION(>=) -# undef BOOST_ITERATOR_FACADE_RELATION - - BOOST_ITERATOR_FACADE_INTEROP_HEAD( - friend, -, detail::choose_difference_type) - ; - - BOOST_ITERATOR_FACADE_PLUS_HEAD( - friend inline - , (iterator_facade const& - , typename Derived::difference_type) - ) - ; - - BOOST_ITERATOR_FACADE_PLUS_HEAD( - friend inline - , (typename Derived::difference_type - , iterator_facade const&) - ) - ; - -# endif - - template - static typename Facade::reference dereference(Facade const& f) - { - return f.dereference(); - } - - template - static void increment(Facade& f) - { - f.increment(); - } - - template - static void decrement(Facade& f) - { - f.decrement(); - } - - template - static bool equal(Facade1 const& f1, Facade2 const& f2, mpl::true_) - { - return f1.equal(f2); - } - - template - static bool equal(Facade1 const& f1, Facade2 const& f2, mpl::false_) - { - return f2.equal(f1); - } - - template - static void advance(Facade& f, typename Facade::difference_type n) - { - f.advance(n); - } - - template - static typename Facade1::difference_type distance_from( - Facade1 const& f1, Facade2 const& f2, mpl::true_) - { - return -f1.distance_to(f2); - } - - template - static typename Facade2::difference_type distance_from( - Facade1 const& f1, Facade2 const& f2, mpl::false_) - { - return f2.distance_to(f1); - } - - // - // Curiously Recurring Template interface. - // - template - static I& derived(iterator_facade& facade) - { - return *static_cast(&facade); - } - - template - static I const& derived(iterator_facade const& facade) - { - return *static_cast(&facade); - } - - private: - // objects of this class are useless - iterator_core_access(); //undefined - }; - - // - // iterator_facade - use as a public base class for defining new - // standard-conforming iterators. - // - template < - class Derived // The derived iterator type being constructed - , class Value - , class CategoryOrTraversal - , class Reference = Value& - , class Difference = std::ptrdiff_t - > - class iterator_facade -# ifdef BOOST_ITERATOR_FACADE_NEEDS_ITERATOR_BASE - : public detail::iterator_facade_types< - Value, CategoryOrTraversal, Reference, Difference - >::base -# undef BOOST_ITERATOR_FACADE_NEEDS_ITERATOR_BASE -# endif - { - private: - // - // Curiously Recurring Template interface. - // - Derived& derived() - { - return *static_cast(this); - } - - Derived const& derived() const - { - return *static_cast(this); - } - - typedef detail::iterator_facade_types< - Value, CategoryOrTraversal, Reference, Difference - > associated_types; - - protected: - // For use by derived classes - typedef iterator_facade iterator_facade_; - - public: - - typedef typename associated_types::value_type value_type; - typedef Reference reference; - typedef Difference difference_type; - typedef typename associated_types::pointer pointer; - typedef typename associated_types::iterator_category iterator_category; - - reference operator*() const - { - return iterator_core_access::dereference(this->derived()); - } - - typename detail::operator_arrow_result< - value_type - , reference - , pointer - >::type - operator->() const - { - return detail::operator_arrow_result< - value_type - , reference - , pointer - >::make(*this->derived()); - } - - typename detail::operator_brackets_result::type - operator[](difference_type n) const - { - typedef detail::use_operator_brackets_proxy use_proxy; - - return detail::make_operator_brackets_result( - this->derived() + n - , use_proxy() - ); - } - - Derived& operator++() - { - iterator_core_access::increment(this->derived()); - return this->derived(); - } - -# if BOOST_WORKAROUND(BOOST_MSVC, < 1300) - typename detail::postfix_increment_result::type - operator++(int) - { - typename detail::postfix_increment_result::type - tmp(this->derived()); - ++*this; - return tmp; - } -# endif - - Derived& operator--() - { - iterator_core_access::decrement(this->derived()); - return this->derived(); - } - - Derived operator--(int) - { - Derived tmp(this->derived()); - --*this; - return tmp; - } - - Derived& operator+=(difference_type n) - { - iterator_core_access::advance(this->derived(), n); - return this->derived(); - } - - Derived& operator-=(difference_type n) - { - iterator_core_access::advance(this->derived(), -n); - return this->derived(); - } - - Derived operator-(difference_type x) const - { - Derived result(this->derived()); - return result -= x; - } - -# if BOOST_WORKAROUND(BOOST_MSVC, < 1300) - // There appears to be a bug which trashes the data of classes - // derived from iterator_facade when they are assigned unless we - // define this assignment operator. This bug is only revealed - // (so far) in STLPort debug mode, but it's clearly a codegen - // problem so we apply the workaround for all MSVC6. - iterator_facade& operator=(iterator_facade const&) - { - return *this; - } -# endif - }; - -# if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) - template - inline typename detail::postfix_increment_result::type - operator++( - iterator_facade& i - , int - ) - { - typename detail::postfix_increment_result::type - tmp(*static_cast(&i)); - - ++i; - - return tmp; - } -# endif - - - // - // Comparison operator implementation. The library supplied operators - // enables the user to provide fully interoperable constant/mutable - // iterator types. I.e. the library provides all operators - // for all mutable/constant iterator combinations. - // - // Note though that this kind of interoperability for constant/mutable - // iterators is not required by the standard for container iterators. - // All the standard asks for is a conversion mutable -> constant. - // Most standard library implementations nowadays provide fully interoperable - // iterator implementations, but there are still heavily used implementations - // that do not provide them. (Actually it's even worse, they do not provide - // them for only a few iterators.) - // - // ?? Maybe a BOOST_ITERATOR_NO_FULL_INTEROPERABILITY macro should - // enable the user to turn off mixed type operators - // - // The library takes care to provide only the right operator overloads. - // I.e. - // - // bool operator==(Iterator, Iterator); - // bool operator==(ConstIterator, Iterator); - // bool operator==(Iterator, ConstIterator); - // bool operator==(ConstIterator, ConstIterator); - // - // ... - // - // In order to do so it uses c++ idioms that are not yet widely supported - // by current compiler releases. The library is designed to degrade gracefully - // in the face of compiler deficiencies. In general compiler - // deficiencies result in less strict error checking and more obscure - // error messages, functionality is not affected. - // - // For full operation compiler support for "Substitution Failure Is Not An Error" - // (aka. enable_if) and boost::is_convertible is required. - // - // The following problems occur if support is lacking. - // - // Pseudo code - // - // --------------- - // AdaptorA a1; - // AdaptorA a2; - // - // // This will result in a no such overload error in full operation - // // If enable_if or is_convertible is not supported - // // The instantiation will fail with an error hopefully indicating that - // // there is no operator== for Iterator1, Iterator2 - // // The same will happen if no enable_if is used to remove - // // false overloads from the templated conversion constructor - // // of AdaptorA. - // - // a1 == a2; - // ---------------- - // - // AdaptorA a; - // AdaptorB b; - // - // // This will result in a no such overload error in full operation - // // If enable_if is not supported the static assert used - // // in the operator implementation will fail. - // // This will accidently work if is_convertible is not supported. - // - // a == b; - // ---------------- - // - -# ifdef BOOST_NO_ONE_WAY_ITERATOR_INTEROP -# define BOOST_ITERATOR_CONVERTIBLE(a,b) mpl::true_() -# else -# define BOOST_ITERATOR_CONVERTIBLE(a,b) is_convertible() -# endif - -# define BOOST_ITERATOR_FACADE_INTEROP(op, result_type, return_prefix, base_op) \ - BOOST_ITERATOR_FACADE_INTEROP_HEAD(inline, op, result_type) \ - { \ - /* For those compilers that do not support enable_if */ \ - BOOST_STATIC_ASSERT(( \ - is_interoperable< Derived1, Derived2 >::value \ - )); \ - return_prefix iterator_core_access::base_op( \ - *static_cast(&lhs) \ - , *static_cast(&rhs) \ - , BOOST_ITERATOR_CONVERTIBLE(Derived2,Derived1) \ - ); \ - } - -# define BOOST_ITERATOR_FACADE_RELATION(op, return_prefix, base_op) \ - BOOST_ITERATOR_FACADE_INTEROP( \ - op \ - , detail::always_bool2 \ - , return_prefix \ - , base_op \ - ) - - BOOST_ITERATOR_FACADE_RELATION(==, return, equal) - BOOST_ITERATOR_FACADE_RELATION(!=, return !, equal) - - BOOST_ITERATOR_FACADE_RELATION(<, return 0 >, distance_from) - BOOST_ITERATOR_FACADE_RELATION(>, return 0 <, distance_from) - BOOST_ITERATOR_FACADE_RELATION(<=, return 0 >=, distance_from) - BOOST_ITERATOR_FACADE_RELATION(>=, return 0 <=, distance_from) -# undef BOOST_ITERATOR_FACADE_RELATION - - // operator- requires an additional part in the static assertion - BOOST_ITERATOR_FACADE_INTEROP( - - - , detail::choose_difference_type - , return - , distance_from - ) -# undef BOOST_ITERATOR_FACADE_INTEROP -# undef BOOST_ITERATOR_FACADE_INTEROP_HEAD - -# define BOOST_ITERATOR_FACADE_PLUS(args) \ - BOOST_ITERATOR_FACADE_PLUS_HEAD(inline, args) \ - { \ - Derived tmp(static_cast(i)); \ - return tmp += n; \ - } - -BOOST_ITERATOR_FACADE_PLUS(( - iterator_facade const& i - , typename Derived::difference_type n -)) - -BOOST_ITERATOR_FACADE_PLUS(( - typename Derived::difference_type n - , iterator_facade const& i -)) -# undef BOOST_ITERATOR_FACADE_PLUS -# undef BOOST_ITERATOR_FACADE_PLUS_HEAD - -} // namespace boost - -#include - -#endif // BOOST_ITERATOR_FACADE_23022003THW_HPP diff --git a/include/boost/iterator/iterator_traits.hpp b/include/boost/iterator/iterator_traits.hpp deleted file mode 100644 index 1352710..0000000 --- a/include/boost/iterator/iterator_traits.hpp +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright David Abrahams 2003. -// 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) -#ifndef ITERATOR_TRAITS_DWA200347_HPP -# define ITERATOR_TRAITS_DWA200347_HPP - -# include -# include - -namespace boost { - -// Unfortunately, g++ 2.95.x chokes when we define a class template -// iterator_category which has the same name as its -// std::iterator_category() function, probably due in part to the -// "std:: is visible globally" hack it uses. Use -// BOOST_ITERATOR_CATEGORY to write code that's portable to older -// GCCs. - -# if BOOST_WORKAROUND(__GNUC__, <= 2) -# define BOOST_ITERATOR_CATEGORY iterator_category_ -# else -# define BOOST_ITERATOR_CATEGORY iterator_category -# endif - - -template -struct iterator_value -{ - typedef typename detail::iterator_traits::value_type type; -}; - -template -struct iterator_reference -{ - typedef typename detail::iterator_traits::reference type; -}; - - -template -struct iterator_pointer -{ - typedef typename detail::iterator_traits::pointer type; -}; - -template -struct iterator_difference -{ - typedef typename detail::iterator_traits::difference_type type; -}; - -template -struct BOOST_ITERATOR_CATEGORY -{ - typedef typename detail::iterator_traits::iterator_category type; -}; - -# if BOOST_WORKAROUND(BOOST_MSVC, < 1300) -template <> -struct iterator_value -{ - typedef void type; -}; - -template <> -struct iterator_reference -{ - typedef void type; -}; - -template <> -struct iterator_pointer -{ - typedef void type; -}; - -template <> -struct iterator_difference -{ - typedef void type; -}; - -template <> -struct BOOST_ITERATOR_CATEGORY -{ - typedef void type; -}; -# endif - -} // namespace boost::iterator - -#endif // ITERATOR_TRAITS_DWA200347_HPP diff --git a/include/boost/iterator/new_iterator_tests.hpp b/include/boost/iterator/new_iterator_tests.hpp deleted file mode 100644 index 8bb47b0..0000000 --- a/include/boost/iterator/new_iterator_tests.hpp +++ /dev/null @@ -1,264 +0,0 @@ -#ifndef BOOST_NEW_ITERATOR_TESTS_HPP -# define BOOST_NEW_ITERATOR_TESTS_HPP - -// -// Copyright (c) David Abrahams 2001. -// Copyright (c) Jeremy Siek 2001-2003. -// Copyright (c) Thomas Witt 2002. -// -// 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 is meant to be the beginnings of a comprehensive, generic -// test suite for STL concepts such as iterators and containers. -// -// Revision History: -// 28 Oct 2002 Started update for new iterator categories -// (Jeremy Siek) -// 28 Apr 2002 Fixed input iterator requirements. -// For a == b a++ == b++ is no longer required. -// See 24.1.1/3 for details. -// (Thomas Witt) -// 08 Feb 2001 Fixed bidirectional iterator test so that -// --i is no longer a precondition. -// (Jeremy Siek) -// 04 Feb 2001 Added lvalue test, corrected preconditions -// (David Abrahams) - -# include -# include -# include -# include -# include // for detail::dummy_constructor -# include -# include -# include -# include - -# include -# include - -namespace boost { - - -// Do separate tests for *i++ so we can treat, e.g., smart pointers, -// as readable and/or writable iterators. -template -void readable_iterator_traversal_test(Iterator i1, T v, mpl::true_) -{ - T v2(*i1++); - assert(v == v2); -} - -template -void readable_iterator_traversal_test(const Iterator i1, T v, mpl::false_) -{} - -template -void writable_iterator_traversal_test(Iterator i1, T v, mpl::true_) -{ - ++i1; // we just wrote into that position - *i1++ = v; - Iterator x(i1++); - (void)x; -} - -template -void writable_iterator_traversal_test(const Iterator i1, T v, mpl::false_) -{} - - -// Preconditions: *i == v -template -void readable_iterator_test(const Iterator i1, T v) -{ - Iterator i2(i1); // Copy Constructible - typedef typename detail::iterator_traits::reference ref_t; - ref_t r1 = *i1; - ref_t r2 = *i2; - T v1 = r1; - T v2 = r2; - assert(v1 == v); - assert(v2 == v); - -# if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407) - readable_iterator_traversal_test(i1, v, detail::is_postfix_incrementable()); - - // I think we don't really need this as it checks the same things as - // the above code. - BOOST_STATIC_ASSERT(is_readable_iterator::value); -# endif -} - -template -void writable_iterator_test(Iterator i, T v, T v2) -{ - Iterator i2(i); // Copy Constructible - *i2 = v; - -# if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407) - writable_iterator_traversal_test( - i, v2, mpl::and_< - detail::is_incrementable - , detail::is_postfix_incrementable - >()); -# endif -} - -template -void swappable_iterator_test(Iterator i, Iterator j) -{ - Iterator i2(i), j2(j); - typename detail::iterator_traits::value_type bi = *i, bj = *j; - iter_swap(i2, j2); - typename detail::iterator_traits::value_type ai = *i, aj = *j; - assert(bi == aj && bj == ai); -} - -template -void constant_lvalue_iterator_test(Iterator i, T v1) -{ - Iterator i2(i); - typedef typename detail::iterator_traits::value_type value_type; - typedef typename detail::iterator_traits::reference reference; - BOOST_STATIC_ASSERT((is_same::value)); - const T& v2 = *i2; - assert(v1 == v2); -# ifndef BOOST_NO_LVALUE_RETURN_DETECTION - BOOST_STATIC_ASSERT(is_lvalue_iterator::value); - BOOST_STATIC_ASSERT(!is_non_const_lvalue_iterator::value); -# endif -} - -template -void non_const_lvalue_iterator_test(Iterator i, T v1, T v2) -{ - Iterator i2(i); - typedef typename detail::iterator_traits::value_type value_type; - typedef typename detail::iterator_traits::reference reference; - BOOST_STATIC_ASSERT((is_same::value)); - T& v3 = *i2; - assert(v1 == v3); - - // A non-const lvalue iterator is not neccessarily writable, but we - // are assuming the value_type is assignable here - *i = v2; - - T& v4 = *i2; - assert(v2 == v4); -# ifndef BOOST_NO_LVALUE_RETURN_DETECTION - BOOST_STATIC_ASSERT(is_lvalue_iterator::value); - BOOST_STATIC_ASSERT(is_non_const_lvalue_iterator::value); -# endif -} - -template -void forward_readable_iterator_test(Iterator i, Iterator j, T val1, T val2) -{ - Iterator i2; - Iterator i3(i); - i2 = i; - assert(i2 == i3); - assert(i != j); - assert(i2 != j); - readable_iterator_test(i, val1); - readable_iterator_test(i2, val1); - readable_iterator_test(i3, val1); - - assert(i == i2++); - assert(i != ++i3); - - readable_iterator_test(i2, val2); - readable_iterator_test(i3, val2); - - readable_iterator_test(i, val1); -} - -template -void forward_swappable_iterator_test(Iterator i, Iterator j, T val1, T val2) -{ - forward_readable_iterator_test(i, j, val1, val2); - Iterator i2 = i; - ++i2; - swappable_iterator_test(i, i2); -} - -// bidirectional -// Preconditions: *i == v1, *++i == v2 -template -void bidirectional_readable_iterator_test(Iterator i, T v1, T v2) -{ - Iterator j(i); - ++j; - forward_readable_iterator_test(i, j, v1, v2); - ++i; - - Iterator i1 = i, i2 = i; - - assert(i == i1--); - assert(i != --i2); - - readable_iterator_test(i, v2); - readable_iterator_test(i1, v1); - readable_iterator_test(i2, v1); - - --i; - assert(i == i1); - assert(i == i2); - ++i1; - ++i2; - - readable_iterator_test(i, v1); - readable_iterator_test(i1, v2); - readable_iterator_test(i2, v2); -} - -// random access -// Preconditions: [i,i+N) is a valid range -template -void random_access_readable_iterator_test(Iterator i, int N, TrueVals vals) -{ - bidirectional_readable_iterator_test(i, vals[0], vals[1]); - const Iterator j = i; - int c; - - for (c = 0; c < N-1; ++c) - { - assert(i == j + c); - assert(*i == vals[c]); - typename detail::iterator_traits::value_type x = j[c]; - assert(*i == x); - assert(*i == *(j + c)); - assert(*i == *(c + j)); - ++i; - assert(i > j); - assert(i >= j); - assert(j <= i); - assert(j < i); - } - - Iterator k = j + N - 1; - for (c = 0; c < N-1; ++c) - { - assert(i == k - c); - assert(*i == vals[N - 1 - c]); - typename detail::iterator_traits::value_type x = j[N - 1 - c]; - assert(*i == x); - Iterator q = k - c; - assert(*i == *q); - assert(i > j); - assert(i >= j); - assert(j <= i); - assert(j < i); - --i; - } -} - -} // namespace boost - -# include - -#endif // BOOST_NEW_ITERATOR_TESTS_HPP diff --git a/include/boost/iterator/permutation_iterator.hpp b/include/boost/iterator/permutation_iterator.hpp deleted file mode 100644 index 1cd0118..0000000 --- a/include/boost/iterator/permutation_iterator.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// (C) Copyright Toon Knapen 2001. -// (C) Copyright David Abrahams 2003. -// (C) Copyright Roland Richter 2003. -// 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) - -#ifndef BOOST_PERMUTATION_ITERATOR_HPP -#define BOOST_PERMUTATION_ITERATOR_HPP - -#include - -#include - - -namespace boost -{ - -template< class ElementIterator - , class IndexIterator> -class permutation_iterator - : public iterator_adaptor< - permutation_iterator - , IndexIterator, typename detail::iterator_traits::value_type - , use_default, typename detail::iterator_traits::reference> -{ - typedef iterator_adaptor< - permutation_iterator - , IndexIterator, typename detail::iterator_traits::value_type - , use_default, typename detail::iterator_traits::reference> super_t; - - friend class iterator_core_access; - -public: - permutation_iterator() : m_elt_iter() {} - - explicit permutation_iterator(ElementIterator x, IndexIterator y) - : super_t(y), m_elt_iter(x) {} - - template - permutation_iterator( - permutation_iterator const& r - , typename enable_if_convertible::type* = 0 - , typename enable_if_convertible::type* = 0 - ) - : super_t(r.base()), m_elt_iter(r.m_elt_iter) - {} - -private: - typename super_t::reference dereference() const - { return *(m_elt_iter + *this->base()); } - - ElementIterator m_elt_iter; -}; - - -template -permutation_iterator -make_permutation_iterator( ElementIterator e, IndexIterator i ) -{ - return permutation_iterator( e, i ); -} - - -} // namespace boost - -#endif diff --git a/include/boost/iterator/reverse_iterator.hpp b/include/boost/iterator/reverse_iterator.hpp deleted file mode 100644 index 97b6b48..0000000 --- a/include/boost/iterator/reverse_iterator.hpp +++ /dev/null @@ -1,69 +0,0 @@ -// (C) Copyright David Abrahams 2002. -// (C) Copyright Jeremy Siek 2002. -// (C) Copyright Thomas Witt 2002. -// 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) -#ifndef BOOST_REVERSE_ITERATOR_23022003THW_HPP -#define BOOST_REVERSE_ITERATOR_23022003THW_HPP - -#include -#include -#include - -namespace boost -{ - - // - // - // - template - class reverse_iterator - : public iterator_adaptor< reverse_iterator, Iterator > - { - typedef iterator_adaptor< reverse_iterator, Iterator > super_t; - - friend class iterator_core_access; - - public: - reverse_iterator() {} - - explicit reverse_iterator(Iterator x) - : super_t(x) {} - - template - reverse_iterator( - reverse_iterator const& r - , typename enable_if_convertible::type* = 0 - ) - : super_t(r.base()) - {} - - private: - typename super_t::reference dereference() const { return *boost::prior(this->base()); } - - void increment() { --this->base_reference(); } - void decrement() { ++this->base_reference(); } - - void advance(typename super_t::difference_type n) - { - this->base_reference() += -n; - } - - template - typename super_t::difference_type - distance_to(reverse_iterator const& y) const - { - return this->base_reference() - y.base(); - } - }; - - template - reverse_iterator make_reverse_iterator(BidirectionalIterator x) - { - return reverse_iterator(x); - } - -} // namespace boost - -#endif // BOOST_REVERSE_ITERATOR_23022003THW_HPP diff --git a/include/boost/iterator/transform_iterator.hpp b/include/boost/iterator/transform_iterator.hpp deleted file mode 100644 index 3c0cc83..0000000 --- a/include/boost/iterator/transform_iterator.hpp +++ /dev/null @@ -1,188 +0,0 @@ -// (C) Copyright David Abrahams 2002. -// (C) Copyright Jeremy Siek 2002. -// (C) Copyright Thomas Witt 2002. -// 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) -#ifndef BOOST_TRANSFORM_ITERATOR_23022003THW_HPP -#define BOOST_TRANSFORM_ITERATOR_23022003THW_HPP - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310)) -# include - -#endif -#include - - -namespace boost -{ - template - class transform_iterator; - - namespace detail - { - - template - struct function_object_result - { - typedef typename UnaryFunc::result_type type; - }; - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - template - struct function_object_result - { - typedef Return type; - }; -#endif - - // Compute the iterator_adaptor instantiation to be used for transform_iterator - template - struct transform_iterator_base - { - private: - // By default, dereferencing the iterator yields the same as - // the function. Do we need to adjust the way - // function_object_result is computed for the standard - // proposal (e.g. using Doug's result_of)? - typedef typename ia_dflt_help< - Reference - , function_object_result - >::type reference; - - // To get the default for Value: remove any reference on the - // result type, but retain any constness to signal - // non-writability. Note that if we adopt Thomas' suggestion - // to key non-writability *only* on the Reference argument, - // we'd need to strip constness here as well. - typedef typename ia_dflt_help< - Value - , remove_reference - >::type cv_value_type; - - public: - typedef iterator_adaptor< - transform_iterator - , Iterator - , cv_value_type - , use_default // Leave the traversal category alone - , reference - > type; - }; - } - - template - class transform_iterator - : public detail::transform_iterator_base::type - { - typedef typename - detail::transform_iterator_base::type - super_t; - - friend class iterator_core_access; - - public: - transform_iterator() { } - - transform_iterator(Iterator const& x, UnaryFunc f) - : super_t(x), m_f(f) { } - - explicit transform_iterator(Iterator const& x) - : super_t(x) - { - // Pro8 is a little too aggressive about instantiating the - // body of this function. -#if !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) - // don't provide this constructor if UnaryFunc is a - // function pointer type, since it will be 0. Too dangerous. - BOOST_STATIC_ASSERT(is_class::value); -#endif - } - - template< - class OtherUnaryFunction - , class OtherIterator - , class OtherReference - , class OtherValue> - transform_iterator( - transform_iterator const& t - , typename enable_if_convertible::type* = 0 -#if !BOOST_WORKAROUND(BOOST_MSVC, == 1310) - , typename enable_if_convertible::type* = 0 -#endif - ) - : super_t(t.base()), m_f(t.functor()) - {} - - UnaryFunc functor() const - { return m_f; } - - private: - typename super_t::reference dereference() const - { return m_f(*this->base()); } - - // Probably should be the initial base class so it can be - // optimized away via EBO if it is an empty class. - UnaryFunc m_f; - }; - - template - transform_iterator - make_transform_iterator(Iterator it, UnaryFunc fun) - { - return transform_iterator(it, fun); - } - - // Version which allows explicit specification of the UnaryFunc - // type. - // - // This generator is not provided if UnaryFunc is a function - // pointer type, because it's too dangerous: the default-constructed - // function pointer in the iterator be 0, leading to a runtime - // crash. - template -#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) - typename mpl::if_< -#else - typename iterators::enable_if< -#endif - is_class // We should probably find a cheaper test than is_class<> - , transform_iterator -#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) - , int[3] -#endif - >::type - make_transform_iterator(Iterator it) - { - return transform_iterator(it, UnaryFunc()); - } - -#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) && !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) - template - transform_iterator< Return (*)(Argument), Iterator, Return> - make_transform_iterator(Iterator it, Return (*fun)(Argument)) - { - return transform_iterator(it, fun); - } -#endif - -} // namespace boost - -#include - -#endif // BOOST_TRANSFORM_ITERATOR_23022003THW_HPP diff --git a/include/boost/iterator/zip_iterator.hpp b/include/boost/iterator/zip_iterator.hpp deleted file mode 100755 index 6758dad..0000000 --- a/include/boost/iterator/zip_iterator.hpp +++ /dev/null @@ -1,600 +0,0 @@ -// (C) Copyright David Abrahams and Thomas Becker 2000. 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. -// -// 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) - -#ifndef BOOST_ZIP_ITERATOR_TMB_07_13_2003_HPP_ -# define BOOST_ZIP_ITERATOR_TMB_07_13_2003_HPP_ - -#include -#include -#include -#include -#include // for enable_if_convertible -#include -#include - -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - -namespace boost { - - // Zip iterator forward declaration for zip_iterator_base - template - class zip_iterator; - - // One important design goal of the zip_iterator is to isolate all - // functionality whose implementation relies on the current tuple - // implementation. This goal has been achieved as follows: Inside - // the namespace detail there is a namespace tuple_impl_specific. - // This namespace encapsulates all functionality that is specific - // to the current Boost tuple implementation. More precisely, the - // namespace tuple_impl_specific provides the following tuple - // algorithms and meta-algorithms for the current Boost tuple - // implementation: - // - // tuple_meta_transform - // tuple_meta_accumulate - // tuple_transform - // tuple_for_each - // - // If the tuple implementation changes, all that needs to be - // replaced is the implementation of these four (meta-)algorithms. - - namespace detail - { - - // Functors to be used with tuple algorithms - // - template - class advance_iterator - { - public: - advance_iterator(DiffType step) : m_step(step) {} - - template - void operator()(Iterator& it) const - { it += m_step; } - - private: - DiffType m_step; - }; - // - struct increment_iterator - { - template - void operator()(Iterator& it) - { ++it; } - }; - // - struct decrement_iterator - { - template - void operator()(Iterator& it) - { --it; } - }; - // - struct dereference_iterator - { - template - struct apply - { - typedef typename - iterator_traits::reference - type; - }; - - template - typename apply::type operator()(Iterator const& it) - { return *it; } - }; - - - // The namespace tuple_impl_specific provides two meta- - // algorithms and two algorithms for tuples. - // - namespace tuple_impl_specific - { - // Meta-transform algorithm for tuples - // - template - struct tuple_meta_transform; - - template - struct tuple_meta_transform_impl - { - typedef tuples::cons< - typename mpl::apply1< - typename mpl::lambda::type - , typename Tuple::head_type - >::type - , typename tuple_meta_transform< - typename Tuple::tail_type - , UnaryMetaFun - >::type - > type; - }; - - template - struct tuple_meta_transform - : mpl::eval_if< - boost::is_same - , mpl::identity - , tuple_meta_transform_impl - > - { - }; - - // Meta-accumulate algorithm for tuples. Note: The template - // parameter StartType corresponds to the initial value in - // ordinary accumulation. - // - template - struct tuple_meta_accumulate; - - template< - typename Tuple - , class BinaryMetaFun - , typename StartType - > - struct tuple_meta_accumulate_impl - { - typedef typename mpl::apply2< - typename mpl::lambda::type - , typename Tuple::head_type - , typename tuple_meta_accumulate< - typename Tuple::tail_type - , BinaryMetaFun - , StartType - >::type - >::type type; - }; - - template< - typename Tuple - , class BinaryMetaFun - , typename StartType - > - struct tuple_meta_accumulate - : mpl::eval_if< -#if BOOST_WORKAROUND(BOOST_MSVC, < 1300) - mpl::or_< -#endif - boost::is_same -#if BOOST_WORKAROUND(BOOST_MSVC, < 1300) - , boost::is_same - > -#endif - , mpl::identity - , tuple_meta_accumulate_impl< - Tuple - , BinaryMetaFun - , StartType - > - > - { - }; - -#if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \ - || ( \ - BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, != 0) && defined(_MSC_VER) \ - ) -// Not sure why intel's partial ordering fails in this case, but I'm -// assuming int's an MSVC bug-compatibility feature. - -# define BOOST_TUPLE_ALGO_DISPATCH -# define BOOST_TUPLE_ALGO(algo) algo##_impl -# define BOOST_TUPLE_ALGO_TERMINATOR , int -# define BOOST_TUPLE_ALGO_RECURSE , ... -#else -# define BOOST_TUPLE_ALGO(algo) algo -# define BOOST_TUPLE_ALGO_TERMINATOR -# define BOOST_TUPLE_ALGO_RECURSE -#endif - - // transform algorithm for tuples. The template parameter Fun - // must be a unary functor which is also a unary metafunction - // class that computes its return type based on its argument - // type. For example: - // - // struct to_ptr - // { - // template - // struct apply - // { - // typedef Arg* type; - // } - // - // template - // Arg* operator()(Arg x); - // }; - template - tuples::null_type BOOST_TUPLE_ALGO(tuple_transform) - (tuples::null_type const&, Fun BOOST_TUPLE_ALGO_TERMINATOR) - { return tuples::null_type(); } - - template - typename tuple_meta_transform< - Tuple - , Fun - >::type - - BOOST_TUPLE_ALGO(tuple_transform)( - const Tuple& t, - Fun f - BOOST_TUPLE_ALGO_RECURSE - ) - { - typedef typename tuple_meta_transform< - BOOST_DEDUCED_TYPENAME Tuple::tail_type - , Fun - >::type transformed_tail_type; - - return tuples::cons< - BOOST_DEDUCED_TYPENAME mpl::apply1< - Fun, BOOST_DEDUCED_TYPENAME Tuple::head_type - >::type - , transformed_tail_type - >( - f(boost::tuples::get<0>(t)), tuple_transform(t.get_tail(), f) - ); - } - -#ifdef BOOST_TUPLE_ALGO_DISPATCH - template - typename tuple_meta_transform< - Tuple - , Fun - >::type - - tuple_transform( - const Tuple& t, - Fun f - ) - { - return tuple_transform_impl(t, f, 1); - } -#endif - - // for_each algorithm for tuples. - // - template - Fun BOOST_TUPLE_ALGO(tuple_for_each)( - tuples::null_type - , Fun f BOOST_TUPLE_ALGO_TERMINATOR - ) - { return f; } - - - template - Fun BOOST_TUPLE_ALGO(tuple_for_each)( - Tuple& t - , Fun f BOOST_TUPLE_ALGO_RECURSE) - { - f( t.get_head() ); - return tuple_for_each(t.get_tail(), f); - } - -#ifdef BOOST_TUPLE_ALGO_DISPATCH - template - Fun - tuple_for_each( - Tuple& t, - Fun f - ) - { - return tuple_for_each_impl(t, f, 1); - } -#endif - - // Equality of tuples. NOTE: "==" for tuples currently (7/2003) - // has problems under some compilers, so I just do my own. - // No point in bringing in a bunch of #ifdefs here. This is - // going to go away with the next tuple implementation anyway. - // - inline bool tuple_equal(tuples::null_type, tuples::null_type) - { return true; } - - template - bool tuple_equal( - Tuple1 const& t1, - Tuple2 const& t2 - ) - { - return t1.get_head() == t2.get_head() && - tuple_equal(t1.get_tail(), t2.get_tail()); - } - } - // - // end namespace tuple_impl_specific - - template - struct iterator_reference - { - typedef typename iterator_traits::reference type; - }; - -#ifdef BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT - // Hack because BOOST_MPL_AUX_LAMBDA_SUPPORT doesn't seem to work - // out well. Instantiating the nested apply template also - // requires instantiating iterator_traits on the - // placeholder. Instead we just specialize it as a metafunction - // class. - template<> - struct iterator_reference - { - template - struct apply : iterator_reference {}; - }; -#endif - - // Metafunction to obtain the type of the tuple whose element types - // are the reference types of an iterator tuple. - // - template - struct tuple_of_references - : tuple_impl_specific::tuple_meta_transform< - IteratorTuple, - iterator_reference - > - { - }; - - // Metafunction to obtain the minimal traversal tag in a tuple - // of iterators. - // - template - struct minimum_traversal_category_in_iterator_tuple - { - typedef typename tuple_impl_specific::tuple_meta_transform< - IteratorTuple - , iterator_traversal<> - >::type tuple_of_traversal_tags; - - typedef typename tuple_impl_specific::tuple_meta_accumulate< - tuple_of_traversal_tags - , minimum_category<> - , random_access_traversal_tag - >::type type; - }; - -#if BOOST_WORKAROUND(BOOST_MSVC, < 1300) // ETI workaround - template <> - struct minimum_traversal_category_in_iterator_tuple - { - typedef int type; - }; -#endif - - // We need to call tuple_meta_accumulate with mpl::and_ as the - // accumulating functor. To this end, we need to wrap it into - // a struct that has exactly two arguments (that is, template - // parameters) and not five, like mpl::and_ does. - // - template - struct and_with_two_args - : mpl::and_ - { - }; - -# ifdef BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT - // Hack because BOOST_MPL_AUX_LAMBDA_SUPPORT doesn't seem to work - // out well. In this case I think it's an MPL bug - template<> - struct and_with_two_args - { - template - struct apply : mpl::and_ - {}; - }; -# endif - - /////////////////////////////////////////////////////////////////// - // - // Class zip_iterator_base - // - // Builds and exposes the iterator facade type from which the zip - // iterator will be derived. - // - template - struct zip_iterator_base - { - private: - // Reference type is the type of the tuple obtained from the - // iterators' reference types. - typedef typename - detail::tuple_of_references::type reference; - - // Value type is the same as reference type. - typedef reference value_type; - - // Difference type is the first iterator's difference type - typedef typename iterator_traits< - typename tuples::element<0, IteratorTuple>::type - >::difference_type difference_type; - - // Traversal catetgory is the minimum traversal category in the - // iterator tuple. - typedef typename - detail::minimum_traversal_category_in_iterator_tuple< - IteratorTuple - >::type traversal_category; - public: - - // The iterator facade type from which the zip iterator will - // be derived. - typedef iterator_facade< - zip_iterator, - value_type, - traversal_category, - reference, - difference_type - > type; - }; - - template <> - struct zip_iterator_base - { - typedef int type; - }; - } - - ///////////////////////////////////////////////////////////////////// - // - // zip_iterator class definition - // - template - class zip_iterator : - public detail::zip_iterator_base::type - { - - // Typedef super_t as our base class. - typedef typename - detail::zip_iterator_base::type super_t; - - // iterator_core_access is the iterator's best friend. - friend class iterator_core_access; - - public: - - // Construction - // ============ - - // Default constructor - zip_iterator() { } - - // Constructor from iterator tuple - zip_iterator(IteratorTuple iterator_tuple) - : m_iterator_tuple(iterator_tuple) - { } - - // Copy constructor - template - zip_iterator( - const zip_iterator& other, - typename enable_if_convertible< - OtherIteratorTuple, - IteratorTuple - >::type* = 0 - ) : m_iterator_tuple(other.get_iterator_tuple()) - {} - - // Get method for the iterator tuple. - const IteratorTuple& get_iterator_tuple() const - { return m_iterator_tuple; } - - private: - - // Implementation of Iterator Operations - // ===================================== - - // Dereferencing returns a tuple built from the dereferenced - // iterators in the iterator tuple. - typename super_t::reference dereference() const - { - return detail::tuple_impl_specific::tuple_transform( - get_iterator_tuple(), - detail::dereference_iterator() - ); - } - - // Two zip iterators are equal if all iterators in the iterator - // tuple are equal. NOTE: It should be possible to implement this - // as - // - // return get_iterator_tuple() == other.get_iterator_tuple(); - // - // but equality of tuples currently (7/2003) does not compile - // under several compilers. No point in bringing in a bunch - // of #ifdefs here. - // - template - bool equal(const zip_iterator& other) const - { - return detail::tuple_impl_specific::tuple_equal( - get_iterator_tuple(), - other.get_iterator_tuple() - ); - } - - // Advancing a zip iterator means to advance all iterators in the - // iterator tuple. - void advance(typename super_t::difference_type n) - { - detail::tuple_impl_specific::tuple_for_each( - m_iterator_tuple, - detail::advance_iterator(n) - ); - } - // Incrementing a zip iterator means to increment all iterators in - // the iterator tuple. - void increment() - { - detail::tuple_impl_specific::tuple_for_each( - m_iterator_tuple, - detail::increment_iterator() - ); - } - - // Decrementing a zip iterator means to decrement all iterators in - // the iterator tuple. - void decrement() - { - detail::tuple_impl_specific::tuple_for_each( - m_iterator_tuple, - detail::decrement_iterator() - ); - } - - // Distance is calculated using the first iterator in the tuple. - template - typename super_t::difference_type distance_to( - const zip_iterator& other - ) const - { - return boost::tuples::get<0>(other.get_iterator_tuple()) - - boost::tuples::get<0>(this->get_iterator_tuple()); - } - - // Data Members - // ============ - - // The iterator tuple. - IteratorTuple m_iterator_tuple; - - }; - - // Make function for zip iterator - // - template - zip_iterator - make_zip_iterator(IteratorTuple t) - { return zip_iterator(t); } - -} - -#endif diff --git a/include/boost/iterator_adaptors.hpp b/include/boost/iterator_adaptors.hpp deleted file mode 100644 index 7058153..0000000 --- a/include/boost/iterator_adaptors.hpp +++ /dev/null @@ -1,10 +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) -#ifndef ITERATOR_ADAPTORS_DWA2004725_HPP -# define ITERATOR_ADAPTORS_DWA2004725_HPP - -#define BOOST_ITERATOR_ADAPTORS_VERSION 0x0200 -#include - -#endif // ITERATOR_ADAPTORS_DWA2004725_HPP diff --git a/include/boost/pending/detail/int_iterator.hpp b/include/boost/pending/detail/int_iterator.hpp deleted file mode 100644 index e3bae34..0000000 --- a/include/boost/pending/detail/int_iterator.hpp +++ /dev/null @@ -1,74 +0,0 @@ -// (C) Copyright Jeremy Siek 1999. -// 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) - -#ifndef BOOST_INT_ITERATOR_H -#define BOOST_INT_ITERATOR_H - -#include -#if !defined BOOST_MSVC -#include -#endif -#include -//using namespace std; - -#ifndef BOOST_NO_OPERATORS_IN_NAMESPACE -namespace boost { -#endif - -// this should use random_access_iterator_helper but I've had -// VC++ portablility problems with that. -JGS -template -class int_iterator -{ - typedef int_iterator self; -public: - typedef std::random_access_iterator_tag iterator_category; - typedef IntT value_type; - typedef IntT& reference; - typedef IntT* pointer; - typedef std::ptrdiff_t difference_type; - - inline int_iterator() : _i(0) { } - inline int_iterator(IntT i) : _i(i) { } - inline int_iterator(const self& x) : _i(x._i) { } - inline self& operator=(const self& x) { _i = x._i; return *this; } - inline IntT operator*() { return _i; } - inline IntT operator[](IntT n) { return _i + n; } - inline self& operator++() { ++_i; return *this; } - inline self operator++(int) { self t = *this; ++_i; return t; } - inline self& operator+=(IntT n) { _i += n; return *this; } - inline self operator+(IntT n) { self t = *this; t += n; return t; } - inline self& operator--() { --_i; return *this; } - inline self operator--(int) { self t = *this; --_i; return t; } - inline self& operator-=(IntT n) { _i -= n; return *this; } - inline IntT operator-(const self& x) const { return _i - x._i; } - inline bool operator==(const self& x) const { return _i == x._i; } - // vc++ had a problem finding != in random_access_iterator_helper - // need to look into this... for now implementing everything here -JGS - inline bool operator!=(const self& x) const { return _i != x._i; } - inline bool operator<(const self& x) const { return _i < x._i; } - inline bool operator<=(const self& x) const { return _i <= x._i; } - inline bool operator>(const self& x) const { return _i > x._i; } - inline bool operator>=(const self& x) const { return _i >= x._i; } -protected: - IntT _i; -}; - -template -inline int_iterator -operator+(IntT n, int_iterator t) { t += n; return t; } - -#ifndef BOOST_NO_OPERATORS_IN_NAMESPACE -} /* namespace boost */ -#endif - -#ifdef BOOST_NO_OPERATORS_IN_NAMESPACE -namespace boost { - using ::int_iterator; -} -#endif - - -#endif /* BOOST_INT_ITERATOR_H */ diff --git a/include/boost/pending/integer_range.hpp b/include/boost/pending/integer_range.hpp deleted file mode 100644 index 229cbd8..0000000 --- a/include/boost/pending/integer_range.hpp +++ /dev/null @@ -1,59 +0,0 @@ -// (C) Copyright David Abrahams and Jeremy Siek 2000-2001. -// 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) -// -// Revision History: -// 04 Jan 2001 Factored counting_iterator stuff into -// boost/counting_iterator.hpp (David Abrahams) - -#ifndef BOOST_INTEGER_RANGE_HPP_ -#define BOOST_INTEGER_RANGE_HPP_ - -#include -#include -#include - -namespace boost { - -//============================================================================= -// Counting Iterator and Integer Range Class - -template -struct integer_range { - typedef counting_iterator iterator; - - typedef iterator const_iterator; - typedef IntegerType value_type; - typedef std::ptrdiff_t difference_type; - typedef IntegerType reference; - typedef IntegerType const_reference; - typedef const IntegerType* pointer; - typedef const IntegerType* const_pointer; - typedef IntegerType size_type; - - integer_range(IntegerType start, IntegerType finish) - : m_start(start), m_finish(finish) { } - - iterator begin() const { return iterator(m_start); } - iterator end() const { return iterator(m_finish); } - size_type size() const { return m_finish - m_start; } - bool empty() const { return m_finish == m_start; } - void swap(integer_range& x) { - std::swap(m_start, x.m_start); - std::swap(m_finish, x.m_finish); - } -protected: - IntegerType m_start, m_finish; -}; - -template -inline integer_range -make_integer_range(IntegerType first, IntegerType last) -{ - return integer_range(first, last); -} - -} // namespace boost - -#endif // BOOST_INTEGER_RANGE_HPP_ diff --git a/include/boost/pending/iterator_adaptors.hpp b/include/boost/pending/iterator_adaptors.hpp deleted file mode 100644 index 2256e81..0000000 --- a/include/boost/pending/iterator_adaptors.hpp +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright David Abrahams 2003. -// 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) - -#include diff --git a/include/boost/pending/iterator_tests.hpp b/include/boost/pending/iterator_tests.hpp deleted file mode 100644 index dd5fe2d..0000000 --- a/include/boost/pending/iterator_tests.hpp +++ /dev/null @@ -1,268 +0,0 @@ -// Copyright David Abrahams and Jeremy Siek 2003. -// 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) -#ifndef BOOST_ITERATOR_TESTS_HPP -# define BOOST_ITERATOR_TESTS_HPP - -// This is meant to be the beginnings of a comprehensive, generic -// test suite for STL concepts such as iterators and containers. -// -// Revision History: -// 28 Apr 2002 Fixed input iterator requirements. -// For a == b a++ == b++ is no longer required. -// See 24.1.1/3 for details. -// (Thomas Witt) -// 08 Feb 2001 Fixed bidirectional iterator test so that -// --i is no longer a precondition. -// (Jeremy Siek) -// 04 Feb 2001 Added lvalue test, corrected preconditions -// (David Abrahams) - -# include -# include -# include -# include -# include // for detail::dummy_constructor -# include -# include - -namespace boost { - - // use this for the value type -struct dummyT { - dummyT() { } - dummyT(detail::dummy_constructor) { } - dummyT(int x) : m_x(x) { } - int foo() const { return m_x; } - bool operator==(const dummyT& d) const { return m_x == d.m_x; } - int m_x; -}; - -} - -BOOST_TT_BROKEN_COMPILER_SPEC(boost::dummyT) - -namespace boost { - -// Tests whether type Iterator satisfies the requirements for a -// TrivialIterator. -// Preconditions: i != j, *i == val -template -void trivial_iterator_test(const Iterator i, const Iterator j, T val) -{ - Iterator k; - assert(i == i); - assert(j == j); - assert(i != j); -#ifdef BOOST_NO_STD_ITERATOR_TRAITS - T v = *i; -#else - typename std::iterator_traits::value_type v = *i; -#endif - assert(v == val); -#if 0 - // hmm, this will give a warning for transform_iterator... perhaps - // this should be separated out into a stand-alone test since there - // are several situations where it can't be used, like for - // integer_range::iterator. - assert(v == i->foo()); -#endif - k = i; - assert(k == k); - assert(k == i); - assert(k != j); - assert(*k == val); -} - - -// Preconditions: i != j -template -void mutable_trivial_iterator_test(const Iterator i, const Iterator j, T val) -{ - *i = val; - trivial_iterator_test(i, j, val); -} - - -// Preconditions: *i == v1, *++i == v2 -template -void input_iterator_test(Iterator i, T v1, T v2) -{ - Iterator i1(i); - - assert(i == i1); - assert(!(i != i1)); - - // I can see no generic way to create an input iterator - // that is in the domain of== of i and != i. - // The following works for istream_iterator but is not - // guaranteed to work for arbitrary input iterators. - // - // Iterator i2; - // - // assert(i != i2); - // assert(!(i == i2)); - - assert(*i1 == v1); - assert(*i == v1); - - // we cannot test for equivalence of (void)++i & (void)i++ - // as i is only guaranteed to be single pass. - assert(*i++ == v1); - - i1 = i; - - assert(i == i1); - assert(!(i != i1)); - - assert(*i1 == v2); - assert(*i == v2); - - // i is dereferencable, so it must be incrementable. - ++i; - - // how to test for operator-> ? -} - -// how to test output iterator? - - -template struct lvalue_test -{ - template static void check(Iterator) - { -# ifndef BOOST_NO_STD_ITERATOR_TRAITS - typedef typename std::iterator_traits::reference reference; - typedef typename std::iterator_traits::value_type value_type; -# else - typedef typename Iterator::reference reference; - typedef typename Iterator::value_type value_type; -# endif - BOOST_STATIC_ASSERT(boost::is_reference::value); - BOOST_STATIC_ASSERT((boost::is_same::value - || boost::is_same::value - )); - } -}; - -# ifdef BOOST_NO_STD_ITERATOR_TRAITS -template <> struct lvalue_test { - template static void check(T) {} -}; -#endif - -template -void forward_iterator_test(Iterator i, T v1, T v2) -{ - input_iterator_test(i, v1, v2); - - Iterator i1 = i, i2 = i; - - assert(i == i1++); - assert(i != ++i2); - - trivial_iterator_test(i, i1, v1); - trivial_iterator_test(i, i2, v1); - - ++i; - assert(i == i1); - assert(i == i2); - ++i1; - ++i2; - - trivial_iterator_test(i, i1, v2); - trivial_iterator_test(i, i2, v2); - - // borland doesn't allow non-type template parameters -# if !defined(__BORLANDC__) || (__BORLANDC__ > 0x551) - lvalue_test<(boost::is_pointer::value)>::check(i); -#endif -} - -// Preconditions: *i == v1, *++i == v2 -template -void bidirectional_iterator_test(Iterator i, T v1, T v2) -{ - forward_iterator_test(i, v1, v2); - ++i; - - Iterator i1 = i, i2 = i; - - assert(i == i1--); - assert(i != --i2); - - trivial_iterator_test(i, i1, v2); - trivial_iterator_test(i, i2, v2); - - --i; - assert(i == i1); - assert(i == i2); - ++i1; - ++i2; - - trivial_iterator_test(i, i1, v1); - trivial_iterator_test(i, i2, v1); -} - -// mutable_bidirectional_iterator_test - -template struct undefined; - -// Preconditions: [i,i+N) is a valid range -template -void random_access_iterator_test(Iterator i, int N, TrueVals vals) -{ - bidirectional_iterator_test(i, vals[0], vals[1]); - const Iterator j = i; - int c; - - typedef typename boost::detail::iterator_traits::value_type value_type; - - for (c = 0; c < N-1; ++c) { - assert(i == j + c); - assert(*i == vals[c]); - assert(*i == boost::implicit_cast(j[c])); - assert(*i == *(j + c)); - assert(*i == *(c + j)); - ++i; - assert(i > j); - assert(i >= j); - assert(j <= i); - assert(j < i); - } - - Iterator k = j + N - 1; - for (c = 0; c < N-1; ++c) { - assert(i == k - c); - assert(*i == vals[N - 1 - c]); - assert(*i == boost::implicit_cast(j[N - 1 - c])); - Iterator q = k - c; - assert(*i == *q); - assert(i > j); - assert(i >= j); - assert(j <= i); - assert(j < i); - --i; - } -} - -// Precondition: i != j -template -void const_nonconst_iterator_test(Iterator i, ConstIterator j) -{ - assert(i != j); - assert(j != i); - - ConstIterator k(i); - assert(k == i); - assert(i == k); - - k = i; - assert(k == i); - assert(i == k); -} - -} // namespace boost - -#endif // BOOST_ITERATOR_TESTS_HPP diff --git a/include/boost/pointee.hpp b/include/boost/pointee.hpp deleted file mode 100755 index 9794b8e..0000000 --- a/include/boost/pointee.hpp +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef POINTEE_DWA200415_HPP -# define POINTEE_DWA200415_HPP - -// -// 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) -// -// typename pointee

::type provides the pointee type of P. -// -// For example, it is T for T* and X for shared_ptr. -// -// http://www.boost.org/libs/iterator/doc/pointee.html -// - -# include -# include -# include -# include -# include -# include - -namespace boost { - -namespace detail -{ - template - struct smart_ptr_pointee - { - typedef typename P::element_type type; - }; - - template - struct iterator_pointee - { - typedef typename iterator_traits::value_type value_type; - - struct impl - { - template - static char test(T const&); - - static char (& test(value_type&) )[2]; - - static Iterator& x; - }; - - BOOST_STATIC_CONSTANT(bool, is_constant = sizeof(impl::test(*impl::x)) == 1); - - typedef typename mpl::if_c< -# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) - ::boost::detail::iterator_pointee::is_constant -# else - is_constant -# endif - , typename add_const::type - , value_type - >::type type; - }; -} - -template -struct pointee - : mpl::eval_if< - detail::is_incrementable

- , detail::iterator_pointee

- , detail::smart_ptr_pointee

- > -{ -}; - -} // namespace boost - -#endif // POINTEE_DWA200415_HPP diff --git a/include/boost/shared_container_iterator.hpp b/include/boost/shared_container_iterator.hpp deleted file mode 100644 index 7d8ecd3..0000000 --- a/include/boost/shared_container_iterator.hpp +++ /dev/null @@ -1,62 +0,0 @@ -// (C) Copyright Ronald Garcia 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. - -// See http://www.boost.org/libs/utility/shared_container_iterator.html for documentation. - -#ifndef SHARED_CONTAINER_ITERATOR_RG08102002_HPP -#define SHARED_CONTAINER_ITERATOR_RG08102002_HPP - -#include "boost/iterator_adaptors.hpp" -#include "boost/shared_ptr.hpp" -#include - -namespace boost { - -template -class shared_container_iterator : public iterator_adaptor< - shared_container_iterator, - typename Container::iterator> { - - typedef iterator_adaptor< - shared_container_iterator, - typename Container::iterator> super_t; - - typedef typename Container::iterator iterator_t; - typedef boost::shared_ptr container_ref_t; - - container_ref_t container_ref; -public: - shared_container_iterator() { } - - shared_container_iterator(iterator_t const& x,container_ref_t const& c) : - super_t(x), container_ref(c) { } - - -}; - -template -shared_container_iterator -make_shared_container_iterator(typename Container::iterator iter, - boost::shared_ptr const& container) { - typedef shared_container_iterator iterator; - return iterator(iter,container); -} - - - -template -std::pair< - shared_container_iterator, - shared_container_iterator > -make_shared_container_range(boost::shared_ptr const& container) { - return - std::make_pair( - make_shared_container_iterator(container->begin(),container), - make_shared_container_iterator(container->end(),container)); -} - - -} // namespace boost -#endif // SHARED_CONTAINER_ITERATOR_RG08102002_HPP diff --git a/test/concept_tests.cpp b/test/concept_tests.cpp deleted file mode 100644 index f3d518a..0000000 --- a/test/concept_tests.cpp +++ /dev/null @@ -1,94 +0,0 @@ -// (C) Copyright Jeremy Siek 2002. -// 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) - -#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/constant_iter_arrow.cpp b/test/constant_iter_arrow.cpp deleted file mode 100755 index 3579c53..0000000 --- a/test/constant_iter_arrow.cpp +++ /dev/null @@ -1,16 +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) - -#include -#include - -struct my_iter : boost::iterator_adaptor const*> -{ - my_iter(std::pair const*); - my_iter(); -}; - -std::pair const x(1,1); -my_iter p(&x); -int y = p->first; // operator-> attempts to return an non-const pointer diff --git a/test/constant_iter_arrow_fail.cpp b/test/constant_iter_arrow_fail.cpp deleted file mode 100755 index 05f551a..0000000 --- a/test/constant_iter_arrow_fail.cpp +++ /dev/null @@ -1,20 +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) - -#include -#include - -struct my_iter : boost::iterator_adaptor const*> -{ - my_iter(std::pair const*); - my_iter(); -}; - -std::pair const x(1,1); -my_iter p(&x); - -void test() -{ - p->first = 3; -} diff --git a/test/counting_iterator_test.cpp b/test/counting_iterator_test.cpp deleted file mode 100644 index 7770af5..0000000 --- a/test/counting_iterator_test.cpp +++ /dev/null @@ -1,300 +0,0 @@ -// (C) Copyright David Abrahams 2001. -// 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) -// -// 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 -# ifdef BOOST_SLIST_HEADER -# include BOOST_SLIST_HEADER -# else -# include -# endif -#endif - - -#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -template -struct signed_assert_nonnegative -{ - static void test(T x) { BOOST_TEST(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 - BOOST_TEST(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 - BOOST_TEST(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; - - BOOST_TEST(boost::detail::distance(x, y) == 1); - - // Show that values outside the range can't be found - BOOST_TEST(!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) - { - BOOST_TEST(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< ::boost::long_long_type>(); - test_integer< ::boost::ulong_long_type>(); -#endif - - // Test user-defined type. - - test_integer3(); - 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 boost::report_errors(); -} diff --git a/test/filter_iterator_test.cpp b/test/filter_iterator_test.cpp deleted file mode 100644 index f4eb635..0000000 --- a/test/filter_iterator_test.cpp +++ /dev/null @@ -1,273 +0,0 @@ -// Copyright David Abrahams 2003, Jeremy Siek 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) - -#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 >(); - } - { - typedef boost::filter_iterator > Iter; - boost::function_requires< boost::BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - { - typedef boost::filter_iterator > Iter; - boost::function_requires< boost::Mutable_BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - { - typedef boost::filter_iterator > Iter; - boost::function_requires< boost::BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - { - typedef boost::filter_iterator > Iter; - boost::function_requires< boost::Mutable_BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - // 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 - - { - typedef boost::iterator_archetype< - const dummyT - , boost::iterator_archetypes::readable_iterator_t - , boost::random_access_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - boost::function_requires< boost::InputIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - -#if !BOOST_WORKAROUND(BOOST_MSVC, == 1200) // Causes Internal Error in linker. - { - typedef boost::iterator_archetype< - dummyT - , boost::iterator_archetypes::readable_writable_iterator_t - , boost::random_access_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::BidirectionalTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - const dummyT - , boost::iterator_archetypes::readable_lvalue_iterator_t - , boost::random_access_traversal_tag - > BaseIter; - typedef boost::filter_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::random_access_traversal_tag - > BaseIter; - typedef boost::filter_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 >(); - } -#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_iter_member_types.cpp b/test/indirect_iter_member_types.cpp deleted file mode 100644 index 84dcaeb..0000000 --- a/test/indirect_iter_member_types.cpp +++ /dev/null @@ -1,89 +0,0 @@ -// (C) Copyright Jeremy Siek 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) - -// 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; - zow const& operator*() const; -// 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 8cea482..0000000 --- a/test/indirect_iterator_test.cpp +++ /dev/null @@ -1,221 +0,0 @@ -// (C) Copyright Jeremy Siek 1999. -// 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) - -// 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 -#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()); - BOOST_TEST(static_cast(de - db) == store.size()); - BOOST_TEST(db + store.size() == de); - indirect_ra_container::const_iterator dci = db; - - BOOST_TEST(dci == db); - -#ifndef NO_MUTABLE_CONST_RA_ITERATOR_INTEROPERABILITY - BOOST_TEST(db == dci); -#endif - - BOOST_TEST(dci != de); - BOOST_TEST(dci < de); - BOOST_TEST(dci <= de); - -#ifndef NO_MUTABLE_CONST_RA_ITERATOR_INTEROPERABILITY - BOOST_TEST(de >= dci); - BOOST_TEST(de > dci); -#endif - - dci = de; - BOOST_TEST(dci == de); - - boost::random_access_iterator_test(db + 1, store.size() - 1, boost::next(store.begin())); - - *db = 999; - BOOST_TEST(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()); - BOOST_TEST(sci == sb); - -# ifndef NO_MUTABLE_CONST_STD_SET_ITERATOR_INTEROPERABILITY - BOOST_TEST(se != sci); -# endif - - BOOST_TEST(sci != se); - sci = se; - BOOST_TEST(sci == se); - - *boost::prior(se) = 888; - BOOST_TEST(store.back() == 888); - BOOST_TEST(std::equal(sb, se, store.begin())); - - boost::bidirectional_iterator_test(boost::next(sb), store[1], store[2]); - BOOST_TEST(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(); - } - return boost::report_errors(); -} diff --git a/test/interoperable.cpp b/test/interoperable.cpp deleted file mode 100755 index ba4196a..0000000 --- a/test/interoperable.cpp +++ /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) - -#include -#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); - BOOST_TEST(i < j); - BOOST_TEST(j > i); - BOOST_TEST(i <= j); - BOOST_TEST(j >= i); - BOOST_TEST(j - i == 1); - BOOST_TEST(i - j == -1); - - constant_it k = i; - - BOOST_TEST(!(i < k)); - BOOST_TEST(!(k > i)); - BOOST_TEST(i <= k); - BOOST_TEST(k >= i); - BOOST_TEST(k - i == 0); - BOOST_TEST(i - k == 0); - - return boost::report_errors(); -} diff --git a/test/interoperable_fail.cpp b/test/interoperable_fail.cpp deleted file mode 100644 index d6d249a..0000000 --- a/test/interoperable_fail.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright Thomas Witt 2003. -// 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) -#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 757b5c6..0000000 --- a/test/is_convertible_fail.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// -// Copyright (c) Thomas Witt 2002. -// -// 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 - -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/iter_archetype_default_ctor.cpp b/test/iter_archetype_default_ctor.cpp deleted file mode 100755 index 7936bdd..0000000 --- a/test/iter_archetype_default_ctor.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright Thomas Witt 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) -// -#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_adaptor_cc.cpp b/test/iterator_adaptor_cc.cpp deleted file mode 100644 index 599474c..0000000 --- a/test/iterator_adaptor_cc.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2004 Jeremy Siek -// 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) - -#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 e339fe1..0000000 --- a/test/iterator_adaptor_test.cpp +++ /dev/null @@ -1,337 +0,0 @@ -// (C) Copyright Thomas Witt 2003. -// 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) - -// 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 - -#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 - BOOST_TEST((*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 - BOOST_TEST((*i).m_x == i->foo()); - } - - // check that base_type is correct - { - // Test constant iterator idiom - typedef ptr_iterator BaseIter; - - test = static_assert_same::value; - test = static_assert_same::base_type,BaseIter>::value; - - typedef modify_traversal IncrementableIter; - - test = static_assert_same::value; - } - - std::cout << "test successful " << std::endl; - (void)test; - return boost::report_errors(); -} diff --git a/test/iterator_archetype_cc.cpp b/test/iterator_archetype_cc.cpp deleted file mode 100644 index 580a32c..0000000 --- a/test/iterator_archetype_cc.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// -// Copyright Thomas Witt 2003. -// 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) -// -#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_facade.cpp b/test/iterator_facade.cpp deleted file mode 100755 index 871c196..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 == 8); - return 0; -} diff --git a/test/iterator_traits_test.cpp b/test/iterator_traits_test.cpp deleted file mode 100644 index 3131d44..0000000 --- a/test/iterator_traits_test.cpp +++ /dev/null @@ -1,218 +0,0 @@ -// (C) Copyright David Abrahams 2002. -// 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) - -// See http://www.boost.org for most recent version including documentation. - -// Revision History -// 04 Mar 2001 Patches for Intel C++ (Dave Abrahams) -// 19 Feb 2001 Take advantage of improved iterator_traits to do more tests -// on MSVC. Reordered some #ifdefs for coherency. -// (David Abrahams) -// 13 Feb 2001 Test new VC6 workarounds (David Abrahams) -// 11 Feb 2001 Final fixes for Borland (David Abrahams) -// 11 Feb 2001 Some fixes for Borland get it closer on that compiler -// (David Abrahams) -// 07 Feb 2001 More comprehensive testing; factored out static tests for -// better reuse (David Abrahams) -// 21 Jan 2001 Quick fix to my_iterator, which wasn't returning a -// reference type from operator* (David Abrahams) -// 19 Jan 2001 Initial version with iterator operators (David Abrahams) - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// A UDT for which we can specialize std::iterator_traits on -// compilers which don't support partial specialization. There's no -// other reasonable way to test pointers on those compilers. -struct element {}; - -// An iterator for which we can get traits. -struct my_iterator1 - : boost::forward_iterator_helper -{ - my_iterator1(const char* p) : m_p(p) {} - - bool operator==(const my_iterator1& rhs) const - { return this->m_p == rhs.m_p; } - - my_iterator1& operator++() { ++this->m_p; return *this; } - const char& operator*() { return *m_p; } - private: - const char* m_p; -}; - -// Used to prove that we don't require std::iterator<> in the hierarchy under -// MSVC6, and that we can compute all the traits for a standard-conforming UDT -// iterator. -struct my_iterator2 - : boost::equality_comparable > > -{ - typedef char value_type; - typedef long difference_type; - typedef const char* pointer; - typedef const char& reference; - typedef std::forward_iterator_tag iterator_category; - - my_iterator2(const char* p) : m_p(p) {} - - bool operator==(const my_iterator2& rhs) const - { return this->m_p == rhs.m_p; } - - my_iterator2& operator++() { ++this->m_p; return *this; } - const char& operator*() { return *m_p; } - private: - const char* m_p; -}; - -// Used to prove that we're not overly confused by the existence of -// std::iterator<> in the hierarchy under MSVC6 - we should find that -// boost::detail::iterator_traits::difference_type is int. -struct my_iterator3 : my_iterator1 -{ - typedef int difference_type; - my_iterator3(const char* p) - : my_iterator1(p) {} -}; - -// -// Assertion tools. Used instead of BOOST_STATIC_ASSERT because that -// doesn't give us a nice stack backtrace -// -template struct assertion; - -template <> struct assertion -{ - typedef char type; -}; - -template -struct assert_same - : assertion<(::boost::is_same::value)> -{ -}; - - -// Iterator tests -template -struct non_portable_tests -{ - typedef typename boost::detail::iterator_traits::pointer test_pt; - typedef typename boost::detail::iterator_traits::reference test_rt; - typedef typename assert_same::type a1; - typedef typename assert_same::type a2; -}; - -template -struct portable_tests -{ - typedef typename boost::detail::iterator_traits::difference_type test_dt; - typedef typename boost::detail::iterator_traits::iterator_category test_cat; - typedef typename assert_same::type a1; - typedef typename assert_same::type a2; -}; - -// Test iterator_traits -template -struct input_iterator_test - : portable_tests -{ - typedef typename boost::detail::iterator_traits::value_type test_vt; - typedef typename assert_same::type a1; -}; - -template -struct non_pointer_test - : input_iterator_test - , non_portable_tests -{ -}; - -template -struct maybe_pointer_test - : portable_tests - , non_portable_tests -{ -}; - -input_iterator_test, int, std::ptrdiff_t, int*, int&, std::input_iterator_tag> - istream_iterator_test; - -#if BOOST_WORKAROUND(__BORLANDC__, <= 0x564) && !defined(__SGI_STL_PORT) -typedef ::std::char_traits::off_type distance; -non_pointer_test,int, - distance,int*,int&,std::output_iterator_tag> ostream_iterator_test; -#elif defined(BOOST_MSVC_STD_ITERATOR) -non_pointer_test, - int, void, int*, int&, std::output_iterator_tag> - ostream_iterator_test; -#elif BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(70190006)) -non_pointer_test, - int, long, int*, int&, std::output_iterator_tag> - ostream_iterator_test; -#else -non_pointer_test, - void, void, void, void, std::output_iterator_tag> - ostream_iterator_test; -#endif - - -#ifdef __KCC - typedef long std_list_diff_type; -#else - typedef std::ptrdiff_t std_list_diff_type; -#endif - -non_pointer_test::iterator, int, std_list_diff_type, int*, int&, std::bidirectional_iterator_tag> - list_iterator_test; - -maybe_pointer_test::iterator, int, std::ptrdiff_t, int*, int&, std::random_access_iterator_tag> - vector_iterator_test; - -maybe_pointer_test - int_pointer_test; - -non_pointer_test - my_iterator1_test; - -non_pointer_test - my_iterator2_test; - -non_pointer_test - my_iterator3_test; - -int main() -{ - char chars[100]; - int ints[100]; - - for (int length = 3; length < 100; length += length / 3) - { - std::list l(length); - BOOST_TEST(boost::detail::distance(l.begin(), l.end()) == length); - - std::vector v(length); - BOOST_TEST(boost::detail::distance(v.begin(), v.end()) == length); - - BOOST_TEST(boost::detail::distance(&ints[0], ints + length) == length); - BOOST_TEST(boost::detail::distance(my_iterator1(chars), my_iterator1(chars + length)) == length); - BOOST_TEST(boost::detail::distance(my_iterator2(chars), my_iterator2(chars + length)) == length); - BOOST_TEST(boost::detail::distance(my_iterator3(chars), my_iterator3(chars + length)) == length); - } - return boost::report_errors(); -} diff --git a/test/lvalue_concept_fail.cpp b/test/lvalue_concept_fail.cpp deleted file mode 100644 index 735bb4a..0000000 --- a/test/lvalue_concept_fail.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2004 Jeremy Siek -// 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) - -#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 af748a9..0000000 --- a/test/permutation_iterator_test.cpp +++ /dev/null @@ -1,84 +0,0 @@ -// (C) Copyright Toon Knapen 2001. -// (C) Copyright Roland Richter 2003. -// 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) - -#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 0404fed..0000000 --- a/test/reverse_iterator_test.cpp +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright Thomas Witt 2003, Jeremy Siek 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) - -#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 6df0506..0000000 --- a/test/static_assert_same.hpp +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright David Abrahams 2003. -// 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) -#ifndef STATIC_ASSERT_SAME_DWA2003530_HPP -# define STATIC_ASSERT_SAME_DWA2003530_HPP - -#include -# include - -#define STATIC_ASSERT_SAME( T1,T2 ) BOOST_MPL_ASSERT((::boost::is_same< T1, T2 >)) - -template -struct static_assert_same -{ - BOOST_MPL_ASSERT((::boost::is_same< T1, T2 >)); - enum { value = 1 }; -}; - -#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 feca9a0..0000000 --- a/test/transform_iterator_test.cpp +++ /dev/null @@ -1,248 +0,0 @@ -// (C) Copyright Jeremy Siek 2002. -// 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) - -// 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 2434310..0000000 --- a/test/unit_tests.cpp +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright David Abrahams 2003. -// 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) -#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; -} -