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