forked from boostorg/iterator
rigged new iterator_traits for backward compatibility
[SVN r9577]
This commit is contained in:
@ -3,6 +3,8 @@
|
||||
|
||||
#include <boost/concept_check.hpp>
|
||||
#include <boost/iterator_traits.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
|
||||
@ -11,6 +13,7 @@ namespace boost_concepts {
|
||||
|
||||
|
||||
//===========================================================================
|
||||
// Iterator Access Concepts
|
||||
|
||||
template <typename Iterator>
|
||||
class ReadableIteratorConcept {
|
||||
@ -23,11 +26,12 @@ namespace boost_concepts {
|
||||
void constraints() {
|
||||
boost::function_requires< boost::SGIAssignableConcept<Iterator> >();
|
||||
boost::function_requires< boost::EqualityComparableConcept<Iterator> >();
|
||||
boost::function_requires< boost::DefaultConstructibleConcept<Iterator> >();
|
||||
|
||||
boost::function_requires<
|
||||
boost::ConvertibleConcept<return_category, boost::readable_iterator_tag> >();
|
||||
|
||||
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);
|
||||
@ -44,10 +48,11 @@ namespace boost_concepts {
|
||||
void constraints() {
|
||||
boost::function_requires< boost::SGIAssignableConcept<Iterator> >();
|
||||
boost::function_requires< boost::EqualityComparableConcept<Iterator> >();
|
||||
boost::function_requires< boost::DefaultConstructibleConcept<Iterator> >();
|
||||
|
||||
boost::function_requires<
|
||||
boost::ConvertibleConcept<return_category, boost::writable_iterator_tag> >();
|
||||
boost::DefaultConstructibleConcept<Iterator> >();
|
||||
|
||||
BOOST_STATIC_ASSERT((boost::is_convertible<return_category*,
|
||||
boost::writable_iterator_tag*>::value));
|
||||
|
||||
*i = v; // an alternative could be something like write(x, v)
|
||||
}
|
||||
@ -65,12 +70,12 @@ namespace boost_concepts {
|
||||
|
||||
void constraints() {
|
||||
boost::function_requires< ReadableIteratorConcept<Iterator> >();
|
||||
|
||||
boost::function_requires<
|
||||
boost::ConvertibleConcept<return_category,
|
||||
boost::constant_lvalue_iterator_tag> >();
|
||||
|
||||
typedef typename boost::require_same<reference, const value_type&>::type req;
|
||||
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);
|
||||
@ -88,13 +93,13 @@ namespace boost_concepts {
|
||||
|
||||
void constraints() {
|
||||
boost::function_requires< ReadableIteratorConcept<Iterator> >();
|
||||
boost::function_requires< WritableIteratorConcept<Iterator, value_type> >();
|
||||
|
||||
boost::function_requires<
|
||||
boost::ConvertibleConcept<return_category,
|
||||
boost::constant_lvalue_iterator_tag> >();
|
||||
WritableIteratorConcept<Iterator, value_type> >();
|
||||
|
||||
BOOST_STATIC_ASSERT((boost::is_convertible<return_category*,
|
||||
boost::mutable_lvalue_iterator_tag*>::value));
|
||||
|
||||
typedef typename boost::require_same<reference, value_type&>::type req;
|
||||
BOOST_STATIC_ASSERT((boost::is_same<reference, value_type&>::value));
|
||||
|
||||
reference v = *i;
|
||||
boost::ignore_unused_variable_warning(v);
|
||||
@ -103,24 +108,25 @@ namespace boost_concepts {
|
||||
};
|
||||
|
||||
//===========================================================================
|
||||
// Iterator Traversal Concepts
|
||||
|
||||
template <typename Iterator>
|
||||
class SinglePassIteratorConcept {
|
||||
public:
|
||||
typedef typename boost::iterator_traits<Iterator>::motion_category
|
||||
motion_category;
|
||||
typedef typename boost::iterator_traits<Iterator>::traversal_category
|
||||
traversal_category;
|
||||
typedef typename boost::iterator_traits<Iterator>::difference_type
|
||||
difference_type;
|
||||
|
||||
void constraints() {
|
||||
boost::function_requires< boost::SGIAssignableConcept<Iterator> >();
|
||||
boost::function_requires< boost::EqualityComparableConcept<Iterator> >();
|
||||
boost::function_requires< boost::DefaultConstructibleConcept<Iterator> >();
|
||||
|
||||
boost::function_requires<
|
||||
boost::ConvertibleConcept<motion_category,
|
||||
boost::single_pass_iterator_tag> >();
|
||||
|
||||
boost::DefaultConstructibleConcept<Iterator> >();
|
||||
|
||||
BOOST_STATIC_ASSERT((boost::is_convertible<traversal_category*,
|
||||
boost::single_pass_iterator_tag*>::value));
|
||||
|
||||
// difference_type must be a signed integral type
|
||||
|
||||
++i;
|
||||
@ -133,30 +139,28 @@ namespace boost_concepts {
|
||||
template <typename Iterator>
|
||||
class ForwardIteratorConcept {
|
||||
public:
|
||||
typedef typename boost::iterator_traits<Iterator>::motion_category
|
||||
motion_category;
|
||||
typedef typename boost::iterator_traits<Iterator>::traversal_category
|
||||
traversal_category;
|
||||
|
||||
void constraints() {
|
||||
boost::function_requires< SinglePassIteratorConcept<Iterator> >();
|
||||
|
||||
boost::function_requires<
|
||||
boost::ConvertibleConcept<motion_category,
|
||||
boost::forward_iterator_tag> >();
|
||||
BOOST_STATIC_ASSERT((boost::is_convertible<traversal_category*,
|
||||
boost::forward_iterator_tag*>::value));
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Iterator>
|
||||
class BidirectionalIteratorConcept {
|
||||
public:
|
||||
typedef typename boost::iterator_traits<Iterator>::motion_category
|
||||
motion_category;
|
||||
typedef typename boost::iterator_traits<Iterator>::traversal_category
|
||||
traversal_category;
|
||||
|
||||
void constraints() {
|
||||
boost::function_requires< ForwardIteratorConcept<Iterator> >();
|
||||
|
||||
boost::function_requires<
|
||||
boost::ConvertibleConcept<motion_category,
|
||||
boost::bidirectional_iterator_tag> >();
|
||||
BOOST_STATIC_ASSERT((boost::is_convertible<traversal_category*,
|
||||
boost::bidirectional_iterator_tag*>::value));
|
||||
|
||||
--i;
|
||||
(void)i--;
|
||||
@ -167,18 +171,17 @@ namespace boost_concepts {
|
||||
template <typename Iterator>
|
||||
class RandomAccessIteratorConcept {
|
||||
public:
|
||||
typedef typename boost::iterator_traits<Iterator>::motion_category
|
||||
motion_category;
|
||||
typedef typename boost::iterator_traits<Iterator>::traversal_category
|
||||
traversal_category;
|
||||
typedef typename boost::iterator_traits<Iterator>::difference_type
|
||||
difference_type;
|
||||
|
||||
void constraints() {
|
||||
boost::function_requires< BidirectionalIteratorConcept<Iterator> >();
|
||||
|
||||
boost::function_requires<
|
||||
boost::ConvertibleConcept<motion_category,
|
||||
boost::random_access_iterator_tag> >();
|
||||
|
||||
BOOST_STATIC_ASSERT((boost::is_convertible<traversal_category*,
|
||||
boost::random_access_iterator_tag*>::value));
|
||||
|
||||
i += n;
|
||||
i = i + n;
|
||||
i = n + i;
|
||||
@ -190,92 +193,6 @@ namespace boost_concepts {
|
||||
Iterator i, j;
|
||||
};
|
||||
|
||||
//===========================================================================
|
||||
|
||||
template <typename Iterator>
|
||||
class ReadableRandomAccessIteratorConcept {
|
||||
public:
|
||||
typedef typename boost::iterator_traits<Iterator>::value_type value_type;
|
||||
typedef typename boost::iterator_traits<Iterator>::reference reference;
|
||||
typedef typename boost::iterator_traits<Iterator>::difference_type
|
||||
difference_type;
|
||||
|
||||
void constraints() {
|
||||
boost::function_requires< RandomAccessIteratorConcept<Iterator> >();
|
||||
boost::function_requires< ReadableIteratorConcept<Iterator> >();
|
||||
|
||||
reference r = i[n];
|
||||
value_type v(r);
|
||||
boost::ignore_unused_variable_warning(v);
|
||||
}
|
||||
difference_type n;
|
||||
Iterator i;
|
||||
};
|
||||
|
||||
template <typename Iterator>
|
||||
class WritableRandomAccessIteratorConcept {
|
||||
public:
|
||||
typedef typename boost::iterator_traits<Iterator>::value_type value_type;
|
||||
typedef typename boost::iterator_traits<Iterator>::difference_type
|
||||
difference_type;
|
||||
|
||||
void constraints() {
|
||||
boost::function_requires< RandomAccessIteratorConcept<Iterator> >();
|
||||
boost::function_requires< WritableIteratorConcept<Iterator, value_type> >();
|
||||
|
||||
i[n] = v;
|
||||
boost::ignore_unused_variable_warning(v);
|
||||
}
|
||||
difference_type n;
|
||||
value_type v;
|
||||
Iterator i;
|
||||
};
|
||||
|
||||
template <typename Iterator>
|
||||
class ConstantLvalueRandomAccessIteratorConcept {
|
||||
public:
|
||||
typedef typename boost::iterator_traits<Iterator>::value_type value_type;
|
||||
typedef typename boost::iterator_traits<Iterator>::reference reference;
|
||||
typedef typename boost::iterator_traits<Iterator>::difference_type
|
||||
difference_type;
|
||||
|
||||
void constraints() {
|
||||
boost::function_requires< RandomAccessIteratorConcept<Iterator> >();
|
||||
boost::function_requires< ReadableIteratorConcept<Iterator> >();
|
||||
|
||||
typedef typename boost::require_same<reference, const value_type&>::type req;
|
||||
|
||||
reference v = i[n];
|
||||
boost::ignore_unused_variable_warning(v);
|
||||
}
|
||||
difference_type n;
|
||||
value_type v;
|
||||
Iterator i;
|
||||
};
|
||||
|
||||
template <typename Iterator>
|
||||
class MutableLvalueRandomAccessIteratorConcept {
|
||||
public:
|
||||
typedef typename boost::iterator_traits<Iterator>::value_type value_type;
|
||||
typedef typename boost::iterator_traits<Iterator>::reference reference;
|
||||
typedef typename boost::iterator_traits<Iterator>::difference_type
|
||||
difference_type;
|
||||
|
||||
void constraints() {
|
||||
boost::function_requires< RandomAccessIteratorConcept<Iterator> >();
|
||||
boost::function_requires< WritableIteratorConcept<Iterator, value_type> >();
|
||||
boost::function_requires< ReadableIteratorConcept<Iterator> >();
|
||||
|
||||
typedef typename boost::require_same<reference, value_type&>::type req;
|
||||
|
||||
reference v = i[n];
|
||||
boost::ignore_unused_variable_warning(v);
|
||||
}
|
||||
difference_type n;
|
||||
value_type v;
|
||||
Iterator i;
|
||||
};
|
||||
|
||||
} // namespace boost_concepts
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user