]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/include/boost/spirit/home/support/char_encoding/standard_wide.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / spirit / include / boost / spirit / home / support / char_encoding / standard_wide.hpp
1 /*=============================================================================
2 Copyright (c) 2001-2011 Hartmut Kaiser
3 Copyright (c) 2001-2011 Joel de Guzman
4
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 =============================================================================*/
8 #if !defined(BOOST_SPIRIT_STANDARD_WIDE_NOVEMBER_10_2006_0913AM)
9 #define BOOST_SPIRIT_STANDARD_WIDE_NOVEMBER_10_2006_0913AM
10
11 #if defined(_MSC_VER)
12 #pragma once
13 #endif
14
15 #include <cwctype>
16 #include <string>
17
18 #include <boost/cstdint.hpp>
19 #include <boost/spirit/home/support/assert_msg.hpp>
20
21 namespace boost { namespace spirit { namespace traits
22 {
23 template <std::size_t N>
24 struct wchar_t_size
25 {
26 BOOST_SPIRIT_ASSERT_MSG(N == 1 || N == 2 || N == 4,
27 not_supported_size_of_wchar_t, ());
28 };
29
30 template <> struct wchar_t_size<1> { enum { mask = 0xff }; };
31 template <> struct wchar_t_size<2> { enum { mask = 0xffff }; };
32 template <> struct wchar_t_size<4> { enum { mask = 0xffffffff }; };
33
34 }}}
35
36 namespace boost { namespace spirit { namespace char_encoding
37 {
38 ///////////////////////////////////////////////////////////////////////////
39 // Test characters for specified conditions (using std wchar_t functions)
40 ///////////////////////////////////////////////////////////////////////////
41
42 struct standard_wide
43 {
44 typedef wchar_t char_type;
45
46 template <typename Char>
47 static typename std::char_traits<Char>::int_type
48 to_int_type(Char ch)
49 {
50 return std::char_traits<Char>::to_int_type(ch);
51 }
52
53 template <typename Char>
54 static Char
55 to_char_type(typename std::char_traits<Char>::int_type ch)
56 {
57 return std::char_traits<Char>::to_char_type(ch);
58 }
59
60 static bool
61 ischar(int ch)
62 {
63 // we have to watch out for sign extensions (casting is there to
64 // silence certain compilers complaining about signed/unsigned
65 // mismatch)
66 return (
67 std::size_t(0) ==
68 std::size_t(ch & ~traits::wchar_t_size<sizeof(wchar_t)>::mask) ||
69 std::size_t(~0) ==
70 std::size_t(ch | traits::wchar_t_size<sizeof(wchar_t)>::mask)
71 ) ? true : false; // any wchar_t, but no other bits set
72 }
73
74 static bool
75 isalnum(wchar_t ch)
76 {
77 using namespace std;
78 return iswalnum(to_int_type(ch)) ? true : false;
79 }
80
81 static bool
82 isalpha(wchar_t ch)
83 {
84 using namespace std;
85 return iswalpha(to_int_type(ch)) ? true : false;
86 }
87
88 static bool
89 iscntrl(wchar_t ch)
90 {
91 using namespace std;
92 return iswcntrl(to_int_type(ch)) ? true : false;
93 }
94
95 static bool
96 isdigit(wchar_t ch)
97 {
98 using namespace std;
99 return iswdigit(to_int_type(ch)) ? true : false;
100 }
101
102 static bool
103 isgraph(wchar_t ch)
104 {
105 using namespace std;
106 return iswgraph(to_int_type(ch)) ? true : false;
107 }
108
109 static bool
110 islower(wchar_t ch)
111 {
112 using namespace std;
113 return iswlower(to_int_type(ch)) ? true : false;
114 }
115
116 static bool
117 isprint(wchar_t ch)
118 {
119 using namespace std;
120 return iswprint(to_int_type(ch)) ? true : false;
121 }
122
123 static bool
124 ispunct(wchar_t ch)
125 {
126 using namespace std;
127 return iswpunct(to_int_type(ch)) ? true : false;
128 }
129
130 static bool
131 isspace(wchar_t ch)
132 {
133 using namespace std;
134 return iswspace(to_int_type(ch)) ? true : false;
135 }
136
137 static bool
138 isupper(wchar_t ch)
139 {
140 using namespace std;
141 return iswupper(to_int_type(ch)) ? true : false;
142 }
143
144 static bool
145 isxdigit(wchar_t ch)
146 {
147 using namespace std;
148 return iswxdigit(to_int_type(ch)) ? true : false;
149 }
150
151 static bool
152 isblank BOOST_PREVENT_MACRO_SUBSTITUTION (wchar_t ch)
153 {
154 return (ch == L' ' || ch == L'\t');
155 }
156
157 ///////////////////////////////////////////////////////////////////////
158 // Simple character conversions
159 ///////////////////////////////////////////////////////////////////////
160
161 static wchar_t
162 tolower(wchar_t ch)
163 {
164 using namespace std;
165 return isupper(ch) ?
166 to_char_type<wchar_t>(towlower(to_int_type(ch))) : ch;
167 }
168
169 static wchar_t
170 toupper(wchar_t ch)
171 {
172 using namespace std;
173 return islower(ch) ?
174 to_char_type<wchar_t>(towupper(to_int_type(ch))) : ch;
175 }
176
177 static ::boost::uint32_t
178 toucs4(int ch)
179 {
180 return ch;
181 }
182 };
183 }}}
184
185 #endif
186