//===----------------------------------------------------------------------===//
//
//                     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.
//
//===----------------------------------------------------------------------===//

// <locale>

// template <> class codecvt<char32_t, char, mbstate_t>
// template <> class codecvt<char16_t, char, mbstate_t>
// template <> class codecvt<char32_t, char16_t, mbstate_t>  // extension

// sanity check

#include <locale>
#include <codecvt>
#include <cassert>

#include <stdio.h>

int main()
{
    typedef std::codecvt<char32_t, char, std::mbstate_t> F32_8;
    typedef std::codecvt<char16_t, char, std::mbstate_t> F16_8;
    typedef std::codecvt_utf16<char32_t> F32_16;
    std::locale l = std::locale(std::locale::classic(), new F32_16);
    const F32_8& f32_8 = std::use_facet<F32_8>(std::locale::classic());
    const F32_16& f32_16 = std::use_facet<F32_16>(l);
    const F16_8& f16_8 = std::use_facet<F16_8>(std::locale::classic());
    std::mbstate_t mbs = {0};
    F32_8::intern_type* c32p;
    F16_8::intern_type* c16p;
    F32_8::extern_type* c8p;
    const F32_8::intern_type* c_c32p;
    const F16_8::intern_type* c_c16p;
    const F32_8::extern_type* c_c8p;
    F32_8::intern_type c32;
    F16_8::intern_type c16[2];
    char c16c[4];
    char* c16cp;
    F32_8::extern_type c8[4];
    for (F32_8::intern_type c32x = 0; c32x < 0x110003; ++c32x)
    {
        if ((0xD800 <= c32x && c32x < 0xE000) || c32x >= 0x110000)
        {
            assert(f32_16.out(mbs, &c32x, &c32x+1, c_c32p, c16c+0, c16c+4, c16cp) == F32_8::error);
            assert(f32_8.out(mbs, &c32x, &c32x+1, c_c32p, c8, c8+4, c8p) == F32_8::error);
        }
        else
        {
            assert(f32_16.out(mbs, &c32x, &c32x+1, c_c32p, c16c, c16c+4, c16cp) == F32_8::ok);
            assert(c_c32p-&c32x == 1);
            if (c32x < 0x10000)
                assert(c16cp-c16c == 2);
            else
                assert(c16cp-c16c == 4);
            for (int i = 0; i < (c16cp - c16c) / 2; ++i)
                c16[i] = (unsigned char)c16c[2*i] << 8 | (unsigned char)c16c[2*i+1];
            c_c16p = c16 + (c16cp - c16c) / 2;
            assert(f16_8.out(mbs, c16, c_c16p, c_c16p, c8, c8+4, c8p) == F32_8::ok);
            if (c32x < 0x10000)
                assert(c_c16p-c16 == 1);
            else
                assert(c_c16p-c16 == 2);
            if (c32x < 0x80)
                assert(c8p-c8 == 1);
            else if (c32x < 0x800)
                assert(c8p-c8 == 2);
            else if (c32x < 0x10000)
                assert(c8p-c8 == 3);
            else
                assert(c8p-c8 == 4);
            c_c8p = c8p;
            assert(f32_8.in(mbs, c8, c_c8p, c_c8p, &c32, &c32+1, c32p) == F32_8::ok);
            if (c32x < 0x80)
                assert(c_c8p-c8 == 1);
            else if (c32x < 0x800)
                assert(c_c8p-c8 == 2);
            else if (c32x < 0x10000)
                assert(c_c8p-c8 == 3);
            else
                assert(c_c8p-c8 == 4);
            assert(c32p-&c32 == 1);
            assert(c32 == c32x);
            assert(f32_8.out(mbs, &c32x, &c32x+1, c_c32p, c8, c8+4, c8p) == F32_8::ok);
            assert(c_c32p-&c32x == 1);
            if (c32x < 0x80)
                assert(c8p-c8 == 1);
            else if (c32x < 0x800)
                assert(c8p-c8 == 2);
            else if (c32x < 0x10000)
                assert(c8p-c8 == 3);
            else
                assert(c8p-c8 == 4);
            c_c8p = c8p;
            assert(f16_8.in(mbs, c8, c_c8p, c_c8p, c16, c16+2, c16p) == F32_8::ok);
            if (c32x < 0x80)
                assert(c_c8p-c8 == 1);
            else if (c32x < 0x800)
                assert(c_c8p-c8 == 2);
            else if (c32x < 0x10000)
                assert(c_c8p-c8 == 3);
            else
                assert(c_c8p-c8 == 4);
            if (c32x < 0x10000)
                assert(c16p-c16 == 1);
            else
                assert(c16p-c16 == 2);
            for (int i = 0; i < c16p-c16; ++i)
            {
                c16c[2*i] = static_cast<char>(c16[i] >> 8);
                c16c[2*i+1] = static_cast<char>(c16[i]);
            }
            const char* c_c16cp = c16c + (c16p-c16)*2;
            assert(f32_16.in(mbs, c16c, c_c16cp, c_c16cp, &c32, &c32+1, c32p) == F32_8::ok);
            if (c32x < 0x10000)
                assert(c_c16cp-c16c == 2);
            else
                assert(c_c16cp-c16c == 4);
            assert(c32p-&c32 == 1);
            assert(c32 == c32x);
        }
    }
}
