// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef _LIBCPP_CODECVT
#define _LIBCPP_CODECVT

/*
    codecvt synopsis

namespace std
{

enum codecvt_mode
{
    consume_header = 4,
    generate_header = 2,
    little_endian = 1
};

template <class Elem, unsigned long Maxcode = 0x10ffff,
          codecvt_mode Mode = (codecvt_mode)0>
class codecvt_utf8
    : public codecvt<Elem, char, mbstate_t>
{
    explicit codecvt_utf8(size_t refs = 0);
    ~codecvt_utf8();
};

template <class Elem, unsigned long Maxcode = 0x10ffff,
          codecvt_mode Mode = (codecvt_mode)0>
class codecvt_utf16
    : public codecvt<Elem, char, mbstate_t>
{
    explicit codecvt_utf16(size_t refs = 0);
    ~codecvt_utf16();
};

template <class Elem, unsigned long Maxcode = 0x10ffff,
          codecvt_mode Mode = (codecvt_mode)0>
class codecvt_utf8_utf16
    : public codecvt<Elem, char, mbstate_t>
{
    explicit codecvt_utf8_utf16(size_t refs = 0);
    ~codecvt_utf8_utf16();
};

}  // std

*/

#include <__assert> // all public C++ headers provide the assertion handler
#include <__config>
#include <__locale>
#include <version>

#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#  pragma GCC system_header
#endif

_LIBCPP_BEGIN_NAMESPACE_STD

enum _LIBCPP_DEPRECATED_IN_CXX17 codecvt_mode
{
    consume_header = 4,
    generate_header = 2,
    little_endian = 1
};

// codecvt_utf8

template <class _Elem> class __codecvt_utf8;

#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
template <>
class _LIBCPP_TYPE_VIS __codecvt_utf8<wchar_t>
    : public codecvt<wchar_t, char, mbstate_t>
{
    unsigned long _Maxcode_;
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
    codecvt_mode _Mode_;
_LIBCPP_SUPPRESS_DEPRECATED_POP
public:
    typedef wchar_t   intern_type;
    typedef char      extern_type;
    typedef mbstate_t state_type;

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
    _LIBCPP_INLINE_VISIBILITY
    explicit __codecvt_utf8(size_t __refs, unsigned long __maxcode,
                            codecvt_mode __mode)
        : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(__maxcode),
          _Mode_(__mode) {}
_LIBCPP_SUPPRESS_DEPRECATED_POP
protected:
    virtual result
        do_out(state_type& __st,
               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual result
        do_in(state_type& __st,
              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    virtual result
        do_unshift(state_type& __st,
                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual int do_encoding() const _NOEXCEPT;
    virtual bool do_always_noconv() const _NOEXCEPT;
    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
                          size_t __mx) const;
    virtual int do_max_length() const _NOEXCEPT;
};
#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
template <>
class _LIBCPP_TYPE_VIS __codecvt_utf8<char16_t>
    : public codecvt<char16_t, char, mbstate_t>
{
    unsigned long _Maxcode_;
    codecvt_mode _Mode_;
public:
    typedef char16_t  intern_type;
    typedef char      extern_type;
    typedef mbstate_t state_type;

    _LIBCPP_INLINE_VISIBILITY
    explicit __codecvt_utf8(size_t __refs, unsigned long __maxcode,
                            codecvt_mode __mode)
        : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(__maxcode),
          _Mode_(__mode) {}
_LIBCPP_SUPPRESS_DEPRECATED_POP

protected:
    virtual result
        do_out(state_type& __st,
               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual result
        do_in(state_type& __st,
              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    virtual result
        do_unshift(state_type& __st,
                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual int do_encoding() const _NOEXCEPT;
    virtual bool do_always_noconv() const _NOEXCEPT;
    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
                          size_t __mx) const;
    virtual int do_max_length() const _NOEXCEPT;
};

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
template <>
class _LIBCPP_TYPE_VIS __codecvt_utf8<char32_t>
    : public codecvt<char32_t, char, mbstate_t>
{
    unsigned long _Maxcode_;
    codecvt_mode _Mode_;
public:
    typedef char32_t  intern_type;
    typedef char      extern_type;
    typedef mbstate_t state_type;

    _LIBCPP_INLINE_VISIBILITY
    explicit __codecvt_utf8(size_t __refs, unsigned long __maxcode,
                            codecvt_mode __mode)
        : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(__maxcode),
          _Mode_(__mode) {}
_LIBCPP_SUPPRESS_DEPRECATED_POP

protected:
    virtual result
        do_out(state_type& __st,
               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual result
        do_in(state_type& __st,
              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    virtual result
        do_unshift(state_type& __st,
                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual int do_encoding() const _NOEXCEPT;
    virtual bool do_always_noconv() const _NOEXCEPT;
    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
                          size_t __mx) const;
    virtual int do_max_length() const _NOEXCEPT;
};

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
template <class _Elem, unsigned long _Maxcode = 0x10ffff,
          codecvt_mode _Mode = (codecvt_mode)0>
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 codecvt_utf8
    : public __codecvt_utf8<_Elem>
{
public:
    _LIBCPP_INLINE_VISIBILITY
    explicit codecvt_utf8(size_t __refs = 0)
        : __codecvt_utf8<_Elem>(__refs, _Maxcode, _Mode) {}

    _LIBCPP_INLINE_VISIBILITY
    ~codecvt_utf8() {}
};
_LIBCPP_SUPPRESS_DEPRECATED_POP

// codecvt_utf16

template <class _Elem, bool _LittleEndian> class __codecvt_utf16;

#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
template <>
class _LIBCPP_TYPE_VIS __codecvt_utf16<wchar_t, false>
    : public codecvt<wchar_t, char, mbstate_t>
{
    unsigned long _Maxcode_;
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
    codecvt_mode _Mode_;
_LIBCPP_SUPPRESS_DEPRECATED_POP
public:
    typedef wchar_t   intern_type;
    typedef char      extern_type;
    typedef mbstate_t state_type;

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
    _LIBCPP_INLINE_VISIBILITY
    explicit __codecvt_utf16(size_t __refs, unsigned long __maxcode,
                            codecvt_mode __mode)
        : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(__maxcode),
          _Mode_(__mode) {}
_LIBCPP_SUPPRESS_DEPRECATED_POP
protected:
    virtual result
        do_out(state_type& __st,
               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual result
        do_in(state_type& __st,
              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    virtual result
        do_unshift(state_type& __st,
                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual int do_encoding() const _NOEXCEPT;
    virtual bool do_always_noconv() const _NOEXCEPT;
    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
                          size_t __mx) const;
    virtual int do_max_length() const _NOEXCEPT;
};

template <>
class _LIBCPP_TYPE_VIS __codecvt_utf16<wchar_t, true>
    : public codecvt<wchar_t, char, mbstate_t>
{
    unsigned long _Maxcode_;
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
    codecvt_mode _Mode_;
_LIBCPP_SUPPRESS_DEPRECATED_POP
public:
    typedef wchar_t   intern_type;
    typedef char      extern_type;
    typedef mbstate_t state_type;

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
    _LIBCPP_INLINE_VISIBILITY
    explicit __codecvt_utf16(size_t __refs, unsigned long __maxcode,
                            codecvt_mode __mode)
        : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(__maxcode),
          _Mode_(__mode) {}
_LIBCPP_SUPPRESS_DEPRECATED_POP
protected:
    virtual result
        do_out(state_type& __st,
               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual result
        do_in(state_type& __st,
              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    virtual result
        do_unshift(state_type& __st,
                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual int do_encoding() const _NOEXCEPT;
    virtual bool do_always_noconv() const _NOEXCEPT;
    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
                          size_t __mx) const;
    virtual int do_max_length() const _NOEXCEPT;
};
#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
template <>
class _LIBCPP_TYPE_VIS __codecvt_utf16<char16_t, false>
    : public codecvt<char16_t, char, mbstate_t>
{
    unsigned long _Maxcode_;
    codecvt_mode _Mode_;
public:
    typedef char16_t  intern_type;
    typedef char      extern_type;
    typedef mbstate_t state_type;

    _LIBCPP_INLINE_VISIBILITY
    explicit __codecvt_utf16(size_t __refs, unsigned long __maxcode,
                            codecvt_mode __mode)
        : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(__maxcode),
          _Mode_(__mode) {}
_LIBCPP_SUPPRESS_DEPRECATED_POP

protected:
    virtual result
        do_out(state_type& __st,
               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual result
        do_in(state_type& __st,
              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    virtual result
        do_unshift(state_type& __st,
                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual int do_encoding() const _NOEXCEPT;
    virtual bool do_always_noconv() const _NOEXCEPT;
    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
                          size_t __mx) const;
    virtual int do_max_length() const _NOEXCEPT;
};

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
template <>
class _LIBCPP_TYPE_VIS __codecvt_utf16<char16_t, true>
    : public codecvt<char16_t, char, mbstate_t>
{
    unsigned long _Maxcode_;
    codecvt_mode _Mode_;
public:
    typedef char16_t  intern_type;
    typedef char      extern_type;
    typedef mbstate_t state_type;

    _LIBCPP_INLINE_VISIBILITY
    explicit __codecvt_utf16(size_t __refs, unsigned long __maxcode,
                            codecvt_mode __mode)
        : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(__maxcode),
          _Mode_(__mode) {}
_LIBCPP_SUPPRESS_DEPRECATED_POP

protected:
    virtual result
        do_out(state_type& __st,
               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual result
        do_in(state_type& __st,
              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    virtual result
        do_unshift(state_type& __st,
                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual int do_encoding() const _NOEXCEPT;
    virtual bool do_always_noconv() const _NOEXCEPT;
    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
                          size_t __mx) const;
    virtual int do_max_length() const _NOEXCEPT;
};

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
template <>
class _LIBCPP_TYPE_VIS __codecvt_utf16<char32_t, false>
    : public codecvt<char32_t, char, mbstate_t>
{
    unsigned long _Maxcode_;
    codecvt_mode _Mode_;
public:
    typedef char32_t  intern_type;
    typedef char      extern_type;
    typedef mbstate_t state_type;

    _LIBCPP_INLINE_VISIBILITY
    explicit __codecvt_utf16(size_t __refs, unsigned long __maxcode,
                            codecvt_mode __mode)
        : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(__maxcode),
          _Mode_(__mode) {}
_LIBCPP_SUPPRESS_DEPRECATED_POP

protected:
    virtual result
        do_out(state_type& __st,
               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual result
        do_in(state_type& __st,
              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    virtual result
        do_unshift(state_type& __st,
                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual int do_encoding() const _NOEXCEPT;
    virtual bool do_always_noconv() const _NOEXCEPT;
    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
                          size_t __mx) const;
    virtual int do_max_length() const _NOEXCEPT;
};

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
template <>
class _LIBCPP_TYPE_VIS __codecvt_utf16<char32_t, true>
    : public codecvt<char32_t, char, mbstate_t>
{
    unsigned long _Maxcode_;
    codecvt_mode _Mode_;
public:
    typedef char32_t  intern_type;
    typedef char      extern_type;
    typedef mbstate_t state_type;

    _LIBCPP_INLINE_VISIBILITY
    explicit __codecvt_utf16(size_t __refs, unsigned long __maxcode,
                            codecvt_mode __mode)
        : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(__maxcode),
          _Mode_(__mode) {}
_LIBCPP_SUPPRESS_DEPRECATED_POP

protected:
    virtual result
        do_out(state_type& __st,
               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual result
        do_in(state_type& __st,
              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    virtual result
        do_unshift(state_type& __st,
                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual int do_encoding() const _NOEXCEPT;
    virtual bool do_always_noconv() const _NOEXCEPT;
    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
                          size_t __mx) const;
    virtual int do_max_length() const _NOEXCEPT;
};

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
template <class _Elem, unsigned long _Maxcode = 0x10ffff,
          codecvt_mode _Mode = (codecvt_mode)0>
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 codecvt_utf16
    : public __codecvt_utf16<_Elem, _Mode & little_endian>
{
public:
    _LIBCPP_INLINE_VISIBILITY
    explicit codecvt_utf16(size_t __refs = 0)
        : __codecvt_utf16<_Elem, _Mode & little_endian>(__refs, _Maxcode, _Mode) {}

    _LIBCPP_INLINE_VISIBILITY
    ~codecvt_utf16() {}
};
_LIBCPP_SUPPRESS_DEPRECATED_POP

// codecvt_utf8_utf16

template <class _Elem> class __codecvt_utf8_utf16;

#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
template <>
class _LIBCPP_TYPE_VIS __codecvt_utf8_utf16<wchar_t>
    : public codecvt<wchar_t, char, mbstate_t>
{
    unsigned long _Maxcode_;
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
    codecvt_mode _Mode_;
_LIBCPP_SUPPRESS_DEPRECATED_POP
public:
    typedef wchar_t   intern_type;
    typedef char      extern_type;
    typedef mbstate_t state_type;

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
    _LIBCPP_INLINE_VISIBILITY
    explicit __codecvt_utf8_utf16(size_t __refs, unsigned long __maxcode,
                            codecvt_mode __mode)
        : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(__maxcode),
          _Mode_(__mode) {}
_LIBCPP_SUPPRESS_DEPRECATED_POP
protected:
    virtual result
        do_out(state_type& __st,
               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual result
        do_in(state_type& __st,
              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    virtual result
        do_unshift(state_type& __st,
                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual int do_encoding() const _NOEXCEPT;
    virtual bool do_always_noconv() const _NOEXCEPT;
    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
                          size_t __mx) const;
    virtual int do_max_length() const _NOEXCEPT;
};
#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
template <>
class _LIBCPP_TYPE_VIS __codecvt_utf8_utf16<char32_t>
    : public codecvt<char32_t, char, mbstate_t>
{
    unsigned long _Maxcode_;
    codecvt_mode _Mode_;
public:
    typedef char32_t  intern_type;
    typedef char      extern_type;
    typedef mbstate_t state_type;

    _LIBCPP_INLINE_VISIBILITY
    explicit __codecvt_utf8_utf16(size_t __refs, unsigned long __maxcode,
                            codecvt_mode __mode)
        : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(__maxcode),
          _Mode_(__mode) {}
_LIBCPP_SUPPRESS_DEPRECATED_POP

protected:
    virtual result
        do_out(state_type& __st,
               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual result
        do_in(state_type& __st,
              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    virtual result
        do_unshift(state_type& __st,
                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual int do_encoding() const _NOEXCEPT;
    virtual bool do_always_noconv() const _NOEXCEPT;
    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
                          size_t __mx) const;
    virtual int do_max_length() const _NOEXCEPT;
};

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
template <>
class _LIBCPP_TYPE_VIS __codecvt_utf8_utf16<char16_t>
    : public codecvt<char16_t, char, mbstate_t>
{
    unsigned long _Maxcode_;
    codecvt_mode _Mode_;
public:
    typedef char16_t  intern_type;
    typedef char      extern_type;
    typedef mbstate_t state_type;

    _LIBCPP_INLINE_VISIBILITY
    explicit __codecvt_utf8_utf16(size_t __refs, unsigned long __maxcode,
                            codecvt_mode __mode)
        : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(__maxcode),
          _Mode_(__mode) {}
_LIBCPP_SUPPRESS_DEPRECATED_POP

protected:
    virtual result
        do_out(state_type& __st,
               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual result
        do_in(state_type& __st,
              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    virtual result
        do_unshift(state_type& __st,
                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    virtual int do_encoding() const _NOEXCEPT;
    virtual bool do_always_noconv() const _NOEXCEPT;
    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
                          size_t __mx) const;
    virtual int do_max_length() const _NOEXCEPT;
};

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
template <class _Elem, unsigned long _Maxcode = 0x10ffff,
          codecvt_mode _Mode = (codecvt_mode)0>
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 codecvt_utf8_utf16
    : public __codecvt_utf8_utf16<_Elem>
{
public:
    _LIBCPP_INLINE_VISIBILITY
    explicit codecvt_utf8_utf16(size_t __refs = 0)
        : __codecvt_utf8_utf16<_Elem>(__refs, _Maxcode, _Mode) {}

    _LIBCPP_INLINE_VISIBILITY
    ~codecvt_utf8_utf16() {}
};
_LIBCPP_SUPPRESS_DEPRECATED_POP

_LIBCPP_END_NAMESPACE_STD

#endif // _LIBCPP_CODECVT
