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 ctype<char>;
13 
14 // const char* is(const char* low, const char* high, mask* vec) const;
15 
16 #include <locale>
17 #include <string>
18 #include <vector>
19 #include <cassert>
20 
21 #include <stdio.h>
22 
23 int main()
24 {
25     std::locale l = std::locale::classic();
26     {
27         typedef std::ctype<char> F;
28         const F& f = std::use_facet<F>(l);
29         const std::string in(" A\x07.a1");
30         std::vector<F::mask> m(in.size());
31         const char* h = f.is(in.data(), in.data() + in.size(), m.data());
32         assert(h == in.data() + in.size());
33 
34         // ' '
35         assert( (m[0] & F::space));
36         assert( (m[0] & F::print));
37         assert(!(m[0] & F::cntrl));
38         assert(!(m[0] & F::upper));
39         assert(!(m[0] & F::lower));
40         assert(!(m[0] & F::alpha));
41         assert(!(m[0] & F::digit));
42         assert(!(m[0] & F::punct));
43         assert(!(m[0] & F::xdigit));
44         assert( (m[0] & F::blank));
45         assert(!(m[0] & F::alnum));
46         assert(!(m[0] & F::graph));
47 
48         // 'A'
49         assert(!(m[1] & F::space));
50         assert( (m[1] & F::print));
51         assert(!(m[1] & F::cntrl));
52         assert( (m[1] & F::upper));
53         assert(!(m[1] & F::lower));
54         assert( (m[1] & F::alpha));
55         assert(!(m[1] & F::digit));
56         assert(!(m[1] & F::punct));
57         assert( (m[1] & F::xdigit));
58         assert(!(m[1] & F::blank));
59         assert( (m[1] & F::alnum));
60         assert( (m[1] & F::graph));
61 
62         // '\x07'
63         assert(!(m[2] & F::space));
64         assert(!(m[2] & F::print));
65         assert( (m[2] & F::cntrl));
66         assert(!(m[2] & F::upper));
67         assert(!(m[2] & F::lower));
68         assert(!(m[2] & F::alpha));
69         assert(!(m[2] & F::digit));
70         assert(!(m[2] & F::punct));
71         assert(!(m[2] & F::xdigit));
72         assert(!(m[2] & F::blank));
73         assert(!(m[2] & F::alnum));
74         assert(!(m[2] & F::graph));
75 
76         // '.'
77         assert(!(m[3] & F::space));
78         assert( (m[3] & F::print));
79         assert(!(m[3] & F::cntrl));
80         assert(!(m[3] & F::upper));
81         assert(!(m[3] & F::lower));
82         assert(!(m[3] & F::alpha));
83         assert(!(m[3] & F::digit));
84         assert( (m[3] & F::punct));
85         assert(!(m[3] & F::xdigit));
86         assert(!(m[3] & F::blank));
87         assert(!(m[3] & F::alnum));
88         assert( (m[3] & F::graph));
89 
90         // 'a'
91         assert(!(m[4] & F::space));
92         assert( (m[4] & F::print));
93         assert(!(m[4] & F::cntrl));
94         assert(!(m[4] & F::upper));
95         assert( (m[4] & F::lower));
96         assert( (m[4] & F::alpha));
97         assert(!(m[4] & F::digit));
98         assert(!(m[4] & F::punct));
99         assert( (m[4] & F::xdigit));
100         assert(!(m[4] & F::blank));
101         assert( (m[4] & F::alnum));
102         assert( (m[4] & F::graph));
103 
104         // '1'
105         assert(!(m[5] & F::space));
106         assert( (m[5] & F::print));
107         assert(!(m[5] & F::cntrl));
108         assert(!(m[5] & F::upper));
109         assert(!(m[5] & F::lower));
110         assert(!(m[5] & F::alpha));
111         assert( (m[5] & F::digit));
112         assert(!(m[5] & F::punct));
113         assert( (m[5] & F::xdigit));
114         assert(!(m[5] & F::blank));
115         assert( (m[5] & F::alnum));
116         assert( (m[5] & F::graph));
117     }
118 }
119