blob: 2505582c261376d7c62ab94beee341d9387b51e8 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001//===----------------------------------------------------------------------===//
2//
Howard Hinnantf5256e12010-05-11 21:36:01 +00003// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10// <locale>
11
12// template <> class codecvt<char32_t, char, mbstate_t>
13// template <> class codecvt<char16_t, char, mbstate_t>
14// template <> class codecvt<char32_t, char16_t, mbstate_t> // extension
15
16// sanity check
17
18#include <locale>
Howard Hinnant87d1a8a2010-05-30 21:39:41 +000019#include <codecvt>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000020#include <cassert>
21
22#include <stdio.h>
23
24int main()
25{
26 typedef std::codecvt<char32_t, char, std::mbstate_t> F32_8;
27 typedef std::codecvt<char16_t, char, std::mbstate_t> F16_8;
Howard Hinnant87d1a8a2010-05-30 21:39:41 +000028 typedef std::codecvt_utf16<char32_t> F32_16;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000029 std::locale l = std::locale(std::locale::classic(), new F32_16);
Howard Hinnant87d1a8a2010-05-30 21:39:41 +000030 const F32_8& f32_8 = std::use_facet<F32_8>(std::locale::classic());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000031 const F32_16& f32_16 = std::use_facet<F32_16>(l);
Howard Hinnant87d1a8a2010-05-30 21:39:41 +000032 const F16_8& f16_8 = std::use_facet<F16_8>(std::locale::classic());
Dan Albert1d4a1ed2016-05-25 22:36:09 -070033 std::mbstate_t mbs = {0};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000034 F32_8::intern_type* c32p;
35 F16_8::intern_type* c16p;
36 F32_8::extern_type* c8p;
37 const F32_8::intern_type* c_c32p;
38 const F16_8::intern_type* c_c16p;
39 const F32_8::extern_type* c_c8p;
40 F32_8::intern_type c32;
41 F16_8::intern_type c16[2];
Howard Hinnant87d1a8a2010-05-30 21:39:41 +000042 char c16c[4];
43 char* c16cp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000044 F32_8::extern_type c8[4];
45 for (F32_8::intern_type c32x = 0; c32x < 0x110003; ++c32x)
46 {
Howard Hinnanta5a0ba82011-05-14 14:53:12 +000047 if ((0xD800 <= c32x && c32x < 0xE000) || c32x >= 0x110000)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000048 {
Howard Hinnant87d1a8a2010-05-30 21:39:41 +000049 assert(f32_16.out(mbs, &c32x, &c32x+1, c_c32p, c16c+0, c16c+4, c16cp) == F32_8::error);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000050 assert(f32_8.out(mbs, &c32x, &c32x+1, c_c32p, c8, c8+4, c8p) == F32_8::error);
51 }
52 else
53 {
Howard Hinnant87d1a8a2010-05-30 21:39:41 +000054 assert(f32_16.out(mbs, &c32x, &c32x+1, c_c32p, c16c, c16c+4, c16cp) == F32_8::ok);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000055 assert(c_c32p-&c32x == 1);
56 if (c32x < 0x10000)
Howard Hinnant87d1a8a2010-05-30 21:39:41 +000057 assert(c16cp-c16c == 2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000058 else
Howard Hinnant87d1a8a2010-05-30 21:39:41 +000059 assert(c16cp-c16c == 4);
60 for (int i = 0; i < (c16cp - c16c) / 2; ++i)
61 c16[i] = (unsigned char)c16c[2*i] << 8 | (unsigned char)c16c[2*i+1];
62 c_c16p = c16 + (c16cp - c16c) / 2;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000063 assert(f16_8.out(mbs, c16, c_c16p, c_c16p, c8, c8+4, c8p) == F32_8::ok);
64 if (c32x < 0x10000)
65 assert(c_c16p-c16 == 1);
66 else
67 assert(c_c16p-c16 == 2);
68 if (c32x < 0x80)
69 assert(c8p-c8 == 1);
70 else if (c32x < 0x800)
71 assert(c8p-c8 == 2);
72 else if (c32x < 0x10000)
73 assert(c8p-c8 == 3);
74 else
75 assert(c8p-c8 == 4);
76 c_c8p = c8p;
77 assert(f32_8.in(mbs, c8, c_c8p, c_c8p, &c32, &c32+1, c32p) == F32_8::ok);
78 if (c32x < 0x80)
79 assert(c_c8p-c8 == 1);
80 else if (c32x < 0x800)
81 assert(c_c8p-c8 == 2);
82 else if (c32x < 0x10000)
83 assert(c_c8p-c8 == 3);
84 else
85 assert(c_c8p-c8 == 4);
86 assert(c32p-&c32 == 1);
87 assert(c32 == c32x);
88 assert(f32_8.out(mbs, &c32x, &c32x+1, c_c32p, c8, c8+4, c8p) == F32_8::ok);
89 assert(c_c32p-&c32x == 1);
90 if (c32x < 0x80)
91 assert(c8p-c8 == 1);
92 else if (c32x < 0x800)
93 assert(c8p-c8 == 2);
94 else if (c32x < 0x10000)
95 assert(c8p-c8 == 3);
96 else
97 assert(c8p-c8 == 4);
98 c_c8p = c8p;
99 assert(f16_8.in(mbs, c8, c_c8p, c_c8p, c16, c16+2, c16p) == F32_8::ok);
100 if (c32x < 0x80)
101 assert(c_c8p-c8 == 1);
102 else if (c32x < 0x800)
103 assert(c_c8p-c8 == 2);
104 else if (c32x < 0x10000)
105 assert(c_c8p-c8 == 3);
106 else
107 assert(c_c8p-c8 == 4);
108 if (c32x < 0x10000)
109 assert(c16p-c16 == 1);
110 else
111 assert(c16p-c16 == 2);
Howard Hinnant87d1a8a2010-05-30 21:39:41 +0000112 for (int i = 0; i < c16p-c16; ++i)
113 {
114 c16c[2*i] = static_cast<char>(c16[i] >> 8);
115 c16c[2*i+1] = static_cast<char>(c16[i]);
116 }
117 const char* c_c16cp = c16c + (c16p-c16)*2;
118 assert(f32_16.in(mbs, c16c, c_c16cp, c_c16cp, &c32, &c32+1, c32p) == F32_8::ok);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000119 if (c32x < 0x10000)
Howard Hinnant87d1a8a2010-05-30 21:39:41 +0000120 assert(c_c16cp-c16c == 2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000121 else
Howard Hinnant87d1a8a2010-05-30 21:39:41 +0000122 assert(c_c16cp-c16c == 4);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000123 assert(c32p-&c32 == 1);
124 assert(c32 == c32x);
125 }
126 }
127}