Chris@16
|
1 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
2 // traits_utils.hpp
|
Chris@16
|
3 //
|
Chris@16
|
4 // Copyright 2008 Eric Niebler. Distributed under the Boost
|
Chris@16
|
5 // Software License, Version 1.0. (See accompanying file
|
Chris@16
|
6 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
7
|
Chris@16
|
8 #ifndef BOOST_XPRESSIVE_DETAIL_UTILITY_TRAITS_UTILS_HPP_EAN_10_04_2005
|
Chris@16
|
9 #define BOOST_XPRESSIVE_DETAIL_UTILITY_TRAITS_UTILS_HPP_EAN_10_04_2005
|
Chris@16
|
10
|
Chris@16
|
11 // MS compatible compilers support #pragma once
|
Chris@101
|
12 #if defined(_MSC_VER)
|
Chris@16
|
13 # pragma once
|
Chris@16
|
14 # pragma warning(push)
|
Chris@16
|
15 # pragma warning(disable : 4100) // unreferenced formal parameter
|
Chris@16
|
16 #endif
|
Chris@16
|
17
|
Chris@16
|
18 #include <string>
|
Chris@16
|
19 #include <boost/mpl/bool.hpp>
|
Chris@16
|
20 #include <boost/mpl/assert.hpp>
|
Chris@16
|
21 #include <boost/utility/enable_if.hpp>
|
Chris@16
|
22 #include <boost/type_traits/is_same.hpp>
|
Chris@16
|
23 #include <boost/iterator/transform_iterator.hpp>
|
Chris@16
|
24 #include <boost/xpressive/detail/utility/algorithm.hpp>
|
Chris@16
|
25
|
Chris@16
|
26 namespace boost { namespace xpressive { namespace detail
|
Chris@16
|
27 {
|
Chris@16
|
28
|
Chris@16
|
29 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
30 // char_cast
|
Chris@16
|
31 //
|
Chris@16
|
32 template<typename ToChar, typename FromChar, typename Traits>
|
Chris@16
|
33 inline ToChar
|
Chris@16
|
34 char_cast(FromChar from, Traits const &, typename enable_if<is_same<ToChar, FromChar> >::type * = 0)
|
Chris@16
|
35 {
|
Chris@16
|
36 return from;
|
Chris@16
|
37 }
|
Chris@16
|
38
|
Chris@16
|
39 template<typename ToChar, typename FromChar, typename Traits>
|
Chris@16
|
40 inline ToChar
|
Chris@16
|
41 char_cast(FromChar from, Traits const &tr, typename disable_if<is_same<ToChar, FromChar> >::type * = 0)
|
Chris@16
|
42 {
|
Chris@16
|
43 BOOST_MPL_ASSERT((is_same<FromChar, char>));
|
Chris@16
|
44 return tr.widen(from);
|
Chris@16
|
45 }
|
Chris@16
|
46
|
Chris@16
|
47 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
48 // widen_fun
|
Chris@16
|
49 //
|
Chris@16
|
50 template<typename Traits>
|
Chris@16
|
51 struct widen_fun
|
Chris@16
|
52 {
|
Chris@16
|
53 typedef typename Traits::char_type result_type;
|
Chris@16
|
54 explicit widen_fun(Traits const &tr)
|
Chris@16
|
55 : traits_(tr)
|
Chris@16
|
56 {}
|
Chris@16
|
57
|
Chris@16
|
58 result_type operator()(char ch) const
|
Chris@16
|
59 {
|
Chris@16
|
60 return this->traits_.widen(ch);
|
Chris@16
|
61 }
|
Chris@16
|
62
|
Chris@16
|
63 Traits const &traits_;
|
Chris@16
|
64 };
|
Chris@16
|
65
|
Chris@16
|
66 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
67 // string_cast_
|
Chris@16
|
68 //
|
Chris@16
|
69 template<
|
Chris@16
|
70 typename To
|
Chris@16
|
71 , typename From
|
Chris@16
|
72 , typename ToChar = typename detail::range_data<To>::type
|
Chris@16
|
73 , typename FromChar = typename detail::range_data<From>::type
|
Chris@16
|
74 >
|
Chris@16
|
75 struct string_cast_
|
Chris@16
|
76 {
|
Chris@16
|
77 BOOST_MPL_ASSERT((is_same<FromChar, char>));
|
Chris@16
|
78 typedef To const result_type;
|
Chris@16
|
79 template<typename Traits>
|
Chris@16
|
80 result_type operator()(From const &from, Traits const &tr) const
|
Chris@16
|
81 {
|
Chris@16
|
82 widen_fun<Traits> widen(tr);
|
Chris@16
|
83 To to(
|
Chris@16
|
84 boost::make_transform_iterator(detail::data_begin(from), widen)
|
Chris@16
|
85 , boost::make_transform_iterator(detail::data_end(from), widen)
|
Chris@16
|
86 );
|
Chris@16
|
87 return to;
|
Chris@16
|
88 }
|
Chris@16
|
89 };
|
Chris@16
|
90
|
Chris@16
|
91 template<typename To, typename From, typename Char>
|
Chris@16
|
92 struct string_cast_<To, From, Char, Char>
|
Chris@16
|
93 {
|
Chris@16
|
94 typedef To const result_type;
|
Chris@16
|
95 template<typename Traits>
|
Chris@16
|
96 result_type operator()(From const &from, Traits const &) const
|
Chris@16
|
97 {
|
Chris@16
|
98 To to(detail::data_begin(from), detail::data_end(from));
|
Chris@16
|
99 return to;
|
Chris@16
|
100 }
|
Chris@16
|
101 };
|
Chris@16
|
102
|
Chris@16
|
103 template<typename From, typename Char>
|
Chris@16
|
104 struct string_cast_<From, From, Char, Char>
|
Chris@16
|
105 {
|
Chris@16
|
106 typedef From const &result_type;
|
Chris@16
|
107 template<typename Traits>
|
Chris@16
|
108 result_type operator()(From const &from, Traits const &) const
|
Chris@16
|
109 {
|
Chris@16
|
110 return from;
|
Chris@16
|
111 }
|
Chris@16
|
112 };
|
Chris@16
|
113
|
Chris@16
|
114 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
115 // string_cast
|
Chris@16
|
116 //
|
Chris@16
|
117 template<typename To, typename From, typename Traits>
|
Chris@16
|
118 typename string_cast_<To, From>::result_type
|
Chris@16
|
119 string_cast(From const &from, Traits const &tr)
|
Chris@16
|
120 {
|
Chris@16
|
121 return string_cast_<To, From>()(from, tr);
|
Chris@16
|
122 }
|
Chris@16
|
123
|
Chris@16
|
124 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
125 // translate
|
Chris@16
|
126 //
|
Chris@16
|
127 template<typename Char, typename Traits>
|
Chris@16
|
128 inline Char translate(Char ch, Traits const &tr, mpl::false_) // case-sensitive
|
Chris@16
|
129 {
|
Chris@16
|
130 return tr.translate(ch);
|
Chris@16
|
131 }
|
Chris@16
|
132
|
Chris@16
|
133 template<typename Char, typename Traits>
|
Chris@16
|
134 inline Char translate(Char ch, Traits const &tr, mpl::true_) // case-insensitive
|
Chris@16
|
135 {
|
Chris@16
|
136 return tr.translate_nocase(ch);
|
Chris@16
|
137 }
|
Chris@16
|
138
|
Chris@16
|
139 }}} // namespace boost::xpressive::detail
|
Chris@16
|
140
|
Chris@101
|
141 #if defined(_MSC_VER)
|
Chris@16
|
142 # pragma warning(pop)
|
Chris@16
|
143 #endif
|
Chris@16
|
144
|
Chris@16
|
145 #endif
|