// -*- 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_IOS
#define _LIBCPP_IOS

/*
    ios synopsis

#include <iosfwd>

namespace std
{

typedef OFF_T streamoff;
typedef SZ_T streamsize;
template <class stateT> class fpos;

class ios_base
{
public:
    class failure;

    typedef T1 fmtflags;
    static constexpr fmtflags boolalpha;
    static constexpr fmtflags dec;
    static constexpr fmtflags fixed;
    static constexpr fmtflags hex;
    static constexpr fmtflags internal;
    static constexpr fmtflags left;
    static constexpr fmtflags oct;
    static constexpr fmtflags right;
    static constexpr fmtflags scientific;
    static constexpr fmtflags showbase;
    static constexpr fmtflags showpoint;
    static constexpr fmtflags showpos;
    static constexpr fmtflags skipws;
    static constexpr fmtflags unitbuf;
    static constexpr fmtflags uppercase;
    static constexpr fmtflags adjustfield;
    static constexpr fmtflags basefield;
    static constexpr fmtflags floatfield;

    typedef T2 iostate;
    static constexpr iostate badbit;
    static constexpr iostate eofbit;
    static constexpr iostate failbit;
    static constexpr iostate goodbit;

    typedef T3 openmode;
    static constexpr openmode app;
    static constexpr openmode ate;
    static constexpr openmode binary;
    static constexpr openmode in;
    static constexpr openmode noreplace; // since C++23
    static constexpr openmode out;
    static constexpr openmode trunc;

    typedef T4 seekdir;
    static constexpr seekdir beg;
    static constexpr seekdir cur;
    static constexpr seekdir end;

    class Init;

    // 27.5.2.2 fmtflags state:
    fmtflags flags() const;
    fmtflags flags(fmtflags fmtfl);
    fmtflags setf(fmtflags fmtfl);
    fmtflags setf(fmtflags fmtfl, fmtflags mask);
    void unsetf(fmtflags mask);

    streamsize precision() const;
    streamsize precision(streamsize prec);
    streamsize width() const;
    streamsize width(streamsize wide);

    // 27.5.2.3 locales:
    locale imbue(const locale& loc);
    locale getloc() const;

    // 27.5.2.5 storage:
    static int xalloc();
    long& iword(int index);
    void*& pword(int index);

    // destructor
    virtual ~ios_base();

    // 27.5.2.6 callbacks;
    enum event { erase_event, imbue_event, copyfmt_event };
    typedef void (*event_callback)(event, ios_base&, int index);
    void register_callback(event_callback fn, int index);

    ios_base(const ios_base&) = delete;
    ios_base& operator=(const ios_base&) = delete;

    static bool sync_with_stdio(bool sync = true);

protected:
    ios_base();
};

template <class charT, class traits = char_traits<charT> >
class basic_ios
    : public ios_base
{
public:
    // types:
    typedef charT char_type;
    typedef typename traits::int_type int_type;  // removed in C++17
    typedef typename traits::pos_type pos_type;  // removed in C++17
    typedef typename traits::off_type off_type;  // removed in C++17
    typedef traits traits_type;

    operator unspecified-bool-type() const;
    bool operator!() const;
    iostate rdstate() const;
    void clear(iostate state = goodbit);
    void setstate(iostate state);
    bool good() const;
    bool eof() const;
    bool fail() const;
    bool bad() const;

    iostate exceptions() const;
    void exceptions(iostate except);

    // 27.5.4.1 Constructor/destructor:
    explicit basic_ios(basic_streambuf<charT,traits>* sb);
    virtual ~basic_ios();

    // 27.5.4.2 Members:
    basic_ostream<charT,traits>* tie() const;
    basic_ostream<charT,traits>* tie(basic_ostream<charT,traits>* tiestr);

    basic_streambuf<charT,traits>* rdbuf() const;
    basic_streambuf<charT,traits>* rdbuf(basic_streambuf<charT,traits>* sb);

    basic_ios& copyfmt(const basic_ios& rhs);

    char_type fill() const;
    char_type fill(char_type ch);

    locale imbue(const locale& loc);

    char narrow(char_type c, char dfault) const;
    char_type widen(char c) const;

    basic_ios(const basic_ios& ) = delete;
    basic_ios& operator=(const basic_ios&) = delete;

protected:
    basic_ios();
    void init(basic_streambuf<charT,traits>* sb);
    void move(basic_ios& rhs);
    void swap(basic_ios& rhs) noexcept;
    void set_rdbuf(basic_streambuf<charT, traits>* sb);
};

// 27.5.5, manipulators:
ios_base& boolalpha (ios_base& str);
ios_base& noboolalpha(ios_base& str);
ios_base& showbase (ios_base& str);
ios_base& noshowbase (ios_base& str);
ios_base& showpoint (ios_base& str);
ios_base& noshowpoint(ios_base& str);
ios_base& showpos (ios_base& str);
ios_base& noshowpos (ios_base& str);
ios_base& skipws (ios_base& str);
ios_base& noskipws (ios_base& str);
ios_base& uppercase (ios_base& str);
ios_base& nouppercase(ios_base& str);
ios_base& unitbuf (ios_base& str);
ios_base& nounitbuf (ios_base& str);

// 27.5.5.2 adjustfield:
ios_base& internal (ios_base& str);
ios_base& left (ios_base& str);
ios_base& right (ios_base& str);

// 27.5.5.3 basefield:
ios_base& dec (ios_base& str);
ios_base& hex (ios_base& str);
ios_base& oct (ios_base& str);

// 27.5.5.4 floatfield:
ios_base& fixed (ios_base& str);
ios_base& scientific (ios_base& str);
ios_base& hexfloat (ios_base& str);
ios_base& defaultfloat(ios_base& str);

// 27.5.5.5 error reporting:
enum class io_errc
{
    stream = 1
};

concept_map ErrorCodeEnum<io_errc> { };
error_code make_error_code(io_errc e) noexcept;
error_condition make_error_condition(io_errc e) noexcept;
storage-class-specifier const error_category& iostream_category() noexcept;

}  // std

*/

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

#  if _LIBCPP_HAS_LOCALIZATION

#    include <__fwd/ios.h>
#    include <__ios/fpos.h>
#    include <__locale>
#    include <__memory/addressof.h>
#    include <__system_error/error_category.h>
#    include <__system_error/error_code.h>
#    include <__system_error/error_condition.h>
#    include <__system_error/system_error.h>
#    include <__utility/swap.h>
#    include <__verbose_abort>
#    include <version>

// standard-mandated includes

// [ios.syn]
#    include <iosfwd>

#    if _LIBCPP_HAS_ATOMIC_HEADER
#      include <__atomic/atomic.h> // for __xindex_
#    endif

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

_LIBCPP_PUSH_MACROS
#    include <__undef_macros>

_LIBCPP_BEGIN_NAMESPACE_STD

typedef ptrdiff_t streamsize;

class _LIBCPP_EXPORTED_FROM_ABI ios_base {
public:
  class _LIBCPP_EXPORTED_FROM_ABI failure;

  typedef unsigned int fmtflags;
  static const fmtflags boolalpha   = 0x0001;
  static const fmtflags dec         = 0x0002;
  static const fmtflags fixed       = 0x0004;
  static const fmtflags hex         = 0x0008;
  static const fmtflags internal    = 0x0010;
  static const fmtflags left        = 0x0020;
  static const fmtflags oct         = 0x0040;
  static const fmtflags right       = 0x0080;
  static const fmtflags scientific  = 0x0100;
  static const fmtflags showbase    = 0x0200;
  static const fmtflags showpoint   = 0x0400;
  static const fmtflags showpos     = 0x0800;
  static const fmtflags skipws      = 0x1000;
  static const fmtflags unitbuf     = 0x2000;
  static const fmtflags uppercase   = 0x4000;
  static const fmtflags adjustfield = left | right | internal;
  static const fmtflags basefield   = dec | oct | hex;
  static const fmtflags floatfield  = scientific | fixed;

  typedef unsigned int iostate;
  static const iostate badbit  = 0x1;
  static const iostate eofbit  = 0x2;
  static const iostate failbit = 0x4;
  static const iostate goodbit = 0x0;

  typedef unsigned int openmode;
  static const openmode app    = 0x01;
  static const openmode ate    = 0x02;
  static const openmode binary = 0x04;
  static const openmode in     = 0x08;
  static const openmode out    = 0x10;
  static const openmode trunc  = 0x20;
#    if _LIBCPP_STD_VER >= 23
  static const openmode noreplace = 0x40;
#    endif

  enum seekdir { beg, cur, end };

#    if _LIBCPP_STD_VER <= 14
  typedef iostate io_state;
  typedef openmode open_mode;
  typedef seekdir seek_dir;

  typedef std::streamoff streamoff;
  typedef std::streampos streampos;
#    endif

  class _LIBCPP_EXPORTED_FROM_ABI Init;

  // 27.5.2.2 fmtflags state:
  _LIBCPP_HIDE_FROM_ABI fmtflags flags() const;
  _LIBCPP_HIDE_FROM_ABI fmtflags flags(fmtflags __fmtfl);
  _LIBCPP_HIDE_FROM_ABI fmtflags setf(fmtflags __fmtfl);
  _LIBCPP_HIDE_FROM_ABI fmtflags setf(fmtflags __fmtfl, fmtflags __mask);
  _LIBCPP_HIDE_FROM_ABI void unsetf(fmtflags __mask);

  _LIBCPP_HIDE_FROM_ABI streamsize precision() const;
  _LIBCPP_HIDE_FROM_ABI streamsize precision(streamsize __prec);
  _LIBCPP_HIDE_FROM_ABI streamsize width() const;
  _LIBCPP_HIDE_FROM_ABI streamsize width(streamsize __wide);

  // 27.5.2.3 locales:
  locale imbue(const locale& __loc);
  locale getloc() const;

  // 27.5.2.5 storage:
  static int xalloc();
  long& iword(int __index);
  void*& pword(int __index);

  // destructor
  virtual ~ios_base();

  // 27.5.2.6 callbacks;
  enum event { erase_event, imbue_event, copyfmt_event };
  typedef void (*event_callback)(event, ios_base&, int __index);
  void register_callback(event_callback __fn, int __index);

  ios_base(const ios_base&)            = delete;
  ios_base& operator=(const ios_base&) = delete;

  static bool sync_with_stdio(bool __sync = true);

  _LIBCPP_HIDE_FROM_ABI iostate rdstate() const;
  void clear(iostate __state = goodbit);
  _LIBCPP_HIDE_FROM_ABI void setstate(iostate __state);

  _LIBCPP_HIDE_FROM_ABI bool good() const;
  _LIBCPP_HIDE_FROM_ABI bool eof() const;
  _LIBCPP_HIDE_FROM_ABI bool fail() const;
  _LIBCPP_HIDE_FROM_ABI bool bad() const;

  _LIBCPP_HIDE_FROM_ABI iostate exceptions() const;
  _LIBCPP_HIDE_FROM_ABI void exceptions(iostate __iostate);

  void __set_badbit_and_consider_rethrow();
  void __set_failbit_and_consider_rethrow();

  _LIBCPP_HIDE_FROM_ABI void __setstate_nothrow(iostate __state) {
    if (__rdbuf_)
      __rdstate_ |= __state;
    else
      __rdstate_ |= __state | ios_base::badbit;
  }

protected:
  _LIBCPP_HIDE_FROM_ABI ios_base() : __loc_(nullptr) {
    // Purposefully does no initialization
    //
    // Except for the locale, this is a sentinel to avoid destroying
    // an uninitialized object. See
    // test/libcxx/input.output/iostreams.base/ios.base/ios.base.cons/dtor.uninitialized.pass.cpp
    // for the details.
  }

  void init(void* __sb);
  _LIBCPP_HIDE_FROM_ABI void* rdbuf() const { return __rdbuf_; }

  _LIBCPP_HIDE_FROM_ABI void rdbuf(void* __sb) {
    __rdbuf_ = __sb;
    clear();
  }

  void __call_callbacks(event);
  void copyfmt(const ios_base&);
  void move(ios_base&);
  void swap(ios_base&) _NOEXCEPT;

  _LIBCPP_HIDE_FROM_ABI void set_rdbuf(void* __sb) { __rdbuf_ = __sb; }

private:
  // All data members must be scalars
  fmtflags __fmtflags_;
  streamsize __precision_;
  streamsize __width_;
  iostate __rdstate_;
  iostate __exceptions_;
  void* __rdbuf_;
  void* __loc_;
  event_callback* __fn_;
  int* __index_;
  size_t __event_size_;
  size_t __event_cap_;
// TODO(EricWF): Enable this for both Clang and GCC. Currently it is only
// enabled with clang.
#    if _LIBCPP_HAS_C_ATOMIC_IMP && _LIBCPP_HAS_THREADS
  static atomic<int> __xindex_;
#    else
  static int __xindex_;
#    endif
  long* __iarray_;
  size_t __iarray_size_;
  size_t __iarray_cap_;
  void** __parray_;
  size_t __parray_size_;
  size_t __parray_cap_;
};

// enum class io_errc
_LIBCPP_DECLARE_STRONG_ENUM(io_errc){stream = 1};
_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(io_errc)

template <>
struct _LIBCPP_TEMPLATE_VIS is_error_code_enum<io_errc> : public true_type {};

#    ifdef _LIBCPP_CXX03_LANG
template <>
struct _LIBCPP_TEMPLATE_VIS is_error_code_enum<io_errc::__lx> : public true_type {};
#    endif

_LIBCPP_EXPORTED_FROM_ABI const error_category& iostream_category() _NOEXCEPT;

inline _LIBCPP_HIDE_FROM_ABI error_code make_error_code(io_errc __e) _NOEXCEPT {
  return error_code(static_cast<int>(__e), iostream_category());
}

inline _LIBCPP_HIDE_FROM_ABI error_condition make_error_condition(io_errc __e) _NOEXCEPT {
  return error_condition(static_cast<int>(__e), iostream_category());
}

class _LIBCPP_EXPORTED_FROM_ABI ios_base::failure : public system_error {
public:
  explicit failure(const string& __msg, const error_code& __ec = io_errc::stream);
  explicit failure(const char* __msg, const error_code& __ec = io_errc::stream);
  _LIBCPP_HIDE_FROM_ABI failure(const failure&) _NOEXCEPT = default;
  ~failure() _NOEXCEPT override;
};

[[__noreturn__]] inline _LIBCPP_HIDE_FROM_ABI void __throw_failure(char const* __msg) {
#    if _LIBCPP_HAS_EXCEPTIONS
  throw ios_base::failure(__msg);
#    else
  _LIBCPP_VERBOSE_ABORT("ios_base::failure was thrown in -fno-exceptions mode with message \"%s\"", __msg);
#    endif
}

class _LIBCPP_EXPORTED_FROM_ABI ios_base::Init {
public:
  Init();
  ~Init();
};

// fmtflags

inline _LIBCPP_HIDE_FROM_ABI ios_base::fmtflags ios_base::flags() const { return __fmtflags_; }

inline _LIBCPP_HIDE_FROM_ABI ios_base::fmtflags ios_base::flags(fmtflags __fmtfl) {
  fmtflags __r = __fmtflags_;
  __fmtflags_  = __fmtfl;
  return __r;
}

inline _LIBCPP_HIDE_FROM_ABI ios_base::fmtflags ios_base::setf(fmtflags __fmtfl) {
  fmtflags __r = __fmtflags_;
  __fmtflags_ |= __fmtfl;
  return __r;
}

inline _LIBCPP_HIDE_FROM_ABI void ios_base::unsetf(fmtflags __mask) { __fmtflags_ &= ~__mask; }

inline _LIBCPP_HIDE_FROM_ABI ios_base::fmtflags ios_base::setf(fmtflags __fmtfl, fmtflags __mask) {
  fmtflags __r = __fmtflags_;
  unsetf(__mask);
  __fmtflags_ |= __fmtfl & __mask;
  return __r;
}

// precision

inline _LIBCPP_HIDE_FROM_ABI streamsize ios_base::precision() const { return __precision_; }

inline _LIBCPP_HIDE_FROM_ABI streamsize ios_base::precision(streamsize __prec) {
  streamsize __r = __precision_;
  __precision_   = __prec;
  return __r;
}

// width

inline _LIBCPP_HIDE_FROM_ABI streamsize ios_base::width() const { return __width_; }

inline _LIBCPP_HIDE_FROM_ABI streamsize ios_base::width(streamsize __wide) {
  streamsize __r = __width_;
  __width_       = __wide;
  return __r;
}

// iostate

inline _LIBCPP_HIDE_FROM_ABI ios_base::iostate ios_base::rdstate() const { return __rdstate_; }

inline _LIBCPP_HIDE_FROM_ABI void ios_base::setstate(iostate __state) { clear(__rdstate_ | __state); }

inline _LIBCPP_HIDE_FROM_ABI bool ios_base::good() const { return __rdstate_ == 0; }

inline _LIBCPP_HIDE_FROM_ABI bool ios_base::eof() const { return (__rdstate_ & eofbit) != 0; }

inline _LIBCPP_HIDE_FROM_ABI bool ios_base::fail() const { return (__rdstate_ & (failbit | badbit)) != 0; }

inline _LIBCPP_HIDE_FROM_ABI bool ios_base::bad() const { return (__rdstate_ & badbit) != 0; }

inline _LIBCPP_HIDE_FROM_ABI ios_base::iostate ios_base::exceptions() const { return __exceptions_; }

inline _LIBCPP_HIDE_FROM_ABI void ios_base::exceptions(iostate __iostate) {
  __exceptions_ = __iostate;
  clear(__rdstate_);
}

template <class _Traits>
// Attribute 'packed' is used to keep the layout compatible with the previous
// definition of the '__fill_' and '_set_' pair in basic_ios on AIX & z/OS.
struct _LIBCPP_PACKED _FillHelper {
  _LIBCPP_HIDE_FROM_ABI void __init() {
    __set_      = false;
    __fill_val_ = _Traits::eof();
  }
  _LIBCPP_HIDE_FROM_ABI _FillHelper& operator=(typename _Traits::int_type __x) {
    __set_      = true;
    __fill_val_ = __x;
    return *this;
  }
  _LIBCPP_HIDE_FROM_ABI bool __is_set() const { return __set_; }
  _LIBCPP_HIDE_FROM_ABI typename _Traits::int_type __get() const { return __fill_val_; }

private:
  typename _Traits::int_type __fill_val_;
  bool __set_;
};

template <class _Traits>
struct _LIBCPP_PACKED _SentinelValueFill {
  _LIBCPP_HIDE_FROM_ABI void __init() { __fill_val_ = _Traits::eof(); }
  _LIBCPP_HIDE_FROM_ABI _SentinelValueFill& operator=(typename _Traits::int_type __x) {
    __fill_val_ = __x;
    return *this;
  }
  _LIBCPP_HIDE_FROM_ABI bool __is_set() const { return __fill_val_ != _Traits::eof(); }
  _LIBCPP_HIDE_FROM_ABI typename _Traits::int_type __get() const { return __fill_val_; }

private:
  typename _Traits::int_type __fill_val_;
};

template <class _CharT, class _Traits>
class _LIBCPP_TEMPLATE_VIS basic_ios : public ios_base {
public:
  // types:
  typedef _CharT char_type;
  typedef _Traits traits_type;

  typedef typename traits_type::int_type int_type;
  typedef typename traits_type::pos_type pos_type;
  typedef typename traits_type::off_type off_type;

  static_assert(is_same<_CharT, typename traits_type::char_type>::value,
                "traits_type::char_type must be the same type as CharT");

#    ifdef _LIBCPP_CXX03_LANG
  // Preserve the ability to compare with literal 0,
  // and implicitly convert to bool, but not implicitly convert to int.
  _LIBCPP_HIDE_FROM_ABI operator void*() const { return fail() ? nullptr : (void*)this; }
#    else
  _LIBCPP_HIDE_FROM_ABI explicit operator bool() const { return !fail(); }
#    endif

  _LIBCPP_HIDE_FROM_ABI bool operator!() const { return fail(); }
  _LIBCPP_HIDE_FROM_ABI iostate rdstate() const { return ios_base::rdstate(); }
  _LIBCPP_HIDE_FROM_ABI void clear(iostate __state = goodbit) { ios_base::clear(__state); }
  _LIBCPP_HIDE_FROM_ABI void setstate(iostate __state) { ios_base::setstate(__state); }
  _LIBCPP_HIDE_FROM_ABI bool good() const { return ios_base::good(); }
  _LIBCPP_HIDE_FROM_ABI bool eof() const { return ios_base::eof(); }
  _LIBCPP_HIDE_FROM_ABI bool fail() const { return ios_base::fail(); }
  _LIBCPP_HIDE_FROM_ABI bool bad() const { return ios_base::bad(); }

  _LIBCPP_HIDE_FROM_ABI iostate exceptions() const { return ios_base::exceptions(); }
  _LIBCPP_HIDE_FROM_ABI void exceptions(iostate __iostate) { ios_base::exceptions(__iostate); }

  // 27.5.4.1 Constructor/destructor:
  _LIBCPP_HIDE_FROM_ABI explicit basic_ios(basic_streambuf<char_type, traits_type>* __sb);
  ~basic_ios() override;

  // 27.5.4.2 Members:
  _LIBCPP_HIDE_FROM_ABI basic_ostream<char_type, traits_type>* tie() const;
  _LIBCPP_HIDE_FROM_ABI basic_ostream<char_type, traits_type>* tie(basic_ostream<char_type, traits_type>* __tiestr);

  _LIBCPP_HIDE_FROM_ABI basic_streambuf<char_type, traits_type>* rdbuf() const;
  _LIBCPP_HIDE_FROM_ABI basic_streambuf<char_type, traits_type>* rdbuf(basic_streambuf<char_type, traits_type>* __sb);

  basic_ios& copyfmt(const basic_ios& __rhs);

  _LIBCPP_HIDE_FROM_ABI char_type fill() const;
  _LIBCPP_HIDE_FROM_ABI char_type fill(char_type __ch);

  _LIBCPP_HIDE_FROM_ABI locale imbue(const locale& __loc);

  _LIBCPP_HIDE_FROM_ABI char narrow(char_type __c, char __dfault) const;
  _LIBCPP_HIDE_FROM_ABI char_type widen(char __c) const;

protected:
  _LIBCPP_HIDE_FROM_ABI basic_ios() {
    // purposefully does no initialization
    // since the destructor does nothing this does not have ios_base issues.
  }
  _LIBCPP_HIDE_FROM_ABI void init(basic_streambuf<char_type, traits_type>* __sb);

  _LIBCPP_HIDE_FROM_ABI void move(basic_ios& __rhs);
  _LIBCPP_HIDE_FROM_ABI void move(basic_ios&& __rhs) { move(__rhs); }
  _LIBCPP_HIDE_FROM_ABI void swap(basic_ios& __rhs) _NOEXCEPT;
  _LIBCPP_HIDE_FROM_ABI void set_rdbuf(basic_streambuf<char_type, traits_type>* __sb);

private:
  basic_ostream<char_type, traits_type>* __tie_;

#    if defined(_LIBCPP_ABI_IOS_ALLOW_ARBITRARY_FILL_VALUE)
  using _FillType _LIBCPP_NODEBUG = _FillHelper<traits_type>;
#    else
  using _FillType _LIBCPP_NODEBUG = _SentinelValueFill<traits_type>;
#    endif
  mutable _FillType __fill_;
};

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI basic_ios<_CharT, _Traits>::basic_ios(basic_streambuf<char_type, traits_type>* __sb) {
  init(__sb);
}

template <class _CharT, class _Traits>
basic_ios<_CharT, _Traits>::~basic_ios() {}

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI void basic_ios<_CharT, _Traits>::init(basic_streambuf<char_type, traits_type>* __sb) {
  ios_base::init(__sb);
  __tie_ = nullptr;
  __fill_.__init();
}

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>* basic_ios<_CharT, _Traits>::tie() const {
  return __tie_;
}

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>*
basic_ios<_CharT, _Traits>::tie(basic_ostream<char_type, traits_type>* __tiestr) {
  basic_ostream<char_type, traits_type>* __r = __tie_;
  __tie_                                     = __tiestr;
  return __r;
}

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI basic_streambuf<_CharT, _Traits>* basic_ios<_CharT, _Traits>::rdbuf() const {
  return static_cast<basic_streambuf<char_type, traits_type>*>(ios_base::rdbuf());
}

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI basic_streambuf<_CharT, _Traits>*
basic_ios<_CharT, _Traits>::rdbuf(basic_streambuf<char_type, traits_type>* __sb) {
  basic_streambuf<char_type, traits_type>* __r = rdbuf();
  ios_base::rdbuf(__sb);
  return __r;
}

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI locale basic_ios<_CharT, _Traits>::imbue(const locale& __loc) {
  locale __r = getloc();
  ios_base::imbue(__loc);
  if (rdbuf())
    rdbuf()->pubimbue(__loc);
  return __r;
}

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI char basic_ios<_CharT, _Traits>::narrow(char_type __c, char __dfault) const {
  return std::use_facet<ctype<char_type> >(getloc()).narrow(__c, __dfault);
}

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI _CharT basic_ios<_CharT, _Traits>::widen(char __c) const {
  return std::use_facet<ctype<char_type> >(getloc()).widen(__c);
}

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI _CharT basic_ios<_CharT, _Traits>::fill() const {
  if (!__fill_.__is_set())
    __fill_ = widen(' ');
  return __fill_.__get();
}

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI _CharT basic_ios<_CharT, _Traits>::fill(char_type __ch) {
  if (!__fill_.__is_set())
    __fill_ = widen(' ');
  char_type __r = __fill_.__get();
  __fill_       = __ch;
  return __r;
}

template <class _CharT, class _Traits>
basic_ios<_CharT, _Traits>& basic_ios<_CharT, _Traits>::copyfmt(const basic_ios& __rhs) {
  if (this != std::addressof(__rhs)) {
    __call_callbacks(erase_event);
    ios_base::copyfmt(__rhs);
    __tie_  = __rhs.__tie_;
    __fill_ = __rhs.__fill_;
    __call_callbacks(copyfmt_event);
    exceptions(__rhs.exceptions());
  }
  return *this;
}

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI void basic_ios<_CharT, _Traits>::move(basic_ios& __rhs) {
  ios_base::move(__rhs);
  __tie_       = __rhs.__tie_;
  __rhs.__tie_ = nullptr;
  __fill_      = __rhs.__fill_;
}

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI void basic_ios<_CharT, _Traits>::swap(basic_ios& __rhs) _NOEXCEPT {
  ios_base::swap(__rhs);
  std::swap(__tie_, __rhs.__tie_);
  std::swap(__fill_, __rhs.__fill_);
}

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI void basic_ios<_CharT, _Traits>::set_rdbuf(basic_streambuf<char_type, traits_type>* __sb) {
  ios_base::set_rdbuf(__sb);
}

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<char>;

#    if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<wchar_t>;
#    endif

_LIBCPP_HIDE_FROM_ABI inline ios_base& boolalpha(ios_base& __str) {
  __str.setf(ios_base::boolalpha);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& noboolalpha(ios_base& __str) {
  __str.unsetf(ios_base::boolalpha);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& showbase(ios_base& __str) {
  __str.setf(ios_base::showbase);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& noshowbase(ios_base& __str) {
  __str.unsetf(ios_base::showbase);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& showpoint(ios_base& __str) {
  __str.setf(ios_base::showpoint);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& noshowpoint(ios_base& __str) {
  __str.unsetf(ios_base::showpoint);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& showpos(ios_base& __str) {
  __str.setf(ios_base::showpos);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& noshowpos(ios_base& __str) {
  __str.unsetf(ios_base::showpos);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& skipws(ios_base& __str) {
  __str.setf(ios_base::skipws);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& noskipws(ios_base& __str) {
  __str.unsetf(ios_base::skipws);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& uppercase(ios_base& __str) {
  __str.setf(ios_base::uppercase);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& nouppercase(ios_base& __str) {
  __str.unsetf(ios_base::uppercase);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& unitbuf(ios_base& __str) {
  __str.setf(ios_base::unitbuf);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& nounitbuf(ios_base& __str) {
  __str.unsetf(ios_base::unitbuf);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& internal(ios_base& __str) {
  __str.setf(ios_base::internal, ios_base::adjustfield);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& left(ios_base& __str) {
  __str.setf(ios_base::left, ios_base::adjustfield);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& right(ios_base& __str) {
  __str.setf(ios_base::right, ios_base::adjustfield);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& dec(ios_base& __str) {
  __str.setf(ios_base::dec, ios_base::basefield);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& hex(ios_base& __str) {
  __str.setf(ios_base::hex, ios_base::basefield);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& oct(ios_base& __str) {
  __str.setf(ios_base::oct, ios_base::basefield);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& fixed(ios_base& __str) {
  __str.setf(ios_base::fixed, ios_base::floatfield);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& scientific(ios_base& __str) {
  __str.setf(ios_base::scientific, ios_base::floatfield);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& hexfloat(ios_base& __str) {
  __str.setf(ios_base::fixed | ios_base::scientific, ios_base::floatfield);
  return __str;
}

_LIBCPP_HIDE_FROM_ABI inline ios_base& defaultfloat(ios_base& __str) {
  __str.unsetf(ios_base::floatfield);
  return __str;
}

_LIBCPP_END_NAMESPACE_STD

_LIBCPP_POP_MACROS

#  endif // _LIBCPP_HAS_LOCALIZATION

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

#endif // _LIBCPP_IOS
