codecvt_utf8_length.pass.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
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
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
26int main()
27{
28    {
29        typedef std::codecvt_utf8<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, 1);
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, 3);
45        assert(r == 2);
46
47        n[0] = char(0x56);
48        r = c.length(m, n, n+1, 3);
49        assert(r == 1);
50    }
51    {
52        typedef std::codecvt_utf8<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, 1);
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, 3);
68        assert(r == 2);
69
70        n[0] = char(0x56);
71        r = c.length(m, n, n+1, 3);
72        assert(r == 1);
73    }
74    {
75        typedef std::codecvt_utf8<wchar_t, 0xFFFFFFFF, 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, 1);
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(0xEF);
89        n[1] = char(0xBB);
90        n[2] = char(0xBF);
91        n[3] = char(0xD1);
92        n[4] = char(0x93);
93        r = c.length(m, n, n+5, 3);
94        assert(r == 5);
95
96        n[0] = char(0x56);
97        r = c.length(m, n, n+1, 3);
98        assert(r == 1);
99    }
100    {
101        typedef std::codecvt_utf8<char32_t> C;
102        C c;
103        char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
104        std::mbstate_t m;
105        int r = c.length(m, n, n+4, 1);
106        assert(r == 4);
107
108        n[0] = char(0xE1);
109        n[1] = char(0x80);
110        n[2] = char(0x85);
111        r = c.length(m, n, n+3, 2);
112        assert(r == 3);
113
114        n[0] = char(0xD1);
115        n[1] = char(0x93);
116        r = c.length(m, n, n+2, 3);
117        assert(r == 2);
118
119        n[0] = char(0x56);
120        r = c.length(m, n, n+1, 3);
121        assert(r == 1);
122    }
123    {
124        typedef std::codecvt_utf8<char32_t, 0x1000> C;
125        C c;
126        char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
127        std::mbstate_t m;
128        int r = c.length(m, n, n+4, 1);
129        assert(r == 0);
130
131        n[0] = char(0xE1);
132        n[1] = char(0x80);
133        n[2] = char(0x85);
134        r = c.length(m, n, n+3, 2);
135        assert(r == 0);
136
137        n[0] = char(0xD1);
138        n[1] = char(0x93);
139        r = c.length(m, n, n+2, 3);
140        assert(r == 2);
141
142        n[0] = char(0x56);
143        r = c.length(m, n, n+1, 3);
144        assert(r == 1);
145    }
146    {
147        typedef std::codecvt_utf8<char32_t, 0xFFFFFFFF, std::consume_header> C;
148        C c;
149        char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
150        std::mbstate_t m;
151        int r = c.length(m, n, n+7, 1);
152        assert(r == 7);
153
154        n[0] = char(0xE1);
155        n[1] = char(0x80);
156        n[2] = char(0x85);
157        r = c.length(m, n, n+3, 2);
158        assert(r == 3);
159
160        n[0] = char(0xEF);
161        n[1] = char(0xBB);
162        n[2] = char(0xBF);
163        n[3] = char(0xD1);
164        n[4] = char(0x93);
165        r = c.length(m, n, n+5, 3);
166        assert(r == 5);
167
168        n[0] = char(0x56);
169        r = c.length(m, n, n+1, 3);
170        assert(r == 1);
171    }
172    {
173        typedef std::codecvt_utf8<char16_t> C;
174        C c;
175        char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
176        std::mbstate_t m;
177        int r = c.length(m, n, n+4, 1);
178        assert(r == 0);
179
180        n[0] = char(0xE1);
181        n[1] = char(0x80);
182        n[2] = char(0x85);
183        r = c.length(m, n, n+3, 2);
184        assert(r == 3);
185
186        n[0] = char(0xD1);
187        n[1] = char(0x93);
188        r = c.length(m, n, n+2, 3);
189        assert(r == 2);
190
191        n[0] = char(0x56);
192        r = c.length(m, n, n+1, 3);
193        assert(r == 1);
194    }
195    {
196        typedef std::codecvt_utf8<char16_t, 0x1000> C;
197        C c;
198        char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
199        std::mbstate_t m;
200        int r = c.length(m, n, n+4, 1);
201        assert(r == 0);
202
203        n[0] = char(0xE1);
204        n[1] = char(0x80);
205        n[2] = char(0x85);
206        r = c.length(m, n, n+3, 2);
207        assert(r == 0);
208
209        n[0] = char(0xD1);
210        n[1] = char(0x93);
211        r = c.length(m, n, n+2, 3);
212        assert(r == 2);
213
214        n[0] = char(0x56);
215        r = c.length(m, n, n+1, 3);
216        assert(r == 1);
217    }
218    {
219        typedef std::codecvt_utf8<char16_t, 0xFFFFFFFF, std::consume_header> C;
220        C c;
221        char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
222        std::mbstate_t m;
223        int r = c.length(m, n, n+7, 1);
224        assert(r == 3);
225
226        n[0] = char(0xE1);
227        n[1] = char(0x80);
228        n[2] = char(0x85);
229        r = c.length(m, n, n+3, 2);
230        assert(r == 3);
231
232        n[0] = char(0xEF);
233        n[1] = char(0xBB);
234        n[2] = char(0xBF);
235        n[3] = char(0xD1);
236        n[4] = char(0x93);
237        r = c.length(m, n, n+5, 3);
238        assert(r == 5);
239
240        n[0] = char(0x56);
241        r = c.length(m, n, n+1, 3);
242        assert(r == 1);
243    }
244}
245