1 // Copyright David Abrahams 2003.
2 // Distributed under the Boost Software License, Version 1.0. (See
3 // accompanying file LICENSE_1_0.txt or copy at
4 // http://www.boost.org/LICENSE_1_0.txt)
5 #include <boost/iterator/iterator_adaptor.hpp>
6 #include <boost/static_assert.hpp>
7
8 #include "static_assert_same.hpp"
9
10 #include <boost/iterator/minimum_category.hpp>
11
12 struct X { int a; };
13
14
15 struct Xiter : boost::iterator_adaptor<Xiter,X*>
16 {
17 Xiter();
XiterXiter18 Xiter(X* p) : boost::iterator_adaptor<Xiter, X*>(p) {}
19 };
20
take_xptr(X *)21 void take_xptr(X*) {}
operator_arrow_test()22 void operator_arrow_test()
23 {
24 // check that the operator-> result is a pointer for lvalue iterators
25 X x;
26 take_xptr(Xiter(&x).operator->());
27 }
28
29 template <class T, class U, class Min>
30 struct static_assert_min_cat
31 : static_assert_same<
32 typename boost::iterators::minimum_category<T,U>::type, Min
33 >
34 {};
35
category_test()36 void category_test()
37 {
38 using namespace boost::iterators;
39 using namespace boost::iterators::detail;
40
41 BOOST_STATIC_ASSERT((
42 !boost::is_convertible<
43 std::input_iterator_tag
44 , input_output_iterator_tag>::value));
45
46 BOOST_STATIC_ASSERT((
47 !boost::is_convertible<
48 std::output_iterator_tag
49 , input_output_iterator_tag>::value));
50
51 BOOST_STATIC_ASSERT((
52 boost::is_convertible<
53 input_output_iterator_tag
54 , std::input_iterator_tag>::value));
55
56 BOOST_STATIC_ASSERT((
57 boost::is_convertible<
58 input_output_iterator_tag
59 , std::output_iterator_tag>::value));
60
61 #if 0 // This seems wrong; we're not advertising
62 // input_output_iterator_tag are we?
63 BOOST_STATIC_ASSERT((
64 boost::is_convertible<
65 std::forward_iterator_tag
66 , input_output_iterator_tag>::value));
67 #endif
68
69 int test = static_assert_min_cat<
70 std::input_iterator_tag,input_output_iterator_tag, std::input_iterator_tag
71 >::value;
72
73 test = static_assert_min_cat<
74 input_output_iterator_tag,std::input_iterator_tag, std::input_iterator_tag
75 >::value;
76
77 #if 0
78 test = static_assert_min_cat<
79 input_output_iterator_tag,std::forward_iterator_tag, input_output_iterator_tag
80 >::value;
81 #endif
82
83 test = static_assert_min_cat<
84 std::input_iterator_tag,std::forward_iterator_tag, std::input_iterator_tag
85 >::value;
86
87 test = static_assert_min_cat<
88 std::input_iterator_tag,std::random_access_iterator_tag, std::input_iterator_tag
89 >::value;
90
91 #if 0 // This would be wrong: a random access iterator is not
92 // neccessarily writable, as is an output iterator.
93 test = static_assert_min_cat<
94 std::output_iterator_tag,std::random_access_iterator_tag, std::output_iterator_tag
95 >::value;
96 #endif
97
98 (void)test;
99 }
100
main()101 int main()
102 {
103 category_test();
104 operator_arrow_test();
105 return 0;
106 }
107
108