• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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