// -*- 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___CXX03_CODECVT
#define _LIBCPP___CXX03_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 <__cxx03/__config>
#include <__cxx03/__locale>
#include <__cxx03/version>

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

_LIBCPP_BEGIN_NAMESPACE_STD

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

#ifndef _LIBCPP_HAS_NO_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_NO_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 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;

#ifndef _LIBCPP_HAS_NO_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_NO_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 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

#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES)
#  include <__cxx03/atomic>
#  include <__cxx03/cstddef>
#  include <__cxx03/cstdlib>
#  include <__cxx03/cstring>
#  include <__cxx03/iosfwd>
#  include <__cxx03/limits>
#  include <__cxx03/mutex>
#  include <__cxx03/new>
#  include <__cxx03/stdexcept>
#  include <__cxx03/type_traits>
#  include <__cxx03/typeinfo>
#endif

#endif // _LIBCPP___CXX03_CODECVT
