mirror of
https://github.com/boostorg/iterator.git
synced 2025-06-27 13:01:39 +02:00
Compare commits
226 Commits
svn-branch
...
boost-1.62
Author | SHA1 | Date | |
---|---|---|---|
22dd100dfd | |||
2f72016049 | |||
5b26a8b3fc | |||
711a0232f8 | |||
443dfb9901 | |||
c734f3bfa3 | |||
b2b9ab1568 | |||
8b23342969 | |||
922296f8c8 | |||
c9a91a1fba | |||
80e6f4a3bf | |||
398bbe63bb | |||
87d82527b1 | |||
b9448b5fae | |||
76519ea4a7 | |||
878812c42f | |||
2283f084d9 | |||
a0533d97f5 | |||
ece225bbda | |||
b62dc6ba9d | |||
20dc7b1abe | |||
0dbbb61bec | |||
2de2111db2 | |||
db04fafe21 | |||
4e0fc90b60 | |||
53cbba6c09 | |||
8be623d733 | |||
d12d60fa12 | |||
ec7d398578 | |||
3d3560c12d | |||
46f9e1753f | |||
2511f21d62 | |||
adee905c51 | |||
82779f78ec | |||
a569c97969 | |||
aad821d28d | |||
23934d7c0d | |||
1073b7f7bc | |||
f158dba6ad | |||
8fe632d6b1 | |||
810b58cfb0 | |||
156c13a494 | |||
785680d929 | |||
269de2691a | |||
11f7d1bc18 | |||
4a403cd3eb | |||
dc96d371fa | |||
e000b676cc | |||
045a05f81f | |||
25139e1311 | |||
aad767ed3f | |||
7fa65a4278 | |||
fd94cc7d78 | |||
36988fcf98 | |||
4283d20261 | |||
91f782ec52 | |||
9841d87212 | |||
782313db8c | |||
c040d4c38b | |||
1ddaca8297 | |||
acf9b4d4cf | |||
e88b3f475c | |||
01cffbed98 | |||
187bc896f6 | |||
6883d083d2 | |||
0345db959b | |||
d814423414 | |||
eb288b2908 | |||
0e23f15623 | |||
6b2a5cccc4 | |||
a803b5b42d | |||
d8284fa602 | |||
8d96469cb4 | |||
09549a613e | |||
daac0f2ab1 | |||
8e5b8025d8 | |||
c142956936 | |||
21afa3d8ec | |||
2d9362fe89 | |||
8779e0e715 | |||
3546643667 | |||
70ac888f75 | |||
854d39f58a | |||
7bb83d4646 | |||
bb27f3ee25 | |||
96d2e9638c | |||
f2137c58b7 | |||
0dfc7bd53c | |||
ae1d0d0dfe | |||
9ddc974825 | |||
1cde579a68 | |||
73ccc2bac0 | |||
9b13de9bfe | |||
35cf24d413 | |||
a83b13f4e6 | |||
c6f70f8394 | |||
0b33da51dd | |||
39c44e0da3 | |||
d1c93d3574 | |||
208400a1d0 | |||
dae3cf2a9d | |||
0c44051189 | |||
4fcb23f8e0 | |||
8a004c12f6 | |||
3695e48b68 | |||
ac3a206eb9 | |||
f9095485a2 | |||
1c4527d58e | |||
455a039c33 | |||
5d7289ad3e | |||
40fd24e5b5 | |||
290cea8289 | |||
e6babb8bf9 | |||
84cd6e1be4 | |||
2325b6070a | |||
91b2854e4a | |||
27b44876bc | |||
123bf514ac | |||
ac7b14253f | |||
69df402f70 | |||
e600d3f65b | |||
f6e5aa2462 | |||
21102938e8 | |||
a1c0cf8373 | |||
220a11883c | |||
913df78ec0 | |||
01f9b396d8 | |||
67d418a5c6 | |||
d853e444ce | |||
e6d5c24b91 | |||
98db5b4f9a | |||
739c95411f | |||
8ce330a111 | |||
3eef8090d6 | |||
d291c7b43e | |||
1471102bfc | |||
2e099caceb | |||
3fd1c34411 | |||
dec42098db | |||
d4d51389d1 | |||
4a82a5646f | |||
fecf28a440 | |||
bc34e54f6c | |||
f543f1e7b6 | |||
9f661c9112 | |||
04bc178fc1 | |||
1b2fbfaaca | |||
a6a8fd00d7 | |||
30a13b8141 | |||
db29a874f1 | |||
8345293f94 | |||
512298cb5c | |||
6d0b2d4f8a | |||
7dbd0f5a89 | |||
c9463e941f | |||
1ce1296320 | |||
9025bbfc2a | |||
c6f3269f4a | |||
31c3971720 | |||
2db78eec90 | |||
c7fc3470d0 | |||
ad90dac61d | |||
964a29979c | |||
fbbdcf8c99 | |||
5d72ae48da | |||
1ca1caddff | |||
5c477dc695 | |||
d45b57c33c | |||
caa0e5035a | |||
5a88e6f958 | |||
36565eae63 | |||
14b1075d6b | |||
752fc7c185 | |||
de4ef14f9b | |||
15f3bf9352 | |||
d469568de7 | |||
251b9f8057 | |||
2786268510 | |||
6bb82230b9 | |||
f65f03afcc | |||
c07f55ff65 | |||
ac522bc9e1 | |||
4c60e26bf8 | |||
d11c7a3ec4 | |||
cfc04ce11e | |||
76fd8e27fb | |||
25d4d34ebe | |||
ea26e9f109 | |||
f2433c63d5 | |||
264c186eac | |||
55c08b706c | |||
835498603d | |||
b0ec5a759b | |||
2ece3ac5c2 | |||
e06c4b3279 | |||
78effefadb | |||
37c46f7da5 | |||
bf7d904bf8 | |||
6d0f901b2e | |||
efecbd0d27 | |||
65e229fb0d | |||
db0e0b7b91 | |||
23d53055f9 | |||
bd5731efa9 | |||
a2d9e63f94 | |||
ff73538b5b | |||
30685528c7 | |||
c849f35965 | |||
aa483f4961 | |||
93c010eb51 | |||
0dc017b1a8 | |||
92c92bbbf8 | |||
f51591cb04 | |||
624131ce46 | |||
47da2546f9 | |||
8a53abc1e8 | |||
b258a435cc | |||
43e4f1a766 | |||
02d22c12ae | |||
70ef2f0e81 | |||
b7283c93c6 | |||
5184d64b80 | |||
f482354ffd | |||
7a2b9d66a9 | |||
d79112ee5a | |||
4a5e8f175a |
@ -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>
|
|
@ -1 +0,0 @@
|
|||||||
GNUmakefile
|
|
0
doc/BidirectionalTraversal.rst
Executable file → Normal file
0
doc/BidirectionalTraversal.rst
Executable file → Normal file
0
doc/ForwardTraversal.rst
Executable file → Normal file
0
doc/ForwardTraversal.rst
Executable file → Normal file
0
doc/GNUmakefile
Executable file → Normal file
0
doc/GNUmakefile
Executable file → Normal file
0
doc/IncrementableIterator.rst
Executable file → Normal file
0
doc/IncrementableIterator.rst
Executable file → Normal file
@ -13,8 +13,11 @@ boostbook standalone
|
|||||||
:
|
:
|
||||||
iterator
|
iterator
|
||||||
:
|
:
|
||||||
|
<xsl:param>boost.root=../../../..
|
||||||
<xsl:param>toc.max.depth=3
|
<xsl:param>toc.max.depth=3
|
||||||
<xsl:param>toc.section.depth=3
|
<xsl:param>toc.section.depth=3
|
||||||
<xsl:param>chunk.section.depth=4
|
<xsl:param>chunk.section.depth=4
|
||||||
|
<format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/libs/iterator/doc
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
0
doc/LvalueIterator.rst
Executable file → Normal file
0
doc/LvalueIterator.rst
Executable file → Normal file
0
doc/ReadableIterator.rst
Executable file → Normal file
0
doc/ReadableIterator.rst
Executable file → Normal file
0
doc/SinglePassIterator.rst
Executable file → Normal file
0
doc/SinglePassIterator.rst
Executable file → Normal file
0
doc/SwappableIterator.rst
Executable file → Normal file
0
doc/SwappableIterator.rst
Executable file → Normal file
0
doc/WritableIterator.rst
Executable file → Normal file
0
doc/WritableIterator.rst
Executable file → Normal file
0
doc/counting_iterator.pdf
Executable file → Normal file
0
doc/counting_iterator.pdf
Executable file → Normal file
0
doc/docutils.sty
Executable file → Normal file
0
doc/docutils.sty
Executable file → Normal file
18
doc/facade-and-adaptor.html
Executable file → Normal file
18
doc/facade-and-adaptor.html
Executable file → Normal file
@ -26,7 +26,7 @@
|
|||||||
Lab</a>, <a class="last reference external" href="http://www.styleadvisor.com">Zephyr Associates, Inc.</a></td></tr>
|
Lab</a>, <a class="last reference external" href="http://www.styleadvisor.com">Zephyr Associates, Inc.</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Date:</th>
|
<tr><th class="docinfo-name">Date:</th>
|
||||||
<td>2006-09-11</td></tr>
|
<td>2006-09-11</td></tr>
|
||||||
<tr class="field"><th class="docinfo-name">Number:</th><td class="field-body">This is a revised version of <a class="reference external" href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1530.html">N1530</a>=03-0113, which was
|
<tr class="field"><th class="docinfo-name">Number:</th><td class="field-body">This is a revised version of <a class="reference external" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1530.html">N1530</a>=03-0113, which was
|
||||||
accepted for Technical Report 1 by the C++ standard
|
accepted for Technical Report 1 by the C++ standard
|
||||||
committee's library working group.</td>
|
committee's library working group.</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -239,29 +239,29 @@ Iterator Concepts.</p>
|
|||||||
<div class="section" id="iterator-concepts">
|
<div class="section" id="iterator-concepts">
|
||||||
<h2><a class="toc-backref" href="#id18">Iterator Concepts</a></h2>
|
<h2><a class="toc-backref" href="#id18">Iterator Concepts</a></h2>
|
||||||
<p>This proposal is formulated in terms of the new <tt class="docutils literal"><span class="pre">iterator</span> <span class="pre">concepts</span></tt>
|
<p>This proposal is formulated in terms of the new <tt class="docutils literal"><span class="pre">iterator</span> <span class="pre">concepts</span></tt>
|
||||||
as proposed in <a class="reference external" href="http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1550.html">n1550</a>, since user-defined and especially adapted
|
as proposed in <a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1550.htm">n1550</a>, since user-defined and especially adapted
|
||||||
iterators suffer from the well known categorization problems that are
|
iterators suffer from the well known categorization problems that are
|
||||||
inherent to the current iterator categories.</p>
|
inherent to the current iterator categories.</p>
|
||||||
<p>This proposal does not strictly depend on proposal <a class="reference external" href="http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1550.html">n1550</a>, as there
|
<p>This proposal does not strictly depend on proposal <a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1550.htm">n1550</a>, as there
|
||||||
is a direct mapping between new and old categories. This proposal
|
is a direct mapping between new and old categories. This proposal
|
||||||
could be reformulated using this mapping if <a class="reference external" href="http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1550.html">n1550</a> was not accepted.</p>
|
could be reformulated using this mapping if <a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1550.htm">n1550</a> was not accepted.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="interoperability">
|
<div class="section" id="interoperability">
|
||||||
<h2><a class="toc-backref" href="#id19">Interoperability</a></h2>
|
<h2><a class="toc-backref" href="#id19">Interoperability</a></h2>
|
||||||
<p>The question of iterator interoperability is poorly addressed in the
|
<p>The question of iterator interoperability is poorly addressed in the
|
||||||
current standard. There are currently two defect reports that are
|
current standard. There are currently two defect reports that are
|
||||||
concerned with interoperability issues.</p>
|
concerned with interoperability issues.</p>
|
||||||
<p>Issue <a class="reference external" href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#179">179</a> concerns the fact that mutable container iterator types
|
<p>Issue <a class="reference external" href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#179">179</a> concerns the fact that mutable container iterator types
|
||||||
are only required to be convertible to the corresponding constant
|
are only required to be convertible to the corresponding constant
|
||||||
iterator types, but objects of these types are not required to
|
iterator types, but objects of these types are not required to
|
||||||
interoperate in comparison or subtraction expressions. This situation
|
interoperate in comparison or subtraction expressions. This situation
|
||||||
is tedious in practice and out of line with the way built in types
|
is tedious in practice and out of line with the way built in types
|
||||||
work. This proposal implements the proposed resolution to issue
|
work. This proposal implements the proposed resolution to issue
|
||||||
<a class="reference external" href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#179">179</a>, as most standard library implementations do nowadays. In other
|
<a class="reference external" href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#179">179</a>, as most standard library implementations do nowadays. In other
|
||||||
words, if an iterator type A has an implicit or user defined
|
words, if an iterator type A has an implicit or user defined
|
||||||
conversion to an iterator type B, the iterator types are interoperable
|
conversion to an iterator type B, the iterator types are interoperable
|
||||||
and the usual set of operators are available.</p>
|
and the usual set of operators are available.</p>
|
||||||
<p>Issue <a class="reference external" href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#280">280</a> concerns the current lack of interoperability between
|
<p>Issue <a class="reference external" href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#280">280</a> concerns the current lack of interoperability between
|
||||||
reverse iterator types. The proposed new reverse_iterator template
|
reverse iterator types. The proposed new reverse_iterator template
|
||||||
fixes the issues raised in 280. It provides the desired
|
fixes the issues raised in 280. It provides the desired
|
||||||
interoperability without introducing unwanted overloads.</p>
|
interoperability without introducing unwanted overloads.</p>
|
||||||
@ -422,8 +422,8 @@ member (e.g. <a class="reference internal" href="#counting"><tt class="docutils
|
|||||||
into the temporary iterator <tt class="docutils literal"><span class="pre">p+n</span></tt>, which is destroyed when
|
into the temporary iterator <tt class="docutils literal"><span class="pre">p+n</span></tt>, which is destroyed when
|
||||||
<tt class="docutils literal"><span class="pre">operator[]</span></tt> returns.</p>
|
<tt class="docutils literal"><span class="pre">operator[]</span></tt> returns.</p>
|
||||||
<p>Writable iterators built with <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> implement the
|
<p>Writable iterators built with <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> implement the
|
||||||
semantics required by the preferred resolution to <a class="reference external" href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#299">issue 299</a> and
|
semantics required by the preferred resolution to <a class="reference external" href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#299">issue 299</a> and
|
||||||
adopted by proposal <a class="reference external" href="http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1550.html">n1550</a>: the result of <tt class="docutils literal"><span class="pre">p[n]</span></tt> is an object
|
adopted by proposal <a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1550.htm">n1550</a>: the result of <tt class="docutils literal"><span class="pre">p[n]</span></tt> is an object
|
||||||
convertible to the iterator's <tt class="docutils literal"><span class="pre">value_type</span></tt>, and <tt class="docutils literal"><span class="pre">p[n]</span> <span class="pre">=</span> <span class="pre">x</span></tt> is
|
convertible to the iterator's <tt class="docutils literal"><span class="pre">value_type</span></tt>, and <tt class="docutils literal"><span class="pre">p[n]</span> <span class="pre">=</span> <span class="pre">x</span></tt> is
|
||||||
equivalent to <tt class="docutils literal"><span class="pre">*(p</span> <span class="pre">+</span> <span class="pre">n)</span> <span class="pre">=</span> <span class="pre">x</span></tt> (Note: This result object may be
|
equivalent to <tt class="docutils literal"><span class="pre">*(p</span> <span class="pre">+</span> <span class="pre">n)</span> <span class="pre">=</span> <span class="pre">x</span></tt> (Note: This result object may be
|
||||||
implemented as a proxy containing a copy of <tt class="docutils literal"><span class="pre">p+n</span></tt>). This approach
|
implemented as a proxy containing a copy of <tt class="docutils literal"><span class="pre">p+n</span></tt>). This approach
|
||||||
|
0
doc/facade-and-adaptor.pdf
Executable file → Normal file
0
doc/facade-and-adaptor.pdf
Executable file → Normal file
@ -19,7 +19,7 @@
|
|||||||
.. Version 1.9 of this ReStructuredText document corresponds to
|
.. Version 1.9 of this ReStructuredText document corresponds to
|
||||||
n1530_, the paper accepted by the LWG.
|
n1530_, the paper accepted by the LWG.
|
||||||
|
|
||||||
.. _n1530: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1530.html
|
.. _n1530: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1530.html
|
||||||
|
|
||||||
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
|
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
|
||||||
|
|
||||||
@ -140,7 +140,7 @@ as proposed in n1550_, since user-defined and especially adapted
|
|||||||
iterators suffer from the well known categorization problems that are
|
iterators suffer from the well known categorization problems that are
|
||||||
inherent to the current iterator categories.
|
inherent to the current iterator categories.
|
||||||
|
|
||||||
.. _n1550: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1550.html
|
.. _n1550: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1550.htm
|
||||||
|
|
||||||
This proposal does not strictly depend on proposal n1550_, as there
|
This proposal does not strictly depend on proposal n1550_, as there
|
||||||
is a direct mapping between new and old categories. This proposal
|
is a direct mapping between new and old categories. This proposal
|
||||||
@ -169,8 +169,8 @@ reverse iterator types. The proposed new reverse_iterator template
|
|||||||
fixes the issues raised in 280. It provides the desired
|
fixes the issues raised in 280. It provides the desired
|
||||||
interoperability without introducing unwanted overloads.
|
interoperability without introducing unwanted overloads.
|
||||||
|
|
||||||
.. _179: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#179
|
.. _179: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#179
|
||||||
.. _280: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#280
|
.. _280: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#280
|
||||||
|
|
||||||
|
|
||||||
Iterator Facade
|
Iterator Facade
|
||||||
|
0
doc/facade_iterator_category.rst
Executable file → Normal file
0
doc/facade_iterator_category.rst
Executable file → Normal file
0
doc/filter_iterator.pdf
Executable file → Normal file
0
doc/filter_iterator.pdf
Executable file → Normal file
142
doc/function_input_iterator.html
Normal file
142
doc/function_input_iterator.html
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<meta name="generator" content="Docutils 0.6: http://docutils.sourceforge.net/" />
|
||||||
|
<title></title>
|
||||||
|
<meta name="author" content="Dean Michael Berris" />
|
||||||
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="document">
|
||||||
|
|
||||||
|
<table class="docinfo" frame="void" rules="none">
|
||||||
|
<col class="docinfo-name" />
|
||||||
|
<col class="docinfo-content" />
|
||||||
|
<tbody valign="top">
|
||||||
|
<tr><th class="docinfo-name">Author:</th>
|
||||||
|
<td><a class="first reference external" href="mailto:mikhailberis@gmail.com">Dean Michael Berris</a></td></tr>
|
||||||
|
<tr class="field"><th class="docinfo-name">License:</th><td class="field-body">Distributed under the Boost Software License, Version 1.0
|
||||||
|
(See accompanying file LICENSE_1_0.txt or copy at <a class="reference external" href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>)</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<div class="section" id="function-input-iterator">
|
||||||
|
<h1>Function Input Iterator</h1>
|
||||||
|
<p>The Function Input Iterator allows for creating iterators that encapsulate
|
||||||
|
a nullary function object and a state object which tracks the number of times
|
||||||
|
the iterator has been incremented. A Function Input Iterator models the
|
||||||
|
<a class="reference external" href="http://www.sgi.com/tech/stl/InputIterator.html">InputIterator</a> concept and is useful for creating bounded input iterators.</p>
|
||||||
|
<p>Like the Generator Iterator, the Function Input Iterator takes a function
|
||||||
|
that models the <a class="reference external" href="http://www.sgi.com/tech/stl/Generator.html">Generator</a> concept (which is basically a nullary or 0-arity
|
||||||
|
function object). Each increment of the function Function Input Iterator
|
||||||
|
invokes the generator function and stores the value in the iterator. When
|
||||||
|
the iterator is dereferenced the stored value is returned.</p>
|
||||||
|
<p>The Function Input Iterator encapsulates a state object which models the
|
||||||
|
<a class="reference internal" href="#incrementable-concept">Incrementable Concept</a> and the <a class="reference external" href="http://www.sgi.com/tech/stl/EqualityComparable.html">EqualityComparable</a> Concept. These concepts are
|
||||||
|
described below as:</p>
|
||||||
|
<div class="section" id="incrementable-concept">
|
||||||
|
<h2>Incrementable Concept</h2>
|
||||||
|
<p>A type models the Incrementable Concept when it supports the pre- and post-
|
||||||
|
increment operators. For a given object <tt class="docutils literal"><span class="pre">i</span></tt> with type <tt class="docutils literal"><span class="pre">I</span></tt>, the following
|
||||||
|
constructs should be valid:</p>
|
||||||
|
<table border="1" class="docutils">
|
||||||
|
<colgroup>
|
||||||
|
<col width="24%" />
|
||||||
|
<col width="46%" />
|
||||||
|
<col width="30%" />
|
||||||
|
</colgroup>
|
||||||
|
<tbody valign="top">
|
||||||
|
<tr><td colspan="3">Construct Description Return Type</td>
|
||||||
|
</tr>
|
||||||
|
<tr><td>i++</td>
|
||||||
|
<td>Post-increment i.</td>
|
||||||
|
<td>I</td>
|
||||||
|
</tr>
|
||||||
|
<tr><td>++i</td>
|
||||||
|
<td>Pre-increment i.</td>
|
||||||
|
<td>I&</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<p>NOTE: An Incrementable type should also be <a class="reference external" href="http://www.sgi.com/tech/stl/DefaultConstructible.html">DefaultConstructible</a>.</p>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="synopsis">
|
||||||
|
<h2>Synopsis</h2>
|
||||||
|
<pre class="literal-block">
|
||||||
|
namespace {
|
||||||
|
template <class Function, class State>
|
||||||
|
class function_input_iterator;
|
||||||
|
|
||||||
|
template <class Function, class State>
|
||||||
|
typename function_input_iterator<Function, State>
|
||||||
|
make_function_input_iterator(Function & f);
|
||||||
|
|
||||||
|
struct infinite;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="function-input-iterator-class">
|
||||||
|
<h2>Function Input Iterator Class</h2>
|
||||||
|
<p>The class Function Input Iterator class takes two template parameters
|
||||||
|
<tt class="docutils literal"><span class="pre">Function</span></tt> and <tt class="docutils literal"><span class="pre">State</span></tt>. These two template parameters tell the
|
||||||
|
Function Input Iterator the type of the function to encapsulate and
|
||||||
|
the type of the internal state value to hold.</p>
|
||||||
|
<p>The <tt class="docutils literal"><span class="pre">State</span></tt> parameter is important in cases where you want to
|
||||||
|
control the type of the counter which determines whether two iterators
|
||||||
|
are at the same state. This allows for creating a pair of iterators which
|
||||||
|
bound the range of the invocations of the encapsulated functions.</p>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="examples">
|
||||||
|
<h2>Examples</h2>
|
||||||
|
<p>The following example shows how we use the function input iterator class
|
||||||
|
in cases where we want to create bounded (lazy) generated ranges.</p>
|
||||||
|
<pre class="literal-block">
|
||||||
|
struct generator {
|
||||||
|
typedef int result_type;
|
||||||
|
generator() { srand(time(0)); }
|
||||||
|
result_type operator() () const {
|
||||||
|
return rand();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(int argc, char * argv[]) {
|
||||||
|
generator f;
|
||||||
|
copy(
|
||||||
|
make_function_input_iterator(f, 0),
|
||||||
|
make_function_input_iterator(f, 10),
|
||||||
|
ostream_iterator<int>(cout, " ")
|
||||||
|
);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
<p>Here we can see that we've bounded the number of invocations using an <tt class="docutils literal"><span class="pre">int</span></tt>
|
||||||
|
that counts from <tt class="docutils literal"><span class="pre">0</span></tt> to <tt class="docutils literal"><span class="pre">10</span></tt>. Say we want to create an endless stream
|
||||||
|
of random numbers and encapsulate that in a pair of integers, we can do
|
||||||
|
it with the <tt class="docutils literal"><span class="pre">boost::infinite</span></tt> helper class.</p>
|
||||||
|
<pre class="literal-block">
|
||||||
|
copy(
|
||||||
|
make_function_input_iterator(f,infinite()),
|
||||||
|
make_function_input_iterator(f,infinite()),
|
||||||
|
ostream_iterator<int>(count, " ")
|
||||||
|
);
|
||||||
|
</pre>
|
||||||
|
<p>Above, instead of creating a huge vector we rely on the STL copy algorithm
|
||||||
|
to traverse the function input iterator and call the function object f
|
||||||
|
as it increments the iterator. The special property of <tt class="docutils literal"><span class="pre">boost::infinite</span></tt>
|
||||||
|
is that equating two instances always yield false -- and that incrementing
|
||||||
|
an instance of <tt class="docutils literal"><span class="pre">boost::infinite</span></tt> doesn't do anything. This is an efficient
|
||||||
|
way of stating that the iterator range provided by two iterators with an
|
||||||
|
encapsulated infinite state will definitely be infinite.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
<hr class="footer" />
|
||||||
|
<a class="reference external" href="function_input_iterator.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
132
doc/function_input_iterator.rst
Normal file
132
doc/function_input_iterator.rst
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
:Author:
|
||||||
|
`Dean Michael Berris <mailto:me@deanberris.com>`_
|
||||||
|
|
||||||
|
:License:
|
||||||
|
Distributed under the Boost Software License, Version 1.0
|
||||||
|
(See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
:Copyright:
|
||||||
|
Copyright 2012 Google, Inc.
|
||||||
|
|
||||||
|
Function Input Iterator
|
||||||
|
=======================
|
||||||
|
|
||||||
|
The Function Input Iterator allows for creating iterators that encapsulate
|
||||||
|
a nullary function object and a state object which tracks the number of times
|
||||||
|
the iterator has been incremented. A Function Input Iterator models the
|
||||||
|
`InputIterator`_ concept and is useful for creating bounded input iterators.
|
||||||
|
|
||||||
|
.. _InputIterator: http://www.sgi.com/tech/stl/InputIterator.html
|
||||||
|
|
||||||
|
The Function Input Iterator takes a function that models the Generator_ concept
|
||||||
|
(which is basically a nullary or 0-arity function object). The first dereference
|
||||||
|
of the iterator at a given position invokes the generator function and stores
|
||||||
|
and returns the result; subsequent dereferences at the same position simply
|
||||||
|
return the same stored result. Incrementing the iterator places it at a new
|
||||||
|
position, hence a subsequent dereference will generate a new value via another
|
||||||
|
invokation of the generator function. This ensures the generator function is
|
||||||
|
invoked precisely when the iterator is requested to return a (new) value.
|
||||||
|
|
||||||
|
.. _Generator: http://www.sgi.com/tech/stl/Generator.html
|
||||||
|
|
||||||
|
The Function Input Iterator encapsulates a state object which models the
|
||||||
|
`Incrementable Concept`_ and the EqualityComparable_ Concept. These concepts are
|
||||||
|
described below as:
|
||||||
|
|
||||||
|
.. _EqualityComparable: http://www.sgi.com/tech/stl/EqualityComparable.html
|
||||||
|
|
||||||
|
Incrementable Concept
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
A type models the Incrementable Concept when it supports the pre- and post-
|
||||||
|
increment operators. For a given object ``i`` with type ``I``, the following
|
||||||
|
constructs should be valid:
|
||||||
|
|
||||||
|
========= ================= ===========
|
||||||
|
Construct Description Return Type
|
||||||
|
-----------------------------------------
|
||||||
|
i++ Post-increment i. I
|
||||||
|
++i Pre-increment i. I&
|
||||||
|
========= ================= ===========
|
||||||
|
|
||||||
|
NOTE: An Incrementable type should also be DefaultConstructible_.
|
||||||
|
|
||||||
|
.. _DefaultConstructible: http://www.sgi.com/tech/stl/DefaultConstructible.html
|
||||||
|
|
||||||
|
Synopsis
|
||||||
|
--------
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
template <class Function, class State>
|
||||||
|
class function_input_iterator;
|
||||||
|
|
||||||
|
template <class Function, class State>
|
||||||
|
typename function_input_iterator<Function, State>
|
||||||
|
make_function_input_iterator(Function & f, State s);
|
||||||
|
|
||||||
|
struct infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
Function Input Iterator Class
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
The class Function Input Iterator class takes two template parameters
|
||||||
|
``Function`` and ``State``. These two template parameters tell the
|
||||||
|
Function Input Iterator the type of the function to encapsulate and
|
||||||
|
the type of the internal state value to hold.
|
||||||
|
|
||||||
|
The ``State`` parameter is important in cases where you want to
|
||||||
|
control the type of the counter which determines whether two iterators
|
||||||
|
are at the same state. This allows for creating a pair of iterators which
|
||||||
|
bound the range of the invocations of the encapsulated functions.
|
||||||
|
|
||||||
|
Examples
|
||||||
|
--------
|
||||||
|
|
||||||
|
The following example shows how we use the function input iterator class
|
||||||
|
in cases where we want to create bounded (lazy) generated ranges.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
struct generator {
|
||||||
|
typedef int result_type;
|
||||||
|
generator() { srand(time(0)); }
|
||||||
|
result_type operator() () const {
|
||||||
|
return rand();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(int argc, char * argv[]) {
|
||||||
|
generator f;
|
||||||
|
copy(
|
||||||
|
make_function_input_iterator(f, 0),
|
||||||
|
make_function_input_iterator(f, 10),
|
||||||
|
ostream_iterator<int>(cout, " ")
|
||||||
|
);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Here we can see that we've bounded the number of invocations using an ``int``
|
||||||
|
that counts from ``0`` to ``10``. Say we want to create an endless stream
|
||||||
|
of random numbers and encapsulate that in a pair of integers, we can do
|
||||||
|
it with the ``boost::infinite`` helper class.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
copy(
|
||||||
|
make_function_input_iterator(f,infinite()),
|
||||||
|
make_function_input_iterator(f,infinite()),
|
||||||
|
ostream_iterator<int>(cout, " ")
|
||||||
|
);
|
||||||
|
|
||||||
|
Above, instead of creating a huge vector we rely on the STL copy algorithm
|
||||||
|
to traverse the function input iterator and call the function object f
|
||||||
|
as it increments the iterator. The special property of ``boost::infinite``
|
||||||
|
is that equating two instances always yield false -- and that incrementing
|
||||||
|
an instance of ``boost::infinite`` doesn't do anything. This is an efficient
|
||||||
|
way of stating that the iterator range provided by two iterators with an
|
||||||
|
encapsulated infinite state will definitely be infinite.
|
||||||
|
|
||||||
|
|
0
doc/function_output_iterator.pdf
Executable file → Normal file
0
doc/function_output_iterator.pdf
Executable file → Normal file
163
doc/generator_iterator.htm
Normal file
163
doc/generator_iterator.htm
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Language" content="en-us">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
|
||||||
|
|
||||||
|
<title>Generator Iterator Adaptor Documentation</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body bgcolor="#FFFFFF" text="#000000">
|
||||||
|
<img src="../../boost.png" alt="boost.png (6897 bytes)" align="middle"
|
||||||
|
width="277" height="86">
|
||||||
|
|
||||||
|
<h1>Generator Iterator Adaptor</h1>
|
||||||
|
|
||||||
|
<p>Defined in header <a href=
|
||||||
|
"../../boost/generator_iterator.hpp">boost/generator_iterator.hpp</a></p>
|
||||||
|
|
||||||
|
<p>The generator iterator adaptor makes it easier to create custom input
|
||||||
|
iterators from 0-ary functions and function objects. The adaptor takes a
|
||||||
|
<a href="http://www.sgi.com/tech/stl/Generator.html">Generator</a> and
|
||||||
|
creates a model of <a href=
|
||||||
|
"http://www.sgi.com/tech/stl/InputIterator.html">Input Iterator</a>. Each
|
||||||
|
increment retrieves an item from the generator and makes it available to be
|
||||||
|
retrieved by dereferencing. The motivation for this iterator is that some
|
||||||
|
concepts can be more naturally expressed as a generator, while most STL
|
||||||
|
algorithms expect an iterator. An example is the <a href=
|
||||||
|
"../random/index.html">Random Number</a> library.</p>
|
||||||
|
|
||||||
|
<h2>Synopsis</h2>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<pre>
|
||||||
|
namespace boost {
|
||||||
|
template <class Generator>
|
||||||
|
class generator_iterator_policies;
|
||||||
|
|
||||||
|
template <class Generator>
|
||||||
|
class generator_iterator_generator;
|
||||||
|
|
||||||
|
template <class Generator>
|
||||||
|
typename generator_iterator_generator<Generator>::type
|
||||||
|
make_generator_iterator(Generator & gen);
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
</blockquote>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>The Generator Iterator Generator Class</h2>
|
||||||
|
|
||||||
|
<p>The class generator_iterator_generator is a helper class whose purpose
|
||||||
|
is to construct a generator iterator type. The template parameter for this
|
||||||
|
class is the Generator function object type that is being wrapped. The
|
||||||
|
generator iterator adaptor only holds a reference (or pointer) to the
|
||||||
|
function object, therefore the function object must outlive the generator
|
||||||
|
iterator adaptor constructed from it.</p>
|
||||||
|
<pre>
|
||||||
|
template <class Generator>
|
||||||
|
class generator_iterator_generator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef <i>unspecified</i> type; // the resulting generator iterator type
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h3>Template Parameters</h3>
|
||||||
|
|
||||||
|
<table border summary="">
|
||||||
|
<tr>
|
||||||
|
<th>Parameter</th>
|
||||||
|
|
||||||
|
<th>Description</th>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><tt><a href=
|
||||||
|
"http://www.sgi.com/tech/stl/Generator.html">Generator</a></tt></td>
|
||||||
|
|
||||||
|
<td>The generator (0-ary function object) type being wrapped. The
|
||||||
|
return type of the function must be defined as
|
||||||
|
<tt>Generator::result_type</tt>. The function object must be a model of
|
||||||
|
<a href=
|
||||||
|
"http://www.sgi.com/tech/stl/Generator.html">Generator</a>.</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h3>Concept Model</h3>
|
||||||
|
|
||||||
|
<p>The generator iterator class is a model of <a href=
|
||||||
|
"http://www.sgi.com/tech/stl/InputIterator.html">Input Iterator</a>.</p>
|
||||||
|
|
||||||
|
<h3>Members</h3>
|
||||||
|
|
||||||
|
<p>The generator iterator implements the member functions and operators
|
||||||
|
required of the <a href=
|
||||||
|
"http://www.sgi.com/tech/stl/InputIterator.html">Input Iterator</a>
|
||||||
|
concept.<br></p>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="make_generator_iterator" id="make_generator_iterator">The
|
||||||
|
Generator Iterator Object Generator</a></h2>
|
||||||
|
|
||||||
|
<p>The <tt>make_generator_iterator()</tt> function provides a convenient
|
||||||
|
way to create generator iterator objects. The function saves the user the
|
||||||
|
trouble of explicitly writing out the iterator types.</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<pre>
|
||||||
|
template <class Generator>
|
||||||
|
typename generator_iterator_generator<Generator>::type
|
||||||
|
make_generator_iterator(Generator & gen);
|
||||||
|
</pre>
|
||||||
|
</blockquote>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h3>Example</h3>
|
||||||
|
|
||||||
|
<p>The following program shows how <code>generator_iterator</code>
|
||||||
|
transforms a generator into an input iterator.</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<pre>
|
||||||
|
#include <iostream>
|
||||||
|
#include <boost/generator_iterator.hpp>
|
||||||
|
|
||||||
|
class my_generator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef int result_type;
|
||||||
|
my_generator() : state(0) { }
|
||||||
|
int operator()() { return ++state; }
|
||||||
|
private:
|
||||||
|
int state;
|
||||||
|
};
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
my_generator gen;
|
||||||
|
boost::generator_iterator_generator<my_generator>::type it = boost::make_generator_iterator(gen);
|
||||||
|
for(int i = 0; i < 10; ++i, ++it)
|
||||||
|
std::cout << *it << std::endl;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
</blockquote>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<p><a href="http://validator.w3.org/check?uri=referer"><img border="0" src=
|
||||||
|
"../../doc/images/valid-html401.png" alt="Valid HTML 4.01 Transitional"
|
||||||
|
height="31" width="88"></a></p>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->05 December, 2006<!--webbot bot="Timestamp" endspan i-checksum="38516" --></p>
|
||||||
|
|
||||||
|
<p><i>Copyright © 2001 <a href=
|
||||||
|
"http://www.boost.org/people/jens_maurer.htm">Jens Maurer</a></i></p>
|
||||||
|
|
||||||
|
<p><i>Distributed under the Boost Software License, Version 1.0. (See
|
||||||
|
accompanying file <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or
|
||||||
|
copy at <a href=
|
||||||
|
"http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>)</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
48
doc/index.html
Executable file → Normal file
48
doc/index.html
Executable file → Normal file
@ -3,7 +3,7 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.6: http://docutils.sourceforge.net/" />
|
||||||
<title>The Boost.Iterator Library Boost</title>
|
<title>The Boost.Iterator Library Boost</title>
|
||||||
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
@ -11,9 +11,6 @@
|
|||||||
<div class="document" id="the-boost-iterator-library-logo">
|
<div class="document" id="the-boost-iterator-library-logo">
|
||||||
<h1 class="title">The Boost.Iterator Library <a class="reference external" href="../../../index.htm"><img alt="Boost" src="../../../boost.png" /></a></h1>
|
<h1 class="title">The Boost.Iterator Library <a class="reference external" href="../../../index.htm"><img alt="Boost" src="../../../boost.png" /></a></h1>
|
||||||
|
|
||||||
<!-- Distributed under the Boost -->
|
|
||||||
<!-- Software License, Version 1.0. (See accompanying -->
|
|
||||||
<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
|
|
||||||
<!-- Distributed under the Boost -->
|
<!-- Distributed under the Boost -->
|
||||||
<!-- Software License, Version 1.0. (See accompanying -->
|
<!-- Software License, Version 1.0. (See accompanying -->
|
||||||
<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
|
<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
|
||||||
@ -40,7 +37,7 @@ Lab</a>, <a class="reference external" href="http://www.styleadvisor.com">Zephyr
|
|||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Abstract:</th><td class="field-body">The Boost Iterator Library contains two parts. The first
|
<tr class="field"><th class="field-name">Abstract:</th><td class="field-body">The Boost Iterator Library contains two parts. The first
|
||||||
is a system of <a class="reference external" href="../../../more/generic_programming.html#concept">concepts</a> which extend the C++ standard
|
is a system of <a class="reference external" href="http://www.boost.org/more/generic_programming.html#concept">concepts</a> which extend the C++ standard
|
||||||
iterator requirements. The second is a framework of
|
iterator requirements. The second is a framework of
|
||||||
components for building iterators based on these
|
components for building iterators based on these
|
||||||
extended concepts and includes several useful iterator
|
extended concepts and includes several useful iterator
|
||||||
@ -60,21 +57,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 first"><strong>Table of Contents</strong></p>
|
<p class="topic-title first"><strong>Table of Contents</strong></p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference internal" href="#new-style-iterators" id="id22">New-Style Iterators</a></li>
|
<li><a class="reference internal" href="#new-style-iterators" id="id23">New-Style Iterators</a></li>
|
||||||
<li><a class="reference internal" href="#iterator-facade-and-adaptor" id="id23">Iterator Facade and Adaptor</a></li>
|
<li><a class="reference internal" href="#iterator-facade-and-adaptor" id="id24">Iterator Facade and Adaptor</a></li>
|
||||||
<li><a class="reference internal" href="#specialized-adaptors" id="id24">Specialized Adaptors</a></li>
|
<li><a class="reference internal" href="#specialized-adaptors" id="id25">Specialized Adaptors</a></li>
|
||||||
<li><a class="reference internal" href="#iterator-utilities" id="id25">Iterator Utilities</a><ul>
|
<li><a class="reference internal" href="#iterator-utilities" id="id26">Iterator Utilities</a><ul>
|
||||||
<li><a class="reference internal" href="#traits" id="id26">Traits</a></li>
|
<li><a class="reference internal" href="#traits" id="id27">Traits</a></li>
|
||||||
<li><a class="reference internal" href="#testing-and-concept-checking" id="id27">Testing and Concept Checking</a></li>
|
<li><a class="reference internal" href="#testing-and-concept-checking" id="id28">Testing and Concept Checking</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a class="reference internal" href="#upgrading-from-the-old-boost-iterator-adaptor-library" id="id28">Upgrading from the old Boost Iterator Adaptor Library</a></li>
|
<li><a class="reference internal" href="#upgrading-from-the-old-boost-iterator-adaptor-library" id="id29">Upgrading from the old Boost Iterator Adaptor Library</a></li>
|
||||||
<li><a class="reference internal" href="#history" id="id29">History</a></li>
|
<li><a class="reference internal" href="#history" id="id30">History</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<hr class="docutils" />
|
<hr class="docutils" />
|
||||||
<div class="section" id="new-style-iterators">
|
<div class="section" id="new-style-iterators">
|
||||||
<h1><a class="toc-backref" href="#id22">New-Style Iterators</a></h1>
|
<h1><a class="toc-backref" href="#id23">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
|
||||||
@ -93,7 +90,7 @@ concepts, see our</p>
|
|||||||
<a class="reference external" href="new-iter-concepts.html">Standard Proposal For New-Style Iterators</a> (<a class="reference external" href="new-iter-concepts.pdf">PDF</a>)</blockquote>
|
<a class="reference external" href="new-iter-concepts.html">Standard Proposal For New-Style Iterators</a> (<a class="reference external" 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">Iterator Facade and Adaptor</a></h1>
|
<h1><a class="toc-backref" href="#id24">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="docutils literal"><span class="pre">iterator_facade</span></tt> class template,
|
the Boost.Iterator library provides the <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> class template,
|
||||||
@ -120,7 +117,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">Specialized Adaptors</a></h1>
|
<h1><a class="toc-backref" href="#id25">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 internal" href="#iterator-facade-and-adaptor">iterator facade and adaptor</a>.</p>
|
iterator templates based on the Boost <a class="reference internal" href="#iterator-facade-and-adaptor">iterator facade and adaptor</a>.</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
@ -128,6 +125,9 @@ iterator templates based on the Boost <a class="reference internal" href="#itera
|
|||||||
Implements a "lazy sequence"</li>
|
Implements a "lazy sequence"</li>
|
||||||
<li><a class="reference external" href="filter_iterator.html"><tt class="docutils literal"><span class="pre">filter_iterator</span></tt></a> (<a class="reference external" href="filter_iterator.pdf">PDF</a>): an iterator over the subset of elements of some
|
<li><a class="reference external" href="filter_iterator.html"><tt class="docutils literal"><span class="pre">filter_iterator</span></tt></a> (<a class="reference external" 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 external" href="function_input_iterator.html"><tt class="docutils literal"><span class="pre">function_input_iterator</span></tt></a> (<a class="reference external" href="function_input_iterator.pdf">PDF</a>): an input iterator wrapping a generator (nullary
|
||||||
|
function object); each time the iterator is dereferenced, the function object
|
||||||
|
is called to get the value to return.</li>
|
||||||
<li><a class="reference external" href="function_output_iterator.html"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt></a> (<a class="reference external" href="function_output_iterator.pdf">PDF</a>): an output iterator wrapping a unary function
|
<li><a class="reference external" href="function_output_iterator.html"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt></a> (<a class="reference external" href="function_output_iterator.pdf">PDF</a>): an output iterator wrapping a unary function
|
||||||
object; each time an element is written into the dereferenced
|
object; each time an element is written into the dereferenced
|
||||||
iterator, it is passed as a parameter to the function object.</li>
|
iterator, it is passed as a parameter to the function object.</li>
|
||||||
@ -149,9 +149,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">Iterator Utilities</a></h1>
|
<h1><a class="toc-backref" href="#id26">Iterator Utilities</a></h1>
|
||||||
<div class="section" id="traits">
|
<div class="section" id="traits">
|
||||||
<h2><a class="toc-backref" href="#id26">Traits</a></h2>
|
<h2><a class="toc-backref" href="#id27">Traits</a></h2>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference external" href="pointee.html"><tt class="docutils literal"><span class="pre">pointee.hpp</span></tt></a> (<a class="reference external" href="pointee.pdf">PDF</a>): Provides the capability to deduce the referent types
|
<li><a class="reference external" href="pointee.html"><tt class="docutils literal"><span class="pre">pointee.hpp</span></tt></a> (<a class="reference external" 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
|
||||||
@ -165,7 +165,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">Testing and Concept Checking</a></h2>
|
<h2><a class="toc-backref" href="#id28">Testing and Concept Checking</a></h2>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference external" href="iterator_concepts.html"><tt class="docutils literal"><span class="pre">iterator_concepts.hpp</span></tt></a> (<a class="reference external" href="iterator_concepts.pdf">PDF</a>): Concept checking classes for the new iterator concepts.</li>
|
<li><a class="reference external" href="iterator_concepts.html"><tt class="docutils literal"><span class="pre">iterator_concepts.hpp</span></tt></a> (<a class="reference external" href="iterator_concepts.pdf">PDF</a>): Concept checking classes for the new iterator concepts.</li>
|
||||||
<li><a class="reference external" href="iterator_archetypes.html"><tt class="docutils literal"><span class="pre">iterator_archetypes.hpp</span></tt></a> (<a class="reference external" href="iterator_archetypes.pdf">PDF</a>): Concept archetype classes for the new iterators concepts.</li>
|
<li><a class="reference external" href="iterator_archetypes.html"><tt class="docutils literal"><span class="pre">iterator_archetypes.hpp</span></tt></a> (<a class="reference external" href="iterator_archetypes.pdf">PDF</a>): Concept archetype classes for the new iterators concepts.</li>
|
||||||
@ -173,17 +173,17 @@ 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">Upgrading from the old Boost Iterator Adaptor Library</a></h1>
|
<h1><a class="toc-backref" href="#id29">Upgrading from the old Boost Iterator Adaptor Library</a></h1>
|
||||||
<p id="upgrading">If you have been using the old Boost Iterator Adaptor library to
|
<p id="upgrading">If you have been using the old Boost Iterator Adaptor library to
|
||||||
implement iterators, you probably wrote a <tt class="docutils literal"><span class="pre">Policies</span></tt> class which
|
implement iterators, you probably wrote a <tt class="docutils 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
|
||||||
design, you'll move those same core operations into the body of the
|
design, you'll move those same core operations into the body of the
|
||||||
iterator class itself. If you were writing a family of iterators,
|
iterator class itself. If you were writing a family of iterators,
|
||||||
you probably wrote a <a class="reference external" href="../../../more/generic_programming.html#type_generator">type generator</a> to build the
|
you probably wrote a <a class="reference external" href="http://www.boost.org/more/generic_programming.html#type_generator">type generator</a> to build the
|
||||||
<tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> specialization you needed; in the new library
|
<tt class="docutils 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">[Cop95]</a>,
|
use of the Curiously Recurring Template Pattern (CRTP) <a class="citation-reference" href="#cop95" id="id22">[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="docutils literal"><span class="pre">iterator_facade</span></tt> or
|
functionality through inheritance from <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> or
|
||||||
<tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>. As a result, you also get much finer control
|
<tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>. As a result, you also get much finer control
|
||||||
@ -198,7 +198,7 @@ type, <tt class="docutils literal"><span class="pre">transform_iterator</span></
|
|||||||
<tt class="docutils literal"><span class="pre">projection_iterator</span></tt> used to.</p>
|
<tt class="docutils 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">History</a></h1>
|
<h1><a class="toc-backref" href="#id30">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
|
||||||
@ -226,7 +226,7 @@ library you see today.</p>
|
|||||||
<table class="docutils citation" frame="void" id="cop95" rules="none">
|
<table class="docutils citation" frame="void" id="cop95" rules="none">
|
||||||
<colgroup><col class="label" /><col /></colgroup>
|
<colgroup><col class="label" /><col /></colgroup>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td class="label"><a class="fn-backref" href="#id21">[Cop95]</a></td><td>[Coplien, 1995] Coplien, J., Curiously Recurring Template
|
<tr><td class="label"><a class="fn-backref" href="#id22">[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>
|
||||||
|
18
doc/index.rst
Executable file → Normal file
18
doc/index.rst
Executable file → Normal file
@ -43,7 +43,7 @@ __ ../../../index.htm
|
|||||||
The components of the Boost Iterator Library replace the
|
The components of the Boost Iterator Library replace the
|
||||||
older Boost Iterator Adaptor Library.
|
older Boost Iterator Adaptor Library.
|
||||||
|
|
||||||
.. _concepts: ../../../more/generic_programming.html#concept
|
.. _concepts: http://www.boost.org/more/generic_programming.html#concept
|
||||||
|
|
||||||
.. contents:: **Table of Contents**
|
.. contents:: **Table of Contents**
|
||||||
|
|
||||||
@ -138,7 +138,11 @@ 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
|
* |function_input|_ (PDF__): an input iterator wrapping a generator (nullary
|
||||||
|
function object); each time the iterator is dereferenced, the function object
|
||||||
|
is called to get the value to return.
|
||||||
|
|
||||||
|
* |function_output|_ (PDF__): an output iterator wrapping a unary function
|
||||||
object; each time an element is written into the dereferenced
|
object; each time an element is written into the dereferenced
|
||||||
iterator, it is passed as a parameter to the function object.
|
iterator, it is passed as a parameter to the function object.
|
||||||
|
|
||||||
@ -171,8 +175,12 @@ __ counting_iterator.pdf
|
|||||||
.. _filter: filter_iterator.html
|
.. _filter: filter_iterator.html
|
||||||
__ filter_iterator.pdf
|
__ filter_iterator.pdf
|
||||||
|
|
||||||
.. |function| replace:: ``function_output_iterator``
|
.. |function_input| replace:: ``function_input_iterator``
|
||||||
.. _function: function_output_iterator.html
|
.. _function_input: function_input_iterator.html
|
||||||
|
__ function_input_iterator.pdf
|
||||||
|
|
||||||
|
.. |function_output| replace:: ``function_output_iterator``
|
||||||
|
.. _function_output: function_output_iterator.html
|
||||||
__ function_output_iterator.pdf
|
__ function_output_iterator.pdf
|
||||||
|
|
||||||
.. |indirect| replace:: ``indirect_iterator``
|
.. |indirect| replace:: ``indirect_iterator``
|
||||||
@ -271,7 +279,7 @@ over how your iterator works: you can add additional constructors,
|
|||||||
or even override the iterator functionality provided by the
|
or even override the iterator functionality provided by the
|
||||||
library.
|
library.
|
||||||
|
|
||||||
.. _`type generator`: ../../../more/generic_programming.html#type_generator
|
.. _`type generator`: http://www.boost.org/more/generic_programming.html#type_generator
|
||||||
|
|
||||||
If you're looking for the old ``projection_iterator`` component,
|
If you're looking for the old ``projection_iterator`` component,
|
||||||
its functionality has been merged into ``transform_iterator``: as
|
its functionality has been merged into ``transform_iterator``: as
|
||||||
|
0
doc/indirect_iterator.pdf
Executable file → Normal file
0
doc/indirect_iterator.pdf
Executable file → Normal file
0
doc/indirect_reference_ref.rst
Executable file → Normal file
0
doc/indirect_reference_ref.rst
Executable file → Normal file
0
doc/interoperability-revisited.rst
Executable file → Normal file
0
doc/interoperability-revisited.rst
Executable file → Normal file
2
doc/issues.rst
Executable file → Normal file
2
doc/issues.rst
Executable file → Normal file
@ -3,7 +3,7 @@
|
|||||||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
.. _N1550: http://www.boost-consulting.com/writing/n1550.html
|
.. _N1550: http://www.boost-consulting.com/writing/n1550.html
|
||||||
.. _N1530: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1530.html
|
.. _N1530: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1530.html
|
||||||
|
|
||||||
:Author: David Abrahams and Jeremy Siek
|
:Author: David Abrahams and Jeremy Siek
|
||||||
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu
|
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu
|
||||||
|
0
doc/iterator_adaptor.pdf
Executable file → Normal file
0
doc/iterator_adaptor.pdf
Executable file → Normal file
0
doc/iterator_adaptor_tutorial.rst
Executable file → Normal file
0
doc/iterator_adaptor_tutorial.rst
Executable file → Normal file
0
doc/iterator_archetypes.html
Executable file → Normal file
0
doc/iterator_archetypes.html
Executable file → Normal file
0
doc/iterator_archetypes.pdf
Executable file → Normal file
0
doc/iterator_archetypes.pdf
Executable file → Normal file
0
doc/iterator_archetypes.rst
Executable file → Normal file
0
doc/iterator_archetypes.rst
Executable file → Normal file
0
doc/iterator_concepts.pdf
Executable file → Normal file
0
doc/iterator_concepts.pdf
Executable file → Normal file
0
doc/iterator_concepts.rst
Executable file → Normal file
0
doc/iterator_concepts.rst
Executable file → Normal file
@ -242,8 +242,8 @@ member (e.g. <a class="reference external" href="counting_iterator.html"><tt cla
|
|||||||
into the temporary iterator <tt class="docutils literal"><span class="pre">p+n</span></tt>, which is destroyed when
|
into the temporary iterator <tt class="docutils literal"><span class="pre">p+n</span></tt>, which is destroyed when
|
||||||
<tt class="docutils literal"><span class="pre">operator[]</span></tt> returns.</p>
|
<tt class="docutils literal"><span class="pre">operator[]</span></tt> returns.</p>
|
||||||
<p>Writable iterators built with <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> implement the
|
<p>Writable iterators built with <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> implement the
|
||||||
semantics required by the preferred resolution to <a class="reference external" href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#299">issue 299</a> and
|
semantics required by the preferred resolution to <a class="reference external" href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#299">issue 299</a> and
|
||||||
adopted by proposal <a class="reference external" href="http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1550.html">n1550</a>: the result of <tt class="docutils literal"><span class="pre">p[n]</span></tt> is an object
|
adopted by proposal <a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1550.htm">n1550</a>: the result of <tt class="docutils literal"><span class="pre">p[n]</span></tt> is an object
|
||||||
convertible to the iterator's <tt class="docutils literal"><span class="pre">value_type</span></tt>, and <tt class="docutils literal"><span class="pre">p[n]</span> <span class="pre">=</span> <span class="pre">x</span></tt> is
|
convertible to the iterator's <tt class="docutils literal"><span class="pre">value_type</span></tt>, and <tt class="docutils literal"><span class="pre">p[n]</span> <span class="pre">=</span> <span class="pre">x</span></tt> is
|
||||||
equivalent to <tt class="docutils literal"><span class="pre">*(p</span> <span class="pre">+</span> <span class="pre">n)</span> <span class="pre">=</span> <span class="pre">x</span></tt> (Note: This result object may be
|
equivalent to <tt class="docutils literal"><span class="pre">*(p</span> <span class="pre">+</span> <span class="pre">n)</span> <span class="pre">=</span> <span class="pre">x</span></tt> (Note: This result object may be
|
||||||
implemented as a proxy containing a copy of <tt class="docutils literal"><span class="pre">p+n</span></tt>). This approach
|
implemented as a proxy containing a copy of <tt class="docutils literal"><span class="pre">p+n</span></tt>). This approach
|
||||||
@ -866,7 +866,7 @@ operator -(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
|
|||||||
<p>In this section we'll walk through the implementation of a few
|
<p>In this section we'll walk through the implementation of a few
|
||||||
iterators using <tt class="docutils literal"><span class="pre">iterator_facade</span></tt>, based around the simple
|
iterators using <tt class="docutils literal"><span class="pre">iterator_facade</span></tt>, based around the simple
|
||||||
example of a linked list of polymorphic objects. This example was
|
example of a linked list of polymorphic objects. This example was
|
||||||
inspired by a <a class="reference external" href="http://thread.gmane.org/gmane.comp.lib.boost.user/5100">posting</a> by Keith Macdonald on the <a class="reference external" href="../../../more/mailing_lists.htm#users">Boost-Users</a>
|
inspired by a <a class="reference external" href="http://thread.gmane.org/gmane.comp.lib.boost.user/5100">posting</a> by Keith Macdonald on the <a class="reference external" href="http://www.boost.org/more/mailing_lists.htm#users">Boost-Users</a>
|
||||||
mailing list.</p>
|
mailing list.</p>
|
||||||
<div class="section" id="the-problem">
|
<div class="section" id="the-problem">
|
||||||
<h2><a class="toc-backref" href="#id32">The Problem</a></h2>
|
<h2><a class="toc-backref" href="#id32">The Problem</a></h2>
|
||||||
|
0
doc/iterator_facade.pdf
Executable file → Normal file
0
doc/iterator_facade.pdf
Executable file → Normal file
@ -167,9 +167,9 @@ the implementation of her iterator is free to implement an
|
|||||||
class; it will hide the one supplied by ``iterator_facade`` from
|
class; it will hide the one supplied by ``iterator_facade`` from
|
||||||
clients of her iterator.
|
clients of her iterator.
|
||||||
|
|
||||||
.. _n1550: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1550.html
|
.. _n1550: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1550.htm
|
||||||
|
|
||||||
.. _`issue 299`: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#299
|
.. _`issue 299`: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#299
|
||||||
|
|
||||||
.. _`operator arrow`:
|
.. _`operator arrow`:
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ The ``iterator_category`` member of ``iterator_facade`` is
|
|||||||
|
|
||||||
.. parsed-literal::
|
.. parsed-literal::
|
||||||
|
|
||||||
*iterator-category*\ (CategoryOrTraversal, value_type, reference)
|
*iterator-category*\ (CategoryOrTraversal, reference, value_type)
|
||||||
|
|
||||||
where *iterator-category* is defined as follows:
|
where *iterator-category* is defined as follows:
|
||||||
|
|
||||||
|
2
doc/iterator_facade_tutorial.rst
Executable file → Normal file
2
doc/iterator_facade_tutorial.rst
Executable file → Normal file
@ -8,7 +8,7 @@ example of a linked list of polymorphic objects. This example was
|
|||||||
inspired by a `posting`__ by Keith Macdonald on the `Boost-Users`_
|
inspired by a `posting`__ by Keith Macdonald on the `Boost-Users`_
|
||||||
mailing list.
|
mailing list.
|
||||||
|
|
||||||
.. _`Boost-Users`: ../../../more/mailing_lists.htm#users
|
.. _`Boost-Users`: http://www.boost.org/more/mailing_lists.htm#users
|
||||||
|
|
||||||
__ http://thread.gmane.org/gmane.comp.lib.boost.user/5100
|
__ http://thread.gmane.org/gmane.comp.lib.boost.user/5100
|
||||||
|
|
||||||
|
31
doc/iterator_traits.html
Executable file → Normal file
31
doc/iterator_traits.html
Executable file → Normal file
@ -3,11 +3,11 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.11: http://docutils.sourceforge.net/" />
|
||||||
<title>Iterator Traits</title>
|
<title>Iterator Traits</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="2006-09-11" />
|
<meta name="date" content="$Date$" />
|
||||||
<meta name="copyright" content="Copyright David Abrahams 2004." />
|
<meta name="copyright" content="Copyright David Abrahams 2004." />
|
||||||
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.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 external" href="http://www.boost-consulting.com">Boost Consulting</a></td></tr>
|
<td><a class="first last reference external" 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>2006-09-11</td></tr>
|
<td>$Date$</td></tr>
|
||||||
<tr><th class="docinfo-name">Copyright:</th>
|
<tr><th class="docinfo-name">Copyright:</th>
|
||||||
<td>Copyright David Abrahams 2004.</td></tr>
|
<td>Copyright David Abrahams 2004.</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@ -37,7 +37,7 @@
|
|||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">abstract:</th><td class="field-body">Header <tt class="docutils literal"><span class="pre"><boost/iterator/iterator_traits.hpp></span></tt> provides
|
<tr class="field"><th class="field-name">abstract:</th><td class="field-body">Header <tt class="docutils literal"><boost/iterator/iterator_traits.hpp></tt> provides
|
||||||
the ability to access an iterator's associated types using
|
the ability to access an iterator's associated types using
|
||||||
MPL-compatible <a class="reference external" href="../../mpl/doc/index.html#metafunctions">metafunctions</a>.</td>
|
MPL-compatible <a class="reference external" href="../../mpl/doc/index.html#metafunctions">metafunctions</a>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -46,15 +46,15 @@ MPL-compatible <a class="reference external" href="../../mpl/doc/index.html#meta
|
|||||||
<div class="section" id="overview">
|
<div class="section" id="overview">
|
||||||
<h1>Overview</h1>
|
<h1>Overview</h1>
|
||||||
<p><tt class="docutils literal"><span class="pre">std::iterator_traits</span></tt> provides access to five associated types
|
<p><tt class="docutils literal"><span class="pre">std::iterator_traits</span></tt> provides access to five associated types
|
||||||
of any iterator: its <tt class="docutils literal"><span class="pre">value_type</span></tt>, <tt class="docutils literal"><span class="pre">reference</span></tt>, <tt class="docutils literal"><span class="pre">pointer</span></tt>,
|
of any iterator: its <tt class="docutils literal">value_type</tt>, <tt class="docutils literal">reference</tt>, <tt class="docutils literal">pointer</tt>,
|
||||||
<tt class="docutils literal"><span class="pre">iterator_category</span></tt>, and <tt class="docutils literal"><span class="pre">difference_type</span></tt>. Unfortunately,
|
<tt class="docutils literal">iterator_category</tt>, and <tt class="docutils literal">difference_type</tt>. Unfortunately,
|
||||||
such a "multi-valued" traits template can be difficult to use in a
|
such a "multi-valued" traits template can be difficult to use in a
|
||||||
metaprogramming context. <tt class="docutils literal"><span class="pre"><boost/iterator/iterator_traits.hpp></span></tt>
|
metaprogramming context. <tt class="docutils literal"><boost/iterator/iterator_traits.hpp></tt>
|
||||||
provides access to these types using a standard <a class="reference external" href="../../mpl/doc/index.html#metafunctions">metafunctions</a>.</p>
|
provides access to these types using a standard <a class="reference external" href="../../mpl/doc/index.html#metafunctions">metafunctions</a>.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="summary">
|
<div class="section" id="summary">
|
||||||
<h1>Summary</h1>
|
<h1>Summary</h1>
|
||||||
<p>Header <tt class="docutils literal"><span class="pre"><boost/iterator/iterator_traits.hpp></span></tt>:</p>
|
<p>Header <tt class="docutils literal"><boost/iterator/iterator_traits.hpp></tt>:</p>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
template <class Iterator>
|
template <class Iterator>
|
||||||
struct iterator_value
|
struct iterator_value
|
||||||
@ -98,21 +98,6 @@ struct iterator_category
|
|||||||
};
|
};
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="broken-compiler-notes">
|
|
||||||
<h1>Broken Compiler Notes</h1>
|
|
||||||
<p>Because of workarounds in Boost, you may find that these
|
|
||||||
<a class="reference external" href="../../mpl/doc/index.html#metafunctions">metafunctions</a> actually work better than the facilities provided by
|
|
||||||
your compiler's standard library.</p>
|
|
||||||
<p>On compilers that don't support partial specialization, such as
|
|
||||||
Microsoft Visual C++ 6.0 or 7.0, you may need to manually invoke
|
|
||||||
<a class="reference external" href="../../type_traits/index.html#transformations">BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION</a> on the
|
|
||||||
<tt class="docutils literal"><span class="pre">value_type</span></tt> of pointers that are passed to these metafunctions.</p>
|
|
||||||
<p>Because of bugs in the implementation of GCC-2.9x, the name of
|
|
||||||
<tt class="docutils literal"><span class="pre">iterator_category</span></tt> is changed to <tt class="docutils literal"><span class="pre">iterator_category_</span></tt> on that
|
|
||||||
compiler. A macro, <tt class="docutils literal"><span class="pre">BOOST_ITERATOR_CATEGORY</span></tt>, that expands to
|
|
||||||
either <tt class="docutils literal"><span class="pre">iterator_category</span></tt> or <tt class="docutils literal"><span class="pre">iterator_category_</span></tt>, as
|
|
||||||
appropriate to the platform, is provided for portability.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<hr class="footer" />
|
<hr class="footer" />
|
||||||
|
0
doc/iterator_traits.pdf
Executable file → Normal file
0
doc/iterator_traits.pdf
Executable file → Normal file
21
doc/iterator_traits.rst
Executable file → Normal file
21
doc/iterator_traits.rst
Executable file → Normal file
@ -75,24 +75,3 @@ Header ``<boost/iterator/iterator_traits.hpp>``::
|
|||||||
detail::iterator_traits<Iterator>::iterator_category
|
detail::iterator_traits<Iterator>::iterator_category
|
||||||
type;
|
type;
|
||||||
};
|
};
|
||||||
|
|
||||||
Broken Compiler Notes
|
|
||||||
=====================
|
|
||||||
|
|
||||||
Because of workarounds in Boost, you may find that these
|
|
||||||
metafunctions_ actually work better than the facilities provided by
|
|
||||||
your compiler's standard library.
|
|
||||||
|
|
||||||
On compilers that don't support partial specialization, such as
|
|
||||||
Microsoft Visual C++ 6.0 or 7.0, you may need to manually invoke
|
|
||||||
BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION_ on the
|
|
||||||
``value_type`` of pointers that are passed to these metafunctions.
|
|
||||||
|
|
||||||
Because of bugs in the implementation of GCC-2.9x, the name of
|
|
||||||
``iterator_category`` is changed to ``iterator_category_`` on that
|
|
||||||
compiler. A macro, ``BOOST_ITERATOR_CATEGORY``, that expands to
|
|
||||||
either ``iterator_category`` or ``iterator_category_``, as
|
|
||||||
appropriate to the platform, is provided for portability.
|
|
||||||
|
|
||||||
.. _BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION: ../../type_traits/index.html#transformations
|
|
||||||
|
|
||||||
|
0
doc/make_counting_iterator.rst
Executable file → Normal file
0
doc/make_counting_iterator.rst
Executable file → Normal file
0
doc/make_filter_iterator.rst
Executable file → Normal file
0
doc/make_filter_iterator.rst
Executable file → Normal file
0
doc/make_transform_iterator.rst
Executable file → Normal file
0
doc/make_transform_iterator.rst
Executable file → Normal file
0
doc/make_zip_iterator.rst
Executable file → Normal file
0
doc/make_zip_iterator.rst
Executable file → Normal file
16
doc/new-iter-concepts.html
Executable file → Normal file
16
doc/new-iter-concepts.html
Executable file → Normal file
@ -27,10 +27,10 @@
|
|||||||
Lab</a>, <a class="last reference external" href="http://www.styleadvisor.com">Zephyr Associates, Inc.</a></td></tr>
|
Lab</a>, <a class="last reference external" href="http://www.styleadvisor.com">Zephyr Associates, Inc.</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Date:</th>
|
<tr><th class="docinfo-name">Date:</th>
|
||||||
<td>2006-09-11</td></tr>
|
<td>2006-09-11</td></tr>
|
||||||
<tr class="field"><th class="docinfo-name">Number:</th><td class="field-body">This is a revised version of <a class="reference external" href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1550.html">n1550</a>=03-0133, which was
|
<tr class="field"><th class="docinfo-name">Number:</th><td class="field-body">This is a revised version of <a class="reference external" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1550.htm">n1550</a>=03-0133, which was
|
||||||
accepted for Technical Report 1 by the C++ standard
|
accepted for Technical Report 1 by the C++ standard
|
||||||
committee's library working group. This proposal is a
|
committee's library working group. This proposal is a
|
||||||
revision of paper <a class="reference external" href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2001/n1297.html">n1297</a>, <a class="reference external" href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1477.html">n1477</a>, and <a class="reference external" href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1531.html">n1531</a>.</td>
|
revision of paper <a class="reference external" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2001/n1297.html">n1297</a>, <a class="reference external" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1477.html">n1477</a>, and <a class="reference external" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1531.html">n1531</a>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><th class="docinfo-name">Copyright:</th>
|
<tr><th class="docinfo-name">Copyright:</th>
|
||||||
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt
|
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt
|
||||||
@ -127,12 +127,12 @@ requirements in the iterator categories.</p>
|
|||||||
<td><tt class="docutils literal"><span class="pre">*i</span></tt> is convertible to <tt class="docutils literal"><span class="pre">T</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">*i</span></tt> is convertible to <tt class="docutils literal"><span class="pre">T</span></tt></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td>Forward Iterator</td>
|
<tr><td>Forward Iterator</td>
|
||||||
<td><tt class="docutils literal"><span class="pre">*i</span></tt> is <tt class="docutils literal"><span class="pre">T&</span></tt> (or <tt class="docutils literal"><span class="pre">const</span> <span class="pre">T&</span></tt> once <a class="reference external" href="http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/lwg-active.html#200">issue 200</a>
|
<td><tt class="docutils literal"><span class="pre">*i</span></tt> is <tt class="docutils literal"><span class="pre">T&</span></tt> (or <tt class="docutils literal"><span class="pre">const</span> <span class="pre">T&</span></tt> once <a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-active.html#200">issue 200</a>
|
||||||
is resolved)</td>
|
is resolved)</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td>Random Access Iterator</td>
|
<tr><td>Random Access Iterator</td>
|
||||||
<td><tt class="docutils literal"><span class="pre">i[n]</span></tt> is convertible to <tt class="docutils literal"><span class="pre">T</span></tt> (also <tt class="docutils literal"><span class="pre">i[n]</span> <span class="pre">=</span> <span class="pre">t</span></tt>
|
<td><tt class="docutils literal"><span class="pre">i[n]</span></tt> is convertible to <tt class="docutils literal"><span class="pre">T</span></tt> (also <tt class="docutils literal"><span class="pre">i[n]</span> <span class="pre">=</span> <span class="pre">t</span></tt>
|
||||||
is required for mutable iterators once <a class="reference external" href="http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/lwg-active.html#299">issue 299</a>
|
is required for mutable iterators once <a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-active.html#299">issue 299</a>
|
||||||
is resolved)</td>
|
is resolved)</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@ -141,7 +141,7 @@ is resolved)</td>
|
|||||||
single hierarchy, many useful iterators can not be appropriately
|
single hierarchy, many useful iterators can not be appropriately
|
||||||
categorized. For example, <tt class="docutils literal"><span class="pre">vector<bool>::iterator</span></tt> is almost a
|
categorized. For example, <tt class="docutils literal"><span class="pre">vector<bool>::iterator</span></tt> is almost a
|
||||||
random access iterator, but the return type is not <tt class="docutils literal"><span class="pre">bool&</span></tt> (see
|
random access iterator, but the return type is not <tt class="docutils literal"><span class="pre">bool&</span></tt> (see
|
||||||
<a class="reference external" href="http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/lwg-active.html#96">issue 96</a> and Herb Sutter's paper J16/99-0008 = WG21
|
<a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-active.html#96">issue 96</a> and Herb Sutter's paper J16/99-0008 = WG21
|
||||||
N1185). Therefore, the iterators of <tt class="docutils literal"><span class="pre">vector<bool></span></tt> only meet the
|
N1185). Therefore, the iterators of <tt class="docutils literal"><span class="pre">vector<bool></span></tt> only meet the
|
||||||
requirements of input iterator and output iterator. This is so
|
requirements of input iterator and output iterator. This is so
|
||||||
nonintuitive that the C++ standard contradicts itself on this point.
|
nonintuitive that the C++ standard contradicts itself on this point.
|
||||||
@ -344,7 +344,7 @@ approach for specifying <tt class="docutils literal"><span class="pre">operator[
|
|||||||
direction would mean that an iterator satisfying the old Random Access
|
direction would mean that an iterator satisfying the old Random Access
|
||||||
Iterator requirements would not necessarily be a model of Readable or
|
Iterator requirements would not necessarily be a model of Readable or
|
||||||
Writable Lvalue Iterator. Instead we have chosen a design that
|
Writable Lvalue Iterator. Instead we have chosen a design that
|
||||||
matches the preferred resolution of <a class="reference external" href="http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/lwg-active.html#299">issue 299</a>: <tt class="docutils literal"><span class="pre">operator[]</span></tt> is
|
matches the preferred resolution of <a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-active.html#299">issue 299</a>: <tt class="docutils literal"><span class="pre">operator[]</span></tt> is
|
||||||
only required to return something convertible to the <tt class="docutils literal"><span class="pre">value_type</span></tt>
|
only required to return something convertible to the <tt class="docutils literal"><span class="pre">value_type</span></tt>
|
||||||
(for a Readable Iterator), and is required to support assignment
|
(for a Readable Iterator), and is required to support assignment
|
||||||
<tt class="docutils literal"><span class="pre">i[n]</span> <span class="pre">=</span> <span class="pre">t</span></tt> (for a Writable Iterator).</p>
|
<tt class="docutils literal"><span class="pre">i[n]</span> <span class="pre">=</span> <span class="pre">t</span></tt> (for a Writable Iterator).</p>
|
||||||
@ -976,7 +976,7 @@ struct random_access_traversal_tag : bidirectional_traversal_tag { };
|
|||||||
<div class="section" id="addition-to-lib-iterator-traits">
|
<div class="section" id="addition-to-lib-iterator-traits">
|
||||||
<h2><a class="toc-backref" href="#id23">Addition to [lib.iterator.traits]</a></h2>
|
<h2><a class="toc-backref" href="#id23">Addition to [lib.iterator.traits]</a></h2>
|
||||||
<p>The <tt class="docutils literal"><span class="pre">is_readable_iterator</span></tt> class
|
<p>The <tt class="docutils literal"><span class="pre">is_readable_iterator</span></tt> class
|
||||||
template satisfies the <a class="reference external" href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1519.htm">UnaryTypeTrait</a> requirements.</p>
|
template satisfies the <a class="reference external" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1519.htm">UnaryTypeTrait</a> requirements.</p>
|
||||||
<p>Given an iterator type <tt class="docutils literal"><span class="pre">X</span></tt>, <tt class="docutils literal"><span class="pre">is_readable_iterator<X>::value</span></tt>
|
<p>Given an iterator type <tt class="docutils literal"><span class="pre">X</span></tt>, <tt class="docutils literal"><span class="pre">is_readable_iterator<X>::value</span></tt>
|
||||||
yields <tt class="docutils literal"><span class="pre">true</span></tt> if, for an object <tt class="docutils literal"><span class="pre">a</span></tt> of type <tt class="docutils literal"><span class="pre">X</span></tt>, <tt class="docutils literal"><span class="pre">*a</span></tt> is
|
yields <tt class="docutils literal"><span class="pre">true</span></tt> if, for an object <tt class="docutils literal"><span class="pre">a</span></tt> of type <tt class="docutils literal"><span class="pre">X</span></tt>, <tt class="docutils literal"><span class="pre">*a</span></tt> is
|
||||||
convertible to <tt class="docutils literal"><span class="pre">iterator_traits<X>::value_type</span></tt>, and <tt class="docutils literal"><span class="pre">false</span></tt>
|
convertible to <tt class="docutils literal"><span class="pre">iterator_traits<X>::value_type</span></tt>, and <tt class="docutils literal"><span class="pre">false</span></tt>
|
||||||
@ -1007,7 +1007,7 @@ otherwise.</p>
|
|||||||
</div>
|
</div>
|
||||||
<div class="section" id="footnotes">
|
<div class="section" id="footnotes">
|
||||||
<h1><a class="toc-backref" href="#id24">Footnotes</a></h1>
|
<h1><a class="toc-backref" href="#id24">Footnotes</a></h1>
|
||||||
<p>The UnaryTypeTrait concept is defined in <a class="reference external" href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1519.htm">n1519</a>; the LWG is
|
<p>The UnaryTypeTrait concept is defined in <a class="reference external" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1519.htm">n1519</a>; the LWG is
|
||||||
considering adding the requirement that specializations are derived
|
considering adding the requirement that specializations are derived
|
||||||
from their nested <tt class="docutils literal"><span class="pre">::type</span></tt>.</p>
|
from their nested <tt class="docutils literal"><span class="pre">::type</span></tt>.</p>
|
||||||
<!-- LocalWords: Abrahams Siek Witt const bool Sutter's WG int UL LI href Lvalue
|
<!-- LocalWords: Abrahams Siek Witt const bool Sutter's WG int UL LI href Lvalue
|
||||||
|
0
doc/new-iter-concepts.pdf
Executable file → Normal file
0
doc/new-iter-concepts.pdf
Executable file → Normal file
@ -38,10 +38,10 @@
|
|||||||
|
|
||||||
.. contents:: Table of Contents
|
.. contents:: Table of Contents
|
||||||
|
|
||||||
.. _n1297: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2001/n1297.html
|
.. _n1297: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2001/n1297.html
|
||||||
.. _n1477: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1477.html
|
.. _n1477: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1477.html
|
||||||
.. _n1531: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1531.html
|
.. _n1531: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1531.html
|
||||||
.. _n1550: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1550.html
|
.. _n1550: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1550.htm
|
||||||
|
|
||||||
============
|
============
|
||||||
Motivation
|
Motivation
|
||||||
@ -76,8 +76,8 @@ requirements in the iterator categories.
|
|||||||
| |is resolved) |
|
| |is resolved) |
|
||||||
+------------------------+-----------------------------------------------------+
|
+------------------------+-----------------------------------------------------+
|
||||||
|
|
||||||
.. _issue 200: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/lwg-active.html#200
|
.. _issue 200: http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-active.html#200
|
||||||
.. _issue 299: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/lwg-active.html#299
|
.. _issue 299: http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-active.html#299
|
||||||
|
|
||||||
|
|
||||||
Because iterator traversal and value access are mixed together in a
|
Because iterator traversal and value access are mixed together in a
|
||||||
@ -91,7 +91,7 @@ nonintuitive that the C++ standard contradicts itself on this point.
|
|||||||
In paragraph 23.2.4/1 it says that a ``vector`` is a sequence that
|
In paragraph 23.2.4/1 it says that a ``vector`` is a sequence that
|
||||||
supports random access iterators.
|
supports random access iterators.
|
||||||
|
|
||||||
.. _issue 96: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/lwg-active.html#96
|
.. _issue 96: http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-active.html#96
|
||||||
|
|
||||||
Another difficult-to-categorize iterator is the transform iterator, an
|
Another difficult-to-categorize iterator is the transform iterator, an
|
||||||
adaptor which applies a unary function object to the dereferenced
|
adaptor which applies a unary function object to the dereferenced
|
||||||
@ -791,7 +791,7 @@ The UnaryTypeTrait concept is defined in n1519_; the LWG is
|
|||||||
considering adding the requirement that specializations are derived
|
considering adding the requirement that specializations are derived
|
||||||
from their nested ``::type``.
|
from their nested ``::type``.
|
||||||
|
|
||||||
.. _n1519: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1519.htm
|
.. _n1519: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1519.htm
|
||||||
|
|
||||||
..
|
..
|
||||||
LocalWords: Abrahams Siek Witt const bool Sutter's WG int UL LI href Lvalue
|
LocalWords: Abrahams Siek Witt const bool Sutter's WG int UL LI href Lvalue
|
||||||
|
0
doc/permutation_iterator.pdf
Executable file → Normal file
0
doc/permutation_iterator.pdf
Executable file → Normal file
0
doc/pointee.html
Executable file → Normal file
0
doc/pointee.html
Executable file → Normal file
0
doc/pointee.pdf
Executable file → Normal file
0
doc/pointee.pdf
Executable file → Normal file
0
doc/pointee.rst
Executable file → Normal file
0
doc/pointee.rst
Executable file → Normal file
0
doc/pointee_ref.rst
Executable file → Normal file
0
doc/pointee_ref.rst
Executable file → Normal file
@ -132,7 +132,7 @@ above are defined as follows:
|
|||||||
|
|
||||||
iterator_adaptor();
|
iterator_adaptor();
|
||||||
|
|
||||||
[*Requires:] The `Base` type must be Default Constructible.\n
|
[*Requires:] The `Base` type must be Default Constructible.[br]
|
||||||
[*Returns:] An instance of `iterator_adaptor` with
|
[*Returns:] An instance of `iterator_adaptor` with
|
||||||
`m_iterator` default constructed.
|
`m_iterator` default constructed.
|
||||||
|
|
||||||
@ -206,7 +206,7 @@ we're going to pick up right where it left off.
|
|||||||
.. |fac_tut| replace:: `iterator_facade` tutorial
|
.. |fac_tut| replace:: `iterator_facade` tutorial
|
||||||
.. _fac_tut: iterator_facade.html#tutorial-example
|
.. _fac_tut: iterator_facade.html#tutorial-example
|
||||||
|
|
||||||
[blurb [*`node_base*` really *is* an iterator]\n\n
|
[blurb [*`node_base*` really *is* an iterator][br][br]
|
||||||
It's not really a very interesting iterator, since `node_base`
|
It's not really a very interesting iterator, since `node_base`
|
||||||
is an abstract class: a pointer to a `node_base` just points
|
is an abstract class: a pointer to a `node_base` just points
|
||||||
at some base subobject of an instance of some other class, and
|
at some base subobject of an instance of some other class, and
|
||||||
|
@ -156,7 +156,7 @@ semantics.
|
|||||||
[
|
[
|
||||||
[`++r`]
|
[`++r`]
|
||||||
[`X&`]
|
[`X&`]
|
||||||
[pre:\n`r` is dereferenceable;\npost:\n`r` is dereferenceable or\n`r` is past-the-end]
|
[pre:[br]`r` is dereferenceable;[br]post:[br]`r` is dereferenceable or[br]`r` is past-the-end]
|
||||||
]
|
]
|
||||||
[
|
[
|
||||||
[`a == b`]
|
[`a == b`]
|
||||||
@ -227,7 +227,7 @@ the stated semantics.
|
|||||||
[
|
[
|
||||||
[`--r`]
|
[`--r`]
|
||||||
[`X&`]
|
[`X&`]
|
||||||
[pre: there exists `s` such that `r == ++s`.\n post: `s` is dereferenceable. `--(++r) == r`. `--r == --s` implies `r == s`. `&r == &--r`.]
|
[pre: there exists `s` such that `r == ++s`.[br] post: `s` is dereferenceable. `--(++r) == r`. `--r == --s` implies `r == s`. `&r == &--r`.]
|
||||||
]
|
]
|
||||||
[
|
[
|
||||||
[`r--`]
|
[`r--`]
|
||||||
|
@ -152,7 +152,7 @@ operations.
|
|||||||
|
|
||||||
counting_iterator();
|
counting_iterator();
|
||||||
|
|
||||||
[*Requires: ] `Incrementable` is Default Constructible.\n
|
[*Requires: ] `Incrementable` is Default Constructible.[br]
|
||||||
[*Effects: ] Default construct the member `m_inc`.
|
[*Effects: ] Default construct the member `m_inc`.
|
||||||
|
|
||||||
|
|
||||||
@ -174,13 +174,13 @@ operations.
|
|||||||
|
|
||||||
counting_iterator& operator++();
|
counting_iterator& operator++();
|
||||||
|
|
||||||
[*Effects: ] `++m_inc`\n
|
[*Effects: ] `++m_inc`[br]
|
||||||
[*Returns: ] `*this`
|
[*Returns: ] `*this`
|
||||||
|
|
||||||
|
|
||||||
counting_iterator& operator--();
|
counting_iterator& operator--();
|
||||||
|
|
||||||
[*Effects: ] `--m_inc`\n
|
[*Effects: ] `--m_inc`[br]
|
||||||
[*Returns: ] `*this`
|
[*Returns: ] `*this`
|
||||||
|
|
||||||
|
|
||||||
|
@ -68,6 +68,7 @@ requirements.
|
|||||||
[
|
[
|
||||||
[`i.dereference()`]
|
[`i.dereference()`]
|
||||||
[Access the value referred to]
|
[Access the value referred to]
|
||||||
|
]
|
||||||
[
|
[
|
||||||
[`i.equal(j)`]
|
[`i.equal(j)`]
|
||||||
[Compare for equality with `j`]
|
[Compare for equality with `j`]
|
||||||
@ -83,6 +84,7 @@ requirements.
|
|||||||
[
|
[
|
||||||
[`i.advance(n)`]
|
[`i.advance(n)`]
|
||||||
[Advance by `n` positions]
|
[Advance by `n` positions]
|
||||||
|
]
|
||||||
[
|
[
|
||||||
[`i.distance_to(j)`]
|
[`i.distance_to(j)`]
|
||||||
[Measure the distance to `j`]
|
[Measure the distance to `j`]
|
||||||
@ -165,9 +167,9 @@ the implementation of her iterator is free to implement an
|
|||||||
class; it will hide the one supplied by `iterator_facade` from
|
class; it will hide the one supplied by `iterator_facade` from
|
||||||
clients of her iterator.
|
clients of her iterator.
|
||||||
|
|
||||||
.. _n1550: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1550.html
|
.. _n1550: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1550.htm
|
||||||
|
|
||||||
.. _`issue 299`: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#299
|
.. _`issue 299`: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#299
|
||||||
|
|
||||||
.. _`operator arrow`:
|
.. _`operator arrow`:
|
||||||
|
|
||||||
@ -488,6 +490,7 @@ w.m)` for some temporary object `w` of type `value_type`.
|
|||||||
|
|
||||||
[*Returns:]
|
[*Returns:]
|
||||||
|
|
||||||
|
[pre
|
||||||
if `is_convertible<Dr2,Dr1>::value`
|
if `is_convertible<Dr2,Dr1>::value`
|
||||||
|
|
||||||
then
|
then
|
||||||
@ -495,6 +498,7 @@ w.m)` for some temporary object `w` of type `value_type`.
|
|||||||
|
|
||||||
Otherwise,
|
Otherwise,
|
||||||
`((Dr2 const&)rhs).equal((Dr1 const&)lhs)`.
|
`((Dr2 const&)rhs).equal((Dr1 const&)lhs)`.
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
template <class Dr1, class V1, class TC1, class R1, class D1,
|
template <class Dr1, class V1, class TC1, class R1, class D1,
|
||||||
@ -505,6 +509,7 @@ w.m)` for some temporary object `w` of type `value_type`.
|
|||||||
|
|
||||||
[*Returns:]
|
[*Returns:]
|
||||||
|
|
||||||
|
[pre
|
||||||
if `is_convertible<Dr2,Dr1>::value`
|
if `is_convertible<Dr2,Dr1>::value`
|
||||||
|
|
||||||
then
|
then
|
||||||
@ -512,6 +517,7 @@ w.m)` for some temporary object `w` of type `value_type`.
|
|||||||
|
|
||||||
Otherwise,
|
Otherwise,
|
||||||
`!((Dr2 const&)rhs).equal((Dr1 const&)lhs)`.
|
`!((Dr2 const&)rhs).equal((Dr1 const&)lhs)`.
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
template <class Dr1, class V1, class TC1, class R1, class D1,
|
template <class Dr1, class V1, class TC1, class R1, class D1,
|
||||||
@ -522,6 +528,7 @@ w.m)` for some temporary object `w` of type `value_type`.
|
|||||||
|
|
||||||
[*Returns:]
|
[*Returns:]
|
||||||
|
|
||||||
|
[pre
|
||||||
if `is_convertible<Dr2,Dr1>::value`
|
if `is_convertible<Dr2,Dr1>::value`
|
||||||
|
|
||||||
then
|
then
|
||||||
@ -529,6 +536,7 @@ w.m)` for some temporary object `w` of type `value_type`.
|
|||||||
|
|
||||||
Otherwise,
|
Otherwise,
|
||||||
`((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) > 0`.
|
`((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) > 0`.
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
template <class Dr1, class V1, class TC1, class R1, class D1,
|
template <class Dr1, class V1, class TC1, class R1, class D1,
|
||||||
@ -539,6 +547,7 @@ w.m)` for some temporary object `w` of type `value_type`.
|
|||||||
|
|
||||||
[*Returns:]
|
[*Returns:]
|
||||||
|
|
||||||
|
[pre
|
||||||
if `is_convertible<Dr2,Dr1>::value`
|
if `is_convertible<Dr2,Dr1>::value`
|
||||||
|
|
||||||
then
|
then
|
||||||
@ -546,6 +555,7 @@ w.m)` for some temporary object `w` of type `value_type`.
|
|||||||
|
|
||||||
Otherwise,
|
Otherwise,
|
||||||
`((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) >= 0`.
|
`((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) >= 0`.
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
template <class Dr1, class V1, class TC1, class R1, class D1,
|
template <class Dr1, class V1, class TC1, class R1, class D1,
|
||||||
@ -556,6 +566,7 @@ w.m)` for some temporary object `w` of type `value_type`.
|
|||||||
|
|
||||||
[*Returns:]
|
[*Returns:]
|
||||||
|
|
||||||
|
[pre
|
||||||
if `is_convertible<Dr2,Dr1>::value`
|
if `is_convertible<Dr2,Dr1>::value`
|
||||||
|
|
||||||
then
|
then
|
||||||
@ -563,6 +574,7 @@ w.m)` for some temporary object `w` of type `value_type`.
|
|||||||
|
|
||||||
Otherwise,
|
Otherwise,
|
||||||
`((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) < 0`.
|
`((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) < 0`.
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
template <class Dr1, class V1, class TC1, class R1, class D1,
|
template <class Dr1, class V1, class TC1, class R1, class D1,
|
||||||
@ -573,6 +585,7 @@ w.m)` for some temporary object `w` of type `value_type`.
|
|||||||
|
|
||||||
[*Returns:]
|
[*Returns:]
|
||||||
|
|
||||||
|
[pre
|
||||||
if `is_convertible<Dr2,Dr1>::value`
|
if `is_convertible<Dr2,Dr1>::value`
|
||||||
|
|
||||||
then
|
then
|
||||||
@ -580,6 +593,7 @@ w.m)` for some temporary object `w` of type `value_type`.
|
|||||||
|
|
||||||
Otherwise,
|
Otherwise,
|
||||||
`((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) <= 0`.
|
`((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) <= 0`.
|
||||||
|
]
|
||||||
|
|
||||||
.. _minus:
|
.. _minus:
|
||||||
|
|
||||||
@ -592,6 +606,7 @@ w.m)` for some temporary object `w` of type `value_type`.
|
|||||||
|
|
||||||
[*Return Type:]
|
[*Return Type:]
|
||||||
|
|
||||||
|
[pre
|
||||||
if `is_convertible<Dr2,Dr1>::value`
|
if `is_convertible<Dr2,Dr1>::value`
|
||||||
|
|
||||||
then
|
then
|
||||||
@ -600,9 +615,11 @@ w.m)` for some temporary object `w` of type `value_type`.
|
|||||||
|
|
||||||
Otherwise
|
Otherwise
|
||||||
`difference` shall be `iterator_traits<Dr2>::difference_type`
|
`difference` shall be `iterator_traits<Dr2>::difference_type`
|
||||||
|
]
|
||||||
|
|
||||||
[*Returns:]
|
[*Returns:]
|
||||||
|
|
||||||
|
[pre
|
||||||
if `is_convertible<Dr2,Dr1>::value`
|
if `is_convertible<Dr2,Dr1>::value`
|
||||||
|
|
||||||
then
|
then
|
||||||
@ -610,6 +627,7 @@ w.m)` for some temporary object `w` of type `value_type`.
|
|||||||
|
|
||||||
Otherwise,
|
Otherwise,
|
||||||
`((Dr2 const&)rhs).distance_to((Dr1 const&)lhs)`.
|
`((Dr2 const&)rhs).distance_to((Dr1 const&)lhs)`.
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
@ -7,7 +7,7 @@ example of a linked list of polymorphic objects. This example was
|
|||||||
inspired by a
|
inspired by a
|
||||||
[@http://thread.gmane.org/gmane.comp.lib.boost.user/5100 `posting`]
|
[@http://thread.gmane.org/gmane.comp.lib.boost.user/5100 `posting`]
|
||||||
by Keith Macdonald on the
|
by Keith Macdonald on the
|
||||||
[@../../../more/mailing_lists.htm#users `Boost-Users`]
|
[@http://www.boost.org/more/mailing_lists.htm#users `Boost-Users`]
|
||||||
mailing list.
|
mailing list.
|
||||||
|
|
||||||
|
|
||||||
@ -261,17 +261,17 @@ __ ../example/node_iterator1.cpp
|
|||||||
|
|
||||||
[h2 A constant `node_iterator`]
|
[h2 A constant `node_iterator`]
|
||||||
|
|
||||||
[blurb *Constant and Mutable iterators*\n\n
|
[blurb *Constant and Mutable iterators*[br][br]
|
||||||
The term **mutable iterator** means an iterator through which
|
The term **mutable iterator** means an iterator through which
|
||||||
the object it references (its "referent") can be modified. A
|
the object it references (its "referent") can be modified. A
|
||||||
**constant iterator** is one which doesn't allow modification of
|
**constant iterator** is one which doesn't allow modification of
|
||||||
its referent.\n\n
|
its referent.[br][br]
|
||||||
The words *constant* and *mutable* don't refer to the ability to
|
The words *constant* and *mutable* don't refer to the ability to
|
||||||
modify the iterator itself. For example, an `int const*` is a
|
modify the iterator itself. For example, an `int const*` is a
|
||||||
non-\ `const` *constant iterator*, which can be incremented
|
non-\ `const` *constant iterator*, which can be incremented
|
||||||
but doesn't allow modification of its referent, and `int*
|
but doesn't allow modification of its referent, and `int*
|
||||||
const` is a `const` *mutable iterator*, which cannot be
|
const` is a `const` *mutable iterator*, which cannot be
|
||||||
modified but which allows modification of its referent.\n\n
|
modified but which allows modification of its referent.[br][br]
|
||||||
Confusing? We agree, but those are the standard terms. It
|
Confusing? We agree, but those are the standard terms. It
|
||||||
probably doesn't help much that a container's constant iterator
|
probably doesn't help much that a container's constant iterator
|
||||||
is called `const_iterator`.
|
is called `const_iterator`.
|
||||||
@ -312,7 +312,7 @@ changes:
|
|||||||
node_base **const**\ * m_node;
|
node_base **const**\ * m_node;
|
||||||
};
|
};
|
||||||
|
|
||||||
[blurb `const` and an iterator's `value_type`\n\n
|
[blurb `const` and an iterator's `value_type`[br][br]
|
||||||
The C++ standard requires an iterator's `value_type` *not* be
|
The C++ standard requires an iterator's `value_type` *not* be
|
||||||
`const`\ -qualified, so `iterator_facade` strips the
|
`const`\ -qualified, so `iterator_facade` strips the
|
||||||
`const` from its `Value` parameter in order to produce the
|
`const` from its `Value` parameter in order to produce the
|
||||||
|
@ -178,7 +178,7 @@ operations.
|
|||||||
|
|
||||||
filter_iterator();
|
filter_iterator();
|
||||||
|
|
||||||
[*Requires: ]`Predicate` and `Iterator` must be Default Constructible.\n
|
[*Requires: ]`Predicate` and `Iterator` must be Default Constructible.[br]
|
||||||
[*Effects: ] Constructs a `filter_iterator` whose`m_pred`, `m_iter`, and `m_end`
|
[*Effects: ] Constructs a `filter_iterator` whose`m_pred`, `m_iter`, and `m_end`
|
||||||
members are a default constructed.
|
members are a default constructed.
|
||||||
|
|
||||||
@ -195,7 +195,7 @@ operations.
|
|||||||
filter_iterator(Iterator x, Iterator end = Iterator());
|
filter_iterator(Iterator x, Iterator end = Iterator());
|
||||||
|
|
||||||
[*Requires: ] `Predicate` must be Default Constructible and
|
[*Requires: ] `Predicate` must be Default Constructible and
|
||||||
`Predicate` is a class type (not a function pointer).\n
|
`Predicate` is a class type (not a function pointer).[br]
|
||||||
[*Effects: ] Constructs a `filter_iterator` where `m_iter` is either
|
[*Effects: ] Constructs a `filter_iterator` where `m_iter` is either
|
||||||
the first position in the range `[x,end)` such that `m_pred(*m_iter) == true`
|
the first position in the range `[x,end)` such that `m_pred(*m_iter) == true`
|
||||||
or else`m_iter == end`. The member `m_pred` is default constructed.
|
or else`m_iter == end`. The member `m_pred` is default constructed.
|
||||||
@ -205,9 +205,9 @@ operations.
|
|||||||
filter_iterator(
|
filter_iterator(
|
||||||
filter_iterator<Predicate, OtherIterator> const& t
|
filter_iterator<Predicate, OtherIterator> const& t
|
||||||
, typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
|
, typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
|
||||||
);`
|
);
|
||||||
|
|
||||||
[*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.\n
|
[*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.[br]
|
||||||
[*Effects: ] Constructs a filter iterator whose members are copied from `t`.
|
[*Effects: ] Constructs a filter iterator whose members are copied from `t`.
|
||||||
|
|
||||||
|
|
||||||
@ -235,7 +235,7 @@ operations.
|
|||||||
|
|
||||||
[*Effects: ] Increments `m_iter` and then continues to
|
[*Effects: ] Increments `m_iter` and then continues to
|
||||||
increment `m_iter` until either `m_iter == m_end`
|
increment `m_iter` until either `m_iter == m_end`
|
||||||
or `m_pred(*m_iter) == true`.\n
|
or `m_pred(*m_iter) == true`.[br]
|
||||||
[*Returns: ] `*this`
|
[*Returns: ] `*this`
|
||||||
|
|
||||||
|
|
||||||
|
@ -203,7 +203,7 @@ following operations:
|
|||||||
|
|
||||||
indirect_iterator();
|
indirect_iterator();
|
||||||
|
|
||||||
[*Requires: ] `Iterator` must be Default Constructible.\n
|
[*Requires: ] `Iterator` must be Default Constructible.[br]
|
||||||
[*Effects: ] Constructs an instance of `indirect_iterator` with
|
[*Effects: ] Constructs an instance of `indirect_iterator` with
|
||||||
a default-constructed `m_iterator`.
|
a default-constructed `m_iterator`.
|
||||||
|
|
||||||
@ -225,7 +225,7 @@ following operations:
|
|||||||
, typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
|
, typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
|
||||||
);
|
);
|
||||||
|
|
||||||
[*Requires: ] `Iterator2` is implicitly convertible to `Iterator`.\n
|
[*Requires: ] `Iterator2` is implicitly convertible to `Iterator`.[br]
|
||||||
[*Effects: ] Constructs an instance of `indirect_iterator` whose
|
[*Effects: ] Constructs an instance of `indirect_iterator` whose
|
||||||
`m_iterator` subobject is constructed from `y.base()`.
|
`m_iterator` subobject is constructed from `y.base()`.
|
||||||
|
|
||||||
@ -242,13 +242,13 @@ following operations:
|
|||||||
|
|
||||||
indirect_iterator& operator++();
|
indirect_iterator& operator++();
|
||||||
|
|
||||||
[*Effects: ] `++m_iterator`\n
|
[*Effects: ] `++m_iterator`[br]
|
||||||
[*Returns: ] `*this`
|
[*Returns: ] `*this`
|
||||||
|
|
||||||
|
|
||||||
indirect_iterator& operator--();
|
indirect_iterator& operator--();
|
||||||
|
|
||||||
[*Effects: ] `--m_iterator`\n
|
[*Effects: ] `--m_iterator`[br]
|
||||||
[*Returns: ] `*this`
|
[*Returns: ] `*this`
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
[library Boost.Iterator
|
[library Boost.Iterator
|
||||||
[/ version 1.0.1]
|
[/ version 1.0.1]
|
||||||
|
[quickbook 1.6]
|
||||||
[authors [Abrahams, David], [Siek, Jeremy], [Witt, Thomas]]
|
[authors [Abrahams, David], [Siek, Jeremy], [Witt, Thomas]]
|
||||||
[copyright 2003 2005 David Abrahams Jeremy Siek Thomas Witt]
|
[copyright 2003 2005 David Abrahams Jeremy Siek Thomas Witt]
|
||||||
[category iterator]
|
[category iterator]
|
||||||
@ -32,7 +33,7 @@
|
|||||||
|
|
||||||
[section:intro Introduction]
|
[section:intro Introduction]
|
||||||
|
|
||||||
[def _concepts_ [@../../more/generic_programming.html#concept concepts]]
|
[def _concepts_ [@http://www.boost.org/more/generic_programming.html#concept concepts]]
|
||||||
|
|
||||||
The Boost Iterator Library contains two parts. The first
|
The Boost Iterator Library contains two parts. The first
|
||||||
is a system of _concepts_ which extend the C++ standard
|
is a system of _concepts_ which extend the C++ standard
|
||||||
@ -99,7 +100,7 @@ adaptors`_ mentioned below have been proposed for standardization
|
|||||||
|
|
||||||
The iterator library supplies a useful suite of standard-conforming
|
The iterator library supplies a useful suite of standard-conforming
|
||||||
iterator templates based on the Boost [link
|
iterator templates based on the Boost [link
|
||||||
intro.iterator_facade_and_adaptor iterator facade and adaptor]
|
iterator.intro.iterator_facade_and_adaptor iterator facade and adaptor]
|
||||||
templates.
|
templates.
|
||||||
|
|
||||||
[def _counting_ [@./counting_iterator.html `counting_iterator`]]
|
[def _counting_ [@./counting_iterator.html `counting_iterator`]]
|
||||||
@ -203,7 +204,7 @@ templates.
|
|||||||
|
|
||||||
[section:upgrading Upgrading from the old Boost Iterator Adaptor Library]
|
[section:upgrading Upgrading from the old Boost Iterator Adaptor Library]
|
||||||
|
|
||||||
[def _type_generator_ [@../../more/generic_programming.html#type_generator type generator]]
|
[def _type_generator_ [@http://www.boost.org/more/generic_programming.html#type_generator type generator]]
|
||||||
|
|
||||||
If you have been using the old Boost Iterator Adaptor library to
|
If you have been using the old Boost Iterator Adaptor library to
|
||||||
implement iterators, you probably wrote a `Policies` class which
|
implement iterators, you probably wrote a `Policies` class which
|
||||||
|
@ -189,7 +189,7 @@ following operations.
|
|||||||
|
|
||||||
permutation_iterator& operator++();
|
permutation_iterator& operator++();
|
||||||
|
|
||||||
[*Effects: ] `++m_order`\n
|
[*Effects: ] `++m_order`[br]
|
||||||
[*Returns: ] `*this`
|
[*Returns: ] `*this`
|
||||||
|
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ operations.
|
|||||||
|
|
||||||
reverse_iterator();
|
reverse_iterator();
|
||||||
|
|
||||||
[*Requires: ] `Iterator` must be Default Constructible.\n
|
[*Requires: ] `Iterator` must be Default Constructible.[br]
|
||||||
[*Effects: ] Constructs an instance of `reverse_iterator` with `m_iterator`
|
[*Effects: ] Constructs an instance of `reverse_iterator` with `m_iterator`
|
||||||
default constructed.
|
default constructed.
|
||||||
|
|
||||||
@ -131,7 +131,7 @@ operations.
|
|||||||
, typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
|
, typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
|
||||||
);
|
);
|
||||||
|
|
||||||
[*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.\n
|
[*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.[br]
|
||||||
[*Effects: ] Constructs instance of `reverse_iterator` whose
|
[*Effects: ] Constructs instance of `reverse_iterator` whose
|
||||||
`m_iterator` subobject is constructed from `y.base()`.
|
`m_iterator` subobject is constructed from `y.base()`.
|
||||||
|
|
||||||
@ -149,12 +149,12 @@ operations.
|
|||||||
|
|
||||||
reverse_iterator& operator++();
|
reverse_iterator& operator++();
|
||||||
|
|
||||||
[*Effects: ] `--m_iterator`\n
|
[*Effects: ] `--m_iterator`[br]
|
||||||
[*Returns: ] `*this`
|
[*Returns: ] `*this`
|
||||||
|
|
||||||
reverse_iterator& operator--();
|
reverse_iterator& operator--();
|
||||||
|
|
||||||
[*Effects: ] `++m_iterator`\n
|
[*Effects: ] `++m_iterator`[br]
|
||||||
[*Returns: ] `*this`
|
[*Returns: ] `*this`
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
@ -52,21 +52,4 @@ Header `<boost/iterator/iterator_traits.hpp>`:
|
|||||||
type;
|
type;
|
||||||
};
|
};
|
||||||
|
|
||||||
[h2 Broken Compiler Notes]
|
|
||||||
|
|
||||||
Because of workarounds in Boost, you may find that these
|
|
||||||
[@../../mpl/doc/index.html#metafunctions metafunctions] actually work better than the facilities provided by
|
|
||||||
your compiler's standard library.
|
|
||||||
|
|
||||||
On compilers that don't support partial specialization, such as
|
|
||||||
Microsoft Visual C++ 6.0 or 7.0, you may need to manually invoke
|
|
||||||
[@../../type_traits/index.html#transformations BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION] on the
|
|
||||||
`value_type` of pointers that are passed to these metafunctions.
|
|
||||||
|
|
||||||
Because of bugs in the implementation of GCC-2.9x, the name of
|
|
||||||
`iterator_category` is changed to `iterator_category_` on that
|
|
||||||
compiler. A macro, `BOOST_ITERATOR_CATEGORY`, that expands to
|
|
||||||
either `iterator_category` or `iterator_category_`, as
|
|
||||||
appropriate to the platform, is provided for portability.
|
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
@ -85,7 +85,7 @@ The source code for this example can be found
|
|||||||
|
|
||||||
|
|
||||||
If `Reference` is `use_default` then the `reference` member of
|
If `Reference` is `use_default` then the `reference` member of
|
||||||
`transform_iterator` is\n
|
`transform_iterator` is[br]
|
||||||
`result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type`.
|
`result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type`.
|
||||||
Otherwise, `reference` is `Reference`.
|
Otherwise, `reference` is `Reference`.
|
||||||
|
|
||||||
@ -160,7 +160,7 @@ interoperable with `Y`.
|
|||||||
|
|
||||||
[h3 Operations]
|
[h3 Operations]
|
||||||
|
|
||||||
In addition to the operations required by the [link transform.concepts concepts] modeled by
|
In addition to the operations required by the [link iterator.specialized.transform.concepts concepts] modeled by
|
||||||
`transform_iterator`, `transform_iterator` provides the following
|
`transform_iterator`, `transform_iterator` provides the following
|
||||||
operations:
|
operations:
|
||||||
|
|
||||||
@ -183,7 +183,7 @@ operations:
|
|||||||
|
|
||||||
[*Returns: ] An instance of `transform_iterator` with `m_f`
|
[*Returns: ] An instance of `transform_iterator` with `m_f`
|
||||||
initialized to `t.functor()` and `m_iterator` initialized to
|
initialized to `t.functor()` and `m_iterator` initialized to
|
||||||
`t.base()`.\n
|
`t.base()`.[br]
|
||||||
[*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.
|
[*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.
|
||||||
|
|
||||||
|
|
||||||
@ -204,13 +204,13 @@ operations:
|
|||||||
|
|
||||||
transform_iterator& operator++();
|
transform_iterator& operator++();
|
||||||
|
|
||||||
[*Effects: ] `++m_iterator`\n
|
[*Effects: ] `++m_iterator`[br]
|
||||||
[*Returns: ] `*this`
|
[*Returns: ] `*this`
|
||||||
|
|
||||||
|
|
||||||
transform_iterator& operator--();
|
transform_iterator& operator--();
|
||||||
|
|
||||||
[*Effects: ] `--m_iterator`\n
|
[*Effects: ] `--m_iterator`[br]
|
||||||
[*Returns: ] `*this`
|
[*Returns: ] `*this`
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
@ -49,11 +49,40 @@ proxy references or return the pointee by value. When that
|
|||||||
information is needed, call on `indirect_reference`.
|
information is needed, call on `indirect_reference`.
|
||||||
|
|
||||||
Both of these templates are essential to the correct functioning of
|
Both of these templates are essential to the correct functioning of
|
||||||
[link indirecct `indirect_iterator`].
|
[link iterator.specialized.indirect `indirect_iterator`].
|
||||||
|
|
||||||
|
[h2 `minimum_category`]
|
||||||
|
|
||||||
|
`minimum_category` takes two iterator categories or two iterator traversal tags
|
||||||
|
and returns the one that is the weakest (i.e. least advanced). For example:
|
||||||
|
|
||||||
|
static_assert(
|
||||||
|
is_same<
|
||||||
|
minimum_category<
|
||||||
|
std::forward_iterator_tag,
|
||||||
|
std::random_access_iterator_tag
|
||||||
|
>::type,
|
||||||
|
std::forward_iterator_tag
|
||||||
|
>::value,
|
||||||
|
"Unexpected minimum_category result"
|
||||||
|
);
|
||||||
|
|
||||||
|
[h2 Iterator category and traversal tags manipulation]
|
||||||
|
|
||||||
|
The library provides several utilities to simplify conversions between iterator categories
|
||||||
|
and traversal tags:
|
||||||
|
|
||||||
|
* `iterator_category_to_traversal<C>::type` - the metafunction takes an iterator category `C` and returns
|
||||||
|
the corresponding traversal tag.
|
||||||
|
* `iterator_traversal<T>::type` - a shorthand for `iterator_category_to_traversal<iterator_category<T>::type>::type`.
|
||||||
|
* `pure_traversal_tag<T>::type` - the metafunction takes a tag `T` which derives from one of the iterator traversal tags
|
||||||
|
and returns that traversal tag. `T` may also derive from other tags describing the iterator (e.g. whether this is a `const`-iterator
|
||||||
|
or not), these additional tags are not considered.
|
||||||
|
* `pure_iterator_traversal<T>::type` - a shorthand for `pure_traversal_tag<iterator_traversal<T>::type>::type`.
|
||||||
|
|
||||||
[h2 Reference]
|
[h2 Reference]
|
||||||
|
|
||||||
[h3 `pointeee`]
|
[h3 `pointee`]
|
||||||
|
|
||||||
template <class Dereferenceable>
|
template <class Dereferenceable>
|
||||||
struct pointee
|
struct pointee
|
||||||
@ -74,9 +103,9 @@ Both of these templates are essential to the correct functioning of
|
|||||||
|
|
||||||
if ( ++x is ill-formed )
|
if ( ++x is ill-formed )
|
||||||
{
|
{
|
||||||
return `Dereferenceable::element_type`
|
return Dereferenceable::element_type
|
||||||
}
|
}
|
||||||
else if (`*x` is a mutable reference to
|
else if (*x is a mutable reference to
|
||||||
std::iterator_traits<Dereferenceable>::value_type)
|
std::iterator_traits<Dereferenceable>::value_type)
|
||||||
{
|
{
|
||||||
return iterator_traits<Dereferenceable>::value_type
|
return iterator_traits<Dereferenceable>::value_type
|
||||||
@ -106,10 +135,81 @@ Both of these templates are essential to the correct functioning of
|
|||||||
`x` is an object of type `Dereferenceable`:
|
`x` is an object of type `Dereferenceable`:
|
||||||
|
|
||||||
if ( ++x is ill-formed )
|
if ( ++x is ill-formed )
|
||||||
return `pointee<Dereferenceable>::type&`
|
return pointee<Dereferenceable>::type&
|
||||||
else
|
else
|
||||||
std::iterator_traits<Dereferenceable>::reference
|
std::iterator_traits<Dereferenceable>::reference
|
||||||
|
|
||||||
|
[h3 `minimum_category`]
|
||||||
|
|
||||||
|
template <typename C1, typename C2>
|
||||||
|
struct minimum_category
|
||||||
|
{
|
||||||
|
typedef /* see below */ type;
|
||||||
|
};
|
||||||
|
|
||||||
|
[*Requires:] Both `C1` and `C2` shall be standard iterator categories or
|
||||||
|
iterator traversal tags.
|
||||||
|
|
||||||
|
`type` is determined according to the following algorithm, where `c1` is an
|
||||||
|
object of type `C1` and `c2` is an object of type `C2`:
|
||||||
|
|
||||||
|
if (c1 is convertible to c2)
|
||||||
|
return C2;
|
||||||
|
else
|
||||||
|
return C1;
|
||||||
|
|
||||||
|
[note The above definition relies on the fact that the more restricting categories
|
||||||
|
and traversal tags are convertible to the less restricting ones.]
|
||||||
|
|
||||||
|
[h3 `iterator_category_to_traversal`]
|
||||||
|
|
||||||
|
template <typename C>
|
||||||
|
struct iterator_category_to_traversal
|
||||||
|
{
|
||||||
|
typedef /* see below */ type;
|
||||||
|
};
|
||||||
|
|
||||||
|
[*Requires:] `C` shall be a standard iterator category or an
|
||||||
|
iterator traversal tag.
|
||||||
|
|
||||||
|
If `C` is an iterator traversal tag or convertible to one, `type` equivalent to `C`.
|
||||||
|
Otherwise, `type` is defined to the closest iterator traversal tag matching `C`.
|
||||||
|
|
||||||
|
[h3 `iterator_traversal`]
|
||||||
|
|
||||||
|
template <typename Iterator>
|
||||||
|
struct iterator_traversal
|
||||||
|
{
|
||||||
|
typedef typename iterator_category_to_traversal<
|
||||||
|
typename iterator_category<Iterator>::type
|
||||||
|
>::type type;
|
||||||
|
};
|
||||||
|
|
||||||
|
[*Requires:] `Iterator` shall be an iterator.
|
||||||
|
|
||||||
|
[h3 `pure_traversal_tag`]
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct pure_traversal_tag
|
||||||
|
{
|
||||||
|
typedef /* see below */ type;
|
||||||
|
};
|
||||||
|
|
||||||
|
[*Requires:] `T` shall be convertible to an iterator traversal tag.
|
||||||
|
|
||||||
|
`type` is defined to be the most advanced traversal tag `Tag` so that `T` is convertible to `Tag`.
|
||||||
|
|
||||||
|
[h3 `pure_iterator_traversal`]
|
||||||
|
|
||||||
|
template <typename Iterator>
|
||||||
|
struct pure_iterator_traversal
|
||||||
|
{
|
||||||
|
typedef typename pure_traversal_tag<
|
||||||
|
typename iterator_traversal<Iterator>::type
|
||||||
|
>::type type;
|
||||||
|
};
|
||||||
|
|
||||||
|
[*Requires:] `Iterator` shall be an iterator.
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
|
@ -8,6 +8,16 @@ the zip iterator moves all the iterators in parallel.
|
|||||||
Dereferencing the zip iterator returns a tuple that contains
|
Dereferencing the zip iterator returns a tuple that contains
|
||||||
the results of dereferencing the individual iterators.
|
the results of dereferencing the individual iterators.
|
||||||
|
|
||||||
|
The tuple of iterators is now implemented in terms of a Boost fusion sequence.
|
||||||
|
Because of this the 'tuple' may be any Boost fusion sequence and, for backwards
|
||||||
|
compatibility through a Boost fusion sequence adapter, a Boost tuple. Because the
|
||||||
|
'tuple' may be any boost::fusion sequence the 'tuple' may also be any type for which a
|
||||||
|
Boost fusion adapter exists. This includes, among others, a std::tuple and a std::pair.
|
||||||
|
Just remember to include the appropriate Boost fusion adapter header files for these
|
||||||
|
other Boost fusion adapters. The zip_iterator header file already includes the
|
||||||
|
Boost fusion adapter header file for Boost tuple, so you need not include it yourself
|
||||||
|
to use a Boost tuple as your 'tuple'.
|
||||||
|
|
||||||
[section:zip_example Example]
|
[section:zip_example Example]
|
||||||
|
|
||||||
There are two main types of applications of the `zip_iterator`. The first
|
There are two main types of applications of the `zip_iterator`. The first
|
||||||
@ -218,7 +228,7 @@ operations.
|
|||||||
, IteratorTuple>::type* = 0 // exposition only
|
, IteratorTuple>::type* = 0 // exposition only
|
||||||
);
|
);
|
||||||
|
|
||||||
[*Returns:] An instance of `zip_iterator` that is a copy of `other`.\n
|
[*Returns:] An instance of `zip_iterator` that is a copy of `other`.[br]
|
||||||
[*Requires:] `OtherIteratorTuple` is implicitly convertible to `IteratorTuple`.
|
[*Requires:] `OtherIteratorTuple` is implicitly convertible to `IteratorTuple`.
|
||||||
|
|
||||||
|
|
||||||
@ -235,13 +245,13 @@ operations.
|
|||||||
|
|
||||||
zip_iterator& operator++();
|
zip_iterator& operator++();
|
||||||
|
|
||||||
[*Effects:] Increments each iterator in `m_iterator_tuple`.\n
|
[*Effects:] Increments each iterator in `m_iterator_tuple`.[br]
|
||||||
[*Returns:] `*this`
|
[*Returns:] `*this`
|
||||||
|
|
||||||
|
|
||||||
zip_iterator& operator--();
|
zip_iterator& operator--();
|
||||||
|
|
||||||
[*Effects:] Decrements each iterator in `m_iterator_tuple`.\n
|
[*Effects:] Decrements each iterator in `m_iterator_tuple`.[br]
|
||||||
[*Returns:] `*this`
|
[*Returns:] `*this`
|
||||||
|
|
||||||
template<typename IteratorTuple>
|
template<typename IteratorTuple>
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
.. _N1550: http://www.boost-consulting.com/writing/n1550.html
|
.. _N1550: http://www.boost-consulting.com/writing/n1550.html
|
||||||
.. _N1530: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1530.html
|
.. _N1530: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1530.html
|
||||||
|
|
||||||
:Author: David Abrahams and Jeremy Siek
|
:Author: David Abrahams and Jeremy Siek
|
||||||
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu
|
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu
|
||||||
|
0
doc/reverse_iterator.pdf
Executable file → Normal file
0
doc/reverse_iterator.pdf
Executable file → Normal file
@ -6,6 +6,7 @@ sources = [
|
|||||||
'counting_iterator.rst',
|
'counting_iterator.rst',
|
||||||
'facade-and-adaptor.rst',
|
'facade-and-adaptor.rst',
|
||||||
'filter_iterator.rst',
|
'filter_iterator.rst',
|
||||||
|
'function_input_iterator.rst',
|
||||||
'function_output_iterator.rst',
|
'function_output_iterator.rst',
|
||||||
'index.rst',
|
'index.rst',
|
||||||
'indirect_iterator.rst',
|
'indirect_iterator.rst',
|
||||||
|
@ -99,7 +99,7 @@ private:
|
|||||||
</pre>
|
</pre>
|
||||||
<p>If <tt class="docutils literal"><span class="pre">Reference</span></tt> is <tt class="docutils literal"><span class="pre">use_default</span></tt> then the <tt class="docutils literal"><span class="pre">reference</span></tt> member of
|
<p>If <tt class="docutils literal"><span class="pre">Reference</span></tt> is <tt class="docutils literal"><span class="pre">use_default</span></tt> then the <tt class="docutils literal"><span class="pre">reference</span></tt> member of
|
||||||
<tt class="docutils literal"><span class="pre">transform_iterator</span></tt> is
|
<tt class="docutils literal"><span class="pre">transform_iterator</span></tt> is
|
||||||
<tt class="docutils literal"><span class="pre">result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type</span></tt>.
|
<tt class="docutils literal"><span class="pre">result_of<const UnaryFunction(iterator_traits<Iterator>::reference)>::type</span></tt>.
|
||||||
Otherwise, <tt class="docutils literal"><span class="pre">reference</span></tt> is <tt class="docutils literal"><span class="pre">Reference</span></tt>.</p>
|
Otherwise, <tt class="docutils literal"><span class="pre">reference</span></tt> is <tt class="docutils literal"><span class="pre">Reference</span></tt>.</p>
|
||||||
<p>If <tt class="docutils literal"><span class="pre">Value</span></tt> is <tt class="docutils literal"><span class="pre">use_default</span></tt> then the <tt class="docutils literal"><span class="pre">value_type</span></tt> member is
|
<p>If <tt class="docutils literal"><span class="pre">Value</span></tt> is <tt class="docutils literal"><span class="pre">use_default</span></tt> then the <tt class="docutils literal"><span class="pre">value_type</span></tt> member is
|
||||||
<tt class="docutils literal"><span class="pre">remove_cv<remove_reference<reference></span> <span class="pre">>::type</span></tt>. Otherwise,
|
<tt class="docutils literal"><span class="pre">remove_cv<remove_reference<reference></span> <span class="pre">>::type</span></tt>. Otherwise,
|
||||||
@ -117,10 +117,10 @@ convertible to <tt class="docutils literal"><span class="pre">input_iterator_tag
|
|||||||
<div class="section" id="transform-iterator-requirements">
|
<div class="section" id="transform-iterator-requirements">
|
||||||
<h1><a class="toc-backref" href="#id3"><tt class="docutils literal"><span class="pre">transform_iterator</span></tt> requirements</a></h1>
|
<h1><a class="toc-backref" href="#id3"><tt class="docutils literal"><span class="pre">transform_iterator</span></tt> requirements</a></h1>
|
||||||
<p>The type <tt class="docutils literal"><span class="pre">UnaryFunction</span></tt> must be Assignable, Copy Constructible, and
|
<p>The type <tt class="docutils literal"><span class="pre">UnaryFunction</span></tt> must be Assignable, Copy Constructible, and
|
||||||
the expression <tt class="docutils literal"><span class="pre">f(*i)</span></tt> must be valid where <tt class="docutils literal"><span class="pre">f</span></tt> is an object of
|
the expression <tt class="docutils literal"><span class="pre">f(*i)</span></tt> must be valid where <tt class="docutils literal"><span class="pre">f</span></tt> is a const object of
|
||||||
type <tt class="docutils literal"><span class="pre">UnaryFunction</span></tt>, <tt class="docutils literal"><span class="pre">i</span></tt> is an object of type <tt class="docutils literal"><span class="pre">Iterator</span></tt>, and
|
type <tt class="docutils literal"><span class="pre">UnaryFunction</span></tt>, <tt class="docutils literal"><span class="pre">i</span></tt> is an object of type <tt class="docutils literal"><span class="pre">Iterator</span></tt>, and
|
||||||
where the type of <tt class="docutils literal"><span class="pre">f(*i)</span></tt> must be
|
where the type of <tt class="docutils literal"><span class="pre">f(*i)</span></tt> must be
|
||||||
<tt class="docutils literal"><span class="pre">result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type</span></tt>.</p>
|
<tt class="docutils literal"><span class="pre">result_of<const UnaryFunction(iterator_traits<Iterator>::reference)>::type</span></tt>.</p>
|
||||||
<p>The argument <tt class="docutils literal"><span class="pre">Iterator</span></tt> shall model Readable Iterator.</p>
|
<p>The argument <tt class="docutils literal"><span class="pre">Iterator</span></tt> shall model Readable Iterator.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="transform-iterator-models">
|
<div class="section" id="transform-iterator-models">
|
||||||
|
0
doc/transform_iterator.pdf
Executable file → Normal file
0
doc/transform_iterator.pdf
Executable file → Normal file
0
doc/transform_iterator_eg.rst
Executable file → Normal file
0
doc/transform_iterator_eg.rst
Executable file → Normal file
@ -41,7 +41,7 @@
|
|||||||
|
|
||||||
If ``Reference`` is ``use_default`` then the ``reference`` member of
|
If ``Reference`` is ``use_default`` then the ``reference`` member of
|
||||||
``transform_iterator`` is
|
``transform_iterator`` is
|
||||||
``result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type``.
|
``result_of<const UnaryFunction(iterator_traits<Iterator>::reference)>::type``.
|
||||||
Otherwise, ``reference`` is ``Reference``.
|
Otherwise, ``reference`` is ``Reference``.
|
||||||
|
|
||||||
If ``Value`` is ``use_default`` then the ``value_type`` member is
|
If ``Value`` is ``use_default`` then the ``value_type`` member is
|
||||||
@ -64,10 +64,10 @@ convertible to ``input_iterator_tag``.
|
|||||||
...................................
|
...................................
|
||||||
|
|
||||||
The type ``UnaryFunction`` must be Assignable, Copy Constructible, and
|
The type ``UnaryFunction`` must be Assignable, Copy Constructible, and
|
||||||
the expression ``f(*i)`` must be valid where ``f`` is an object of
|
the expression ``f(*i)`` must be valid where ``f`` is a const object of
|
||||||
type ``UnaryFunction``, ``i`` is an object of type ``Iterator``, and
|
type ``UnaryFunction``, ``i`` is an object of type ``Iterator``, and
|
||||||
where the type of ``f(*i)`` must be
|
where the type of ``f(*i)`` must be
|
||||||
``result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type``.
|
``result_of<const UnaryFunction(iterator_traits<Iterator>::reference)>::type``.
|
||||||
|
|
||||||
The argument ``Iterator`` shall model Readable Iterator.
|
The argument ``Iterator`` shall model Readable Iterator.
|
||||||
|
|
||||||
|
0
doc/zip_iterator.html
Executable file → Normal file
0
doc/zip_iterator.html
Executable file → Normal file
0
doc/zip_iterator.pdf
Executable file → Normal file
0
doc/zip_iterator.pdf
Executable file → Normal file
0
doc/zip_iterator.rst
Executable file → Normal file
0
doc/zip_iterator.rst
Executable file → Normal file
10
doc/zip_iterator_abstract.rst
Executable file → Normal file
10
doc/zip_iterator_abstract.rst
Executable file → Normal file
@ -8,3 +8,13 @@ iterator is constructed from a tuple of iterators. Moving
|
|||||||
the zip iterator moves all the iterators in parallel.
|
the zip iterator moves all the iterators in parallel.
|
||||||
Dereferencing the zip iterator returns a tuple that contains
|
Dereferencing the zip iterator returns a tuple that contains
|
||||||
the results of dereferencing the individual iterators.
|
the results of dereferencing the individual iterators.
|
||||||
|
|
||||||
|
The tuple of iterators is now implemented in terms of a Boost fusion sequence.
|
||||||
|
Because of this the 'tuple' may be any Boost fusion sequence and, for backwards
|
||||||
|
compatibility through a Boost fusion sequence adapter, a Boost tuple. Because the
|
||||||
|
'tuple' may be any boost::fusion sequence the 'tuple' may also be any type for which a
|
||||||
|
Boost fusion adapter exists. This includes, among others, a std::tuple and a std::pair.
|
||||||
|
Just remember to include the appropriate Boost fusion adapter header files for these
|
||||||
|
other Boost fusion adapters. The zip_iterator header file already includes the
|
||||||
|
Boost fusion adapter header file for Boost tuple, so you need not include it yourself
|
||||||
|
to use a Boost tuple as your 'tuple'.
|
||||||
|
0
doc/zip_iterator_eg.rst
Executable file → Normal file
0
doc/zip_iterator_eg.rst
Executable file → Normal file
0
doc/zip_iterator_ref.rst
Executable file → Normal file
0
doc/zip_iterator_ref.rst
Executable file → Normal file
0
example/node.hpp
Executable file → Normal file
0
example/node.hpp
Executable file → Normal file
0
example/node_iterator1.cpp
Executable file → Normal file
0
example/node_iterator1.cpp
Executable file → Normal file
0
example/node_iterator1.hpp
Executable file → Normal file
0
example/node_iterator1.hpp
Executable file → Normal file
0
example/node_iterator2.cpp
Executable file → Normal file
0
example/node_iterator2.cpp
Executable file → Normal file
0
example/node_iterator2.hpp
Executable file → Normal file
0
example/node_iterator2.hpp
Executable file → Normal file
0
example/node_iterator3.cpp
Executable file → Normal file
0
example/node_iterator3.cpp
Executable file → Normal file
0
example/node_iterator3.hpp
Executable file → Normal file
0
example/node_iterator3.hpp
Executable file → Normal file
@ -14,6 +14,7 @@
|
|||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
|
||||||
template <class UnaryFunction>
|
template <class UnaryFunction>
|
||||||
class function_output_iterator {
|
class function_output_iterator {
|
||||||
@ -51,6 +52,11 @@ namespace boost {
|
|||||||
return function_output_iterator<UnaryFunction>(f);
|
return function_output_iterator<UnaryFunction>(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace iterators
|
||||||
|
|
||||||
|
using iterators::function_output_iterator;
|
||||||
|
using iterators::make_function_output_iterator;
|
||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
#endif // BOOST_FUNCTION_OUTPUT_ITERATOR_HPP
|
#endif // BOOST_FUNCTION_OUTPUT_ITERATOR_HPP
|
||||||
|
85
include/boost/generator_iterator.hpp
Normal file
85
include/boost/generator_iterator.hpp
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
// (C) Copyright Jens Maurer 2001.
|
||||||
|
// Distributed under the Boost Software License, Version 1.0. (See
|
||||||
|
// accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
// http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
//
|
||||||
|
// Revision History:
|
||||||
|
|
||||||
|
// 15 Nov 2001 Jens Maurer
|
||||||
|
// created.
|
||||||
|
|
||||||
|
// See http://www.boost.org/libs/utility/iterator_adaptors.htm for documentation.
|
||||||
|
|
||||||
|
#ifndef BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP
|
||||||
|
#define BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP
|
||||||
|
|
||||||
|
#include <boost/iterator/iterator_facade.hpp>
|
||||||
|
#include <boost/ref.hpp>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
|
||||||
|
template<class Generator>
|
||||||
|
class generator_iterator
|
||||||
|
: public iterator_facade<
|
||||||
|
generator_iterator<Generator>
|
||||||
|
, typename Generator::result_type
|
||||||
|
, single_pass_traversal_tag
|
||||||
|
, typename Generator::result_type const&
|
||||||
|
>
|
||||||
|
{
|
||||||
|
typedef iterator_facade<
|
||||||
|
generator_iterator<Generator>
|
||||||
|
, typename Generator::result_type
|
||||||
|
, single_pass_traversal_tag
|
||||||
|
, typename Generator::result_type const&
|
||||||
|
> super_t;
|
||||||
|
|
||||||
|
public:
|
||||||
|
generator_iterator() {}
|
||||||
|
generator_iterator(Generator* g) : m_g(g), m_value((*m_g)()) {}
|
||||||
|
|
||||||
|
void increment()
|
||||||
|
{
|
||||||
|
m_value = (*m_g)();
|
||||||
|
}
|
||||||
|
|
||||||
|
const typename Generator::result_type&
|
||||||
|
dereference() const
|
||||||
|
{
|
||||||
|
return m_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool equal(generator_iterator const& y) const
|
||||||
|
{
|
||||||
|
return this->m_g == y.m_g && this->m_value == y.m_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Generator* m_g;
|
||||||
|
typename Generator::result_type m_value;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class Generator>
|
||||||
|
struct generator_iterator_generator
|
||||||
|
{
|
||||||
|
typedef generator_iterator<Generator> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Generator>
|
||||||
|
inline generator_iterator<Generator>
|
||||||
|
make_generator_iterator(Generator & gen)
|
||||||
|
{
|
||||||
|
typedef generator_iterator<Generator> result_t;
|
||||||
|
return result_t(&gen);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace iterators
|
||||||
|
|
||||||
|
using iterators::generator_iterator;
|
||||||
|
using iterators::generator_iterator_generator;
|
||||||
|
using iterators::make_generator_iterator;
|
||||||
|
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#endif // BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP
|
43
include/boost/indirect_reference.hpp
Normal file
43
include/boost/indirect_reference.hpp
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#ifndef INDIRECT_REFERENCE_DWA200415_HPP
|
||||||
|
# define INDIRECT_REFERENCE_DWA200415_HPP
|
||||||
|
|
||||||
|
//
|
||||||
|
// Copyright David Abrahams 2004. Use, modification and distribution is
|
||||||
|
// subject to the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
//
|
||||||
|
// typename indirect_reference<P>::type provides the type of *p.
|
||||||
|
//
|
||||||
|
// http://www.boost.org/libs/iterator/doc/pointee.html
|
||||||
|
//
|
||||||
|
|
||||||
|
# include <boost/detail/is_incrementable.hpp>
|
||||||
|
# include <boost/iterator/iterator_traits.hpp>
|
||||||
|
# include <boost/type_traits/remove_cv.hpp>
|
||||||
|
# include <boost/mpl/eval_if.hpp>
|
||||||
|
# include <boost/pointee.hpp>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
template <class P>
|
||||||
|
struct smart_ptr_reference
|
||||||
|
{
|
||||||
|
typedef typename boost::pointee<P>::type& type;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class P>
|
||||||
|
struct indirect_reference
|
||||||
|
: mpl::eval_if<
|
||||||
|
detail::is_incrementable<P>
|
||||||
|
, iterator_reference<P>
|
||||||
|
, detail::smart_ptr_reference<P>
|
||||||
|
>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#endif // INDIRECT_REFERENCE_DWA200415_HPP
|
@ -1,59 +0,0 @@
|
|||||||
// interator.hpp workarounds for non-conforming standard libraries ---------//
|
|
||||||
|
|
||||||
// (C) Copyright Beman Dawes 2000. Distributed under the Boost
|
|
||||||
// Software License, Version 1.0. (See accompanying file
|
|
||||||
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
|
|
||||||
// See http://www.boost.org/libs/utility for documentation.
|
|
||||||
|
|
||||||
// Revision History
|
|
||||||
// 12 Jan 01 added <cstddef> for std::ptrdiff_t (Jens Maurer)
|
|
||||||
// 28 Jun 00 Workarounds to deal with known MSVC bugs (David Abrahams)
|
|
||||||
// 26 Jun 00 Initial version (Jeremy Siek)
|
|
||||||
|
|
||||||
#ifndef BOOST_ITERATOR_HPP
|
|
||||||
#define BOOST_ITERATOR_HPP
|
|
||||||
|
|
||||||
#include <iterator>
|
|
||||||
#include <cstddef> // std::ptrdiff_t
|
|
||||||
#include <boost/config.hpp>
|
|
||||||
|
|
||||||
namespace boost
|
|
||||||
{
|
|
||||||
# if defined(BOOST_NO_STD_ITERATOR) && !defined(BOOST_MSVC_STD_ITERATOR)
|
|
||||||
template <class Category, class T,
|
|
||||||
class Distance = std::ptrdiff_t,
|
|
||||||
class Pointer = T*, class Reference = T&>
|
|
||||||
struct iterator
|
|
||||||
{
|
|
||||||
typedef T value_type;
|
|
||||||
typedef Distance difference_type;
|
|
||||||
typedef Pointer pointer;
|
|
||||||
typedef Reference reference;
|
|
||||||
typedef Category iterator_category;
|
|
||||||
};
|
|
||||||
# else
|
|
||||||
|
|
||||||
// declare iterator_base in namespace detail to work around MSVC bugs which
|
|
||||||
// prevent derivation from an identically-named class in a different namespace.
|
|
||||||
namespace detail {
|
|
||||||
template <class Category, class T, class Distance, class Pointer, class Reference>
|
|
||||||
# if !defined(BOOST_MSVC_STD_ITERATOR)
|
|
||||||
struct iterator_base : std::iterator<Category, T, Distance, Pointer, Reference> {};
|
|
||||||
# else
|
|
||||||
struct iterator_base : std::iterator<Category, T, Distance>
|
|
||||||
{
|
|
||||||
typedef Reference reference;
|
|
||||||
typedef Pointer pointer;
|
|
||||||
typedef Distance difference_type;
|
|
||||||
};
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Category, class T, class Distance = std::ptrdiff_t,
|
|
||||||
class Pointer = T*, class Reference = T&>
|
|
||||||
struct iterator : boost::detail::iterator_base<Category, T, Distance, Pointer, Reference> {};
|
|
||||||
# endif
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
#endif // BOOST_ITERATOR_HPP
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user