1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <locale>
11 
12 // template <class charT> class ctype_byname;
13 
14 // const charT* do_is(const charT* low, const charT* high, mask* vec) const;
15 
16 // REQUIRES: locale.en_US.UTF-8
17 
18 #include <locale>
19 #include <string>
20 #include <vector>
21 #include <cassert>
22 
23 #include <stdio.h>
24 
25 #include "platform_support.h" // locale name macros
26 
main()27 int main()
28 {
29     {
30         std::locale l(LOCALE_en_US_UTF_8);
31         {
32             typedef std::ctype<wchar_t> F;
33             const F& f = std::use_facet<F>(l);
34             const std::wstring in(L"\x00DA A\x07.a1");
35             std::vector<F::mask> m(in.size());
36             const wchar_t* h = f.is(in.data(), in.data() + in.size(), m.data());
37             assert(h == in.data() + in.size());
38 
39             // L'\x00DA'
40             assert(!(m[0] & F::space));
41             assert( (m[0] & F::print));
42             assert(!(m[0] & F::cntrl));
43             assert( (m[0] & F::upper));
44             assert(!(m[0] & F::lower));
45             assert( (m[0] & F::alpha));
46             assert(!(m[0] & F::digit));
47             assert(!(m[0] & F::punct));
48             assert(!(m[0] & F::xdigit));
49             assert(!(m[0] & F::blank));
50             assert( (m[0] & F::alnum));
51             assert( (m[0] & F::graph));
52 
53             // L' '
54             assert( (m[1] & F::space));
55             assert( (m[1] & F::print));
56             assert(!(m[1] & F::cntrl));
57             assert(!(m[1] & F::upper));
58             assert(!(m[1] & F::lower));
59             assert(!(m[1] & F::alpha));
60             assert(!(m[1] & F::digit));
61             assert(!(m[1] & F::punct));
62             assert(!(m[1] & F::xdigit));
63             assert( (m[1] & F::blank));
64             assert(!(m[1] & F::alnum));
65             assert(!(m[1] & F::graph));
66 
67             // L'A'
68             assert(!(m[2] & F::space));
69             assert( (m[2] & F::print));
70             assert(!(m[2] & F::cntrl));
71             assert( (m[2] & F::upper));
72             assert(!(m[2] & F::lower));
73             assert( (m[2] & F::alpha));
74             assert(!(m[2] & F::digit));
75             assert(!(m[2] & F::punct));
76             assert( (m[2] & F::xdigit));
77             assert(!(m[2] & F::blank));
78             assert( (m[2] & F::alnum));
79             assert( (m[2] & F::graph));
80 
81             // L'\x07'
82             assert(!(m[3] & F::space));
83             assert(!(m[3] & F::print));
84             assert( (m[3] & F::cntrl));
85             assert(!(m[3] & F::upper));
86             assert(!(m[3] & F::lower));
87             assert(!(m[3] & F::alpha));
88             assert(!(m[3] & F::digit));
89             assert(!(m[3] & F::punct));
90             assert(!(m[3] & F::xdigit));
91             assert(!(m[3] & F::blank));
92             assert(!(m[3] & F::alnum));
93             assert(!(m[3] & F::graph));
94 
95             // L'.'
96             assert(!(m[4] & F::space));
97             assert( (m[4] & F::print));
98             assert(!(m[4] & F::cntrl));
99             assert(!(m[4] & F::upper));
100             assert(!(m[4] & F::lower));
101             assert(!(m[4] & F::alpha));
102             assert(!(m[4] & F::digit));
103             assert( (m[4] & F::punct));
104             assert(!(m[4] & F::xdigit));
105             assert(!(m[4] & F::blank));
106             assert(!(m[4] & F::alnum));
107             assert( (m[4] & F::graph));
108 
109             // L'a'
110             assert(!(m[5] & F::space));
111             assert( (m[5] & F::print));
112             assert(!(m[5] & F::cntrl));
113             assert(!(m[5] & F::upper));
114             assert( (m[5] & F::lower));
115             assert( (m[5] & F::alpha));
116             assert(!(m[5] & F::digit));
117             assert(!(m[5] & F::punct));
118             assert( (m[5] & F::xdigit));
119             assert(!(m[5] & F::blank));
120             assert( (m[5] & F::alnum));
121             assert( (m[5] & F::graph));
122 
123             // L'1'
124             assert(!(m[6] & F::space));
125             assert( (m[6] & F::print));
126             assert(!(m[6] & F::cntrl));
127             assert(!(m[6] & F::upper));
128             assert(!(m[6] & F::lower));
129             assert(!(m[6] & F::alpha));
130             assert( (m[6] & F::digit));
131             assert(!(m[6] & F::punct));
132             assert( (m[6] & F::xdigit));
133             assert(!(m[6] & F::blank));
134             assert( (m[6] & F::alnum));
135             assert( (m[6] & F::graph));
136         }
137     }
138     {
139         std::locale l("C");
140         {
141             typedef std::ctype<wchar_t> F;
142             const F& f = std::use_facet<F>(l);
143             const std::wstring in(L"\x00DA A\x07.a1");
144             std::vector<F::mask> m(in.size());
145             const wchar_t* h = f.is(in.data(), in.data() + in.size(), m.data());
146             assert(h == in.data() + in.size());
147 
148             // L'\x00DA'
149             assert(!(m[0] & F::space));
150             assert(!(m[0] & F::print));
151             assert(!(m[0] & F::cntrl));
152             assert(!(m[0] & F::upper));
153             assert(!(m[0] & F::lower));
154             assert(!(m[0] & F::alpha));
155             assert(!(m[0] & F::digit));
156             assert(!(m[0] & F::punct));
157             assert(!(m[0] & F::xdigit));
158             assert(!(m[0] & F::blank));
159             assert(!(m[0] & F::alnum));
160             assert(!(m[0] & F::graph));
161 
162             // L' '
163             assert( (m[1] & F::space));
164             assert( (m[1] & F::print));
165             assert(!(m[1] & F::cntrl));
166             assert(!(m[1] & F::upper));
167             assert(!(m[1] & F::lower));
168             assert(!(m[1] & F::alpha));
169             assert(!(m[1] & F::digit));
170             assert(!(m[1] & F::punct));
171             assert(!(m[1] & F::xdigit));
172             assert( (m[1] & F::blank));
173             assert(!(m[1] & F::alnum));
174             assert(!(m[1] & F::graph));
175 
176             // L'A'
177             assert(!(m[2] & F::space));
178             assert( (m[2] & F::print));
179             assert(!(m[2] & F::cntrl));
180             assert( (m[2] & F::upper));
181             assert(!(m[2] & F::lower));
182             assert( (m[2] & F::alpha));
183             assert(!(m[2] & F::digit));
184             assert(!(m[2] & F::punct));
185             assert( (m[2] & F::xdigit));
186             assert(!(m[2] & F::blank));
187             assert( (m[2] & F::alnum));
188             assert( (m[2] & F::graph));
189 
190             // L'\x07'
191             assert(!(m[3] & F::space));
192             assert(!(m[3] & F::print));
193             assert( (m[3] & F::cntrl));
194             assert(!(m[3] & F::upper));
195             assert(!(m[3] & F::lower));
196             assert(!(m[3] & F::alpha));
197             assert(!(m[3] & F::digit));
198             assert(!(m[3] & F::punct));
199             assert(!(m[3] & F::xdigit));
200             assert(!(m[3] & F::blank));
201             assert(!(m[3] & F::alnum));
202             assert(!(m[3] & F::graph));
203 
204             // L'.'
205             assert(!(m[4] & F::space));
206             assert( (m[4] & F::print));
207             assert(!(m[4] & F::cntrl));
208             assert(!(m[4] & F::upper));
209             assert(!(m[4] & F::lower));
210             assert(!(m[4] & F::alpha));
211             assert(!(m[4] & F::digit));
212             assert( (m[4] & F::punct));
213             assert(!(m[4] & F::xdigit));
214             assert(!(m[4] & F::blank));
215             assert(!(m[4] & F::alnum));
216             assert( (m[4] & F::graph));
217 
218             // L'a'
219             assert(!(m[5] & F::space));
220             assert( (m[5] & F::print));
221             assert(!(m[5] & F::cntrl));
222             assert(!(m[5] & F::upper));
223             assert( (m[5] & F::lower));
224             assert( (m[5] & F::alpha));
225             assert(!(m[5] & F::digit));
226             assert(!(m[5] & F::punct));
227             assert( (m[5] & F::xdigit));
228             assert(!(m[5] & F::blank));
229             assert( (m[5] & F::alnum));
230             assert( (m[5] & F::graph));
231 
232             // L'1'
233             assert(!(m[6] & F::space));
234             assert( (m[6] & F::print));
235             assert(!(m[6] & F::cntrl));
236             assert(!(m[6] & F::upper));
237             assert(!(m[6] & F::lower));
238             assert(!(m[6] & F::alpha));
239             assert( (m[6] & F::digit));
240             assert(!(m[6] & F::punct));
241             assert( (m[6] & F::xdigit));
242             assert(!(m[6] & F::blank));
243             assert( (m[6] & F::alnum));
244             assert( (m[6] & F::graph));
245         }
246     }
247 }
248