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

*/

#include <__config>

#if !defined(_LIBCPP_HAS_NO_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 defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_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 = _FillHelper<traits_type>;
#  else
  using _FillType = _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>;

#  ifndef _LIBCPP_HAS_NO_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 // !defined(_LIBCPP_HAS_NO_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 // _LIBCPP_IOS
