| //===----------------------------------------------------------------------===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is dual licensed under the MIT and the University of Illinois Open | 
 | // Source Licenses. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | // <codecvt> | 
 |  | 
 | // template <class Elem, unsigned long Maxcode = 0x10ffff, | 
 | //           codecvt_mode Mode = (codecvt_mode)0> | 
 | // class codecvt_utf16 | 
 | //     : public codecvt<Elem, char, mbstate_t> | 
 | // { | 
 | //     // unspecified | 
 | // }; | 
 |  | 
 | // result | 
 | // out(stateT& state, | 
 | //     const internT* from, const internT* from_end, const internT*& from_next, | 
 | //     externT* to, externT* to_end, externT*& to_next) const; | 
 |  | 
 | #include <codecvt> | 
 | #include <cassert> | 
 |  | 
 | int main() | 
 | { | 
 |     { | 
 |         typedef std::codecvt_utf16<wchar_t> C; | 
 |         C c; | 
 |         wchar_t w = 0x40003; | 
 |         char n[4] = {0}; | 
 |         const wchar_t* wp = nullptr; | 
 |         std::mbstate_t m; | 
 |         char* np = nullptr; | 
 |         std::codecvt_base::result r = c.out(m, &w, &w+1, wp, n, n+4, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+4); | 
 |         assert(n[0] == char(0xD8)); | 
 |         assert(n[1] == char(0xC0)); | 
 |         assert(n[2] == char(0xDC)); | 
 |         assert(n[3] == char(0x03)); | 
 |  | 
 |         w = 0x1005; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+4, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+2); | 
 |         assert(n[0] == char(0x10)); | 
 |         assert(n[1] == char(0x05)); | 
 |         assert(n[2] == char(0xDC)); | 
 |         assert(n[3] == char(0x03)); | 
 |  | 
 |         w = 0x453; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+4, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+2); | 
 |         assert(n[0] == char(0x04)); | 
 |         assert(n[1] == char(0x53)); | 
 |         assert(n[2] == char(0xDC)); | 
 |         assert(n[3] == char(0x03)); | 
 |  | 
 |         w = 0x56; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+4, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+2); | 
 |         assert(n[0] == char(0x00)); | 
 |         assert(n[1] == char(0x56)); | 
 |         assert(n[2] == char(0xDC)); | 
 |         assert(n[3] == char(0x03)); | 
 |     } | 
 |     { | 
 |         typedef std::codecvt_utf16<wchar_t, 0x1000> C; | 
 |         C c; | 
 |         wchar_t w = 0x40003; | 
 |         char n[4] = {0}; | 
 |         const wchar_t* wp = nullptr; | 
 |         std::mbstate_t m; | 
 |         char* np = nullptr; | 
 |         std::codecvt_base::result r = c.out(m, &w, &w+1, wp, n, n+4, np); | 
 |         assert(r == std::codecvt_base::error); | 
 |         assert(wp == &w); | 
 |         assert(np == n); | 
 |         assert(n[0] == char(0)); | 
 |         assert(n[1] == char(0)); | 
 |         assert(n[2] == char(0)); | 
 |         assert(n[3] == char(0)); | 
 |  | 
 |         w = 0x1005; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+4, np); | 
 |         assert(r == std::codecvt_base::error); | 
 |         assert(wp == &w); | 
 |         assert(np == n); | 
 |         assert(n[0] == char(0)); | 
 |         assert(n[1] == char(0)); | 
 |         assert(n[2] == char(0)); | 
 |         assert(n[3] == char(0)); | 
 |  | 
 |         w = 0x453; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+4, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+2); | 
 |         assert(n[0] == char(0x04)); | 
 |         assert(n[1] == char(0x53)); | 
 |         assert(n[2] == char(0)); | 
 |         assert(n[3] == char(0)); | 
 |  | 
 |         w = 0x56; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+4, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+2); | 
 |         assert(n[0] == char(0x00)); | 
 |         assert(n[1] == char(0x56)); | 
 |         assert(n[2] == char(0)); | 
 |         assert(n[3] == char(0)); | 
 |     } | 
 |     { | 
 |         typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::generate_header> C; | 
 |         C c; | 
 |         wchar_t w = 0x40003; | 
 |         char n[6] = {0}; | 
 |         const wchar_t* wp = nullptr; | 
 |         std::mbstate_t m; | 
 |         char* np = nullptr; | 
 |         std::codecvt_base::result r = c.out(m, &w, &w+1, wp, n, n+6, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+6); | 
 |         assert(n[0] == char(0xFE)); | 
 |         assert(n[1] == char(0xFF)); | 
 |         assert(n[2] == char(0xD8)); | 
 |         assert(n[3] == char(0xC0)); | 
 |         assert(n[4] == char(0xDC)); | 
 |         assert(n[5] == char(0x03)); | 
 |  | 
 |         w = 0x1005; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+6, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+4); | 
 |         assert(n[0] == char(0xFE)); | 
 |         assert(n[1] == char(0xFF)); | 
 |         assert(n[2] == char(0x10)); | 
 |         assert(n[3] == char(0x05)); | 
 |         assert(n[4] == char(0xDC)); | 
 |         assert(n[5] == char(0x03)); | 
 |  | 
 |         w = 0x453; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+6, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+4); | 
 |         assert(n[0] == char(0xFE)); | 
 |         assert(n[1] == char(0xFF)); | 
 |         assert(n[2] == char(0x04)); | 
 |         assert(n[3] == char(0x53)); | 
 |         assert(n[4] == char(0xDC)); | 
 |         assert(n[5] == char(0x03)); | 
 |  | 
 |         w = 0x56; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+6, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+4); | 
 |         assert(n[0] == char(0xFE)); | 
 |         assert(n[1] == char(0xFF)); | 
 |         assert(n[2] == char(0x00)); | 
 |         assert(n[3] == char(0x56)); | 
 |         assert(n[4] == char(0xDC)); | 
 |         assert(n[5] == char(0x03)); | 
 |     } | 
 |  | 
 |     { | 
 |         typedef std::codecvt_utf16<wchar_t, 0x10FFFF, std::little_endian> C; | 
 |         C c; | 
 |         wchar_t w = 0x40003; | 
 |         char n[4] = {0}; | 
 |         const wchar_t* wp = nullptr; | 
 |         std::mbstate_t m; | 
 |         char* np = nullptr; | 
 |         std::codecvt_base::result r = c.out(m, &w, &w+1, wp, n, n+4, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+4); | 
 |         assert(n[1] == char(0xD8)); | 
 |         assert(n[0] == char(0xC0)); | 
 |         assert(n[3] == char(0xDC)); | 
 |         assert(n[2] == char(0x03)); | 
 |  | 
 |         w = 0x1005; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+4, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+2); | 
 |         assert(n[1] == char(0x10)); | 
 |         assert(n[0] == char(0x05)); | 
 |         assert(n[3] == char(0xDC)); | 
 |         assert(n[2] == char(0x03)); | 
 |  | 
 |         w = 0x453; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+4, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+2); | 
 |         assert(n[1] == char(0x04)); | 
 |         assert(n[0] == char(0x53)); | 
 |         assert(n[3] == char(0xDC)); | 
 |         assert(n[2] == char(0x03)); | 
 |  | 
 |         w = 0x56; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+4, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+2); | 
 |         assert(n[1] == char(0x00)); | 
 |         assert(n[0] == char(0x56)); | 
 |         assert(n[3] == char(0xDC)); | 
 |         assert(n[2] == char(0x03)); | 
 |     } | 
 |     { | 
 |         typedef std::codecvt_utf16<wchar_t, 0x1000, std::little_endian> C; | 
 |         C c; | 
 |         wchar_t w = 0x40003; | 
 |         char n[4] = {0}; | 
 |         const wchar_t* wp = nullptr; | 
 |         std::mbstate_t m; | 
 |         char* np = nullptr; | 
 |         std::codecvt_base::result r = c.out(m, &w, &w+1, wp, n, n+4, np); | 
 |         assert(r == std::codecvt_base::error); | 
 |         assert(wp == &w); | 
 |         assert(np == n); | 
 |         assert(n[1] == char(0)); | 
 |         assert(n[0] == char(0)); | 
 |         assert(n[3] == char(0)); | 
 |         assert(n[2] == char(0)); | 
 |  | 
 |         w = 0x1005; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+4, np); | 
 |         assert(r == std::codecvt_base::error); | 
 |         assert(wp == &w); | 
 |         assert(np == n); | 
 |         assert(n[1] == char(0)); | 
 |         assert(n[0] == char(0)); | 
 |         assert(n[3] == char(0)); | 
 |         assert(n[2] == char(0)); | 
 |  | 
 |         w = 0x453; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+4, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+2); | 
 |         assert(n[1] == char(0x04)); | 
 |         assert(n[0] == char(0x53)); | 
 |         assert(n[3] == char(0)); | 
 |         assert(n[2] == char(0)); | 
 |  | 
 |         w = 0x56; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+4, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+2); | 
 |         assert(n[1] == char(0x00)); | 
 |         assert(n[0] == char(0x56)); | 
 |         assert(n[3] == char(0)); | 
 |         assert(n[2] == char(0)); | 
 |     } | 
 |     { | 
 |         typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::codecvt_mode( | 
 |                                                          std::generate_header | | 
 |                                                          std::little_endian)> C; | 
 |         C c; | 
 |         wchar_t w = 0x40003; | 
 |         char n[6] = {0}; | 
 |         const wchar_t* wp = nullptr; | 
 |         std::mbstate_t m; | 
 |         char* np = nullptr; | 
 |         std::codecvt_base::result r = c.out(m, &w, &w+1, wp, n, n+6, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+6); | 
 |         assert(n[1] == char(0xFE)); | 
 |         assert(n[0] == char(0xFF)); | 
 |         assert(n[3] == char(0xD8)); | 
 |         assert(n[2] == char(0xC0)); | 
 |         assert(n[5] == char(0xDC)); | 
 |         assert(n[4] == char(0x03)); | 
 |  | 
 |         w = 0x1005; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+6, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+4); | 
 |         assert(n[1] == char(0xFE)); | 
 |         assert(n[0] == char(0xFF)); | 
 |         assert(n[3] == char(0x10)); | 
 |         assert(n[2] == char(0x05)); | 
 |         assert(n[5] == char(0xDC)); | 
 |         assert(n[4] == char(0x03)); | 
 |  | 
 |         w = 0x453; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+6, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+4); | 
 |         assert(n[1] == char(0xFE)); | 
 |         assert(n[0] == char(0xFF)); | 
 |         assert(n[3] == char(0x04)); | 
 |         assert(n[2] == char(0x53)); | 
 |         assert(n[5] == char(0xDC)); | 
 |         assert(n[4] == char(0x03)); | 
 |  | 
 |         w = 0x56; | 
 |         r = c.out(m, &w, &w+1, wp, n, n+6, np); | 
 |         assert(r == std::codecvt_base::ok); | 
 |         assert(wp == &w+1); | 
 |         assert(np == n+4); | 
 |         assert(n[1] == char(0xFE)); | 
 |         assert(n[0] == char(0xFF)); | 
 |         assert(n[3] == char(0x00)); | 
 |         assert(n[2] == char(0x56)); | 
 |         assert(n[5] == char(0xDC)); | 
 |         assert(n[4] == char(0x03)); | 
 |     } | 
 | } |