// -*- 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:
    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 override;
    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 override;
    result do_unshift(state_type& __st,
                      extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const override;
    int do_encoding() const _NOEXCEPT override;
    bool do_always_noconv() const _NOEXCEPT override;
    int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const override;
    int do_max_length() const _NOEXCEPT override;
};
#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:
     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 override;
     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 override;
     result do_unshift(state_type& __st,
                       extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const override;
     int do_encoding() const _NOEXCEPT override;
     bool do_always_noconv() const _NOEXCEPT override;
     int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const override;
     int do_max_length() const _NOEXCEPT override;
};

_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:
     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 override;
     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 override;
     result do_unshift(state_type& __st,
                       extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const override;
     int do_encoding() const _NOEXCEPT override;
     bool do_always_noconv() const _NOEXCEPT override;
     int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const override;
     int do_max_length() const _NOEXCEPT override;
};

_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:
     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 override;
     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 override;
     result do_unshift(state_type& __st,
                       extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const override;
     int do_encoding() const _NOEXCEPT override;
     bool do_always_noconv() const _NOEXCEPT override;
     int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
                          size_t __mx) const override;
     int do_max_length() const _NOEXCEPT override;
};

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:
     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 override;
     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 override;
     result do_unshift(state_type& __st,
                       extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const override;
     int do_encoding() const _NOEXCEPT override;
     bool do_always_noconv() const _NOEXCEPT override;
     int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const override;
     int do_max_length() const _NOEXCEPT override;
};
#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:
     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 override;
     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 override;
     result do_unshift(state_type& __st,
                       extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const override;
     int do_encoding() const _NOEXCEPT override;
     bool do_always_noconv() const _NOEXCEPT override;
     int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const override;
     int do_max_length() const _NOEXCEPT override;
};

_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:
     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 override;
     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 override;
     result do_unshift(state_type& __st,
                       extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const override;
     int do_encoding() const _NOEXCEPT override;
     bool do_always_noconv() const _NOEXCEPT override;
     int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const override;
     int do_max_length() const _NOEXCEPT override;
};

_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:
     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 override;
     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 override;
     result do_unshift(state_type& __st,
                       extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const override;
     int do_encoding() const _NOEXCEPT override;
     bool do_always_noconv() const _NOEXCEPT override;
     int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const override;
     int do_max_length() const _NOEXCEPT override;
};

_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:
     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 override;
     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 override;
     result do_unshift(state_type& __st,
                       extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const override;
     int do_encoding() const _NOEXCEPT override;
     bool do_always_noconv() const _NOEXCEPT override;
     int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const override;
     int do_max_length() const _NOEXCEPT override;
};

_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:
     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 override;
     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 override;
     result do_unshift(state_type& __st,
                       extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const override;
     int do_encoding() const _NOEXCEPT override;
     bool do_always_noconv() const _NOEXCEPT override;
     int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const override;
     int do_max_length() const _NOEXCEPT override;
};
#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:
     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 override;
     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 override;
     result do_unshift(state_type& __st,
                       extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const override;
     int do_encoding() const _NOEXCEPT override;
     bool do_always_noconv() const _NOEXCEPT override;
     int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const override;
     int do_max_length() const _NOEXCEPT override;
};

_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:
     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 override;
     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 override;
     result do_unshift(state_type& __st,
                       extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const override;
     int do_encoding() const _NOEXCEPT override;
     bool do_always_noconv() const _NOEXCEPT override;
     int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const override;
     int do_max_length() const _NOEXCEPT override;
};

_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
