forked from boostorg/iterator
This commit was manufactured by cvs2svn to create tag
'merged_to_RC_1_31_0'. [SVN r22369]
This commit is contained in:
@@ -1,159 +0,0 @@
|
|||||||
#ifndef BOOST_ITERATOR_CATEGORIES_HPP
|
|
||||||
#define BOOST_ITERATOR_CATEGORIES_HPP
|
|
||||||
|
|
||||||
#include <boost/config.hpp>
|
|
||||||
#include <boost/type_traits/conversion_traits.hpp>
|
|
||||||
#include <boost/type_traits/cv_traits.hpp>
|
|
||||||
#include <boost/pending/ct_if.hpp>
|
|
||||||
#include <boost/detail/iterator.hpp>
|
|
||||||
|
|
||||||
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 <typename Iterator> struct bind {
|
|
||||||
typedef typename Iterator::return_category type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct traversal_category_from_nested_type {
|
|
||||||
template <typename Iterator> struct bind {
|
|
||||||
typedef typename Iterator::traversal_category type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename ValueType>
|
|
||||||
struct choose_lvalue_return {
|
|
||||||
typedef typename ct_if<is_const<ValueType>::value,
|
|
||||||
boost::constant_lvalue_iterator_tag,
|
|
||||||
boost::mutable_lvalue_iterator_tag>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Category, typename ValueType>
|
|
||||||
struct iter_category_to_return {
|
|
||||||
typedef typename ct_if<
|
|
||||||
is_convertible<Category*, std::forward_iterator_tag*>::value,
|
|
||||||
typename choose_lvalue_return<ValueType>::type,
|
|
||||||
typename ct_if<
|
|
||||||
is_convertible<Category*, std::input_iterator_tag*>::value,
|
|
||||||
boost::readable_iterator_tag,
|
|
||||||
typename ct_if<
|
|
||||||
is_convertible<Category*, std::output_iterator_tag*>::value,
|
|
||||||
boost::writable_iterator_tag,
|
|
||||||
boost::error_iterator_tag
|
|
||||||
>::type
|
|
||||||
>::type
|
|
||||||
>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Category>
|
|
||||||
struct iter_category_to_traversal {
|
|
||||||
typedef typename ct_if<
|
|
||||||
is_convertible<Category*, std::random_access_iterator_tag*>::value,
|
|
||||||
random_access_traversal_tag,
|
|
||||||
typename ct_if<
|
|
||||||
is_convertible<Category*, std::bidirectional_iterator_tag*>::value,
|
|
||||||
bidirectional_traversal_tag,
|
|
||||||
forward_traversal_tag
|
|
||||||
>::type
|
|
||||||
>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct return_category_from_old_traits {
|
|
||||||
template <typename Iterator> class bind {
|
|
||||||
typedef boost::detail::iterator_traits<Iterator> OldTraits;
|
|
||||||
typedef typename OldTraits::iterator_category Cat;
|
|
||||||
typedef typename OldTraits::value_type value_type;
|
|
||||||
public:
|
|
||||||
typedef iter_category_to_return<Cat, value_type>::type type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct traversal_category_from_old_traits {
|
|
||||||
template <typename Iterator> class bind {
|
|
||||||
typedef boost::detail::iterator_traits<Iterator> OldTraits;
|
|
||||||
typedef typename OldTraits::iterator_category Cat;
|
|
||||||
public:
|
|
||||||
typedef iter_category_to_traversal<Cat>::type type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class choose_return_category {
|
|
||||||
typedef typename ct_if<is_convertible<Iterator*,
|
|
||||||
new_iterator_base*>::value,
|
|
||||||
return_category_from_nested_type,
|
|
||||||
return_category_from_old_traits>::type Choice;
|
|
||||||
public:
|
|
||||||
typedef typename Choice:: template bind<Iterator>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class choose_traversal_category {
|
|
||||||
typedef typename ct_if<is_convertible<Iterator*,
|
|
||||||
new_iterator_base*>::value,
|
|
||||||
traversal_category_from_nested_type,
|
|
||||||
traversal_category_from_old_traits>::type Choice;
|
|
||||||
public:
|
|
||||||
typedef typename Choice:: template bind<Iterator>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace detail
|
|
||||||
|
|
||||||
template <class Iterator>
|
|
||||||
struct return_category {
|
|
||||||
typedef typename detail::choose_return_category<Iterator>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <class Iterator>
|
|
||||||
struct traversal_category {
|
|
||||||
typedef typename detail::choose_traversal_category<Iterator>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct return_category<T*>
|
|
||||||
{
|
|
||||||
typedef typename ct_if<is_const<T>::value,
|
|
||||||
constant_lvalue_iterator_tag,
|
|
||||||
mutable_lvalue_iterator_tag>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct traversal_category<T*>
|
|
||||||
{
|
|
||||||
typedef random_access_traversal_tag type;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
#endif // BOOST_ITERATOR_CATEGORIES_HPP
|
|
@@ -1,172 +0,0 @@
|
|||||||
#ifndef BOOST_ITERATOR_CONCEPTS_HPP
|
|
||||||
#define BOOST_ITERATOR_CONCEPTS_HPP
|
|
||||||
|
|
||||||
#include <boost/concept_check.hpp>
|
|
||||||
#include <boost/iterator_categories.hpp>
|
|
||||||
#include <boost/type_traits/conversion_traits.hpp>
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
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 <typename Iterator>
|
|
||||||
class ReadableIteratorConcept {
|
|
||||||
public:
|
|
||||||
typedef typename std::iterator_traits<Iterator>::value_type value_type;
|
|
||||||
typedef typename std::iterator_traits<Iterator>::reference reference;
|
|
||||||
typedef typename boost::return_category<Iterator>::type return_category;
|
|
||||||
|
|
||||||
void constraints() {
|
|
||||||
boost::function_requires< boost::SGIAssignableConcept<Iterator> >();
|
|
||||||
boost::function_requires< boost::EqualityComparableConcept<Iterator> >();
|
|
||||||
boost::function_requires<
|
|
||||||
boost::DefaultConstructibleConcept<Iterator> >();
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_convertible<return_category*,
|
|
||||||
boost::readable_iterator_tag*>::value));
|
|
||||||
|
|
||||||
reference r = *i; // or perhaps read(x)
|
|
||||||
value_type v(r);
|
|
||||||
boost::ignore_unused_variable_warning(v);
|
|
||||||
}
|
|
||||||
Iterator i;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Iterator, typename ValueType>
|
|
||||||
class WritableIteratorConcept {
|
|
||||||
public:
|
|
||||||
typedef typename boost::return_category<Iterator>::type return_category;
|
|
||||||
|
|
||||||
void constraints() {
|
|
||||||
boost::function_requires< boost::SGIAssignableConcept<Iterator> >();
|
|
||||||
boost::function_requires< boost::EqualityComparableConcept<Iterator> >();
|
|
||||||
boost::function_requires<
|
|
||||||
boost::DefaultConstructibleConcept<Iterator> >();
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_convertible<return_category*,
|
|
||||||
boost::writable_iterator_tag*>::value));
|
|
||||||
|
|
||||||
*i = v; // a good alternative could be something like write(x, v)
|
|
||||||
}
|
|
||||||
ValueType v;
|
|
||||||
Iterator i;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class ConstantLvalueIteratorConcept {
|
|
||||||
public:
|
|
||||||
typedef typename std::iterator_traits<Iterator>::value_type value_type;
|
|
||||||
typedef typename std::iterator_traits<Iterator>::reference reference;
|
|
||||||
typedef typename boost::return_category<Iterator>::type return_category;
|
|
||||||
|
|
||||||
void constraints() {
|
|
||||||
boost::function_requires< ReadableIteratorConcept<Iterator> >();
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_convertible<return_category*,
|
|
||||||
boost::constant_lvalue_iterator_tag*>::value));
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_same<reference,
|
|
||||||
const value_type&>::value));
|
|
||||||
|
|
||||||
reference v = *i;
|
|
||||||
boost::ignore_unused_variable_warning(v);
|
|
||||||
}
|
|
||||||
Iterator i;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class MutableLvalueIteratorConcept {
|
|
||||||
public:
|
|
||||||
typedef typename std::iterator_traits<Iterator>::value_type value_type;
|
|
||||||
typedef typename std::iterator_traits<Iterator>::reference reference;
|
|
||||||
typedef typename boost::return_category<Iterator>::type return_category;
|
|
||||||
|
|
||||||
void constraints() {
|
|
||||||
boost::function_requires< ReadableIteratorConcept<Iterator> >();
|
|
||||||
boost::function_requires<
|
|
||||||
WritableIteratorConcept<Iterator, value_type> >();
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_convertible<return_category*,
|
|
||||||
boost::mutable_lvalue_iterator_tag*>::value));
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_same<reference, value_type&>::value));
|
|
||||||
|
|
||||||
reference v = *i;
|
|
||||||
boost::ignore_unused_variable_warning(v);
|
|
||||||
}
|
|
||||||
Iterator i;
|
|
||||||
};
|
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
// Iterator Traversal Concepts
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class ForwardIteratorConcept {
|
|
||||||
public:
|
|
||||||
typedef typename boost::traversal_category<Iterator>::type traversal_category;
|
|
||||||
|
|
||||||
void constraints() {
|
|
||||||
boost::function_requires< boost::SGIAssignableConcept<Iterator> >();
|
|
||||||
boost::function_requires< boost::EqualityComparableConcept<Iterator> >();
|
|
||||||
boost::function_requires<
|
|
||||||
boost::DefaultConstructibleConcept<Iterator> >();
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_convertible<traversal_category*,
|
|
||||||
boost::forward_traversal_tag*>::value));
|
|
||||||
++i;
|
|
||||||
(void)i++;
|
|
||||||
}
|
|
||||||
Iterator i;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class BidirectionalIteratorConcept {
|
|
||||||
public:
|
|
||||||
typedef typename boost::traversal_category<Iterator>::type traversal_category;
|
|
||||||
|
|
||||||
void constraints() {
|
|
||||||
boost::function_requires< ForwardIteratorConcept<Iterator> >();
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_convertible<traversal_category*,
|
|
||||||
boost::bidirectional_traversal_tag*>::value));
|
|
||||||
|
|
||||||
--i;
|
|
||||||
(void)i--;
|
|
||||||
}
|
|
||||||
Iterator i;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class RandomAccessIteratorConcept {
|
|
||||||
public:
|
|
||||||
typedef typename boost::traversal_category<Iterator>::type traversal_category;
|
|
||||||
typedef typename std::iterator_traits<Iterator>::difference_type
|
|
||||||
difference_type;
|
|
||||||
|
|
||||||
void constraints() {
|
|
||||||
boost::function_requires< BidirectionalIteratorConcept<Iterator> >();
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_convertible<traversal_category*,
|
|
||||||
boost::random_access_traversal_tag*>::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
|
|
@@ -1,73 +0,0 @@
|
|||||||
#include <boost/iterator_concepts.hpp>
|
|
||||||
#include <boost/operators.hpp>
|
|
||||||
|
|
||||||
struct new_iterator
|
|
||||||
: public boost::iterator<std::random_access_iterator_tag, int>,
|
|
||||||
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<std::random_access_iterator_tag, int>
|
|
||||||
{
|
|
||||||
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<int*> >();
|
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::RandomAccessIteratorConcept<int*> >();
|
|
||||||
|
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::ConstantLvalueIteratorConcept<const int*> >();
|
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::RandomAccessIteratorConcept<const int*> >();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::MutableLvalueIteratorConcept<new_iterator> >();
|
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::RandomAccessIteratorConcept<new_iterator> >();
|
|
||||||
|
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::MutableLvalueIteratorConcept<old_iterator> >();
|
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::RandomAccessIteratorConcept<old_iterator> >();
|
|
||||||
return 0;
|
|
||||||
}
|
|
@@ -1,160 +0,0 @@
|
|||||||
<html>
|
|
||||||
<!--
|
|
||||||
-- Copyright (c) Jeremy Siek 2000,2001
|
|
||||||
--
|
|
||||||
-- Permission to use, copy, modify, distribute and sell this software
|
|
||||||
-- and its documentation for any purpose is hereby granted without fee,
|
|
||||||
-- provided that the above copyright notice appears in all copies and
|
|
||||||
-- that both that copyright notice and this permission notice appear
|
|
||||||
-- in supporting documentation. I make no representations about the
|
|
||||||
-- suitability of this software for any purpose. It is provided "as is"
|
|
||||||
-- without express or implied warranty.
|
|
||||||
-->
|
|
||||||
<head>
|
|
||||||
<title>Boost Iterator Traits</title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
|
||||||
ALINK="#ff0000">
|
|
||||||
<IMG SRC="../../../../c++boost.gif"
|
|
||||||
ALT="C++ Boost" width="277" height="86">
|
|
||||||
<BR Clear>
|
|
||||||
|
|
||||||
<h1>Boost Iterator Category Traits</h1>
|
|
||||||
Header <tt><a href="../../boost/iterator_categories.hpp">boost/iterator_categories.hpp</a></tt>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The <tt>boost::traversal_category</tt> and
|
|
||||||
<tt>boost::return_category</tt> traits classes provides access to the
|
|
||||||
category tags for iterators that model the Boost <a
|
|
||||||
href="./iterator_concepts.htm">Iterator Concepts</a>, 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 <tt>std::iterator_traits</tt> class.
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><tt>traversal_category<Iter>::type</tt> Can the iterator go forward, backward, etc.?
|
|
||||||
<li><tt>return_category<Iter>::type</tt> Is the iterator read or write only?
|
|
||||||
Is the dereferenced type an lvalue?
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
An important feature of the <tt>boost::traversal_category</tt> and
|
|
||||||
<tt>boost::return_category</tt> classes is that they are <b>backwards
|
|
||||||
compatible</b>, i.e., they automatically work for iterators for which
|
|
||||||
there are valid definitions of <tt>std::iterator_traits</tt>. The old
|
|
||||||
<tt>iterator_category</tt> is mapped to the appropriate traversal and
|
|
||||||
return categories.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
When creating a new iterator type that is meant to work with
|
|
||||||
<tt>boost::traversal_category</tt> and
|
|
||||||
<tt>boost::return_category</tt>, 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
|
|
||||||
<tt>new_iterator_base</tt> to let the category traits know
|
|
||||||
that it will be able to find typedefs for <tt>traversal_category</tt>
|
|
||||||
and <tt>return_category</tt> in you iterator class.
|
|
||||||
|
|
||||||
|
|
||||||
Each of the new iterator requirements will need a category tag.
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
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 { };
|
|
||||||
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The following is pseudo-code for the iterator category traits classes.
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
namespace boost {
|
|
||||||
|
|
||||||
<i>// 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.</i>
|
|
||||||
struct new_iterator_base { };
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
struct return_category
|
|
||||||
{
|
|
||||||
<b><i>// Pseudo-code</i></b>
|
|
||||||
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*>
|
|
||||||
{
|
|
||||||
<b><i>// Pseudo-code</i></b>
|
|
||||||
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
|
|
||||||
{
|
|
||||||
<b><i>// Pseudo-code</i></b>
|
|
||||||
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;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<address><a href="mailto:jsiek@lsc.nd.edu">jeremy siek</a></address>
|
|
||||||
<!-- Created: Sun Mar 18 14:06:57 EST 2001 -->
|
|
||||||
<!-- hhmts start -->
|
|
||||||
Last modified: Mon Mar 19 12:59:30 EST 2001
|
|
||||||
<!-- hhmts end -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@@ -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
|
|
Binary file not shown.
Before Width: | Height: | Size: 3.2 KiB |
@@ -1,663 +0,0 @@
|
|||||||
<HTML>
|
|
||||||
<!--
|
|
||||||
-- Copyright (c) Jeremy Siek 2000
|
|
||||||
--
|
|
||||||
-- Permission to use, copy, modify, distribute and sell this software
|
|
||||||
-- and its documentation for any purpose is hereby granted without fee,
|
|
||||||
-- provided that the above copyright notice appears in all copies and
|
|
||||||
-- that both that copyright notice and this permission notice appear
|
|
||||||
-- in supporting documentation. I make no representations about the
|
|
||||||
-- suitability of this software for any purpose. It is provided "as is"
|
|
||||||
-- without express or implied warranty.
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
-- Copyright (c) 1996-1999
|
|
||||||
-- Silicon Graphics Computer Systems, Inc.
|
|
||||||
--
|
|
||||||
-- Permission to use, copy, modify, distribute and sell this software
|
|
||||||
-- and its documentation for any purpose is hereby granted without fee,
|
|
||||||
-- provided that the above copyright notice appears in all copies and
|
|
||||||
-- that both that copyright notice and this permission notice appear
|
|
||||||
-- in supporting documentation. Silicon Graphics makes no
|
|
||||||
-- representations about the suitability of this software for any
|
|
||||||
-- purpose. It is provided "as is" without express or implied warranty.
|
|
||||||
--
|
|
||||||
-- Copyright (c) 1994
|
|
||||||
-- Hewlett-Packard Company
|
|
||||||
--
|
|
||||||
-- Permission to use, copy, modify, distribute and sell this software
|
|
||||||
-- and its documentation for any purpose is hereby granted without fee,
|
|
||||||
-- provided that the above copyright notice appears in all copies and
|
|
||||||
-- that both that copyright notice and this permission notice appear
|
|
||||||
-- in supporting documentation. Hewlett-Packard Company makes no
|
|
||||||
-- representations about the suitability of this software for any
|
|
||||||
-- purpose. It is provided "as is" without express or implied warranty.
|
|
||||||
--
|
|
||||||
-->
|
|
||||||
<Head>
|
|
||||||
<Title>Iterator Concepts</Title>
|
|
||||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
|
||||||
ALINK="#ff0000">
|
|
||||||
<IMG SRC="../../../../c++boost.gif"
|
|
||||||
ALT="C++ Boost" width="277" height="86">
|
|
||||||
|
|
||||||
<BR Clear>
|
|
||||||
|
|
||||||
|
|
||||||
<h1>Iterator Concepts</h1>
|
|
||||||
|
|
||||||
<p>The standard iterator categories and requirements are flawed because
|
|
||||||
they use a single hierarchy of requirements to address two orthogonal
|
|
||||||
issues: <b><i>iterator traversal</i></b> and <b><i>dereference return
|
|
||||||
type</i></b>. 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.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The iterator requirements should be separated into two hierarchies.
|
|
||||||
One set of concepts handles the return type semantics:
|
|
||||||
<ul>
|
|
||||||
<li><a href="#concept:ReadableIterator">Readable Iterator</a></li>
|
|
||||||
<li><a href="#concept:WritableIterator">Writable Iterator</a></li>
|
|
||||||
<li><a href="#concept:SwappableIterator">Swappable Iterator</a></li>
|
|
||||||
<li><a href="#concept:ConstantLvalueIterator">Constant Lvalue Iterator</a></li>
|
|
||||||
<li><a href="#concept:MutableLvalueIterator">Mutable Lvalue Iterator</a></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
The other set of concepts handles iterator traversal:
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><a href="#concept:ForwardTraversalIterator">Forward Traversal Iterator</a></li>
|
|
||||||
<li><a href="#concept:BidirectionalTraversalIterator">Bidirectional Traversal Iterator</a></li>
|
|
||||||
<li><a href="#concept:RandomAccessTraversalIterator">Random Access Traversal Iterator</a></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
<p></p>
|
|
||||||
<DIV ALIGN="CENTER"><A NAME="fig:graph-concepts"></A></A>
|
|
||||||
<TABLE>
|
|
||||||
<CAPTION ALIGN="TOP"><STRONG>Figure 1:</STRONG>
|
|
||||||
The iterator concepts and refinement relationships.
|
|
||||||
</CAPTION>
|
|
||||||
<TR><TD><IMG SRC="./iterator_concepts.gif" ></TD></TR>
|
|
||||||
</TABLE>
|
|
||||||
</DIV>
|
|
||||||
<p></p>
|
|
||||||
|
|
||||||
|
|
||||||
<h2>Relationship with the standard iterator concepts</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
std::Input Iterator implies boost::ReadableIterator.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
std::Output Iterator implies boost::Writable Iterator.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
std::Forward Iterator refines boost::Forward Iterator and
|
|
||||||
boost::Constant Lvalue Iterator or boost::Mutable Lvalue Iterator.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
std::Bidirectional Iterator refines boost::Bidirectional Iterator and
|
|
||||||
boost::Constant Lvalue Iterator or boost::Mutable Lvalue Iterator.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
std::Random Access Iterator refines boost::Random Access Iterator and
|
|
||||||
boost::Constant Lvalue Iterator or boost::Mutable Lvalue Iterator.
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Notation</h3>
|
|
||||||
<Table>
|
|
||||||
<tr>
|
|
||||||
<td><tt>X</tt></td>
|
|
||||||
<td>The iterator type.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><tt>T</tt></td>
|
|
||||||
<td>The value type of <tt>X</tt>, i.e., <tt>std::iterator_traits<X>::value_type</tt>.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><tt>x</tt>, <tt>y</tt></td>
|
|
||||||
<td>An object of type <tt>X</tt>.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><tt>t</tt></td>
|
|
||||||
<td>An object of type <tt>T</tt>.</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<!--------------------------------------------------------------------------->
|
|
||||||
|
|
||||||
<H3><A NAME="concept:ReadableIterator"></A>
|
|
||||||
Readable Iterator
|
|
||||||
</H3>
|
|
||||||
|
|
||||||
A Readable Iterator is an iterator that dereferences to produce an
|
|
||||||
rvalue that is convertible to the <tt>value_type</tt> of the
|
|
||||||
iterator.
|
|
||||||
|
|
||||||
<h3>Associated Types</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Value type</td>
|
|
||||||
<td><tt>std::iterator_traits<X>::value_type</tt></td>
|
|
||||||
<td>The type of the objects pointed to by the iterator.</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Reference type</td>
|
|
||||||
<td><tt>std::iterator_traits<X>::reference</tt></td>
|
|
||||||
<td>
|
|
||||||
The return type of dereferencing the iterator. This
|
|
||||||
type must be convertible to <tt>T</tt>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Return Category</td>
|
|
||||||
<td><tt>std::return_category<X>::type</tt></td>
|
|
||||||
<td>
|
|
||||||
A type convertible to <tt>std::readable_iterator_tag</tt>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</Table>
|
|
||||||
|
|
||||||
<h3>Refinement of</h3>
|
|
||||||
|
|
||||||
<A href="http://www.boost.org/libs/utility/CopyConstructible.html">Copy Constructible</A>
|
|
||||||
|
|
||||||
<h3>Valid expressions</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr><TH>Name</TH><TH>Expression</TH><TH>Type requirements</TH><TH>Return type</TH></tr>
|
|
||||||
<tr>
|
|
||||||
<td>Dereference</td>
|
|
||||||
<td><tt>*x</tt></td>
|
|
||||||
<td> </td>
|
|
||||||
<td><tt>std::iterator_traits<X>::reference</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Member access</td>
|
|
||||||
<td><tt>x->m</tt></td>
|
|
||||||
<td><tt>T</tt> is a type with a member named <tt>m</tt>.</td>
|
|
||||||
<td>
|
|
||||||
If <tt>m</tt> is a data member, the type of <tt>m</tt>.
|
|
||||||
If <tt>m</tt> is a member function, the return type of <tt>m</tt>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<!--------------------------------------------------------------------------->
|
|
||||||
|
|
||||||
<H3><A NAME="concept:WritableIterator"></A>
|
|
||||||
Writable Iterator
|
|
||||||
</H3>
|
|
||||||
|
|
||||||
A Writable Iterator is an iterator that can be used to store a value
|
|
||||||
using the dereference-assignment expression.
|
|
||||||
|
|
||||||
<h3>Definitions</h3>
|
|
||||||
|
|
||||||
If <tt>x</tt> is an Writable Iterator of type <tt>X</tt>, then the
|
|
||||||
expression <tt>*x = a;</tt> stores the value <tt>a</tt> into
|
|
||||||
<tt>x</tt>. Note that <tt>operator=</tt>, like other C++ functions,
|
|
||||||
may be overloaded; it may, in fact, even be a template function. In
|
|
||||||
general, then, <tt>a</tt> may be any of several different types. A
|
|
||||||
type <tt>A</tt> belongs to the <i>set of value types</i> of <tt>X</tt>
|
|
||||||
if, for an object <tt>a</tt> of type <tt>A</tt>, <tt>*x = a;</tt> is
|
|
||||||
well-defined and does not require performing any non-trivial
|
|
||||||
conversions on <tt>a</tt>.
|
|
||||||
|
|
||||||
<h3>Associated Types</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Return Category</td>
|
|
||||||
<td><tt>std::return_category<X>::type</tt></td>
|
|
||||||
<td>
|
|
||||||
A type convertible to <tt>std::writable_iterator_tag</tt>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</Table>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Refinement of</h3>
|
|
||||||
|
|
||||||
<A href="http://www.boost.org/libs/utility/CopyConstructible.html">Copy Constructible</A>
|
|
||||||
|
|
||||||
<h3>Valid expressions</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr>
|
|
||||||
<TH>Name</TH><TH>Expression</TH><TH>Return type</TH>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Dereference assignment</td>
|
|
||||||
<td><tt>*x = a</tt></td>
|
|
||||||
<td>unspecified</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<!--------------------------------------------------------------------------->
|
|
||||||
|
|
||||||
<H3><A NAME="concept:SwappableIterator"></A>
|
|
||||||
Swappable Iterator
|
|
||||||
</H3>
|
|
||||||
|
|
||||||
A Swappable Iterator is an iterator whose dereferenced values can be
|
|
||||||
swapped.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Note: the requirements for Swappable Iterator are dependent on the
|
|
||||||
issues surrounding <tt>std::swap()</tt> being resolved. Here we assume
|
|
||||||
that the issue will be resolved by allowing the overload of
|
|
||||||
<tt>std::swap()</tt> for user-defined types.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Note: Readable Iterator and Writable Iterator combined implies
|
|
||||||
Swappable Iterator because of the fully templated
|
|
||||||
<tt>std::swap()</tt>. However, Swappable Iterator does not imply
|
|
||||||
Readable Iterator nor Writable Iterator.
|
|
||||||
|
|
||||||
<h3>Associated Types</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Return Category</td>
|
|
||||||
<td><tt>std::return_category<X>::type</tt></td>
|
|
||||||
<td>
|
|
||||||
A type convertible to <tt>std::swappable_iterator_tag</tt>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</Table>
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Valid expressions</h3>
|
|
||||||
|
|
||||||
Of the two valid expressions listed below, only one <b>OR</b> the
|
|
||||||
other is required. If <tt>std::iter_swap()</tt> is overloaded for
|
|
||||||
<tt>X</tt> then <tt>std::swap()</tt> is not required. If
|
|
||||||
<tt>std::iter_swap()</tt> is not overloaded for <tt>X</tt> then the
|
|
||||||
default (fully templated) version is used, which will call
|
|
||||||
<tt>std::swap()</tt> (this means changing the current requirements for
|
|
||||||
<tt>std::iter_swap()</tt>).
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<Table border>
|
|
||||||
<tr>
|
|
||||||
<TH>Name</TH><TH>Expression</TH><TH>Return type</TH>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Iterator Swap</td>
|
|
||||||
<td><tt>std::iter_swap(x, y)</tt></td>
|
|
||||||
<td>void</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Dereference and Swap</td>
|
|
||||||
<td><tt>std::swap(*x, *y)</tt></td>
|
|
||||||
<td>void</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<!--------------------------------------------------------------------------->
|
|
||||||
|
|
||||||
<H3><A NAME="concept:ConstantLvalueIterator"></A>
|
|
||||||
Constant Lvalue Iterator
|
|
||||||
</H3>
|
|
||||||
|
|
||||||
A Constant Lvalue Iterator is an iterator that dereferences to produce a
|
|
||||||
const reference to the pointed-to object, i.e., the associated
|
|
||||||
<tt>reference</tt> type is <tt>const T&</tt>. Changing the value
|
|
||||||
of or destroying an iterator that models Constant Lvalue Iterator does
|
|
||||||
not invalidate pointers and references previously obtained from that
|
|
||||||
iterator.
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Refinement of</h3>
|
|
||||||
|
|
||||||
<a href="#concept:ReadableIterator">Readable Iterator</a>
|
|
||||||
|
|
||||||
<h3>Associated Types</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Reference type</td>
|
|
||||||
<td><tt>std::iterator_traits<X>::reference</tt></td>
|
|
||||||
<td>
|
|
||||||
The return type of dereferencing the iterator, which must be
|
|
||||||
<tt>const T&</tt>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<!-- I don't think this is needed
|
|
||||||
<tr>
|
|
||||||
<td>Pointer type</td>
|
|
||||||
<td><tt>std::iterator_traits<X>::pointer</tt></td>
|
|
||||||
<td>
|
|
||||||
The pointer to the value type, which must be <tt>const T*</tt>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Return Category</td>
|
|
||||||
<td><tt>std::return_category<X>::type</tt></td>
|
|
||||||
<td>
|
|
||||||
A type convertible to <tt>std::constant_lvalue_iterator_tag</tt>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<!-- these are not necessary now that we use reference as operator* return type
|
|
||||||
<h3>Valid expressions</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr><TH>Name</TH><TH>Expression</TH><TH>Type requirements</TH><TH>Return type</TH></tr>
|
|
||||||
<tr>
|
|
||||||
<td>Dereference</td>
|
|
||||||
<td><tt>*x</tt></td>
|
|
||||||
<td> </td>
|
|
||||||
<td><tt>std::iterator_traits<X>::reference</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Member access</td>
|
|
||||||
<td><tt>x->m</tt></td>
|
|
||||||
<td><tt>T</tt> is a type with a member named <tt>m</tt>.</td>
|
|
||||||
<td>
|
|
||||||
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<!--------------------------------------------------------------------------->
|
|
||||||
|
|
||||||
<H3><A NAME="concept:MutableLvalueIterator"></A>
|
|
||||||
Mutable Lvalue Iterator
|
|
||||||
</H3>
|
|
||||||
|
|
||||||
A Mutable Lvalue Iterator is an iterator that dereferences to produce a
|
|
||||||
reference to the pointed-to object. The associated <tt>reference</tt>
|
|
||||||
type is <tt>T&</tt>. Changing the value of or destroying an
|
|
||||||
iterator that models Mutable Lvalue Iterator does not invalidate
|
|
||||||
pointers and references previously obtained from that iterator.
|
|
||||||
|
|
||||||
<h3>Refinement of</h3>
|
|
||||||
|
|
||||||
<a href="#concept:ReadableIterator">Readable Iterator</a>,
|
|
||||||
<a href="#concept:WritableIterator">Writable Iterator</a>,
|
|
||||||
and <a href="#concept:SwappableIterator">Swappable Iterator</a>.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Associated Types</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Reference type</td>
|
|
||||||
<td><tt>std::iterator_traits<X>::reference</tt></td>
|
|
||||||
<td>The return type of dereferencing the iterator, which must be
|
|
||||||
<tt>T&</tt>.</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<!-- I don't think this is necessary
|
|
||||||
<tr>
|
|
||||||
<td>Pointer type</td>
|
|
||||||
<td><tt>std::iterator_traits<X>::pointer</tt></td>
|
|
||||||
<td>
|
|
||||||
The pointer to the value type, which is <tt>T*</tt>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Return Category</td>
|
|
||||||
<td><tt>std::return_category<X>::type</tt></td>
|
|
||||||
<td>
|
|
||||||
A type convertible to <tt>std::mutable_lvalue_iterator_tag</tt>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<!-- no longer needed since the return type is specified as reference in the readable iterator
|
|
||||||
<h3>Valid expressions</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr><TH>Name</TH><TH>Expression</TH><TH>Type requirements</TH><TH>Return type</TH></tr>
|
|
||||||
<tr>
|
|
||||||
<td>Dereference</td>
|
|
||||||
<td><tt>*x</tt></td>
|
|
||||||
<td> </td>
|
|
||||||
<td><tt>std::iterator_traits<X>::reference</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Member access</td>
|
|
||||||
<td><tt>x->m</tt></td>
|
|
||||||
<td><tt>T</tt> is a type with a member named <tt>m</tt>.</td>
|
|
||||||
<td>
|
|
||||||
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<hr>
|
|
||||||
<!--------------------------------------------------------------------------->
|
|
||||||
|
|
||||||
<H3><A NAME="concept:ForwardTraversalIterator"></A>
|
|
||||||
Forward Traversal Iterator
|
|
||||||
</H3>
|
|
||||||
|
|
||||||
The Forward Iterator is an iterator that can be incremented. Also, it
|
|
||||||
is permissible to make multiple passes through the iterator's range.
|
|
||||||
|
|
||||||
<h3>Refinement of</h3>
|
|
||||||
|
|
||||||
<A href="http://www.boost.org/libs/utility/CopyConstructible.html">Copy Constructible</A>,
|
|
||||||
<A href="http://www.boost.org/libs/utility/Assignable.html">Assignable</A>,
|
|
||||||
<A href="http://www.sgi.com/tech/stl/DefaultConstructible.html">Default Constructible</A>, and
|
|
||||||
<A href="http://www.sgi.com/tech/stl/EqualityComparable.html">Equality Comparable</A>
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Associated types</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Difference Type</td>
|
|
||||||
<td><tt>std::iterator_traits<X>::difference_type</tt></td>
|
|
||||||
<td>
|
|
||||||
A signed integral type used for representing distances
|
|
||||||
between iterators that point into the same range.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Traversal Category</td>
|
|
||||||
<td><tt>std::traversal_category<X>::type</tt></td>
|
|
||||||
<td>
|
|
||||||
A type convertible to <tt>std::forward_traversal_tag</tt>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</Table>
|
|
||||||
|
|
||||||
<h3>Valid expressions</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr>
|
|
||||||
<TH>Name</TH><TH>Expression</TH><TH>Type requirements</TH>
|
|
||||||
<TH>Return type</TH>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Preincrement</td>
|
|
||||||
<td><tt>++i</tt></td><td> </td><td><tt>X&</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Postincrement</td>
|
|
||||||
<td><tt>i++</tt></td><td> </td><td>convertible to <tt>const X&</tt></td>
|
|
||||||
</tr>
|
|
||||||
</Table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<hr>
|
|
||||||
<!--------------------------------------------------------------------------->
|
|
||||||
|
|
||||||
<H3><A NAME="concept:BidirectionalTraversalIterator"></A>
|
|
||||||
Bidirectional Traversal Iterator
|
|
||||||
</H3>
|
|
||||||
|
|
||||||
An iterator that can be incremented and decremented.
|
|
||||||
|
|
||||||
<h3>Refinement of</h3>
|
|
||||||
|
|
||||||
<a href="#concept:ForwardTraversalIterator">Forward Traversal Iterator</a>
|
|
||||||
|
|
||||||
<h3>Associated types</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr>
|
|
||||||
<td>Traversal Category</td>
|
|
||||||
<td><tt>std::traversal_category<X>::type</tt></td>
|
|
||||||
<td>
|
|
||||||
A type convertible to <tt>std::bidirectional_traversal_tag</tt>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</Table>
|
|
||||||
|
|
||||||
<h3>Valid expressions</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr>
|
|
||||||
<TH>Name</TH><TH>Expression</TH><TH>Type requirements</TH>
|
|
||||||
<TH>Return type</TH>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Predecrement</td>
|
|
||||||
<td><tt>--i</tt></td><td> </td><td><tt>X&</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Postdecrement</td>
|
|
||||||
<td><tt>i--</tt></td><td> </td><td>convertible to <tt>const X&</tt></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<hr>
|
|
||||||
<!--------------------------------------------------------------------------->
|
|
||||||
|
|
||||||
<H3><A NAME="concept:RandomAccessTraversalIterator"></A>
|
|
||||||
Random Access Traversal Iterator
|
|
||||||
</H3>
|
|
||||||
|
|
||||||
An iterator that provides constant-time methods for moving forward and
|
|
||||||
backward in arbitrary-sized steps.
|
|
||||||
|
|
||||||
<h3>Refinement of</h3>
|
|
||||||
|
|
||||||
<a href="#concept:BidirectionalTraversalIterator">Bidirectional Traversal Iterator</a> and
|
|
||||||
<A href="http://www.sgi.com/tech/stl/LessThanComparable.html">Less Than Comparable</A> where <tt><</tt> is a total ordering
|
|
||||||
|
|
||||||
<h3>Associated types</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr>
|
|
||||||
<td>Traversal Category</td>
|
|
||||||
<td><tt>std::traversal_category<X>::type</tt></td>
|
|
||||||
<td>
|
|
||||||
A type convertible to <tt>std::random_access_traversal_tag</tt>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</Table>
|
|
||||||
|
|
||||||
<h3>Valid expressions</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr><TH>Name</TH><TH>Expression</TH><TH>Type requirements</TH>
|
|
||||||
<TH>Return type</TH>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Iterator addition</td>
|
|
||||||
<td><tt>i += n</tt></td><td> </td><td><tt>X&</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Iterator addition</td>
|
|
||||||
<td><tt>i + n</tt> or <tt>n + i</tt></td><td> </td><td><tt>X</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Iterator subtraction</td>
|
|
||||||
<td><tt>i -= n</tt></td><td> </td><td><tt>X&</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Iterator subtraction</td>
|
|
||||||
<td><tt>i - n</tt></td><td> </td><td><tt>X</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Difference</td>
|
|
||||||
<td><tt>i - j</tt></td><td> </td><td><tt>std::iterator_traits<X>::difference_type</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Element operator</td>
|
|
||||||
<td><tt>i[n]</tt></td>
|
|
||||||
<td><tt>X</tt> must also be a model of
|
|
||||||
<a href="#concept:ReadableIterator">Readable Iterator</a>. </td>
|
|
||||||
<td><tt>std::iterator_traits<X>::reference</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Element assignment</td>
|
|
||||||
<td><tt>i[n] = t</tt></td>
|
|
||||||
<td><tt>X</tt> must also be a model of
|
|
||||||
<a href="#concept:WritableIterator">Writable Iterator</a>.</td>
|
|
||||||
<td>unspecified</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|
|
||||||
<HR>
|
|
||||||
<TABLE>
|
|
||||||
<TR valign=top>
|
|
||||||
<TD nowrap>Copyright © 2000</TD><TD>
|
|
||||||
<A HREF="../../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
|
||||||
</TD></TR></TABLE>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@@ -53,21 +53,21 @@ older Boost Iterator Adaptor Library.</td>
|
|||||||
<div class="contents topic" id="table-of-contents">
|
<div class="contents topic" id="table-of-contents">
|
||||||
<p class="topic-title"><a name="table-of-contents"><strong>Table of Contents</strong></a></p>
|
<p class="topic-title"><a name="table-of-contents"><strong>Table of Contents</strong></a></p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="#new-style-iterators" id="id22" name="id22">New-Style Iterators</a></li>
|
<li><a class="reference" href="#new-style-iterators" id="id21" name="id21">New-Style Iterators</a></li>
|
||||||
<li><a class="reference" href="#iterator-facade-and-adaptor" id="id23" name="id23">Iterator Facade and Adaptor</a></li>
|
<li><a class="reference" href="#iterator-facade-and-adaptor" id="id22" name="id22">Iterator Facade and Adaptor</a></li>
|
||||||
<li><a class="reference" href="#specialized-adaptors" id="id24" name="id24">Specialized Adaptors</a></li>
|
<li><a class="reference" href="#specialized-adaptors" id="id23" name="id23">Specialized Adaptors</a></li>
|
||||||
<li><a class="reference" href="#iterator-utilities" id="id25" name="id25">Iterator Utilities</a><ul>
|
<li><a class="reference" href="#iterator-utilities" id="id24" name="id24">Iterator Utilities</a><ul>
|
||||||
<li><a class="reference" href="#traits" id="id26" name="id26">Traits</a></li>
|
<li><a class="reference" href="#traits" id="id25" name="id25">Traits</a></li>
|
||||||
<li><a class="reference" href="#testing-and-concept-checking" id="id27" name="id27">Testing and Concept Checking</a></li>
|
<li><a class="reference" href="#testing-and-concept-checking" id="id26" name="id26">Testing and Concept Checking</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a class="reference" href="#upgrading-from-the-old-boost-iterator-adaptor-library" id="id28" name="id28">Upgrading from the old Boost Iterator Adaptor Library</a></li>
|
<li><a class="reference" href="#upgrading-from-the-old-boost-iterator-adaptor-library" id="id27" name="id27">Upgrading from the old Boost Iterator Adaptor Library</a></li>
|
||||||
<li><a class="reference" href="#history" id="id29" name="id29">History</a></li>
|
<li><a class="reference" href="#history" id="id28" name="id28">History</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
<div class="section" id="new-style-iterators">
|
<div class="section" id="new-style-iterators">
|
||||||
<h1><a class="toc-backref" href="#id22" name="new-style-iterators">New-Style Iterators</a></h1>
|
<h1><a class="toc-backref" href="#id21" name="new-style-iterators">New-Style Iterators</a></h1>
|
||||||
<p>The iterator categories defined in C++98 are extremely limiting
|
<p>The iterator categories defined in C++98 are extremely limiting
|
||||||
because they bind together two orthogonal concepts: traversal and
|
because they bind together two orthogonal concepts: traversal and
|
||||||
element access. For example, because a random access iterator is
|
element access. For example, because a random access iterator is
|
||||||
@@ -86,7 +86,7 @@ concepts, see our</p>
|
|||||||
<a class="reference" href="new-iter-concepts.html">Standard Proposal For New-Style Iterators</a> (<a class="reference" href="new-iter-concepts.pdf">PDF</a>)</blockquote>
|
<a class="reference" href="new-iter-concepts.html">Standard Proposal For New-Style Iterators</a> (<a class="reference" href="new-iter-concepts.pdf">PDF</a>)</blockquote>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="iterator-facade-and-adaptor">
|
<div class="section" id="iterator-facade-and-adaptor">
|
||||||
<h1><a class="toc-backref" href="#id23" name="iterator-facade-and-adaptor">Iterator Facade and Adaptor</a></h1>
|
<h1><a class="toc-backref" href="#id22" name="iterator-facade-and-adaptor">Iterator Facade and Adaptor</a></h1>
|
||||||
<p>Writing standard-conforming iterators is tricky, but the need comes
|
<p>Writing standard-conforming iterators is tricky, but the need comes
|
||||||
up often. In order to ease the implementation of new iterators,
|
up often. In order to ease the implementation of new iterators,
|
||||||
the Boost.Iterator library provides the <tt class="literal"><span class="pre">iterator_facade</span></tt> class template,
|
the Boost.Iterator library provides the <tt class="literal"><span class="pre">iterator_facade</span></tt> class template,
|
||||||
@@ -113,7 +113,7 @@ and accepted into the first C++ technical report; see our</p>
|
|||||||
<p>for more details.</p>
|
<p>for more details.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="specialized-adaptors">
|
<div class="section" id="specialized-adaptors">
|
||||||
<h1><a class="toc-backref" href="#id24" name="specialized-adaptors">Specialized Adaptors</a></h1>
|
<h1><a class="toc-backref" href="#id23" name="specialized-adaptors">Specialized Adaptors</a></h1>
|
||||||
<p>The iterator library supplies a useful suite of standard-conforming
|
<p>The iterator library supplies a useful suite of standard-conforming
|
||||||
iterator templates based on the Boost <a class="reference" href="#iterator-facade-and-adaptor">iterator facade and adaptor</a>.</p>
|
iterator templates based on the Boost <a class="reference" href="#iterator-facade-and-adaptor">iterator facade and adaptor</a>.</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
@@ -121,9 +121,6 @@ iterator templates based on the Boost <a class="reference" href="#iterator-facad
|
|||||||
Implements a "lazy sequence"</li>
|
Implements a "lazy sequence"</li>
|
||||||
<li><a class="reference" href="filter_iterator.html"><tt class="literal"><span class="pre">filter_iterator</span></tt></a> (<a class="reference" href="filter_iterator.pdf">PDF</a>): an iterator over the subset of elements of some
|
<li><a class="reference" href="filter_iterator.html"><tt class="literal"><span class="pre">filter_iterator</span></tt></a> (<a class="reference" href="filter_iterator.pdf">PDF</a>): an iterator over the subset of elements of some
|
||||||
sequence which satisfy a given predicate</li>
|
sequence which satisfy a given predicate</li>
|
||||||
<li><a class="reference" href="function_output_iterator.html"><tt class="literal"><span class="pre">function_output_iterator</span></tt></a> (<a class="reference" href="function_output_iterator.pdf">PDF</a>): an output iterator wrapping a unary function
|
|
||||||
object; each time an element is written into the dereferenced
|
|
||||||
iterator, it is passed as a parameter to the function object.</li>
|
|
||||||
<li><a class="reference" href="indirect_iterator.html"><tt class="literal"><span class="pre">indirect_iterator</span></tt></a> (<a class="reference" href="indirect_iterator.pdf">PDF</a>): an iterator over the objects <em>pointed-to</em> by the
|
<li><a class="reference" href="indirect_iterator.html"><tt class="literal"><span class="pre">indirect_iterator</span></tt></a> (<a class="reference" href="indirect_iterator.pdf">PDF</a>): an iterator over the objects <em>pointed-to</em> by the
|
||||||
elements of some sequence.</li>
|
elements of some sequence.</li>
|
||||||
<li><a class="reference" href="permutation_iterator.html"><tt class="literal"><span class="pre">permutation_iterator</span></tt></a> (<a class="reference" href="permutation_iterator.pdf">PDF</a>): an iterator over the elements of some random-access
|
<li><a class="reference" href="permutation_iterator.html"><tt class="literal"><span class="pre">permutation_iterator</span></tt></a> (<a class="reference" href="permutation_iterator.pdf">PDF</a>): an iterator over the elements of some random-access
|
||||||
@@ -131,8 +128,6 @@ sequence, rearranged according to some sequence of integer indices.</li>
|
|||||||
<li><a class="reference" href="reverse_iterator.html"><tt class="literal"><span class="pre">reverse_iterator</span></tt></a> (<a class="reference" href="reverse_iterator.pdf">PDF</a>): an iterator which traverses the elements of some
|
<li><a class="reference" href="reverse_iterator.html"><tt class="literal"><span class="pre">reverse_iterator</span></tt></a> (<a class="reference" href="reverse_iterator.pdf">PDF</a>): an iterator which traverses the elements of some
|
||||||
bidirectional sequence in reverse. Corrects many of the
|
bidirectional sequence in reverse. Corrects many of the
|
||||||
shortcomings of C++98's <tt class="literal"><span class="pre">std::reverse_iterator</span></tt>.</li>
|
shortcomings of C++98's <tt class="literal"><span class="pre">std::reverse_iterator</span></tt>.</li>
|
||||||
<li><a class="reference" href="../../utility/shared_container_iterator.html"><tt class="literal"><span class="pre">shared_container_iterator</span></tt></a>: an iterator over elements of a container whose
|
|
||||||
lifetime is maintained by a <a class="reference" href="../../smart_ptr/shared_ptr.htm"><tt class="literal"><span class="pre">shared_ptr</span></tt></a> stored in the iterator.</li>
|
|
||||||
<li><a class="reference" href="transform_iterator.html"><tt class="literal"><span class="pre">transform_iterator</span></tt></a> (<a class="reference" href="transform_iterator.pdf">PDF</a>): an iterator over elements which are the result of
|
<li><a class="reference" href="transform_iterator.html"><tt class="literal"><span class="pre">transform_iterator</span></tt></a> (<a class="reference" href="transform_iterator.pdf">PDF</a>): an iterator over elements which are the result of
|
||||||
applying some functional transformation to the elements of an
|
applying some functional transformation to the elements of an
|
||||||
underlying sequence. This component also replaces the old
|
underlying sequence. This component also replaces the old
|
||||||
@@ -142,9 +137,9 @@ positions of heterogeneous underlying iterators.</li>
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="iterator-utilities">
|
<div class="section" id="iterator-utilities">
|
||||||
<h1><a class="toc-backref" href="#id25" name="iterator-utilities">Iterator Utilities</a></h1>
|
<h1><a class="toc-backref" href="#id24" name="iterator-utilities">Iterator Utilities</a></h1>
|
||||||
<div class="section" id="traits">
|
<div class="section" id="traits">
|
||||||
<h2><a class="toc-backref" href="#id26" name="traits">Traits</a></h2>
|
<h2><a class="toc-backref" href="#id25" name="traits">Traits</a></h2>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="pointee.html"><tt class="literal"><span class="pre">pointee.hpp</span></tt></a> (<a class="reference" href="pointee.pdf">PDF</a>): Provides the capability to deduce the referent types
|
<li><a class="reference" href="pointee.html"><tt class="literal"><span class="pre">pointee.hpp</span></tt></a> (<a class="reference" href="pointee.pdf">PDF</a>): Provides the capability to deduce the referent types
|
||||||
of pointers, smart pointers and iterators in generic code. Used
|
of pointers, smart pointers and iterators in generic code. Used
|
||||||
@@ -158,7 +153,7 @@ testing iterator interoperability -->
|
|||||||
<!-- comment! __ interoperable.pdf -->
|
<!-- comment! __ interoperable.pdf -->
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="testing-and-concept-checking">
|
<div class="section" id="testing-and-concept-checking">
|
||||||
<h2><a class="toc-backref" href="#id27" name="testing-and-concept-checking">Testing and Concept Checking</a></h2>
|
<h2><a class="toc-backref" href="#id26" name="testing-and-concept-checking">Testing and Concept Checking</a></h2>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="iterator_concepts.html"><tt class="literal"><span class="pre">iterator_concepts.hpp</span></tt></a> (<a class="reference" href="iterator_concepts.pdf">PDF</a>): Concept checking classes for the new iterator concepts.</li>
|
<li><a class="reference" href="iterator_concepts.html"><tt class="literal"><span class="pre">iterator_concepts.hpp</span></tt></a> (<a class="reference" href="iterator_concepts.pdf">PDF</a>): Concept checking classes for the new iterator concepts.</li>
|
||||||
<li><a class="reference" href="iterator_archetypes.html"><tt class="literal"><span class="pre">iterator_archetypes.hpp</span></tt></a> (<a class="reference" href="iterator_archetypes.pdf">PDF</a>): Concept archetype classes for the new iterators concepts.</li>
|
<li><a class="reference" href="iterator_archetypes.html"><tt class="literal"><span class="pre">iterator_archetypes.hpp</span></tt></a> (<a class="reference" href="iterator_archetypes.pdf">PDF</a>): Concept archetype classes for the new iterators concepts.</li>
|
||||||
@@ -166,7 +161,7 @@ testing iterator interoperability -->
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="upgrading-from-the-old-boost-iterator-adaptor-library">
|
<div class="section" id="upgrading-from-the-old-boost-iterator-adaptor-library">
|
||||||
<h1><a class="toc-backref" href="#id28" name="upgrading-from-the-old-boost-iterator-adaptor-library">Upgrading from the old Boost Iterator Adaptor Library</a></h1>
|
<h1><a class="toc-backref" href="#id27" name="upgrading-from-the-old-boost-iterator-adaptor-library">Upgrading from the old Boost Iterator Adaptor Library</a></h1>
|
||||||
<a class="target" id="upgrading" name="upgrading"></a><p>If you have been using the old Boost Iterator Adaptor library to
|
<a class="target" id="upgrading" name="upgrading"></a><p>If you have been using the old Boost Iterator Adaptor library to
|
||||||
implement iterators, you probably wrote a <tt class="literal"><span class="pre">Policies</span></tt> class which
|
implement iterators, you probably wrote a <tt class="literal"><span class="pre">Policies</span></tt> class which
|
||||||
captures the core operations of your iterator. In the new library
|
captures the core operations of your iterator. In the new library
|
||||||
@@ -176,7 +171,7 @@ you probably wrote a <a class="reference" href="../../../more/generic_programmin
|
|||||||
<tt class="literal"><span class="pre">iterator_adaptor</span></tt> specialization you needed; in the new library
|
<tt class="literal"><span class="pre">iterator_adaptor</span></tt> specialization you needed; in the new library
|
||||||
design you don't need a type generator (though may want to keep it
|
design you don't need a type generator (though may want to keep it
|
||||||
around as a compatibility aid for older code) because, due to the
|
around as a compatibility aid for older code) because, due to the
|
||||||
use of the Curiously Recurring Template Pattern (CRTP) <a class="citation-reference" href="#cop95" id="id21" name="id21">[Cop95]</a>,
|
use of the Curiously Recurring Template Pattern (CRTP) <a class="citation-reference" href="#cop95" id="id20" name="id20">[Cop95]</a>,
|
||||||
you can now define the iterator class yourself and acquire
|
you can now define the iterator class yourself and acquire
|
||||||
functionality through inheritance from <tt class="literal"><span class="pre">iterator_facade</span></tt> or
|
functionality through inheritance from <tt class="literal"><span class="pre">iterator_facade</span></tt> or
|
||||||
<tt class="literal"><span class="pre">iterator_adaptor</span></tt>. As a result, you also get much finer control
|
<tt class="literal"><span class="pre">iterator_adaptor</span></tt>. As a result, you also get much finer control
|
||||||
@@ -191,7 +186,7 @@ type, <tt class="literal"><span class="pre">transform_iterator</span></tt> will
|
|||||||
<tt class="literal"><span class="pre">projection_iterator</span></tt> used to.</p>
|
<tt class="literal"><span class="pre">projection_iterator</span></tt> used to.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="history">
|
<div class="section" id="history">
|
||||||
<h1><a class="toc-backref" href="#id29" name="history">History</a></h1>
|
<h1><a class="toc-backref" href="#id28" name="history">History</a></h1>
|
||||||
<p>In 2000 Dave Abrahams was writing an iterator for a container of
|
<p>In 2000 Dave Abrahams was writing an iterator for a container of
|
||||||
pointers, which would access the pointed-to elements when
|
pointers, which would access the pointed-to elements when
|
||||||
dereferenced. Naturally, being a library writer, he decided to
|
dereferenced. Naturally, being a library writer, he decided to
|
||||||
@@ -220,7 +215,7 @@ library you see today.</p>
|
|||||||
<colgroup><col class="label" /><col /></colgroup>
|
<colgroup><col class="label" /><col /></colgroup>
|
||||||
<col />
|
<col />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td class="label"><a class="fn-backref" href="#id21" name="cop95">[Cop95]</a></td><td>[Coplien, 1995] Coplien, J., Curiously Recurring Template
|
<tr><td class="label"><a class="fn-backref" href="#id20" name="cop95">[Cop95]</a></td><td>[Coplien, 1995] Coplien, J., Curiously Recurring Template
|
||||||
Patterns, C++ Report, February 1995, pp. 24-27.</td></tr>
|
Patterns, C++ Report, February 1995, pp. 24-27.</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
BIN
doc/index.pdf
Executable file
BIN
doc/index.pdf
Executable file
Binary file not shown.
@@ -134,10 +134,6 @@ iterator templates based on the Boost `iterator facade and adaptor`_.
|
|||||||
* |filter|_ (PDF__): an iterator over the subset of elements of some
|
* |filter|_ (PDF__): an iterator over the subset of elements of some
|
||||||
sequence which satisfy a given predicate
|
sequence which satisfy a given predicate
|
||||||
|
|
||||||
* |function|_ (PDF__): an output iterator wrapping a unary function
|
|
||||||
object; each time an element is written into the dereferenced
|
|
||||||
iterator, it is passed as a parameter to the function object.
|
|
||||||
|
|
||||||
* |indirect|_ (PDF__): an iterator over the objects *pointed-to* by the
|
* |indirect|_ (PDF__): an iterator over the objects *pointed-to* by the
|
||||||
elements of some sequence.
|
elements of some sequence.
|
||||||
|
|
||||||
@@ -148,9 +144,6 @@ iterator templates based on the Boost `iterator facade and adaptor`_.
|
|||||||
bidirectional sequence in reverse. Corrects many of the
|
bidirectional sequence in reverse. Corrects many of the
|
||||||
shortcomings of C++98's ``std::reverse_iterator``.
|
shortcomings of C++98's ``std::reverse_iterator``.
|
||||||
|
|
||||||
* |shared|_: an iterator over elements of a container whose
|
|
||||||
lifetime is maintained by a |shared_ptr|_ stored in the iterator.
|
|
||||||
|
|
||||||
* |transform|_ (PDF__): an iterator over elements which are the result of
|
* |transform|_ (PDF__): an iterator over elements which are the result of
|
||||||
applying some functional transformation to the elements of an
|
applying some functional transformation to the elements of an
|
||||||
underlying sequence. This component also replaces the old
|
underlying sequence. This component also replaces the old
|
||||||
@@ -167,10 +160,6 @@ __ counting_iterator.pdf
|
|||||||
.. _filter: filter_iterator.html
|
.. _filter: filter_iterator.html
|
||||||
__ filter_iterator.pdf
|
__ filter_iterator.pdf
|
||||||
|
|
||||||
.. |function| replace:: ``function_output_iterator``
|
|
||||||
.. _function: function_output_iterator.html
|
|
||||||
__ function_output_iterator.pdf
|
|
||||||
|
|
||||||
.. |indirect| replace:: ``indirect_iterator``
|
.. |indirect| replace:: ``indirect_iterator``
|
||||||
.. _indirect: indirect_iterator.html
|
.. _indirect: indirect_iterator.html
|
||||||
__ indirect_iterator.pdf
|
__ indirect_iterator.pdf
|
||||||
@@ -183,9 +172,6 @@ __ permutation_iterator.pdf
|
|||||||
.. _reverse: reverse_iterator.html
|
.. _reverse: reverse_iterator.html
|
||||||
__ reverse_iterator.pdf
|
__ reverse_iterator.pdf
|
||||||
|
|
||||||
.. |shared| replace:: ``shared_container_iterator``
|
|
||||||
.. _shared: ../../utility/shared_container_iterator.html
|
|
||||||
|
|
||||||
.. |transform| replace:: ``transform_iterator``
|
.. |transform| replace:: ``transform_iterator``
|
||||||
.. _transform: transform_iterator.html
|
.. _transform: transform_iterator.html
|
||||||
__ transform_iterator.pdf
|
__ transform_iterator.pdf
|
||||||
@@ -194,9 +180,6 @@ __ transform_iterator.pdf
|
|||||||
.. _zip: zip_iterator.html
|
.. _zip: zip_iterator.html
|
||||||
__ zip_iterator.pdf
|
__ zip_iterator.pdf
|
||||||
|
|
||||||
.. |shared_ptr| replace:: ``shared_ptr``
|
|
||||||
.. _shared_ptr: ../../smart_ptr/shared_ptr.htm
|
|
||||||
|
|
||||||
====================
|
====================
|
||||||
Iterator Utilities
|
Iterator Utilities
|
||||||
====================
|
====================
|
||||||
|
Binary file not shown.
@@ -7,7 +7,7 @@
|
|||||||
<title>pointee and indirect_reference</title>
|
<title>pointee and indirect_reference</title>
|
||||||
<meta name="author" content="David Abrahams" />
|
<meta name="author" content="David Abrahams" />
|
||||||
<meta name="organization" content="Boost Consulting" />
|
<meta name="organization" content="Boost Consulting" />
|
||||||
<meta name="date" content="2004-01-29" />
|
<meta name="date" content="2004-01-13" />
|
||||||
<meta name="copyright" content="Copyright David Abrahams 2004. All rights reserved" />
|
<meta name="copyright" content="Copyright David Abrahams 2004. All rights reserved" />
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="default.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
<tr><th class="docinfo-name">Organization:</th>
|
<tr><th class="docinfo-name">Organization:</th>
|
||||||
<td><a class="first last reference" href="http://www.boost-consulting.com">Boost Consulting</a></td></tr>
|
<td><a class="first last reference" href="http://www.boost-consulting.com">Boost Consulting</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Date:</th>
|
<tr><th class="docinfo-name">Date:</th>
|
||||||
<td>2004-01-29</td></tr>
|
<td>2004-01-13</td></tr>
|
||||||
<tr><th class="docinfo-name">Copyright:</th>
|
<tr><th class="docinfo-name">Copyright:</th>
|
||||||
<td>Copyright David Abrahams 2004. All rights reserved</td></tr>
|
<td>Copyright David Abrahams 2004. All rights reserved</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
BIN
doc/pointee.pdf
BIN
doc/pointee.pdf
Binary file not shown.
41
doc/style.tex
Executable file
41
doc/style.tex
Executable file
@@ -0,0 +1,41 @@
|
|||||||
|
% donot indent first line.
|
||||||
|
\setlength{\parindent}{0pt}
|
||||||
|
\setlength{\parskip}{5pt plus 2pt minus 1pt}
|
||||||
|
|
||||||
|
% sloppy
|
||||||
|
% ------
|
||||||
|
% Less strict (opposite to default fussy) space size between words. Therefore
|
||||||
|
% less hyphenation.
|
||||||
|
\sloppy
|
||||||
|
|
||||||
|
% fonts
|
||||||
|
% -----
|
||||||
|
% times for pdf generation, gives smaller pdf files.
|
||||||
|
%
|
||||||
|
% But in standard postscript fonts: courier and times/helvetica do not fit.
|
||||||
|
% Maybe use pslatex.
|
||||||
|
\usepackage{times}
|
||||||
|
\usepackage{pslatex}
|
||||||
|
|
||||||
|
% pagestyle
|
||||||
|
% \usepackage{fancyhdr}
|
||||||
|
\pagestyle{headings}
|
||||||
|
\setlength{\paperwidth}{8.5in}
|
||||||
|
\setlength{\paperheight}{11in}
|
||||||
|
|
||||||
|
\setlength{\oddsidemargin}{0.375in}
|
||||||
|
\setlength{\evensidemargin}{0.375in}
|
||||||
|
\setlength{\textwidth}{6.125in}
|
||||||
|
\setlength{\textheight}{8.875in}
|
||||||
|
|
||||||
|
\setlength{\topmargin}{-0.375in}
|
||||||
|
\setlength{\headheight}{0.25in}
|
||||||
|
\setlength{\headsep}{0.25in}
|
||||||
|
\setlength{\footskip}{0.25in}
|
||||||
|
|
||||||
|
\setlength{\admonitionwidth}{0.9\textwidth}
|
||||||
|
\setlength{\docinfowidth}{0.9\textwidth}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Binary file not shown.
@@ -10,11 +10,4 @@ test-suite iterator_examples
|
|||||||
[ run node_iterator1.cpp ]
|
[ run node_iterator1.cpp ]
|
||||||
[ run node_iterator2.cpp ]
|
[ run node_iterator2.cpp ]
|
||||||
[ run node_iterator3.cpp ]
|
[ run node_iterator3.cpp ]
|
||||||
[ run counting_iterator_example.cpp ]
|
|
||||||
[ run filter_iterator_example.cpp ]
|
|
||||||
[ run function_output_iterator_example.cpp ]
|
|
||||||
[ run indirect_iterator_example.cpp ]
|
|
||||||
[ run permutation_iterator_example.cpp ]
|
|
||||||
[ run reverse_iterator_example.cpp ]
|
|
||||||
[ run transform_iterator_example.cpp ]
|
|
||||||
;
|
;
|
||||||
|
@@ -26,9 +26,7 @@ namespace boost {
|
|||||||
typedef void pointer;
|
typedef void pointer;
|
||||||
typedef void reference;
|
typedef void reference;
|
||||||
|
|
||||||
explicit function_output_iterator() {}
|
explicit function_output_iterator(const UnaryFunction& f = UnaryFunction())
|
||||||
|
|
||||||
explicit function_output_iterator(const UnaryFunction& f)
|
|
||||||
: m_f(f) {}
|
: m_f(f) {}
|
||||||
|
|
||||||
struct output_proxy {
|
struct output_proxy {
|
||||||
|
@@ -107,8 +107,13 @@ struct iterator_facade_default_category
|
|||||||
// check for readability
|
// check for readability
|
||||||
, is_convertible<Reference, ValueParam>
|
, is_convertible<Reference, ValueParam>
|
||||||
>
|
>
|
||||||
, mpl::identity<std::input_iterator_tag>
|
, mpl::if_<
|
||||||
, mpl::identity<Traversal>
|
iterator_writability_disabled<ValueParam,Reference>
|
||||||
|
, std::input_iterator_tag
|
||||||
|
, input_output_iterator_tag
|
||||||
|
>
|
||||||
|
|
||||||
|
, mpl::identity<std::output_iterator_tag>
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
|
@@ -27,11 +27,7 @@ namespace boost {
|
|||||||
//
|
//
|
||||||
// Traversal Categories
|
// Traversal Categories
|
||||||
//
|
//
|
||||||
|
struct incrementable_traversal_tag {};
|
||||||
struct no_traversal_tag {};
|
|
||||||
|
|
||||||
struct incrementable_traversal_tag
|
|
||||||
: no_traversal_tag {};
|
|
||||||
|
|
||||||
struct single_pass_traversal_tag
|
struct single_pass_traversal_tag
|
||||||
: incrementable_traversal_tag {};
|
: incrementable_traversal_tag {};
|
||||||
|
@@ -60,13 +60,19 @@ namespace boost_concepts {
|
|||||||
class ReadableIteratorConcept {
|
class ReadableIteratorConcept {
|
||||||
public:
|
public:
|
||||||
typedef BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits<Iterator>::value_type value_type;
|
typedef BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits<Iterator>::value_type value_type;
|
||||||
|
typedef BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits<Iterator>::reference reference;
|
||||||
|
|
||||||
void constraints() {
|
void constraints() {
|
||||||
boost::function_requires< boost::AssignableConcept<Iterator> >();
|
boost::function_requires< boost::SGIAssignableConcept<Iterator> >();
|
||||||
boost::function_requires< boost::CopyConstructibleConcept<Iterator> >();
|
boost::function_requires< boost::EqualityComparableConcept<Iterator> >();
|
||||||
|
boost::function_requires<
|
||||||
|
boost::DefaultConstructibleConcept<Iterator> >();
|
||||||
|
|
||||||
value_type v = *i;
|
reference r = *i; // or perhaps read(x)
|
||||||
|
value_type v = r;
|
||||||
|
value_type v2 = *i;
|
||||||
boost::ignore_unused_variable_warning(v);
|
boost::ignore_unused_variable_warning(v);
|
||||||
|
boost::ignore_unused_variable_warning(v2);
|
||||||
}
|
}
|
||||||
Iterator i;
|
Iterator i;
|
||||||
};
|
};
|
||||||
@@ -79,8 +85,12 @@ namespace boost_concepts {
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
void constraints() {
|
void constraints() {
|
||||||
boost::function_requires< boost::CopyConstructibleConcept<Iterator> >();
|
boost::function_requires< boost::SGIAssignableConcept<Iterator> >();
|
||||||
*i = v;
|
boost::function_requires< boost::EqualityComparableConcept<Iterator> >();
|
||||||
|
boost::function_requires<
|
||||||
|
boost::DefaultConstructibleConcept<Iterator> >();
|
||||||
|
|
||||||
|
*i = v; // a good alternative could be something like write(x, v)
|
||||||
}
|
}
|
||||||
ValueType v;
|
ValueType v;
|
||||||
Iterator i;
|
Iterator i;
|
||||||
@@ -98,18 +108,47 @@ namespace boost_concepts {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <typename Iterator>
|
template <typename Iterator>
|
||||||
class LvalueIteratorConcept
|
class ReadableLvalueIteratorConcept
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef typename boost::detail::iterator_traits<Iterator>::value_type value_type;
|
typedef typename boost::detail::iterator_traits<Iterator>::value_type value_type;
|
||||||
|
typedef typename boost::detail::iterator_traits<Iterator>::reference reference;
|
||||||
|
|
||||||
void constraints()
|
void constraints()
|
||||||
{
|
{
|
||||||
value_type& r = const_cast<value_type&>(*i);
|
boost::function_requires< ReadableIteratorConcept<Iterator> >();
|
||||||
boost::ignore_unused_variable_warning(r);
|
|
||||||
}
|
typedef boost::mpl::or_<
|
||||||
|
boost::is_same<reference, value_type&>
|
||||||
|
, boost::is_same<reference, value_type const&>
|
||||||
|
> correct_reference;
|
||||||
|
|
||||||
|
BOOST_STATIC_ASSERT(correct_reference::value);
|
||||||
|
|
||||||
|
reference v = *i;
|
||||||
|
boost::ignore_unused_variable_warning(v);
|
||||||
|
}
|
||||||
Iterator i;
|
Iterator i;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename Iterator>
|
||||||
|
class WritableLvalueIteratorConcept {
|
||||||
|
public:
|
||||||
|
typedef typename boost::detail::iterator_traits<Iterator>::value_type value_type;
|
||||||
|
typedef typename boost::detail::iterator_traits<Iterator>::reference reference;
|
||||||
|
|
||||||
|
void constraints() {
|
||||||
|
boost::function_requires<
|
||||||
|
ReadableLvalueIteratorConcept<Iterator> >();
|
||||||
|
boost::function_requires<
|
||||||
|
WritableIteratorConcept<Iterator, value_type> >();
|
||||||
|
boost::function_requires<
|
||||||
|
SwappableIteratorConcept<Iterator> >();
|
||||||
|
|
||||||
|
|
||||||
|
BOOST_STATIC_ASSERT((boost::is_same<reference, value_type&>::value));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
// Iterator Traversal Concepts
|
// Iterator Traversal Concepts
|
||||||
@@ -120,8 +159,9 @@ namespace boost_concepts {
|
|||||||
typedef typename boost::iterator_traversal<Iterator>::type traversal_category;
|
typedef typename boost::iterator_traversal<Iterator>::type traversal_category;
|
||||||
|
|
||||||
void constraints() {
|
void constraints() {
|
||||||
boost::function_requires< boost::AssignableConcept<Iterator> >();
|
boost::function_requires< boost::SGIAssignableConcept<Iterator> >();
|
||||||
boost::function_requires< boost::CopyConstructibleConcept<Iterator> >();
|
boost::function_requires<
|
||||||
|
boost::DefaultConstructibleConcept<Iterator> >();
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT(
|
BOOST_STATIC_ASSERT(
|
||||||
(boost::is_convertible<
|
(boost::is_convertible<
|
||||||
@@ -163,8 +203,6 @@ namespace boost_concepts {
|
|||||||
|
|
||||||
void constraints() {
|
void constraints() {
|
||||||
boost::function_requires< SinglePassIteratorConcept<Iterator> >();
|
boost::function_requires< SinglePassIteratorConcept<Iterator> >();
|
||||||
boost::function_requires<
|
|
||||||
boost::DefaultConstructibleConcept<Iterator> >();
|
|
||||||
|
|
||||||
typedef boost::mpl::and_<
|
typedef boost::mpl::and_<
|
||||||
boost::is_integral<difference_type>,
|
boost::is_integral<difference_type>,
|
||||||
@@ -233,74 +271,125 @@ namespace boost_concepts {
|
|||||||
//===========================================================================
|
//===========================================================================
|
||||||
// Iterator Interoperability Concept
|
// Iterator Interoperability Concept
|
||||||
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
template <typename Iterator1, typename Iterator2>
|
template <typename TraversalTag>
|
||||||
void interop_single_pass_constraints(Iterator1 const& i1, Iterator2 const& i2)
|
struct Operations;
|
||||||
{
|
|
||||||
bool b;
|
|
||||||
b = i1 == i2;
|
|
||||||
b = i1 != i2;
|
|
||||||
|
|
||||||
b = i2 == i1;
|
|
||||||
b = i2 != i1;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Iterator1, typename Iterator2>
|
template <>
|
||||||
void interop_rand_access_constraints(Iterator1 const& i1, Iterator2 const& i2,
|
struct Operations<boost::incrementable_traversal_tag>
|
||||||
boost::random_access_traversal_tag, boost::random_access_traversal_tag)
|
{
|
||||||
|
template <typename Iterator1, typename Iterator2>
|
||||||
|
static void constraints(Iterator1 const& i1, Iterator2 const& i2)
|
||||||
|
{
|
||||||
|
// no interoperability constraints
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct Operations<boost::single_pass_traversal_tag>
|
||||||
|
{
|
||||||
|
template <typename Iterator1, typename Iterator2>
|
||||||
|
static void constraints(Iterator1 const& i1, Iterator2 const& i2)
|
||||||
|
{
|
||||||
|
Operations<boost::incrementable_traversal_tag>::constraints(i1, i2);
|
||||||
|
i1 == i2;
|
||||||
|
i1 != i2;
|
||||||
|
|
||||||
|
i2 == i1;
|
||||||
|
i2 != i1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct Operations<boost::forward_traversal_tag>
|
||||||
|
{
|
||||||
|
template <typename Iterator1, typename Iterator2>
|
||||||
|
static void constraints(Iterator1 const& i1, Iterator2 const& i2)
|
||||||
|
{
|
||||||
|
Operations<boost::single_pass_traversal_tag>::constraints(i1, i2);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct Operations<boost::bidirectional_traversal_tag>
|
||||||
|
{
|
||||||
|
template <typename Iterator1, typename Iterator2>
|
||||||
|
static void constraints(Iterator1 const& i1, Iterator2 const& i2)
|
||||||
|
{
|
||||||
|
Operations<boost::forward_traversal_tag>::constraints(i1, i2);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct Operations<boost::random_access_traversal_tag>
|
||||||
{
|
{
|
||||||
bool b;
|
template <typename Iterator1, typename Iterator2>
|
||||||
typename boost::detail::iterator_traits<Iterator2>::difference_type n;
|
static void constraints(Iterator1 const& i1, Iterator2 const& i2)
|
||||||
b = i1 < i2;
|
{
|
||||||
b = i1 <= i2;
|
Operations<boost::bidirectional_traversal_tag>::constraints(i1, i2);
|
||||||
b = i1 > i2;
|
|
||||||
b = i1 >= i2;
|
i1 < i2;
|
||||||
n = i1 - i2;
|
i1 <= i2;
|
||||||
|
i1 > i2;
|
||||||
b = i2 < i1;
|
i1 >= i2;
|
||||||
b = i2 <= i1;
|
i1 - i2;
|
||||||
b = i2 > i1;
|
|
||||||
b = i2 >= i1;
|
i2 < i1;
|
||||||
n = i2 - i1;
|
i2 <= i1;
|
||||||
}
|
i2 > i1;
|
||||||
template <typename Iterator1, typename Iterator2>
|
i2 >= i1;
|
||||||
void interop_rand_access_constraints(Iterator1 const& i1, Iterator2 const& i2,
|
i2 - i1;
|
||||||
boost::single_pass_traversal_tag, boost::single_pass_traversal_tag)
|
}
|
||||||
{ }
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
template <typename Iterator, typename ConstIterator>
|
template <typename Iterator, typename ConstIterator>
|
||||||
class InteroperableIteratorConcept
|
class InteroperableConcept
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef typename boost::detail::pure_traversal_tag<
|
typedef typename boost::detail::pure_traversal_tag<
|
||||||
typename boost::iterator_traversal<
|
typename boost::iterator_traversal<
|
||||||
Iterator
|
Iterator
|
||||||
>::type
|
>::type
|
||||||
>::type traversal_category;
|
>::type traversal_category;
|
||||||
|
|
||||||
|
typedef typename
|
||||||
|
boost::detail::iterator_traits<Iterator>::difference_type
|
||||||
|
difference_type;
|
||||||
|
|
||||||
typedef typename boost::detail::pure_traversal_tag<
|
typedef typename boost::detail::pure_traversal_tag<
|
||||||
typename boost::iterator_traversal<
|
typename boost::iterator_traversal<
|
||||||
ConstIterator
|
ConstIterator
|
||||||
>::type
|
>::type
|
||||||
>::type const_traversal_category;
|
>::type const_traversal_category;
|
||||||
|
|
||||||
|
typedef typename
|
||||||
|
boost::detail::iterator_traits<ConstIterator>::difference_type
|
||||||
|
const_difference_type;
|
||||||
|
|
||||||
void constraints()
|
void constraints()
|
||||||
{
|
{
|
||||||
boost::function_requires< SinglePassIteratorConcept<Iterator> >();
|
BOOST_STATIC_ASSERT(
|
||||||
boost::function_requires< SinglePassIteratorConcept<ConstIterator> >();
|
(boost::is_same< difference_type, const_difference_type>::value)
|
||||||
|
);
|
||||||
|
|
||||||
|
BOOST_STATIC_ASSERT(
|
||||||
|
(boost::is_same< traversal_category, const_traversal_category>::value)
|
||||||
|
);
|
||||||
|
|
||||||
detail::interop_single_pass_constraints(i, ci);
|
// ToDo check what the std really requires
|
||||||
detail::interop_rand_access_constraints(i, ci, traversal_category(), const_traversal_category());
|
|
||||||
|
|
||||||
ci = i;
|
// detail::Operations<traversal_category>::constraints(i, ci);
|
||||||
}
|
|
||||||
Iterator i;
|
ci = i;
|
||||||
ConstIterator ci;
|
|
||||||
};
|
}
|
||||||
|
Iterator i;
|
||||||
|
ConstIterator ci;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace boost_concepts
|
} // namespace boost_concepts
|
||||||
|
|
||||||
|
@@ -18,40 +18,64 @@ namespace boost
|
|||||||
{
|
{
|
||||||
|
|
||||||
template< class ElementIterator
|
template< class ElementIterator
|
||||||
, class IndexIterator>
|
, class IndexIterator
|
||||||
|
, class ValueT = use_default
|
||||||
|
, class CategoryT = use_default
|
||||||
|
, class ReferenceT = use_default
|
||||||
|
, class DifferenceT = use_default >
|
||||||
class permutation_iterator
|
class permutation_iterator
|
||||||
: public iterator_adaptor<
|
: public iterator_adaptor<
|
||||||
permutation_iterator<ElementIterator, IndexIterator>
|
permutation_iterator<ElementIterator, IndexIterator, ValueT, CategoryT, ReferenceT, DifferenceT>
|
||||||
, IndexIterator, typename detail::iterator_traits<ElementIterator>::value_type
|
, ElementIterator, ValueT, CategoryT, ReferenceT, DifferenceT >
|
||||||
, use_default, typename detail::iterator_traits<ElementIterator>::reference>
|
|
||||||
{
|
{
|
||||||
typedef iterator_adaptor<
|
typedef iterator_adaptor<
|
||||||
permutation_iterator<ElementIterator, IndexIterator>
|
permutation_iterator<ElementIterator, IndexIterator, ValueT, CategoryT, ReferenceT, DifferenceT>
|
||||||
, IndexIterator, typename detail::iterator_traits<ElementIterator>::value_type
|
, ElementIterator, ValueT, CategoryT, ReferenceT, DifferenceT > super_t;
|
||||||
, use_default, typename detail::iterator_traits<ElementIterator>::reference> super_t;
|
|
||||||
|
|
||||||
friend class iterator_core_access;
|
friend class iterator_core_access;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
permutation_iterator() : m_elt_iter() {}
|
permutation_iterator() : order_it_() {}
|
||||||
|
|
||||||
explicit permutation_iterator(ElementIterator x, IndexIterator y)
|
explicit permutation_iterator(ElementIterator x, IndexIterator y)
|
||||||
: super_t(y), m_elt_iter(x) {}
|
: super_t(x), order_it_(y) {}
|
||||||
|
|
||||||
template<class OtherElementIterator, class OtherIndexIterator>
|
template<class OtherElementIterator, class OtherIndexIterator, class V, class C, class R, class D >
|
||||||
permutation_iterator(
|
permutation_iterator(
|
||||||
permutation_iterator<OtherElementIterator, OtherIndexIterator> const& r
|
permutation_iterator<OtherElementIterator, OtherIndexIterator, V, C, R, D> const& r
|
||||||
, typename enable_if_convertible<OtherElementIterator, ElementIterator>::type* = 0
|
, typename enable_if_convertible<OtherElementIterator, ElementIterator>::type* = 0
|
||||||
, typename enable_if_convertible<OtherIndexIterator, IndexIterator>::type* = 0
|
, typename enable_if_convertible<OtherIndexIterator, IndexIterator>::type* = 0
|
||||||
)
|
)
|
||||||
: super_t(r.base()), m_elt_iter(r.m_elt_iter)
|
: super_t(r.base())
|
||||||
{}
|
{}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typename super_t::reference dereference() const
|
typename super_t::reference dereference() const
|
||||||
{ return *(m_elt_iter + *this->base()); }
|
{ return *(this->base() + *this->order_it_); }
|
||||||
|
|
||||||
|
void increment() { ++this->order_it_; }
|
||||||
|
void decrement() { --this->order_it_; }
|
||||||
|
|
||||||
ElementIterator m_elt_iter;
|
void advance(typename super_t::difference_type n)
|
||||||
|
{
|
||||||
|
std::advance( order_it_, n );
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class OtherElementIterator, class OtherIndexIterator, class V, class C, class R, class D >
|
||||||
|
typename super_t::difference_type
|
||||||
|
distance_to( permutation_iterator<OtherElementIterator, OtherIndexIterator, V, C, R, D> const& y ) const
|
||||||
|
{
|
||||||
|
return std::distance( this->order_it_, y.order_it_ );
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class OtherElementIterator, class OtherIndexIterator, class V, class C, class R, class D >
|
||||||
|
bool
|
||||||
|
equal( permutation_iterator<OtherElementIterator, OtherIndexIterator, V, C, R, D> const& y ) const
|
||||||
|
{
|
||||||
|
return( y.order_it_ == this->order_it_ );
|
||||||
|
}
|
||||||
|
|
||||||
|
IndexIterator order_it_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -36,8 +36,6 @@ test-suite iterator
|
|||||||
[ run iterator_adaptor_cc.cpp ]
|
[ run iterator_adaptor_cc.cpp ]
|
||||||
[ run iterator_adaptor_test.cpp ]
|
[ run iterator_adaptor_test.cpp ]
|
||||||
[ compile iterator_archetype_cc.cpp ]
|
[ compile iterator_archetype_cc.cpp ]
|
||||||
[ compile-fail iterator_archetype_default_ctor.cpp ]
|
|
||||||
[ compile-fail lvalue_concept_fail_expected.cpp ]
|
|
||||||
[ run transform_iterator_test.cpp ]
|
[ run transform_iterator_test.cpp ]
|
||||||
[ run indirect_iterator_test.cpp ]
|
[ run indirect_iterator_test.cpp ]
|
||||||
[ compile indirect_iterator_member_types.cpp ]
|
[ compile indirect_iterator_member_types.cpp ]
|
||||||
|
@@ -61,35 +61,23 @@ main()
|
|||||||
(void)derived;
|
(void)derived;
|
||||||
|
|
||||||
boost::function_requires<
|
boost::function_requires<
|
||||||
boost_concepts::WritableIteratorConcept<int*> >();
|
boost_concepts::WritableLvalueIteratorConcept<int*> >();
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::LvalueIteratorConcept<int*> >();
|
|
||||||
boost::function_requires<
|
boost::function_requires<
|
||||||
boost_concepts::RandomAccessTraversalConcept<int*> >();
|
boost_concepts::RandomAccessTraversalConcept<int*> >();
|
||||||
|
|
||||||
boost::function_requires<
|
boost::function_requires<
|
||||||
boost_concepts::ReadableIteratorConcept<const int*> >();
|
boost_concepts::ReadableLvalueIteratorConcept<const int*> >();
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::LvalueIteratorConcept<const int*> >();
|
|
||||||
boost::function_requires<
|
boost::function_requires<
|
||||||
boost_concepts::RandomAccessTraversalConcept<const int*> >();
|
boost_concepts::RandomAccessTraversalConcept<const int*> >();
|
||||||
|
|
||||||
boost::function_requires<
|
boost::function_requires<
|
||||||
boost_concepts::WritableIteratorConcept<new_iterator> >();
|
boost_concepts::WritableLvalueIteratorConcept<new_iterator> >();
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::LvalueIteratorConcept<new_iterator> >();
|
|
||||||
boost::function_requires<
|
boost::function_requires<
|
||||||
boost_concepts::RandomAccessTraversalConcept<new_iterator> >();
|
boost_concepts::RandomAccessTraversalConcept<new_iterator> >();
|
||||||
|
|
||||||
boost::function_requires<
|
boost::function_requires<
|
||||||
boost_concepts::WritableIteratorConcept<old_iterator> >();
|
boost_concepts::WritableLvalueIteratorConcept<old_iterator> >();
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::LvalueIteratorConcept<old_iterator> >();
|
|
||||||
boost::function_requires<
|
boost::function_requires<
|
||||||
boost_concepts::RandomAccessTraversalConcept<old_iterator> >();
|
boost_concepts::RandomAccessTraversalConcept<old_iterator> >();
|
||||||
|
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::InteroperableIteratorConcept<int*, int const*> >();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -125,8 +125,7 @@ int main()
|
|||||||
> BaseIter;
|
> BaseIter;
|
||||||
typedef boost::filter_iterator<one_or_four, BaseIter> Iter;
|
typedef boost::filter_iterator<one_or_four, BaseIter> Iter;
|
||||||
boost::function_requires< boost::ForwardIteratorConcept<Iter> >();
|
boost::function_requires< boost::ForwardIteratorConcept<Iter> >();
|
||||||
boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >();
|
boost::function_requires< boost_concepts::ReadableLvalueIteratorConcept<Iter> >();
|
||||||
boost::function_requires< boost_concepts::LvalueIteratorConcept<Iter> >();
|
|
||||||
boost::function_requires< boost_concepts::ForwardTraversalConcept<Iter> >();
|
boost::function_requires< boost_concepts::ForwardTraversalConcept<Iter> >();
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@@ -137,8 +136,7 @@ int main()
|
|||||||
> BaseIter;
|
> BaseIter;
|
||||||
typedef boost::filter_iterator<one_or_four, BaseIter> Iter;
|
typedef boost::filter_iterator<one_or_four, BaseIter> Iter;
|
||||||
boost::function_requires< boost::Mutable_ForwardIteratorConcept<Iter> >();
|
boost::function_requires< boost::Mutable_ForwardIteratorConcept<Iter> >();
|
||||||
boost::function_requires< boost_concepts::WritableIteratorConcept<Iter> >();
|
boost::function_requires< boost_concepts::WritableLvalueIteratorConcept<Iter> >();
|
||||||
boost::function_requires< boost_concepts::LvalueIteratorConcept<Iter> >();
|
|
||||||
boost::function_requires< boost_concepts::ForwardTraversalConcept<Iter> >();
|
boost::function_requires< boost_concepts::ForwardTraversalConcept<Iter> >();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -175,7 +175,7 @@ main()
|
|||||||
> c_iter_t;
|
> c_iter_t;
|
||||||
|
|
||||||
# ifndef NO_MUTABLE_CONST_RA_ITERATOR_INTEROPERABILITY
|
# ifndef NO_MUTABLE_CONST_RA_ITERATOR_INTEROPERABILITY
|
||||||
boost::function_requires< boost_concepts::InteroperableIteratorConcept<iter_t, c_iter_t> >();
|
boost::function_requires< boost_concepts::InteroperableConcept<iter_t, c_iter_t> >();
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -10,32 +10,20 @@ int main()
|
|||||||
typedef boost::reverse_iterator<int*> rev_iter;
|
typedef boost::reverse_iterator<int*> rev_iter;
|
||||||
typedef boost::reverse_iterator<int const*> c_rev_iter;
|
typedef boost::reverse_iterator<int const*> c_rev_iter;
|
||||||
|
|
||||||
boost::function_requires< boost_concepts::WritableIteratorConcept<rev_iter> >();
|
boost::function_requires< boost_concepts::WritableLvalueIteratorConcept<rev_iter> >();
|
||||||
boost::function_requires< boost_concepts::LvalueIteratorConcept<rev_iter> >();
|
|
||||||
boost::function_requires< boost_concepts::RandomAccessTraversalConcept<rev_iter> >();
|
boost::function_requires< boost_concepts::RandomAccessTraversalConcept<rev_iter> >();
|
||||||
boost::function_requires< boost::RandomAccessIteratorConcept<rev_iter> >();
|
boost::function_requires< boost::RandomAccessIteratorConcept<rev_iter> >();
|
||||||
boost::function_requires< boost_concepts::InteroperableIteratorConcept<rev_iter, c_rev_iter> >();
|
boost::function_requires< boost_concepts::InteroperableConcept<rev_iter, c_rev_iter> >();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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<std::list<int>::iterator> rev_iter;
|
typedef boost::reverse_iterator<std::list<int>::iterator> rev_iter;
|
||||||
typedef boost::reverse_iterator<std::list<int>::const_iterator> c_rev_iter;
|
typedef boost::reverse_iterator<std::list<int>::const_iterator> c_rev_iter;
|
||||||
|
|
||||||
boost::function_requires< boost_concepts::ReadableIteratorConcept<c_rev_iter> >();
|
boost::function_requires< boost_concepts::ReadableLvalueIteratorConcept<c_rev_iter> >();
|
||||||
boost::function_requires< boost_concepts::LvalueIteratorConcept<c_rev_iter> >();
|
|
||||||
boost::function_requires< boost_concepts::BidirectionalTraversalConcept<c_rev_iter> >();
|
boost::function_requires< boost_concepts::BidirectionalTraversalConcept<c_rev_iter> >();
|
||||||
boost::function_requires< boost::BidirectionalIteratorConcept<c_rev_iter> >();
|
boost::function_requires< boost::BidirectionalIteratorConcept<c_rev_iter> >();
|
||||||
boost::function_requires< boost_concepts::InteroperableIteratorConcept<rev_iter, c_rev_iter> >();
|
boost::function_requires< boost_concepts::InteroperableConcept<rev_iter, c_rev_iter> >();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
return boost::exit_success;
|
return boost::exit_success;
|
||||||
}
|
}
|
||||||
|
@@ -150,18 +150,18 @@ template <class T>
|
|||||||
struct in_iterator
|
struct in_iterator
|
||||||
: boost::iterator_adaptor<
|
: boost::iterator_adaptor<
|
||||||
in_iterator<T>
|
in_iterator<T>
|
||||||
, boost::input_iterator_archetype_no_proxy<T>
|
, boost::input_iterator_archetype<T>
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
typedef boost::iterator_adaptor<
|
typedef boost::iterator_adaptor<
|
||||||
in_iterator<T>
|
in_iterator<T>
|
||||||
, boost::input_iterator_archetype_no_proxy<T>
|
, boost::input_iterator_archetype<T>
|
||||||
> super_t;
|
> super_t;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
in_iterator() { }
|
in_iterator() { }
|
||||||
in_iterator(boost::input_iterator_archetype_no_proxy<T> d) : super_t(d) { }
|
in_iterator(boost::input_iterator_archetype<T> d) : super_t(d) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class Iter>
|
template <class Iter>
|
||||||
@@ -309,7 +309,7 @@ main()
|
|||||||
|
|
||||||
// check operator-> with an input iterator
|
// check operator-> with an input iterator
|
||||||
{
|
{
|
||||||
boost::input_iterator_archetype_no_proxy<dummyT> input_iter;
|
boost::input_iterator_archetype<dummyT> input_iter;
|
||||||
typedef in_iterator<dummyT> adaptor_type;
|
typedef in_iterator<dummyT> adaptor_type;
|
||||||
adaptor_type i(input_iter);
|
adaptor_type i(input_iter);
|
||||||
int zero = 0;
|
int zero = 0;
|
||||||
|
@@ -9,54 +9,18 @@
|
|||||||
#include <boost/iterator/iterator_categories.hpp>
|
#include <boost/iterator/iterator_categories.hpp>
|
||||||
#include <boost/iterator/iterator_concepts.hpp>
|
#include <boost/iterator/iterator_concepts.hpp>
|
||||||
#include <boost/concept_check.hpp>
|
#include <boost/concept_check.hpp>
|
||||||
#include <boost/cstdlib.hpp>
|
|
||||||
|
|
||||||
int main()
|
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<iter> >();
|
|
||||||
boost::function_requires< boost_concepts::RandomAccessTraversalConcept<iter> >();
|
|
||||||
}
|
|
||||||
{
|
|
||||||
typedef boost::iterator_archetype<
|
|
||||||
int
|
|
||||||
, boost::iterator_archetypes::readable_writable_iterator_t
|
|
||||||
, boost::random_access_traversal_tag
|
|
||||||
> iter;
|
|
||||||
|
|
||||||
boost::function_requires< boost_concepts::ReadableIteratorConcept<iter> >();
|
|
||||||
boost::function_requires< boost_concepts::WritableIteratorConcept<iter> >();
|
|
||||||
boost::function_requires< boost_concepts::RandomAccessTraversalConcept<iter> >();
|
|
||||||
}
|
|
||||||
{
|
|
||||||
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<iter> >();
|
|
||||||
boost::function_requires< boost_concepts::LvalueIteratorConcept<iter> >();
|
|
||||||
boost::function_requires< boost_concepts::RandomAccessTraversalConcept<iter> >();
|
|
||||||
}
|
|
||||||
{
|
|
||||||
typedef boost::iterator_archetype<
|
typedef boost::iterator_archetype<
|
||||||
int
|
int
|
||||||
, boost::iterator_archetypes::writable_lvalue_iterator_t
|
, boost::iterator_archetypes::writable_lvalue_iterator_t
|
||||||
, boost::random_access_traversal_tag
|
, boost::random_access_traversal_tag
|
||||||
> iter;
|
> iter;
|
||||||
|
|
||||||
boost::function_requires< boost_concepts::WritableIteratorConcept<iter> >();
|
boost::function_requires< boost_concepts::WritableLvalueIteratorConcept<iter> >();
|
||||||
boost::function_requires< boost_concepts::LvalueIteratorConcept<iter> >();
|
|
||||||
boost::function_requires< boost_concepts::RandomAccessTraversalConcept<iter> >();
|
boost::function_requires< boost_concepts::RandomAccessTraversalConcept<iter> >();
|
||||||
}
|
|
||||||
|
return 0; // keep msvc happy
|
||||||
return boost::exit_success;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,22 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright Thomas Witt 2004. Permission to copy, use,
|
|
||||||
// modify, sell and distribute this software is granted provided this
|
|
||||||
// copyright notice appears in all copies. This software is provided
|
|
||||||
// "as is" without express or implied warranty, and with no claim as
|
|
||||||
// to its suitability for any purpose.
|
|
||||||
//
|
|
||||||
#include <boost/iterator/iterator_archetypes.hpp>
|
|
||||||
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
@@ -1,15 +0,0 @@
|
|||||||
#include <boost/iterator/iterator_concepts.hpp>
|
|
||||||
#include <boost/iterator/iterator_archetypes.hpp>
|
|
||||||
#include <boost/cstdlib.hpp>
|
|
||||||
|
|
||||||
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<Iter> >();
|
|
||||||
return boost::exit_success;
|
|
||||||
}
|
|
@@ -20,7 +20,7 @@
|
|||||||
void permutation_test()
|
void permutation_test()
|
||||||
{
|
{
|
||||||
// Example taken from documentation of old permutation_iterator.
|
// Example taken from documentation of old permutation_iterator.
|
||||||
typedef std::vector< double > element_range_type;
|
typedef std::vector< int > element_range_type;
|
||||||
typedef std::list< int > index_type;
|
typedef std::list< int > index_type;
|
||||||
|
|
||||||
const int element_range_size = 10;
|
const int element_range_size = 10;
|
||||||
@@ -52,22 +52,21 @@ void permutation_test()
|
|||||||
}
|
}
|
||||||
|
|
||||||
it = begin;
|
it = begin;
|
||||||
for( int i1 = 0; i1 < index_size - 1 ; ++++i1, ++++it )
|
for( int i1 = 0; i1 < index_size - 1 ; i1+=2, it+=2 )
|
||||||
{
|
{
|
||||||
index_type::iterator i_it2 = indices.begin();
|
index_type::iterator i_it2 = indices.begin();
|
||||||
std::advance( i_it2, i1 );
|
std::advance( i_it2, i1 );
|
||||||
BOOST_CHECK( *it == elements[ *i_it2 ] );
|
BOOST_CHECK( *it == elements[ *i_it2 ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
it = begin;
|
|
||||||
std::advance(it, index_size);
|
it = begin + (index_size);
|
||||||
for( index_type::iterator i_it3 = indices.end(); it != begin; )
|
for( index_type::iterator i_it3 = indices.end(); it != begin; )
|
||||||
{
|
{
|
||||||
BOOST_CHECK( *--it == elements[ *--i_it3 ] );
|
BOOST_CHECK( *--it == elements[ *--i_it3 ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
it = begin;
|
it = begin + index_size;
|
||||||
std::advance(it, index_size);
|
|
||||||
for( int i2 = 0; i2 < index_size - 1; i2+=2, --it )
|
for( int i2 = 0; i2 < index_size - 1; i2+=2, --it )
|
||||||
{
|
{
|
||||||
index_type::iterator i_it4 = --indices.end();
|
index_type::iterator i_it4 = --indices.end();
|
||||||
|
@@ -31,15 +31,13 @@ int main()
|
|||||||
{
|
{
|
||||||
typedef boost::reverse_iterator<boost::bidirectional_iterator_archetype<dummyT> > Iter;
|
typedef boost::reverse_iterator<boost::bidirectional_iterator_archetype<dummyT> > Iter;
|
||||||
boost::function_requires< boost::BidirectionalIteratorConcept<Iter> >();
|
boost::function_requires< boost::BidirectionalIteratorConcept<Iter> >();
|
||||||
boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >();
|
boost::function_requires< boost_concepts::ReadableLvalueIteratorConcept<Iter> >();
|
||||||
boost::function_requires< boost_concepts::LvalueIteratorConcept<Iter> >();
|
|
||||||
boost::function_requires< boost_concepts::BidirectionalTraversalConcept<Iter> >();
|
boost::function_requires< boost_concepts::BidirectionalTraversalConcept<Iter> >();
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
typedef boost::reverse_iterator<boost::mutable_bidirectional_iterator_archetype<dummyT> > Iter;
|
typedef boost::reverse_iterator<boost::mutable_bidirectional_iterator_archetype<dummyT> > Iter;
|
||||||
boost::function_requires< boost::Mutable_BidirectionalIteratorConcept<Iter> >();
|
boost::function_requires< boost::Mutable_BidirectionalIteratorConcept<Iter> >();
|
||||||
boost::function_requires< boost_concepts::WritableIteratorConcept<Iter> >();
|
boost::function_requires< boost_concepts::WritableLvalueIteratorConcept<Iter> >();
|
||||||
boost::function_requires< boost_concepts::LvalueIteratorConcept<Iter> >();
|
|
||||||
boost::function_requires< boost_concepts::BidirectionalTraversalConcept<Iter> >();
|
boost::function_requires< boost_concepts::BidirectionalTraversalConcept<Iter> >();
|
||||||
}
|
}
|
||||||
// Adapting new-style iterators
|
// Adapting new-style iterators
|
||||||
@@ -89,8 +87,7 @@ int main()
|
|||||||
> iter;
|
> iter;
|
||||||
typedef boost::reverse_iterator<iter> Iter;
|
typedef boost::reverse_iterator<iter> Iter;
|
||||||
boost::function_requires< boost::BidirectionalIteratorConcept<Iter> >();
|
boost::function_requires< boost::BidirectionalIteratorConcept<Iter> >();
|
||||||
boost::function_requires< boost_concepts::ReadableIteratorConcept<Iter> >();
|
boost::function_requires< boost_concepts::ReadableLvalueIteratorConcept<Iter> >();
|
||||||
boost::function_requires< boost_concepts::LvalueIteratorConcept<Iter> >();
|
|
||||||
boost::function_requires< boost_concepts::BidirectionalTraversalConcept<Iter> >();
|
boost::function_requires< boost_concepts::BidirectionalTraversalConcept<Iter> >();
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@@ -101,8 +98,7 @@ int main()
|
|||||||
> iter;
|
> iter;
|
||||||
typedef boost::reverse_iterator<iter> Iter;
|
typedef boost::reverse_iterator<iter> Iter;
|
||||||
boost::function_requires< boost::BidirectionalIteratorConcept<Iter> >();
|
boost::function_requires< boost::BidirectionalIteratorConcept<Iter> >();
|
||||||
boost::function_requires< boost_concepts::WritableIteratorConcept<Iter> >();
|
boost::function_requires< boost_concepts::WritableLvalueIteratorConcept<Iter> >();
|
||||||
boost::function_requires< boost_concepts::LvalueIteratorConcept<Iter> >();
|
|
||||||
boost::function_requires< boost_concepts::BidirectionalTraversalConcept<Iter> >();
|
boost::function_requires< boost_concepts::BidirectionalTraversalConcept<Iter> >();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -115,7 +115,7 @@ main()
|
|||||||
typedef boost::transform_iterator<adaptable_mult_functor, int*> iter_t;
|
typedef boost::transform_iterator<adaptable_mult_functor, int*> iter_t;
|
||||||
typedef boost::transform_iterator<adaptable_mult_functor, int const*> c_iter_t;
|
typedef boost::transform_iterator<adaptable_mult_functor, int const*> c_iter_t;
|
||||||
|
|
||||||
boost::function_requires< boost_concepts::InteroperableIteratorConcept<iter_t, c_iter_t> >();
|
boost::function_requires< boost_concepts::InteroperableConcept<iter_t, c_iter_t> >();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test transform_iterator
|
// Test transform_iterator
|
||||||
|
Reference in New Issue
Block a user