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