// -*- 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_IOMANIP
#define _LIBCPP_IOMANIP

/*
    iomanip synopsis

namespace std {

// types T1, T2, ... are unspecified implementation types
T1 resetiosflags(ios_base::fmtflags mask);
T2 setiosflags (ios_base::fmtflags mask);
T3 setbase(int base);
template<charT> T4 setfill(charT c);
T5 setprecision(int n);
T6 setw(int n);
template <class moneyT> T7 get_money(moneyT& mon, bool intl = false);
template <class charT, class moneyT> T8 put_money(const moneyT& mon, bool intl = false);
template <class charT> T9 get_time(struct tm* tmb, const charT* fmt);
template <class charT> T10 put_time(const struct tm* tmb, const charT* fmt);

template <class charT>
  T11 quoted(const charT* s, charT delim=charT('"'), charT escape=charT('\\')); // C++14

template <class charT, class traits, class Allocator>
  T12 quoted(const basic_string<charT, traits, Allocator>& s,
             charT delim=charT('"'), charT escape=charT('\\')); // C++14

template <class charT, class traits, class Allocator>
  T13 quoted(basic_string<charT, traits, Allocator>& s,
             charT delim=charT('"'), charT escape=charT('\\')); // C++14

}  // std

*/

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

#  if _LIBCPP_HAS_LOCALIZATION

#    include <__iterator/istreambuf_iterator.h>
#    include <__locale_dir/money.h>
#    include <__locale_dir/time.h>
#    include <__ostream/put_character_sequence.h>
#    include <ios>
#    include <iosfwd>
#    include <version>

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

_LIBCPP_BEGIN_NAMESPACE_STD

// resetiosflags

class __iom_t1 {
  ios_base::fmtflags __mask_;

public:
  _LIBCPP_HIDE_FROM_ABI explicit __iom_t1(ios_base::fmtflags __m) : __mask_(__m) {}

  template <class _CharT, class _Traits>
  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t1& __x) {
    __is.unsetf(__x.__mask_);
    return __is;
  }

  template <class _CharT, class _Traits>
  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t1& __x) {
    __os.unsetf(__x.__mask_);
    return __os;
  }
};

inline _LIBCPP_HIDE_FROM_ABI __iom_t1 resetiosflags(ios_base::fmtflags __mask) { return __iom_t1(__mask); }

// setiosflags

class __iom_t2 {
  ios_base::fmtflags __mask_;

public:
  _LIBCPP_HIDE_FROM_ABI explicit __iom_t2(ios_base::fmtflags __m) : __mask_(__m) {}

  template <class _CharT, class _Traits>
  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t2& __x) {
    __is.setf(__x.__mask_);
    return __is;
  }

  template <class _CharT, class _Traits>
  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t2& __x) {
    __os.setf(__x.__mask_);
    return __os;
  }
};

inline _LIBCPP_HIDE_FROM_ABI __iom_t2 setiosflags(ios_base::fmtflags __mask) { return __iom_t2(__mask); }

// setbase

class __iom_t3 {
  int __base_;

public:
  _LIBCPP_HIDE_FROM_ABI explicit __iom_t3(int __b) : __base_(__b) {}

  template <class _CharT, class _Traits>
  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t3& __x) {
    __is.setf(__x.__base_ == 8    ? ios_base::oct
              : __x.__base_ == 10 ? ios_base::dec
              : __x.__base_ == 16 ? ios_base::hex
                                  : ios_base::fmtflags(0),
              ios_base::basefield);
    return __is;
  }

  template <class _CharT, class _Traits>
  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t3& __x) {
    __os.setf(__x.__base_ == 8    ? ios_base::oct
              : __x.__base_ == 10 ? ios_base::dec
              : __x.__base_ == 16 ? ios_base::hex
                                  : ios_base::fmtflags(0),
              ios_base::basefield);
    return __os;
  }
};

inline _LIBCPP_HIDE_FROM_ABI __iom_t3 setbase(int __base) { return __iom_t3(__base); }

// setfill

template <class _CharT>
class __iom_t4 {
  _CharT __fill_;

public:
  _LIBCPP_HIDE_FROM_ABI explicit __iom_t4(_CharT __c) : __fill_(__c) {}

  template <class _Traits>
  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t4& __x) {
    __os.fill(__x.__fill_);
    return __os;
  }
};

template <class _CharT>
inline _LIBCPP_HIDE_FROM_ABI __iom_t4<_CharT> setfill(_CharT __c) {
  return __iom_t4<_CharT>(__c);
}

// setprecision

class __iom_t5 {
  int __n_;

public:
  _LIBCPP_HIDE_FROM_ABI explicit __iom_t5(int __n) : __n_(__n) {}

  template <class _CharT, class _Traits>
  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t5& __x) {
    __is.precision(__x.__n_);
    return __is;
  }

  template <class _CharT, class _Traits>
  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t5& __x) {
    __os.precision(__x.__n_);
    return __os;
  }
};

inline _LIBCPP_HIDE_FROM_ABI __iom_t5 setprecision(int __n) { return __iom_t5(__n); }

// setw

class __iom_t6 {
  int __n_;

public:
  _LIBCPP_HIDE_FROM_ABI explicit __iom_t6(int __n) : __n_(__n) {}

  template <class _CharT, class _Traits>
  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t6& __x) {
    __is.width(__x.__n_);
    return __is;
  }

  template <class _CharT, class _Traits>
  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t6& __x) {
    __os.width(__x.__n_);
    return __os;
  }
};

inline _LIBCPP_HIDE_FROM_ABI __iom_t6 setw(int __n) { return __iom_t6(__n); }

// get_money

template <class _MoneyT>
class __iom_t7;

template <class _CharT, class _Traits, class _MoneyT>
_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x);

template <class _MoneyT>
class __iom_t7 {
  _MoneyT& __mon_;
  bool __intl_;

public:
  _LIBCPP_HIDE_FROM_ABI __iom_t7(_MoneyT& __mon, bool __intl) : __mon_(__mon), __intl_(__intl) {}

  template <class _CharT, class _Traits, class _Mp>
  friend basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_Mp>& __x);
};

template <class _CharT, class _Traits, class _MoneyT>
_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x) {
#    if _LIBCPP_HAS_EXCEPTIONS
  try {
#    endif // _LIBCPP_HAS_EXCEPTIONS
    typename basic_istream<_CharT, _Traits>::sentry __s(__is);
    if (__s) {
      typedef istreambuf_iterator<_CharT, _Traits> _Ip;
      typedef money_get<_CharT, _Ip> _Fp;
      ios_base::iostate __err = ios_base::goodbit;
      const _Fp& __mf         = std::use_facet<_Fp>(__is.getloc());
      __mf.get(_Ip(__is), _Ip(), __x.__intl_, __is, __err, __x.__mon_);
      __is.setstate(__err);
    }
#    if _LIBCPP_HAS_EXCEPTIONS
  } catch (...) {
    __is.__set_badbit_and_consider_rethrow();
  }
#    endif // _LIBCPP_HAS_EXCEPTIONS
  return __is;
}

template <class _MoneyT>
inline _LIBCPP_HIDE_FROM_ABI __iom_t7<_MoneyT> get_money(_MoneyT& __mon, bool __intl = false) {
  return __iom_t7<_MoneyT>(__mon, __intl);
}

// put_money

template <class _MoneyT>
class __iom_t8;

template <class _CharT, class _Traits, class _MoneyT>
_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x);

template <class _MoneyT>
class __iom_t8 {
  const _MoneyT& __mon_;
  bool __intl_;

public:
  _LIBCPP_HIDE_FROM_ABI __iom_t8(const _MoneyT& __mon, bool __intl) : __mon_(__mon), __intl_(__intl) {}

  template <class _CharT, class _Traits, class _Mp>
  friend basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_Mp>& __x);
};

template <class _CharT, class _Traits, class _MoneyT>
_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x) {
#    if _LIBCPP_HAS_EXCEPTIONS
  try {
#    endif // _LIBCPP_HAS_EXCEPTIONS
    typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
    if (__s) {
      typedef ostreambuf_iterator<_CharT, _Traits> _Op;
      typedef money_put<_CharT, _Op> _Fp;
      const _Fp& __mf = std::use_facet<_Fp>(__os.getloc());
      if (__mf.put(_Op(__os), __x.__intl_, __os, __os.fill(), __x.__mon_).failed())
        __os.setstate(ios_base::badbit);
    }
#    if _LIBCPP_HAS_EXCEPTIONS
  } catch (...) {
    __os.__set_badbit_and_consider_rethrow();
  }
#    endif // _LIBCPP_HAS_EXCEPTIONS
  return __os;
}

template <class _MoneyT>
inline _LIBCPP_HIDE_FROM_ABI __iom_t8<_MoneyT> put_money(const _MoneyT& __mon, bool __intl = false) {
  return __iom_t8<_MoneyT>(__mon, __intl);
}

// get_time

template <class _CharT>
class __iom_t9;

template <class _CharT, class _Traits>
_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x);

template <class _CharT>
class __iom_t9 {
  tm* __tm_;
  const _CharT* __fmt_;

public:
  _LIBCPP_HIDE_FROM_ABI __iom_t9(tm* __tm, const _CharT* __fmt) : __tm_(__tm), __fmt_(__fmt) {}

  template <class _Cp, class _Traits>
  friend basic_istream<_Cp, _Traits>& operator>>(basic_istream<_Cp, _Traits>& __is, const __iom_t9<_Cp>& __x);
};

template <class _CharT, class _Traits>
_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x) {
#    if _LIBCPP_HAS_EXCEPTIONS
  try {
#    endif // _LIBCPP_HAS_EXCEPTIONS
    typename basic_istream<_CharT, _Traits>::sentry __s(__is);
    if (__s) {
      typedef istreambuf_iterator<_CharT, _Traits> _Ip;
      typedef time_get<_CharT, _Ip> _Fp;
      ios_base::iostate __err = ios_base::goodbit;
      const _Fp& __tf         = std::use_facet<_Fp>(__is.getloc());
      __tf.get(_Ip(__is), _Ip(), __is, __err, __x.__tm_, __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_));
      __is.setstate(__err);
    }
#    if _LIBCPP_HAS_EXCEPTIONS
  } catch (...) {
    __is.__set_badbit_and_consider_rethrow();
  }
#    endif // _LIBCPP_HAS_EXCEPTIONS
  return __is;
}

template <class _CharT>
inline _LIBCPP_HIDE_FROM_ABI __iom_t9<_CharT> get_time(tm* __tm, const _CharT* __fmt) {
  return __iom_t9<_CharT>(__tm, __fmt);
}

// put_time

template <class _CharT>
class __iom_t10;

template <class _CharT, class _Traits>
_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x);

template <class _CharT>
class __iom_t10 {
  const tm* __tm_;
  const _CharT* __fmt_;

public:
  _LIBCPP_HIDE_FROM_ABI __iom_t10(const tm* __tm, const _CharT* __fmt) : __tm_(__tm), __fmt_(__fmt) {}

  template <class _Cp, class _Traits>
  friend basic_ostream<_Cp, _Traits>& operator<<(basic_ostream<_Cp, _Traits>& __os, const __iom_t10<_Cp>& __x);
};

template <class _CharT, class _Traits>
_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x) {
#    if _LIBCPP_HAS_EXCEPTIONS
  try {
#    endif // _LIBCPP_HAS_EXCEPTIONS
    typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
    if (__s) {
      typedef ostreambuf_iterator<_CharT, _Traits> _Op;
      typedef time_put<_CharT, _Op> _Fp;
      const _Fp& __tf = std::use_facet<_Fp>(__os.getloc());
      if (__tf.put(_Op(__os), __os, __os.fill(), __x.__tm_, __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_))
              .failed())
        __os.setstate(ios_base::badbit);
    }
#    if _LIBCPP_HAS_EXCEPTIONS
  } catch (...) {
    __os.__set_badbit_and_consider_rethrow();
  }
#    endif // _LIBCPP_HAS_EXCEPTIONS
  return __os;
}

template <class _CharT>
inline _LIBCPP_HIDE_FROM_ABI __iom_t10<_CharT> put_time(const tm* __tm, const _CharT* __fmt) {
  return __iom_t10<_CharT>(__tm, __fmt);
}

template <class _CharT, class _Traits>
_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& __quoted_output(
    basic_ostream<_CharT, _Traits>& __os,
    const _CharT* __first,
    const _CharT* __last,
    _CharT __delim,
    _CharT __escape) {
  basic_string<_CharT, _Traits> __str;
  __str.push_back(__delim);
  for (; __first != __last; ++__first) {
    if (_Traits::eq(*__first, __escape) || _Traits::eq(*__first, __delim))
      __str.push_back(__escape);
    __str.push_back(*__first);
  }
  __str.push_back(__delim);
  return std::__put_character_sequence(__os, __str.data(), __str.size());
}

template <class _CharT, class _Traits, class _String>
_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
__quoted_input(basic_istream<_CharT, _Traits>& __is, _String& __string, _CharT __delim, _CharT __escape) {
  __string.clear();
  _CharT __c;
  __is >> __c;
  if (__is.fail())
    return __is;

  if (!_Traits::eq(__c, __delim)) {
    // no delimiter, read the whole string
    __is.unget();
    __is >> __string;
    return __is;
  }

  __save_flags<_CharT, _Traits> __sf(__is);
  std::noskipws(__is);
  while (true) {
    __is >> __c;
    if (__is.fail())
      break;
    if (_Traits::eq(__c, __escape)) {
      __is >> __c;
      if (__is.fail())
        break;
    } else if (_Traits::eq(__c, __delim))
      break;
    __string.push_back(__c);
  }
  return __is;
}

template <class _CharT, class _Traits>
struct _LIBCPP_HIDDEN __quoted_output_proxy {
  const _CharT* __first_;
  const _CharT* __last_;
  _CharT __delim_;
  _CharT __escape_;

  _LIBCPP_HIDE_FROM_ABI explicit __quoted_output_proxy(const _CharT* __f, const _CharT* __l, _CharT __d, _CharT __e)
      : __first_(__f), __last_(__l), __delim_(__d), __escape_(__e) {}

  template <class _T2, __enable_if_t<_IsSame<_Traits, void>::value || _IsSame<_Traits, _T2>::value, int> = 0>
  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _T2>&
  operator<<(basic_ostream<_CharT, _T2>& __os, const __quoted_output_proxy& __p) {
    return std::__quoted_output(__os, __p.__first_, __p.__last_, __p.__delim_, __p.__escape_);
  }
};

template <class _CharT, class _Traits, class _Allocator>
struct _LIBCPP_HIDDEN __quoted_proxy {
  basic_string<_CharT, _Traits, _Allocator>& __string_;
  _CharT __delim_;
  _CharT __escape_;

  _LIBCPP_HIDE_FROM_ABI explicit __quoted_proxy(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __d, _CharT __e)
      : __string_(__s), __delim_(__d), __escape_(__e) {}

  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
  operator<<(basic_ostream<_CharT, _Traits>& __os, const __quoted_proxy& __p) {
    return std::__quoted_output(
        __os, __p.__string_.data(), __p.__string_.data() + __p.__string_.size(), __p.__delim_, __p.__escape_);
  }

  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
  operator>>(basic_istream<_CharT, _Traits>& __is, const __quoted_proxy& __p) {
    return std::__quoted_input(__is, __p.__string_, __p.__delim_, __p.__escape_);
  }
};

template <class _CharT, class _Traits, class _Allocator>
_LIBCPP_HIDE_FROM_ABI __quoted_output_proxy<_CharT, _Traits>
__quoted(const basic_string<_CharT, _Traits, _Allocator>& __s,
         _CharT __delim  = _CharT('"'),
         _CharT __escape = _CharT('\\')) {
  return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape);
}

template <class _CharT, class _Traits, class _Allocator>
_LIBCPP_HIDE_FROM_ABI __quoted_proxy<_CharT, _Traits, _Allocator>
__quoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {
  return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape);
}

#    if _LIBCPP_STD_VER >= 14

template <class _CharT>
_LIBCPP_HIDE_FROM_ABI auto quoted(const _CharT* __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {
  const _CharT* __end = __s;
  while (*__end)
    ++__end;
  return __quoted_output_proxy<_CharT, void>(__s, __end, __delim, __escape);
}

template <class _CharT, class _Traits, class _Allocator>
_LIBCPP_HIDE_FROM_ABI auto
quoted(const basic_string<_CharT, _Traits, _Allocator>& __s,
       _CharT __delim  = _CharT('"'),
       _CharT __escape = _CharT('\\')) {
  return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape);
}

template <class _CharT, class _Traits, class _Allocator>
_LIBCPP_HIDE_FROM_ABI auto
quoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {
  return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape);
}

template <class _CharT, class _Traits>
_LIBCPP_HIDE_FROM_ABI auto
quoted(basic_string_view<_CharT, _Traits> __sv, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {
  return __quoted_output_proxy<_CharT, _Traits>(__sv.data(), __sv.data() + __sv.size(), __delim, __escape);
}

#    endif // _LIBCPP_STD_VER >= 14

_LIBCPP_END_NAMESPACE_STD

#  endif // _LIBCPP_HAS_LOCALIZATION

#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
#    include <array>
#    include <bitset>
#    include <deque>
#    include <format>
#    include <functional>
#    include <istream>
#    include <ostream>
#    include <print>
#    include <queue>
#    include <stack>
#    include <unordered_map>
#    include <vector>
#  endif

#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 23
#    include <locale>
#  endif

#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)

#endif // _LIBCPP_IOMANIP
