|
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 #ifndef ITERATOR_TRAITS_DWA200347_HPP |
|
6 # define ITERATOR_TRAITS_DWA200347_HPP |
|
7 |
|
8 # include <boost/detail/iterator.hpp> |
|
9 # include <boost/detail/workaround.hpp> |
|
10 |
|
11 namespace boost { |
|
12 |
|
13 // Unfortunately, g++ 2.95.x chokes when we define a class template |
|
14 // iterator_category which has the same name as its |
|
15 // std::iterator_category() function, probably due in part to the |
|
16 // "std:: is visible globally" hack it uses. Use |
|
17 // BOOST_ITERATOR_CATEGORY to write code that's portable to older |
|
18 // GCCs. |
|
19 |
|
20 # if BOOST_WORKAROUND(__GNUC__, <= 2) |
|
21 # define BOOST_ITERATOR_CATEGORY iterator_category_ |
|
22 # else |
|
23 # define BOOST_ITERATOR_CATEGORY iterator_category |
|
24 # endif |
|
25 |
|
26 |
|
27 template <class Iterator> |
|
28 struct iterator_value |
|
29 { |
|
30 typedef typename boost::detail::iterator_traits<Iterator>::value_type type; |
|
31 }; |
|
32 |
|
33 template <class Iterator> |
|
34 struct iterator_reference |
|
35 { |
|
36 typedef typename boost::detail::iterator_traits<Iterator>::reference type; |
|
37 }; |
|
38 |
|
39 |
|
40 template <class Iterator> |
|
41 struct iterator_pointer |
|
42 { |
|
43 typedef typename boost::detail::iterator_traits<Iterator>::pointer type; |
|
44 }; |
|
45 |
|
46 template <class Iterator> |
|
47 struct iterator_difference |
|
48 { |
|
49 typedef typename boost::detail::iterator_traits<Iterator>::difference_type type; |
|
50 }; |
|
51 |
|
52 template <class Iterator> |
|
53 struct BOOST_ITERATOR_CATEGORY |
|
54 { |
|
55 typedef typename boost::detail::iterator_traits<Iterator>::iterator_category type; |
|
56 }; |
|
57 |
|
58 # if BOOST_WORKAROUND(BOOST_MSVC, < 1300) |
|
59 template <> |
|
60 struct iterator_value<int> |
|
61 { |
|
62 typedef void type; |
|
63 }; |
|
64 |
|
65 template <> |
|
66 struct iterator_reference<int> |
|
67 { |
|
68 typedef void type; |
|
69 }; |
|
70 |
|
71 template <> |
|
72 struct iterator_pointer<int> |
|
73 { |
|
74 typedef void type; |
|
75 }; |
|
76 |
|
77 template <> |
|
78 struct iterator_difference<int> |
|
79 { |
|
80 typedef void type; |
|
81 }; |
|
82 |
|
83 template <> |
|
84 struct BOOST_ITERATOR_CATEGORY<int> |
|
85 { |
|
86 typedef void type; |
|
87 }; |
|
88 # endif |
|
89 |
|
90 } // namespace boost::iterator |
|
91 |
|
92 #endif // ITERATOR_TRAITS_DWA200347_HPP |