mirror of
https://github.com/boostorg/iterator.git
synced 2025-07-30 21:07:20 +02:00
iterator_adaptor_test
[SVN r20842]
This commit is contained in:
@ -14,6 +14,10 @@
|
|||||||
#include <numeric>
|
#include <numeric>
|
||||||
|
|
||||||
#include <boost/iterator/iterator_adaptor.hpp>
|
#include <boost/iterator/iterator_adaptor.hpp>
|
||||||
|
#if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407)
|
||||||
|
# include <boost/iterator/is_readable_iterator.hpp>
|
||||||
|
# include <boost/iterator/is_lvalue_iterator.hpp>
|
||||||
|
#endif
|
||||||
#include <boost/pending/iterator_tests.hpp>
|
#include <boost/pending/iterator_tests.hpp>
|
||||||
|
|
||||||
# include <boost/type_traits/broken_compiler_spec.hpp>
|
# include <boost/type_traits/broken_compiler_spec.hpp>
|
||||||
@ -26,8 +30,6 @@
|
|||||||
|
|
||||||
#include "static_assert_same.hpp"
|
#include "static_assert_same.hpp"
|
||||||
|
|
||||||
struct my_iterator_tag : public std::random_access_iterator_tag { };
|
|
||||||
|
|
||||||
using boost::dummyT;
|
using boost::dummyT;
|
||||||
|
|
||||||
struct mult_functor {
|
struct mult_functor {
|
||||||
@ -83,7 +85,7 @@ struct ptr_iterator
|
|||||||
ptr_iterator<V>
|
ptr_iterator<V>
|
||||||
, V*
|
, V*
|
||||||
, V
|
, V
|
||||||
, std::random_access_iterator_tag
|
, boost::random_access_traversal_tag
|
||||||
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
|
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
|
||||||
, V&
|
, V&
|
||||||
#endif
|
#endif
|
||||||
@ -94,7 +96,7 @@ private:
|
|||||||
ptr_iterator<V>
|
ptr_iterator<V>
|
||||||
, V*
|
, V*
|
||||||
, V
|
, V
|
||||||
, std::random_access_iterator_tag
|
, boost::random_access_traversal_tag
|
||||||
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
|
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
|
||||||
, V&
|
, V&
|
||||||
#endif
|
#endif
|
||||||
@ -114,13 +116,13 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Non-functional iterator for category modification checking
|
// Non-functional iterator for category modification checking
|
||||||
template <class Iter, class Category>
|
template <class Iter, class Traversal>
|
||||||
struct modify_category
|
struct modify_traversal
|
||||||
: boost::iterator_adaptor<
|
: boost::iterator_adaptor<
|
||||||
modify_category<Iter, Category>
|
modify_traversal<Iter, Traversal>
|
||||||
, Iter
|
, Iter
|
||||||
, boost::use_default
|
, boost::use_default
|
||||||
, Category
|
, Traversal
|
||||||
>
|
>
|
||||||
{};
|
{};
|
||||||
|
|
||||||
@ -179,6 +181,12 @@ struct constant_iterator
|
|||||||
: base_t(it) {}
|
: base_t(it) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
char (& traversal(boost::incrementable_traversal_tag) )[1];
|
||||||
|
char (& traversal(boost::single_pass_traversal_tag ) )[2];
|
||||||
|
char (& traversal(boost::forward_traversal_tag ) )[3];
|
||||||
|
char (& traversal(boost::bidirectional_traversal_tag) )[4];
|
||||||
|
char (& traversal(boost::random_access_traversal_tag) )[5];
|
||||||
|
|
||||||
int
|
int
|
||||||
main()
|
main()
|
||||||
{
|
{
|
||||||
@ -219,7 +227,11 @@ main()
|
|||||||
typedef ptr_iterator<int const> Iter1;
|
typedef ptr_iterator<int const> Iter1;
|
||||||
test = static_assert_same<Iter1::value_type, int>::value;
|
test = static_assert_same<Iter1::value_type, int>::value;
|
||||||
test = static_assert_same<Iter1::reference, const int&>::value;
|
test = static_assert_same<Iter1::reference, const int&>::value;
|
||||||
test = static_assert_same<Iter1::iterator_category::access, boost::readable_lvalue_iterator_tag>::value; test = static_assert_same<Iter1::pointer, const int*>::value;
|
#if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407)
|
||||||
|
BOOST_STATIC_ASSERT(boost::is_readable_iterator<Iter1>::value);
|
||||||
|
BOOST_STATIC_ASSERT(boost::is_lvalue_iterator<Iter1>::value);
|
||||||
|
#endif
|
||||||
|
test = static_assert_same<Iter1::pointer, const int*>::value;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -231,17 +243,26 @@ main()
|
|||||||
test = static_assert_same<Iter::reference, int const&>::value;
|
test = static_assert_same<Iter::reference, int const&>::value;
|
||||||
test = static_assert_same<Iter::pointer, int const*>::value;
|
test = static_assert_same<Iter::pointer, int const*>::value;
|
||||||
|
|
||||||
test = static_assert_same<BaseIter::iterator_category::access, boost::writable_lvalue_iterator_tag>::value;
|
#if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407)
|
||||||
test = static_assert_same<Iter::iterator_category::access, boost::readable_lvalue_iterator_tag>::value;
|
BOOST_STATIC_ASSERT(boost::is_mutable_lvalue_iterator<BaseIter>::value);
|
||||||
|
BOOST_STATIC_ASSERT(boost::is_lvalue_iterator<Iter>::value);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Test category modification
|
typedef modify_traversal<BaseIter, boost::incrementable_traversal_tag> IncrementableIter;
|
||||||
typedef modify_category<BaseIter, boost::readable_iterator_tag> ReadableIter;
|
|
||||||
test = static_assert_same<ReadableIter::iterator_category::access, boost::readable_iterator_tag>::value;
|
|
||||||
|
|
||||||
typedef modify_category<BaseIter, boost::incrementable_traversal_tag> IncrementableIter;
|
BaseIter::iterator_category base_cat;
|
||||||
test = static_assert_same<BaseIter::iterator_category::traversal, boost::random_access_traversal_tag>::value;
|
boost::random_access_traversal_tag random_traversal;
|
||||||
test = static_assert_same<IncrementableIter::iterator_category::traversal, boost::incrementable_traversal_tag>::value;
|
BOOST_STATIC_ASSERT(
|
||||||
|
sizeof(traversal(base_cat))
|
||||||
|
== sizeof(traversal(random_traversal))
|
||||||
|
);
|
||||||
|
|
||||||
|
IncrementableIter::iterator_category incr_cat;
|
||||||
|
boost::incrementable_traversal_tag incrementable_traversal;
|
||||||
|
BOOST_STATIC_ASSERT(
|
||||||
|
sizeof(traversal(incr_cat))
|
||||||
|
== sizeof(traversal(incrementable_traversal))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test the iterator_adaptor
|
// Test the iterator_adaptor
|
||||||
|
Reference in New Issue
Block a user