1 | /* |
2 | * |
3 | * Copyright (c) 1998-2002 |
4 | * John Maddock |
5 | * |
6 | * Use, modification and distribution are subject to the |
7 | * Boost Software License, Version 1.0. (See accompanying file |
8 | * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
9 | * |
10 | */ |
11 | |
12 | /* |
13 | * LOCATION: see http://www.boost.org for most recent version. |
14 | * FILE iterator_traits.cpp |
15 | * VERSION see <boost/version.hpp> |
16 | * DESCRIPTION: Declares iterator traits workarounds. |
17 | */ |
18 | |
19 | #ifndef BOOST_REGEX_V4_ITERATOR_TRAITS_HPP |
20 | #define BOOST_REGEX_V4_ITERATOR_TRAITS_HPP |
21 | |
22 | #ifdef BOOST_MSVC |
23 | #pragma warning(push) |
24 | #pragma warning(disable: 4103) |
25 | #endif |
26 | #ifdef BOOST_HAS_ABI_HEADERS |
27 | # include BOOST_ABI_PREFIX |
28 | #endif |
29 | #ifdef BOOST_MSVC |
30 | #pragma warning(pop) |
31 | #endif |
32 | |
33 | namespace boost{ |
34 | namespace BOOST_REGEX_DETAIL_NS{ |
35 | |
36 | #if defined(BOOST_NO_STD_ITERATOR_TRAITS) |
37 | |
38 | template <class T> |
39 | struct regex_iterator_traits |
40 | { |
41 | typedef typename T::iterator_category iterator_category; |
42 | typedef typename T::value_type value_type; |
43 | #if !defined(BOOST_NO_STD_ITERATOR) |
44 | typedef typename T::difference_type difference_type; |
45 | typedef typename T::pointer pointer; |
46 | typedef typename T::reference reference; |
47 | #else |
48 | typedef std::ptrdiff_t difference_type; |
49 | typedef value_type* pointer; |
50 | typedef value_type& reference; |
51 | #endif |
52 | }; |
53 | |
54 | template <class T> |
55 | struct pointer_iterator_traits |
56 | { |
57 | typedef std::ptrdiff_t difference_type; |
58 | typedef T value_type; |
59 | typedef T* pointer; |
60 | typedef T& reference; |
61 | typedef std::random_access_iterator_tag iterator_category; |
62 | }; |
63 | template <class T> |
64 | struct const_pointer_iterator_traits |
65 | { |
66 | typedef std::ptrdiff_t difference_type; |
67 | typedef T value_type; |
68 | typedef const T* pointer; |
69 | typedef const T& reference; |
70 | typedef std::random_access_iterator_tag iterator_category; |
71 | }; |
72 | |
73 | template<> |
74 | struct regex_iterator_traits<char*> : pointer_iterator_traits<char>{}; |
75 | template<> |
76 | struct regex_iterator_traits<const char*> : const_pointer_iterator_traits<char>{}; |
77 | template<> |
78 | struct regex_iterator_traits<wchar_t*> : pointer_iterator_traits<wchar_t>{}; |
79 | template<> |
80 | struct regex_iterator_traits<const wchar_t*> : const_pointer_iterator_traits<wchar_t>{}; |
81 | // |
82 | // the follwoing are needed for ICU support: |
83 | // |
84 | template<> |
85 | struct regex_iterator_traits<unsigned char*> : pointer_iterator_traits<char>{}; |
86 | template<> |
87 | struct regex_iterator_traits<const unsigned char*> : const_pointer_iterator_traits<char>{}; |
88 | template<> |
89 | struct regex_iterator_traits<int*> : pointer_iterator_traits<int>{}; |
90 | template<> |
91 | struct regex_iterator_traits<const int*> : const_pointer_iterator_traits<int>{}; |
92 | |
93 | #ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T |
94 | template<> |
95 | struct regex_iterator_traits<unsigned short*> : pointer_iterator_traits<unsigned short>{}; |
96 | template<> |
97 | struct regex_iterator_traits<const unsigned short*> : const_pointer_iterator_traits<unsigned short>{}; |
98 | #endif |
99 | |
100 | #if defined(__SGI_STL_PORT) && defined(__STL_DEBUG) |
101 | template<> |
102 | struct regex_iterator_traits<std::string::iterator> : pointer_iterator_traits<char>{}; |
103 | template<> |
104 | struct regex_iterator_traits<std::string::const_iterator> : const_pointer_iterator_traits<char>{}; |
105 | #ifndef BOOST_NO_STD_WSTRING |
106 | template<> |
107 | struct regex_iterator_traits<std::wstring::iterator> : pointer_iterator_traits<wchar_t>{}; |
108 | template<> |
109 | struct regex_iterator_traits<std::wstring::const_iterator> : const_pointer_iterator_traits<wchar_t>{}; |
110 | #endif // BOOST_NO_WSTRING |
111 | #endif // stport |
112 | |
113 | #else |
114 | |
115 | template <class T> |
116 | struct regex_iterator_traits : public std::iterator_traits<T> {}; |
117 | |
118 | #endif |
119 | |
120 | } // namespace BOOST_REGEX_DETAIL_NS |
121 | } // namespace boost |
122 | |
123 | #ifdef BOOST_MSVC |
124 | #pragma warning(push) |
125 | #pragma warning(disable: 4103) |
126 | #endif |
127 | #ifdef BOOST_HAS_ABI_HEADERS |
128 | # include BOOST_ABI_SUFFIX |
129 | #endif |
130 | #ifdef BOOST_MSVC |
131 | #pragma warning(pop) |
132 | #endif |
133 | |
134 | #endif |
135 | |
136 | |