1 // (C) Copyright Jeremy Siek 2002.
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 
6 #include <boost/iterator/iterator_concepts.hpp>
7 #include <boost/iterator/iterator_categories.hpp>
8 #include <boost/operators.hpp>
9 
10 struct new_random_access
11   : std::random_access_iterator_tag
12   , boost::random_access_traversal_tag
13 {};
14 
15 struct new_iterator
16   : public boost::iterator< new_random_access, int >
17 {
operator *new_iterator18   int& operator*() const { return *m_x; }
operator ++new_iterator19   new_iterator& operator++() { return *this; }
operator ++new_iterator20   new_iterator operator++(int) { return *this; }
operator --new_iterator21   new_iterator& operator--() { return *this; }
operator --new_iterator22   new_iterator operator--(int) { return *this; }
operator +=new_iterator23   new_iterator& operator+=(std::ptrdiff_t) { return *this; }
operator +new_iterator24   new_iterator operator+(std::ptrdiff_t) { return *this; }
operator -=new_iterator25   new_iterator& operator-=(std::ptrdiff_t) { return *this; }
operator -new_iterator26   std::ptrdiff_t operator-(const new_iterator&) const { return 0; }
operator -new_iterator27   new_iterator operator-(std::ptrdiff_t) const { return *this; }
operator ==new_iterator28   bool operator==(const new_iterator&) const { return false; }
operator !=new_iterator29   bool operator!=(const new_iterator&) const { return false; }
operator <new_iterator30   bool operator<(const new_iterator&) const { return false; }
31   int* m_x;
32 };
operator +(std::ptrdiff_t,new_iterator x)33 new_iterator operator+(std::ptrdiff_t, new_iterator x) { return x; }
34 
35 struct old_iterator
36   : public boost::iterator<std::random_access_iterator_tag, int>
37 {
operator *old_iterator38   int& operator*() const { return *m_x; }
operator ++old_iterator39   old_iterator& operator++() { return *this; }
operator ++old_iterator40   old_iterator operator++(int) { return *this; }
operator --old_iterator41   old_iterator& operator--() { return *this; }
operator --old_iterator42   old_iterator operator--(int) { return *this; }
operator +=old_iterator43   old_iterator& operator+=(std::ptrdiff_t) { return *this; }
operator +old_iterator44   old_iterator operator+(std::ptrdiff_t) { return *this; }
operator -=old_iterator45   old_iterator& operator-=(std::ptrdiff_t) { return *this; }
operator -old_iterator46   old_iterator operator-(std::ptrdiff_t) const { return *this; }
operator -old_iterator47   std::ptrdiff_t operator-(const old_iterator&) const { return 0; }
operator ==old_iterator48   bool operator==(const old_iterator&) const { return false; }
operator !=old_iterator49   bool operator!=(const old_iterator&) const { return false; }
operator <old_iterator50   bool operator<(const old_iterator&) const { return false; }
51   int* m_x;
52 };
operator +(std::ptrdiff_t,old_iterator x)53 old_iterator operator+(std::ptrdiff_t, old_iterator x) { return x; }
54 
55 int
main()56 main()
57 {
58   boost::iterator_traversal<new_iterator>::type tc;
59   boost::random_access_traversal_tag derived = tc;
60   (void)derived;
61 
62   boost::function_requires<
63     boost_concepts::WritableIteratorConcept<int*> >();
64   boost::function_requires<
65     boost_concepts::LvalueIteratorConcept<int*> >();
66   boost::function_requires<
67     boost_concepts::RandomAccessTraversalConcept<int*> >();
68 
69   boost::function_requires<
70     boost_concepts::ReadableIteratorConcept<const int*> >();
71   boost::function_requires<
72     boost_concepts::LvalueIteratorConcept<const int*> >();
73   boost::function_requires<
74     boost_concepts::RandomAccessTraversalConcept<const int*> >();
75 
76   boost::function_requires<
77     boost_concepts::WritableIteratorConcept<new_iterator> >();
78   boost::function_requires<
79     boost_concepts::LvalueIteratorConcept<new_iterator> >();
80   boost::function_requires<
81     boost_concepts::RandomAccessTraversalConcept<new_iterator> >();
82 
83   boost::function_requires<
84     boost_concepts::WritableIteratorConcept<old_iterator> >();
85   boost::function_requires<
86     boost_concepts::LvalueIteratorConcept<old_iterator> >();
87   boost::function_requires<
88     boost_concepts::RandomAccessTraversalConcept<old_iterator> >();
89 
90   boost::function_requires<
91     boost_concepts::InteroperableIteratorConcept<int*, int const*> >();
92 
93   return 0;
94 }
95