1b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//===----------------------------------------------------------------------===//
2b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//
3b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//                     The LLVM Compiler Infrastructure
4b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//
5b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// This file is dual licensed under the MIT and the University of Illinois Open
6b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// Source Licenses. See LICENSE.TXT for details.
7b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//
8b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//===----------------------------------------------------------------------===//
9b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
10b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// <codecvt>
11b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
12b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// template <class Elem, unsigned long Maxcode = 0x10ffff,
13b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//           codecvt_mode Mode = (codecvt_mode)0>
14b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// class codecvt_utf8
15b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//     : public codecvt<Elem, char, mbstate_t>
16b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// {
17b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//     // unspecified
18b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// };
19b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
20b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// result
21b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//     in(stateT& state,
22b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//        const externT* from, const externT* from_end, const externT*& from_next,
23b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//        internT* to, internT* to_end, internT*& to_next) const;
24b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
25b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner#include <codecvt>
26b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner#include <cassert>
27b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
28b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerint main()
29b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
30b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
31b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        typedef std::codecvt_utf8<wchar_t> C;
32b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        C c;
33b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        wchar_t w = 0;
34b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
35b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        wchar_t* wp = nullptr;
36b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::mbstate_t m;
37b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char* np = nullptr;
38b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
39b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
40b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
41b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+4);
42b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x40003);
43b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
44b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0xE1);
45b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[1] = char(0x80);
46b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[2] = char(0x85);
47b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+3, np, &w, &w+1, wp);
48b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
49b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
50b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+3);
51b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x1005);
52b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
53b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0xD1);
54b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[1] = char(0x93);
55b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+2, np, &w, &w+1, wp);
56b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
57b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
58b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+2);
59b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x453);
60b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
61b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        w = 0x56;
62b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0x56);
63b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+1, np, &w, &w+1, wp);
64b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
65b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
66b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+1);
67b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x56);
68b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
69b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
70b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        typedef std::codecvt_utf8<wchar_t, 0x1000> C;
71b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        C c;
72b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        wchar_t w = 0;
73b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
74b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        wchar_t* wp = nullptr;
75b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::mbstate_t m;
76b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char* np = nullptr;
77b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
78b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::error);
79b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w);
80b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n);
81b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0);
82b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
83b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0xE1);
84b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[1] = char(0x80);
85b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[2] = char(0x85);
86b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+3, np, &w, &w+1, wp);
87b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::error);
88b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w);
89b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n);
90b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0);
91b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
92b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0xD1);
93b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[1] = char(0x93);
94b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+2, np, &w, &w+1, wp);
95b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
96b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
97b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+2);
98b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x453);
99b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
100b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        w = 0x56;
101b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0x56);
102b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+1, np, &w, &w+1, wp);
103b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
104b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
105b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+1);
106b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x56);
107b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
108b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
109b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        typedef std::codecvt_utf8<wchar_t, 0xFFFFFFFF, std::consume_header> C;
110b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        C c;
111b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        wchar_t w = 0;
112b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
113b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        wchar_t* wp = nullptr;
114b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::mbstate_t m;
115b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char* np = nullptr;
116b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::codecvt_base::result r = c.in(m, n, n+7, np, &w, &w+1, wp);
117b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
118b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
119b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+7);
120b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x40003);
121b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
122b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0xE1);
123b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[1] = char(0x80);
124b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[2] = char(0x85);
125b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+3, np, &w, &w+1, wp);
126b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
127b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
128b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+3);
129b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x1005);
130b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
131b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0xEF);
132b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[1] = char(0xBB);
133b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[2] = char(0xBF);
134b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[3] = char(0xD1);
135b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[4] = char(0x93);
136b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+5, np, &w, &w+1, wp);
137b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
138b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
139b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+5);
140b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x453);
141b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
142b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        w = 0x56;
143b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0x56);
144b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+1, np, &w, &w+1, wp);
145b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
146b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
147b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+1);
148b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x56);
149b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
150b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
151b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        typedef std::codecvt_utf8<char32_t> C;
152b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        C c;
153b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char32_t w = 0;
154b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
155b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char32_t* wp = nullptr;
156b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::mbstate_t m;
157b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char* np = nullptr;
158b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
159b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
160b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
161b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+4);
162b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x40003);
163b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
164b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0xE1);
165b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[1] = char(0x80);
166b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[2] = char(0x85);
167b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+3, np, &w, &w+1, wp);
168b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
169b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
170b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+3);
171b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x1005);
172b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
173b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0xD1);
174b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[1] = char(0x93);
175b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+2, np, &w, &w+1, wp);
176b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
177b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
178b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+2);
179b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x453);
180b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
181b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        w = 0x56;
182b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0x56);
183b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+1, np, &w, &w+1, wp);
184b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
185b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
186b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+1);
187b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x56);
188b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
189b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
190b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        typedef std::codecvt_utf8<char32_t, 0x1000> C;
191b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        C c;
192b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char32_t w = 0;
193b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
194b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char32_t* wp = nullptr;
195b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::mbstate_t m;
196b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char* np = nullptr;
197b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
198b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::error);
199b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w);
200b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n);
201b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0);
202b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
203b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0xE1);
204b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[1] = char(0x80);
205b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[2] = char(0x85);
206b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+3, np, &w, &w+1, wp);
207b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::error);
208b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w);
209b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n);
210b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0);
211b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
212b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0xD1);
213b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[1] = char(0x93);
214b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+2, np, &w, &w+1, wp);
215b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
216b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
217b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+2);
218b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x453);
219b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
220b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        w = 0x56;
221b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0x56);
222b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+1, np, &w, &w+1, wp);
223b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
224b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
225b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+1);
226b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x56);
227b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
228b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
229b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        typedef std::codecvt_utf8<char32_t, 0xFFFFFFFF, std::consume_header> C;
230b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        C c;
231b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char32_t w = 0;
232b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
233b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char32_t* wp = nullptr;
234b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::mbstate_t m;
235b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char* np = nullptr;
236b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::codecvt_base::result r = c.in(m, n, n+7, np, &w, &w+1, wp);
237b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
238b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
239b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+7);
240b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x40003);
241b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
242b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0xE1);
243b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[1] = char(0x80);
244b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[2] = char(0x85);
245b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+3, np, &w, &w+1, wp);
246b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
247b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
248b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+3);
249b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x1005);
250b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
251b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0xEF);
252b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[1] = char(0xBB);
253b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[2] = char(0xBF);
254b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[3] = char(0xD1);
255b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[4] = char(0x93);
256b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+5, np, &w, &w+1, wp);
257b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
258b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
259b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+5);
260b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x453);
261b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
262b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        w = 0x56;
263b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0x56);
264b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+1, np, &w, &w+1, wp);
265b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
266b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
267b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+1);
268b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x56);
269b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
270b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
271b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        typedef std::codecvt_utf8<char16_t> C;
272b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        C c;
273b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char16_t w = 0;
274b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char n[3] = {char(0xE1), char(0x80), char(0x85)};
275b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char16_t* wp = nullptr;
276b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::mbstate_t m;
277b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char* np = nullptr;
278b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::codecvt_base::result r = c.in(m, n, n+3, np, &w, &w+1, wp);
279b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
280b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
281b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+3);
282b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x1005);
283b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
284b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0xD1);
285b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[1] = char(0x93);
286b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+2, np, &w, &w+1, wp);
287b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
288b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
289b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+2);
290b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x453);
291b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
292b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        w = 0x56;
293b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0x56);
294b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+1, np, &w, &w+1, wp);
295b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
296b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
297b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+1);
298b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x56);
299b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
300b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
301b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        typedef std::codecvt_utf8<char16_t, 0x1000> C;
302b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        C c;
303b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char16_t w = 0;
304b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char n[3] = {char(0xE1), char(0x80), char(0x85)};
305b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char16_t* wp = nullptr;
306b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::mbstate_t m;
307b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char* np = nullptr;
308b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::codecvt_base::result r = c.in(m, n, n+3, np, &w, &w+1, wp);
309b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::error);
310b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w);
311b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n);
312b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0);
313b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
314b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0xD1);
315b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[1] = char(0x93);
316b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+2, np, &w, &w+1, wp);
317b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
318b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
319b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+2);
320b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x453);
321b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
322b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        w = 0x56;
323b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0x56);
324b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+1, np, &w, &w+1, wp);
325b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
326b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
327b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+1);
328b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x56);
329b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
330b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
331b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        typedef std::codecvt_utf8<char16_t, 0xFFFFFFFF, std::consume_header> C;
332b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        C c;
333b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char16_t w = 0;
334b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char n[6] = {char(0xEF), char(0xBB), char(0xBF), char(0xE1), char(0x80), char(0x85)};
335b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        char16_t* wp = nullptr;
336b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::mbstate_t m;
337b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char* np = nullptr;
338b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
339b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
340b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
341b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+6);
342b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x1005);
343b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
344b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0xD1);
345b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[1] = char(0x93);
346b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+2, np, &w, &w+1, wp);
347b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
348b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
349b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+2);
350b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x453);
351b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
352b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        w = 0x56;
353b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        n[0] = char(0x56);
354b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        r = c.in(m, n, n+1, np, &w, &w+1, wp);
355b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(r == std::codecvt_base::ok);
356b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(wp == &w+1);
357b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(np == n+1);
358b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(w == 0x56);
359b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
360b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner}
361