// -*- 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

*/

#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
#  include <__cxx03/codecvt>
#else
#  include <__config>
#  include <__locale>
#  include <version>

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

#  if _LIBCPP_STD_VER < 26 || defined(_LIBCPP_BUILDING_LIBRARY) || defined(_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT)

_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;

#    if _LIBCPP_HAS_WIDE_CHARACTERS
template <>
class _LIBCPP_EXPORTED_FROM_ABI __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_HIDE_FROM_ABI 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_WIDE_CHARACTERS

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
template <>
class _LIBCPP_EXPORTED_FROM_ABI __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_HIDE_FROM_ABI 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_EXPORTED_FROM_ABI __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_HIDE_FROM_ABI 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_HIDE_FROM_ABI explicit codecvt_utf8(size_t __refs = 0) : __codecvt_utf8<_Elem>(__refs, _Maxcode, _Mode) {}

  _LIBCPP_HIDE_FROM_ABI ~codecvt_utf8() {}
};
_LIBCPP_SUPPRESS_DEPRECATED_POP

// codecvt_utf16

template <class _Elem, bool _LittleEndian>
class __codecvt_utf16;

#    if _LIBCPP_HAS_WIDE_CHARACTERS
template <>
class _LIBCPP_EXPORTED_FROM_ABI __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_HIDE_FROM_ABI 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_EXPORTED_FROM_ABI __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_HIDE_FROM_ABI 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_WIDE_CHARACTERS

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
template <>
class _LIBCPP_EXPORTED_FROM_ABI __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_HIDE_FROM_ABI 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_EXPORTED_FROM_ABI __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_HIDE_FROM_ABI 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_EXPORTED_FROM_ABI __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_HIDE_FROM_ABI 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_EXPORTED_FROM_ABI __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_HIDE_FROM_ABI 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_HIDE_FROM_ABI explicit codecvt_utf16(size_t __refs = 0)
      : __codecvt_utf16<_Elem, _Mode & little_endian>(__refs, _Maxcode, _Mode) {}

  _LIBCPP_HIDE_FROM_ABI ~codecvt_utf16() {}
};
_LIBCPP_SUPPRESS_DEPRECATED_POP

// codecvt_utf8_utf16

template <class _Elem>
class __codecvt_utf8_utf16;

#    if _LIBCPP_HAS_WIDE_CHARACTERS
template <>
class _LIBCPP_EXPORTED_FROM_ABI __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_HIDE_FROM_ABI 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_WIDE_CHARACTERS

_LIBCPP_SUPPRESS_DEPRECATED_PUSH
template <>
class _LIBCPP_EXPORTED_FROM_ABI __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_HIDE_FROM_ABI 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_EXPORTED_FROM_ABI __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_HIDE_FROM_ABI 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_HIDE_FROM_ABI explicit codecvt_utf8_utf16(size_t __refs = 0)
      : __codecvt_utf8_utf16<_Elem>(__refs, _Maxcode, _Mode) {}

  _LIBCPP_HIDE_FROM_ABI ~codecvt_utf8_utf16() {}
};
_LIBCPP_SUPPRESS_DEPRECATED_POP

_LIBCPP_END_NAMESPACE_STD

#  endif // _LIBCPP_STD_VER < 26 || defined(_LIBCPP_BUILDING_LIBRARY) || defined(_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT)

#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
#    include <atomic>
#    include <concepts>
#    include <cstddef>
#    include <cstdlib>
#    include <cstring>
#    include <initializer_list>
#    include <iosfwd>
#    include <limits>
#    include <mutex>
#    include <new>
#    include <stdexcept>
#    include <type_traits>
#    include <typeinfo>
#  endif
#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)

#endif // _LIBCPP_CODECVT
