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 // <codecvt>
11
12 // template <class Elem, unsigned long Maxcode = 0x10ffff,
13 // codecvt_mode Mode = (codecvt_mode)0>
14 // class codecvt_utf8_utf16
15 // : public codecvt<Elem, char, mbstate_t>
16 // {
17 // // unspecified
18 // };
19
20 // int length(stateT& state, const externT* from, const externT* from_end,
21 // size_t max) const;
22
23 #include <codecvt>
24 #include <cassert>
25
main()26 int main()
27 {
28 {
29 typedef std::codecvt_utf8_utf16<wchar_t> C;
30 C c;
31 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
32 std::mbstate_t m;
33 int r = c.length(m, n, n+4, 2);
34 assert(r == 4);
35
36 n[0] = char(0xE1);
37 n[1] = char(0x80);
38 n[2] = char(0x85);
39 r = c.length(m, n, n+3, 2);
40 assert(r == 3);
41
42 n[0] = char(0xD1);
43 n[1] = char(0x93);
44 r = c.length(m, n, n+2, 2);
45 assert(r == 2);
46
47 n[0] = char(0x56);
48 r = c.length(m, n, n+1, 2);
49 assert(r == 1);
50 }
51 {
52 typedef std::codecvt_utf8_utf16<wchar_t, 0x1000> C;
53 C c;
54 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
55 std::mbstate_t m;
56 int r = c.length(m, n, n+4, 2);
57 assert(r == 0);
58
59 n[0] = char(0xE1);
60 n[1] = char(0x80);
61 n[2] = char(0x85);
62 r = c.length(m, n, n+3, 2);
63 assert(r == 0);
64
65 n[0] = char(0xD1);
66 n[1] = char(0x93);
67 r = c.length(m, n, n+2, 2);
68 assert(r == 2);
69
70 n[0] = char(0x56);
71 r = c.length(m, n, n+1, 2);
72 assert(r == 1);
73 }
74 {
75 typedef std::codecvt_utf8_utf16<wchar_t, 0x10ffff, std::consume_header> C;
76 C c;
77 char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
78 std::mbstate_t m;
79 int r = c.length(m, n, n+7, 2);
80 assert(r == 7);
81
82 n[0] = char(0xE1);
83 n[1] = char(0x80);
84 n[2] = char(0x85);
85 r = c.length(m, n, n+3, 2);
86 assert(r == 3);
87
88 n[0] = char(0xD1);
89 n[1] = char(0x93);
90 r = c.length(m, n, n+2, 2);
91 assert(r == 2);
92
93 n[0] = char(0x56);
94 r = c.length(m, n, n+1, 2);
95 assert(r == 1);
96 }
97 {
98 typedef std::codecvt_utf8_utf16<char32_t> C;
99 C c;
100 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
101 std::mbstate_t m;
102 int r = c.length(m, n, n+4, 2);
103 assert(r == 4);
104
105 n[0] = char(0xE1);
106 n[1] = char(0x80);
107 n[2] = char(0x85);
108 r = c.length(m, n, n+3, 2);
109 assert(r == 3);
110
111 n[0] = char(0xD1);
112 n[1] = char(0x93);
113 r = c.length(m, n, n+2, 2);
114 assert(r == 2);
115
116 n[0] = char(0x56);
117 r = c.length(m, n, n+1, 2);
118 assert(r == 1);
119 }
120 {
121 typedef std::codecvt_utf8_utf16<char32_t, 0x1000> C;
122 C c;
123 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
124 std::mbstate_t m;
125 int r = c.length(m, n, n+4, 2);
126 assert(r == 0);
127
128 n[0] = char(0xE1);
129 n[1] = char(0x80);
130 n[2] = char(0x85);
131 r = c.length(m, n, n+3, 2);
132 assert(r == 0);
133
134 n[0] = char(0xD1);
135 n[1] = char(0x93);
136 r = c.length(m, n, n+2, 2);
137 assert(r == 2);
138
139 n[0] = char(0x56);
140 r = c.length(m, n, n+1, 2);
141 assert(r == 1);
142 }
143 {
144 typedef std::codecvt_utf8_utf16<char32_t, 0x10ffff, std::consume_header> C;
145 C c;
146 char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
147 std::mbstate_t m;
148 int r = c.length(m, n, n+7, 2);
149 assert(r == 7);
150
151 n[0] = char(0xE1);
152 n[1] = char(0x80);
153 n[2] = char(0x85);
154 r = c.length(m, n, n+3, 2);
155 assert(r == 3);
156
157 n[0] = char(0xD1);
158 n[1] = char(0x93);
159 r = c.length(m, n, n+2, 2);
160 assert(r == 2);
161
162 n[0] = char(0x56);
163 r = c.length(m, n, n+1, 2);
164 assert(r == 1);
165 }
166 {
167 typedef std::codecvt_utf8_utf16<char16_t> C;
168 C c;
169 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
170 std::mbstate_t m;
171 int r = c.length(m, n, n+4, 2);
172 assert(r == 4);
173
174 n[0] = char(0xE1);
175 n[1] = char(0x80);
176 n[2] = char(0x85);
177 r = c.length(m, n, n+3, 2);
178 assert(r == 3);
179
180 n[0] = char(0xD1);
181 n[1] = char(0x93);
182 r = c.length(m, n, n+2, 2);
183 assert(r == 2);
184
185 n[0] = char(0x56);
186 r = c.length(m, n, n+1, 2);
187 assert(r == 1);
188 }
189 {
190 typedef std::codecvt_utf8_utf16<char16_t, 0x1000> C;
191 C c;
192 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
193 std::mbstate_t m;
194 int r = c.length(m, n, n+4, 2);
195 assert(r == 0);
196
197 n[0] = char(0xE1);
198 n[1] = char(0x80);
199 n[2] = char(0x85);
200 r = c.length(m, n, n+3, 2);
201 assert(r == 0);
202
203 n[0] = char(0xD1);
204 n[1] = char(0x93);
205 r = c.length(m, n, n+2, 2);
206 assert(r == 2);
207
208 n[0] = char(0x56);
209 r = c.length(m, n, n+1, 2);
210 assert(r == 1);
211 }
212 {
213 typedef std::codecvt_utf8_utf16<char16_t, 0x10ffff, std::consume_header> C;
214 C c;
215 char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
216 std::mbstate_t m;
217 int r = c.length(m, n, n+7, 2);
218 assert(r == 7);
219
220 n[0] = char(0xE1);
221 n[1] = char(0x80);
222 n[2] = char(0x85);
223 r = c.length(m, n, n+3, 2);
224 assert(r == 3);
225
226 n[0] = char(0xD1);
227 n[1] = char(0x93);
228 r = c.length(m, n, n+2, 2);
229 assert(r == 2);
230
231 n[0] = char(0x56);
232 r = c.length(m, n, n+1, 2);
233 assert(r == 1);
234 }
235 }
236