15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <codecvt>
105a83710eSEric Fiselier 
11*3ee9a50aSNikolas Klauser // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
12*3ee9a50aSNikolas Klauser 
135a83710eSEric Fiselier // template <class Elem, unsigned long Maxcode = 0x10ffff,
145a83710eSEric Fiselier //           codecvt_mode Mode = (codecvt_mode)0>
155a83710eSEric Fiselier // class codecvt_utf8_utf16
165a83710eSEric Fiselier //     : public codecvt<Elem, char, mbstate_t>
175a83710eSEric Fiselier // {
185a83710eSEric Fiselier //     // unspecified
195a83710eSEric Fiselier // };
205a83710eSEric Fiselier 
215a83710eSEric Fiselier // int length(stateT& state, const externT* from, const externT* from_end,
225a83710eSEric Fiselier //            size_t max) const;
235a83710eSEric Fiselier 
245a83710eSEric Fiselier #include <codecvt>
255a83710eSEric Fiselier #include <cassert>
265a83710eSEric Fiselier 
277fc6a556SMarshall Clow #include "test_macros.h"
287fc6a556SMarshall Clow 
main(int,char **)292df59c50SJF Bastien int main(int, char**)
305a83710eSEric Fiselier {
31f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
325a83710eSEric Fiselier     {
335a83710eSEric Fiselier         typedef std::codecvt_utf8_utf16<wchar_t> C;
345a83710eSEric Fiselier         C c;
355a83710eSEric Fiselier         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
365a83710eSEric Fiselier         std::mbstate_t m;
375a83710eSEric Fiselier         int r = c.length(m, n, n+4, 2);
385a83710eSEric Fiselier         assert(r == 4);
395a83710eSEric Fiselier 
405a83710eSEric Fiselier         n[0] = char(0xE1);
415a83710eSEric Fiselier         n[1] = char(0x80);
425a83710eSEric Fiselier         n[2] = char(0x85);
435a83710eSEric Fiselier         r = c.length(m, n, n+3, 2);
445a83710eSEric Fiselier         assert(r == 3);
455a83710eSEric Fiselier 
465a83710eSEric Fiselier         n[0] = char(0xD1);
475a83710eSEric Fiselier         n[1] = char(0x93);
485a83710eSEric Fiselier         r = c.length(m, n, n+2, 2);
495a83710eSEric Fiselier         assert(r == 2);
505a83710eSEric Fiselier 
515a83710eSEric Fiselier         n[0] = char(0x56);
525a83710eSEric Fiselier         r = c.length(m, n, n+1, 2);
535a83710eSEric Fiselier         assert(r == 1);
545a83710eSEric Fiselier     }
555a83710eSEric Fiselier     {
565a83710eSEric Fiselier         typedef std::codecvt_utf8_utf16<wchar_t, 0x1000> C;
575a83710eSEric Fiselier         C c;
585a83710eSEric Fiselier         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
595a83710eSEric Fiselier         std::mbstate_t m;
605a83710eSEric Fiselier         int r = c.length(m, n, n+4, 2);
615a83710eSEric Fiselier         assert(r == 0);
625a83710eSEric Fiselier 
635a83710eSEric Fiselier         n[0] = char(0xE1);
645a83710eSEric Fiselier         n[1] = char(0x80);
655a83710eSEric Fiselier         n[2] = char(0x85);
665a83710eSEric Fiselier         r = c.length(m, n, n+3, 2);
675a83710eSEric Fiselier         assert(r == 0);
685a83710eSEric Fiselier 
695a83710eSEric Fiselier         n[0] = char(0xD1);
705a83710eSEric Fiselier         n[1] = char(0x93);
715a83710eSEric Fiselier         r = c.length(m, n, n+2, 2);
725a83710eSEric Fiselier         assert(r == 2);
735a83710eSEric Fiselier 
745a83710eSEric Fiselier         n[0] = char(0x56);
755a83710eSEric Fiselier         r = c.length(m, n, n+1, 2);
765a83710eSEric Fiselier         assert(r == 1);
775a83710eSEric Fiselier     }
785a83710eSEric Fiselier     {
795a83710eSEric Fiselier         typedef std::codecvt_utf8_utf16<wchar_t, 0x10ffff, std::consume_header> C;
805a83710eSEric Fiselier         C c;
815a83710eSEric Fiselier         char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
825a83710eSEric Fiselier         std::mbstate_t m;
835a83710eSEric Fiselier         int r = c.length(m, n, n+7, 2);
845a83710eSEric Fiselier         assert(r == 7);
855a83710eSEric Fiselier 
865a83710eSEric Fiselier         n[0] = char(0xE1);
875a83710eSEric Fiselier         n[1] = char(0x80);
885a83710eSEric Fiselier         n[2] = char(0x85);
895a83710eSEric Fiselier         r = c.length(m, n, n+3, 2);
905a83710eSEric Fiselier         assert(r == 3);
915a83710eSEric Fiselier 
925a83710eSEric Fiselier         n[0] = char(0xD1);
935a83710eSEric Fiselier         n[1] = char(0x93);
945a83710eSEric Fiselier         r = c.length(m, n, n+2, 2);
955a83710eSEric Fiselier         assert(r == 2);
965a83710eSEric Fiselier 
975a83710eSEric Fiselier         n[0] = char(0x56);
985a83710eSEric Fiselier         r = c.length(m, n, n+1, 2);
995a83710eSEric Fiselier         assert(r == 1);
1005a83710eSEric Fiselier     }
101f4c1258dSLouis Dionne #endif // TEST_HAS_NO_WIDE_CHARACTERS
1025a83710eSEric Fiselier     {
1035a83710eSEric Fiselier         typedef std::codecvt_utf8_utf16<char32_t> C;
1045a83710eSEric Fiselier         C c;
1055a83710eSEric Fiselier         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
1065a83710eSEric Fiselier         std::mbstate_t m;
1075a83710eSEric Fiselier         int r = c.length(m, n, n+4, 2);
1085a83710eSEric Fiselier         assert(r == 4);
1095a83710eSEric Fiselier 
1105a83710eSEric Fiselier         n[0] = char(0xE1);
1115a83710eSEric Fiselier         n[1] = char(0x80);
1125a83710eSEric Fiselier         n[2] = char(0x85);
1135a83710eSEric Fiselier         r = c.length(m, n, n+3, 2);
1145a83710eSEric Fiselier         assert(r == 3);
1155a83710eSEric Fiselier 
1165a83710eSEric Fiselier         n[0] = char(0xD1);
1175a83710eSEric Fiselier         n[1] = char(0x93);
1185a83710eSEric Fiselier         r = c.length(m, n, n+2, 2);
1195a83710eSEric Fiselier         assert(r == 2);
1205a83710eSEric Fiselier 
1215a83710eSEric Fiselier         n[0] = char(0x56);
1225a83710eSEric Fiselier         r = c.length(m, n, n+1, 2);
1235a83710eSEric Fiselier         assert(r == 1);
1245a83710eSEric Fiselier     }
1255a83710eSEric Fiselier     {
1265a83710eSEric Fiselier         typedef std::codecvt_utf8_utf16<char32_t, 0x1000> C;
1275a83710eSEric Fiselier         C c;
1285a83710eSEric Fiselier         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
1295a83710eSEric Fiselier         std::mbstate_t m;
1305a83710eSEric Fiselier         int r = c.length(m, n, n+4, 2);
1315a83710eSEric Fiselier         assert(r == 0);
1325a83710eSEric Fiselier 
1335a83710eSEric Fiselier         n[0] = char(0xE1);
1345a83710eSEric Fiselier         n[1] = char(0x80);
1355a83710eSEric Fiselier         n[2] = char(0x85);
1365a83710eSEric Fiselier         r = c.length(m, n, n+3, 2);
1375a83710eSEric Fiselier         assert(r == 0);
1385a83710eSEric Fiselier 
1395a83710eSEric Fiselier         n[0] = char(0xD1);
1405a83710eSEric Fiselier         n[1] = char(0x93);
1415a83710eSEric Fiselier         r = c.length(m, n, n+2, 2);
1425a83710eSEric Fiselier         assert(r == 2);
1435a83710eSEric Fiselier 
1445a83710eSEric Fiselier         n[0] = char(0x56);
1455a83710eSEric Fiselier         r = c.length(m, n, n+1, 2);
1465a83710eSEric Fiselier         assert(r == 1);
1475a83710eSEric Fiselier     }
1485a83710eSEric Fiselier     {
1495a83710eSEric Fiselier         typedef std::codecvt_utf8_utf16<char32_t, 0x10ffff, std::consume_header> C;
1505a83710eSEric Fiselier         C c;
1515a83710eSEric Fiselier         char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
1525a83710eSEric Fiselier         std::mbstate_t m;
1535a83710eSEric Fiselier         int r = c.length(m, n, n+7, 2);
1545a83710eSEric Fiselier         assert(r == 7);
1555a83710eSEric Fiselier 
1565a83710eSEric Fiselier         n[0] = char(0xE1);
1575a83710eSEric Fiselier         n[1] = char(0x80);
1585a83710eSEric Fiselier         n[2] = char(0x85);
1595a83710eSEric Fiselier         r = c.length(m, n, n+3, 2);
1605a83710eSEric Fiselier         assert(r == 3);
1615a83710eSEric Fiselier 
1625a83710eSEric Fiselier         n[0] = char(0xD1);
1635a83710eSEric Fiselier         n[1] = char(0x93);
1645a83710eSEric Fiselier         r = c.length(m, n, n+2, 2);
1655a83710eSEric Fiselier         assert(r == 2);
1665a83710eSEric Fiselier 
1675a83710eSEric Fiselier         n[0] = char(0x56);
1685a83710eSEric Fiselier         r = c.length(m, n, n+1, 2);
1695a83710eSEric Fiselier         assert(r == 1);
1705a83710eSEric Fiselier     }
1715a83710eSEric Fiselier     {
1725a83710eSEric Fiselier         typedef std::codecvt_utf8_utf16<char16_t> C;
1735a83710eSEric Fiselier         C c;
1745a83710eSEric Fiselier         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
1755a83710eSEric Fiselier         std::mbstate_t m;
1765a83710eSEric Fiselier         int r = c.length(m, n, n+4, 2);
1775a83710eSEric Fiselier         assert(r == 4);
1785a83710eSEric Fiselier 
1795a83710eSEric Fiselier         n[0] = char(0xE1);
1805a83710eSEric Fiselier         n[1] = char(0x80);
1815a83710eSEric Fiselier         n[2] = char(0x85);
1825a83710eSEric Fiselier         r = c.length(m, n, n+3, 2);
1835a83710eSEric Fiselier         assert(r == 3);
1845a83710eSEric Fiselier 
1855a83710eSEric Fiselier         n[0] = char(0xD1);
1865a83710eSEric Fiselier         n[1] = char(0x93);
1875a83710eSEric Fiselier         r = c.length(m, n, n+2, 2);
1885a83710eSEric Fiselier         assert(r == 2);
1895a83710eSEric Fiselier 
1905a83710eSEric Fiselier         n[0] = char(0x56);
1915a83710eSEric Fiselier         r = c.length(m, n, n+1, 2);
1925a83710eSEric Fiselier         assert(r == 1);
1935a83710eSEric Fiselier     }
1945a83710eSEric Fiselier     {
1955a83710eSEric Fiselier         typedef std::codecvt_utf8_utf16<char16_t, 0x1000> C;
1965a83710eSEric Fiselier         C c;
1975a83710eSEric Fiselier         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
1985a83710eSEric Fiselier         std::mbstate_t m;
1995a83710eSEric Fiselier         int r = c.length(m, n, n+4, 2);
2005a83710eSEric Fiselier         assert(r == 0);
2015a83710eSEric Fiselier 
2025a83710eSEric Fiselier         n[0] = char(0xE1);
2035a83710eSEric Fiselier         n[1] = char(0x80);
2045a83710eSEric Fiselier         n[2] = char(0x85);
2055a83710eSEric Fiselier         r = c.length(m, n, n+3, 2);
2065a83710eSEric Fiselier         assert(r == 0);
2075a83710eSEric Fiselier 
2085a83710eSEric Fiselier         n[0] = char(0xD1);
2095a83710eSEric Fiselier         n[1] = char(0x93);
2105a83710eSEric Fiselier         r = c.length(m, n, n+2, 2);
2115a83710eSEric Fiselier         assert(r == 2);
2125a83710eSEric Fiselier 
2135a83710eSEric Fiselier         n[0] = char(0x56);
2145a83710eSEric Fiselier         r = c.length(m, n, n+1, 2);
2155a83710eSEric Fiselier         assert(r == 1);
2165a83710eSEric Fiselier     }
2175a83710eSEric Fiselier     {
2185a83710eSEric Fiselier         typedef std::codecvt_utf8_utf16<char16_t, 0x10ffff, std::consume_header> C;
2195a83710eSEric Fiselier         C c;
2205a83710eSEric Fiselier         char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
2215a83710eSEric Fiselier         std::mbstate_t m;
2225a83710eSEric Fiselier         int r = c.length(m, n, n+7, 2);
2235a83710eSEric Fiselier         assert(r == 7);
2245a83710eSEric Fiselier 
2255a83710eSEric Fiselier         n[0] = char(0xE1);
2265a83710eSEric Fiselier         n[1] = char(0x80);
2275a83710eSEric Fiselier         n[2] = char(0x85);
2285a83710eSEric Fiselier         r = c.length(m, n, n+3, 2);
2295a83710eSEric Fiselier         assert(r == 3);
2305a83710eSEric Fiselier 
2315a83710eSEric Fiselier         n[0] = char(0xD1);
2325a83710eSEric Fiselier         n[1] = char(0x93);
2335a83710eSEric Fiselier         r = c.length(m, n, n+2, 2);
2345a83710eSEric Fiselier         assert(r == 2);
2355a83710eSEric Fiselier 
2365a83710eSEric Fiselier         n[0] = char(0x56);
2375a83710eSEric Fiselier         r = c.length(m, n, n+1, 2);
2385a83710eSEric Fiselier         assert(r == 1);
2395a83710eSEric Fiselier     }
2402df59c50SJF Bastien 
2412df59c50SJF Bastien   return 0;
2425a83710eSEric Fiselier }
243