10b57cec5SDimitry Andric// -*- C++ -*-
2349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
30b57cec5SDimitry Andric//
40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric//
80b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric
100b57cec5SDimitry Andric#ifndef _LIBCPP_IOMANIP
110b57cec5SDimitry Andric#define _LIBCPP_IOMANIP
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric/*
140b57cec5SDimitry Andric    iomanip synopsis
150b57cec5SDimitry Andric
160b57cec5SDimitry Andricnamespace std {
170b57cec5SDimitry Andric
180b57cec5SDimitry Andric// types T1, T2, ... are unspecified implementation types
190b57cec5SDimitry AndricT1 resetiosflags(ios_base::fmtflags mask);
200b57cec5SDimitry AndricT2 setiosflags (ios_base::fmtflags mask);
210b57cec5SDimitry AndricT3 setbase(int base);
220b57cec5SDimitry Andrictemplate<charT> T4 setfill(charT c);
230b57cec5SDimitry AndricT5 setprecision(int n);
240b57cec5SDimitry AndricT6 setw(int n);
250b57cec5SDimitry Andrictemplate <class moneyT> T7 get_money(moneyT& mon, bool intl = false);
260b57cec5SDimitry Andrictemplate <class charT, class moneyT> T8 put_money(const moneyT& mon, bool intl = false);
270b57cec5SDimitry Andrictemplate <class charT> T9 get_time(struct tm* tmb, const charT* fmt);
280b57cec5SDimitry Andrictemplate <class charT> T10 put_time(const struct tm* tmb, const charT* fmt);
290b57cec5SDimitry Andric
300b57cec5SDimitry Andrictemplate <class charT>
310b57cec5SDimitry Andric  T11 quoted(const charT* s, charT delim=charT('"'), charT escape=charT('\\')); // C++14
320b57cec5SDimitry Andric
330b57cec5SDimitry Andrictemplate <class charT, class traits, class Allocator>
340b57cec5SDimitry Andric  T12 quoted(const basic_string<charT, traits, Allocator>& s,
350b57cec5SDimitry Andric             charT delim=charT('"'), charT escape=charT('\\')); // C++14
360b57cec5SDimitry Andric
370b57cec5SDimitry Andrictemplate <class charT, class traits, class Allocator>
380b57cec5SDimitry Andric  T13 quoted(basic_string<charT, traits, Allocator>& s,
390b57cec5SDimitry Andric             charT delim=charT('"'), charT escape=charT('\\')); // C++14
400b57cec5SDimitry Andric
410b57cec5SDimitry Andric}  // std
420b57cec5SDimitry Andric
430b57cec5SDimitry Andric*/
440b57cec5SDimitry Andric
4581ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler
460b57cec5SDimitry Andric#include <__config>
470b57cec5SDimitry Andric#include <istream>
480b57cec5SDimitry Andric#include <version>
490b57cec5SDimitry Andric
500b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
510b57cec5SDimitry Andric#  pragma GCC system_header
520b57cec5SDimitry Andric#endif
530b57cec5SDimitry Andric
540b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
550b57cec5SDimitry Andric
560b57cec5SDimitry Andric// resetiosflags
570b57cec5SDimitry Andric
58cb14a3feSDimitry Andricclass __iom_t1 {
590b57cec5SDimitry Andric  ios_base::fmtflags __mask_;
60cb14a3feSDimitry Andric
610b57cec5SDimitry Andricpublic:
62cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __iom_t1(ios_base::fmtflags __m) : __mask_(__m) {}
630b57cec5SDimitry Andric
640b57cec5SDimitry Andric  template <class _CharT, class _Traits>
65cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
66cb14a3feSDimitry Andric  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t1& __x) {
670b57cec5SDimitry Andric    __is.unsetf(__x.__mask_);
680b57cec5SDimitry Andric    return __is;
690b57cec5SDimitry Andric  }
700b57cec5SDimitry Andric
710b57cec5SDimitry Andric  template <class _CharT, class _Traits>
72cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
73cb14a3feSDimitry Andric  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t1& __x) {
740b57cec5SDimitry Andric    __os.unsetf(__x.__mask_);
750b57cec5SDimitry Andric    return __os;
760b57cec5SDimitry Andric  }
770b57cec5SDimitry Andric};
780b57cec5SDimitry Andric
79cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t1 resetiosflags(ios_base::fmtflags __mask) { return __iom_t1(__mask); }
800b57cec5SDimitry Andric
810b57cec5SDimitry Andric// setiosflags
820b57cec5SDimitry Andric
83cb14a3feSDimitry Andricclass __iom_t2 {
840b57cec5SDimitry Andric  ios_base::fmtflags __mask_;
85cb14a3feSDimitry Andric
860b57cec5SDimitry Andricpublic:
87cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __iom_t2(ios_base::fmtflags __m) : __mask_(__m) {}
880b57cec5SDimitry Andric
890b57cec5SDimitry Andric  template <class _CharT, class _Traits>
90cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
91cb14a3feSDimitry Andric  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t2& __x) {
920b57cec5SDimitry Andric    __is.setf(__x.__mask_);
930b57cec5SDimitry Andric    return __is;
940b57cec5SDimitry Andric  }
950b57cec5SDimitry Andric
960b57cec5SDimitry Andric  template <class _CharT, class _Traits>
97cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
98cb14a3feSDimitry Andric  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t2& __x) {
990b57cec5SDimitry Andric    __os.setf(__x.__mask_);
1000b57cec5SDimitry Andric    return __os;
1010b57cec5SDimitry Andric  }
1020b57cec5SDimitry Andric};
1030b57cec5SDimitry Andric
104cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t2 setiosflags(ios_base::fmtflags __mask) { return __iom_t2(__mask); }
1050b57cec5SDimitry Andric
1060b57cec5SDimitry Andric// setbase
1070b57cec5SDimitry Andric
108cb14a3feSDimitry Andricclass __iom_t3 {
1090b57cec5SDimitry Andric  int __base_;
110cb14a3feSDimitry Andric
1110b57cec5SDimitry Andricpublic:
112cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __iom_t3(int __b) : __base_(__b) {}
1130b57cec5SDimitry Andric
1140b57cec5SDimitry Andric  template <class _CharT, class _Traits>
115cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
116cb14a3feSDimitry Andric  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t3& __x) {
117cb14a3feSDimitry Andric    __is.setf(__x.__base_ == 8    ? ios_base::oct
118cb14a3feSDimitry Andric              : __x.__base_ == 10 ? ios_base::dec
119cb14a3feSDimitry Andric              : __x.__base_ == 16 ? ios_base::hex
120cb14a3feSDimitry Andric                                  : ios_base::fmtflags(0),
121cb14a3feSDimitry Andric              ios_base::basefield);
1220b57cec5SDimitry Andric    return __is;
1230b57cec5SDimitry Andric  }
1240b57cec5SDimitry Andric
1250b57cec5SDimitry Andric  template <class _CharT, class _Traits>
126cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
127cb14a3feSDimitry Andric  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t3& __x) {
128cb14a3feSDimitry Andric    __os.setf(__x.__base_ == 8    ? ios_base::oct
129cb14a3feSDimitry Andric              : __x.__base_ == 10 ? ios_base::dec
130cb14a3feSDimitry Andric              : __x.__base_ == 16 ? ios_base::hex
131cb14a3feSDimitry Andric                                  : ios_base::fmtflags(0),
132cb14a3feSDimitry Andric              ios_base::basefield);
1330b57cec5SDimitry Andric    return __os;
1340b57cec5SDimitry Andric  }
1350b57cec5SDimitry Andric};
1360b57cec5SDimitry Andric
137cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t3 setbase(int __base) { return __iom_t3(__base); }
1380b57cec5SDimitry Andric
1390b57cec5SDimitry Andric// setfill
1400b57cec5SDimitry Andric
1410b57cec5SDimitry Andrictemplate <class _CharT>
142cb14a3feSDimitry Andricclass __iom_t4 {
1430b57cec5SDimitry Andric  _CharT __fill_;
144cb14a3feSDimitry Andric
1450b57cec5SDimitry Andricpublic:
146cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __iom_t4(_CharT __c) : __fill_(__c) {}
1470b57cec5SDimitry Andric
1480b57cec5SDimitry Andric  template <class _Traits>
149cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
150cb14a3feSDimitry Andric  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t4& __x) {
1510b57cec5SDimitry Andric    __os.fill(__x.__fill_);
1520b57cec5SDimitry Andric    return __os;
1530b57cec5SDimitry Andric  }
1540b57cec5SDimitry Andric};
1550b57cec5SDimitry Andric
1560b57cec5SDimitry Andrictemplate <class _CharT>
157cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t4<_CharT> setfill(_CharT __c) {
1580b57cec5SDimitry Andric  return __iom_t4<_CharT>(__c);
1590b57cec5SDimitry Andric}
1600b57cec5SDimitry Andric
1610b57cec5SDimitry Andric// setprecision
1620b57cec5SDimitry Andric
163cb14a3feSDimitry Andricclass __iom_t5 {
1640b57cec5SDimitry Andric  int __n_;
165cb14a3feSDimitry Andric
1660b57cec5SDimitry Andricpublic:
167cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __iom_t5(int __n) : __n_(__n) {}
1680b57cec5SDimitry Andric
1690b57cec5SDimitry Andric  template <class _CharT, class _Traits>
170cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
171cb14a3feSDimitry Andric  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t5& __x) {
1720b57cec5SDimitry Andric    __is.precision(__x.__n_);
1730b57cec5SDimitry Andric    return __is;
1740b57cec5SDimitry Andric  }
1750b57cec5SDimitry Andric
1760b57cec5SDimitry Andric  template <class _CharT, class _Traits>
177cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
178cb14a3feSDimitry Andric  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t5& __x) {
1790b57cec5SDimitry Andric    __os.precision(__x.__n_);
1800b57cec5SDimitry Andric    return __os;
1810b57cec5SDimitry Andric  }
1820b57cec5SDimitry Andric};
1830b57cec5SDimitry Andric
184cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t5 setprecision(int __n) { return __iom_t5(__n); }
1850b57cec5SDimitry Andric
1860b57cec5SDimitry Andric// setw
1870b57cec5SDimitry Andric
188cb14a3feSDimitry Andricclass __iom_t6 {
1890b57cec5SDimitry Andric  int __n_;
190cb14a3feSDimitry Andric
1910b57cec5SDimitry Andricpublic:
192cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __iom_t6(int __n) : __n_(__n) {}
1930b57cec5SDimitry Andric
1940b57cec5SDimitry Andric  template <class _CharT, class _Traits>
195cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
196cb14a3feSDimitry Andric  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t6& __x) {
1970b57cec5SDimitry Andric    __is.width(__x.__n_);
1980b57cec5SDimitry Andric    return __is;
1990b57cec5SDimitry Andric  }
2000b57cec5SDimitry Andric
2010b57cec5SDimitry Andric  template <class _CharT, class _Traits>
202cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
203cb14a3feSDimitry Andric  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t6& __x) {
2040b57cec5SDimitry Andric    __os.width(__x.__n_);
2050b57cec5SDimitry Andric    return __os;
2060b57cec5SDimitry Andric  }
2070b57cec5SDimitry Andric};
2080b57cec5SDimitry Andric
209cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t6 setw(int __n) { return __iom_t6(__n); }
2100b57cec5SDimitry Andric
2110b57cec5SDimitry Andric// get_money
2120b57cec5SDimitry Andric
213cb14a3feSDimitry Andrictemplate <class _MoneyT>
214cb14a3feSDimitry Andricclass __iom_t7;
2150b57cec5SDimitry Andric
2160b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT>
217bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
2180b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x);
2190b57cec5SDimitry Andric
2200b57cec5SDimitry Andrictemplate <class _MoneyT>
221cb14a3feSDimitry Andricclass __iom_t7 {
2220b57cec5SDimitry Andric  _MoneyT& __mon_;
2230b57cec5SDimitry Andric  bool __intl_;
224cb14a3feSDimitry Andric
2250b57cec5SDimitry Andricpublic:
226cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __iom_t7(_MoneyT& __mon, bool __intl) : __mon_(__mon), __intl_(__intl) {}
2270b57cec5SDimitry Andric
2280b57cec5SDimitry Andric  template <class _CharT, class _Traits, class _Mp>
229cb14a3feSDimitry Andric  friend basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_Mp>& __x);
2300b57cec5SDimitry Andric};
2310b57cec5SDimitry Andric
2320b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT>
233bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
234cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x) {
23506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
236cb14a3feSDimitry Andric  try {
23706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2380b57cec5SDimitry Andric    typename basic_istream<_CharT, _Traits>::sentry __s(__is);
239cb14a3feSDimitry Andric    if (__s) {
2400b57cec5SDimitry Andric      typedef istreambuf_iterator<_CharT, _Traits> _Ip;
2410b57cec5SDimitry Andric      typedef money_get<_CharT, _Ip> _Fp;
2420b57cec5SDimitry Andric      ios_base::iostate __err = ios_base::goodbit;
243bdd1243dSDimitry Andric      const _Fp& __mf         = std::use_facet<_Fp>(__is.getloc());
2440b57cec5SDimitry Andric      __mf.get(_Ip(__is), _Ip(), __x.__intl_, __is, __err, __x.__mon_);
2450b57cec5SDimitry Andric      __is.setstate(__err);
2460b57cec5SDimitry Andric    }
24706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
248cb14a3feSDimitry Andric  } catch (...) {
2490b57cec5SDimitry Andric    __is.__set_badbit_and_consider_rethrow();
2500b57cec5SDimitry Andric  }
25106c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2520b57cec5SDimitry Andric  return __is;
2530b57cec5SDimitry Andric}
2540b57cec5SDimitry Andric
2550b57cec5SDimitry Andrictemplate <class _MoneyT>
256cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t7<_MoneyT> get_money(_MoneyT& __mon, bool __intl = false) {
2570b57cec5SDimitry Andric  return __iom_t7<_MoneyT>(__mon, __intl);
2580b57cec5SDimitry Andric}
2590b57cec5SDimitry Andric
2600b57cec5SDimitry Andric// put_money
2610b57cec5SDimitry Andric
262cb14a3feSDimitry Andrictemplate <class _MoneyT>
263cb14a3feSDimitry Andricclass __iom_t8;
2640b57cec5SDimitry Andric
2650b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT>
266bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
2670b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x);
2680b57cec5SDimitry Andric
2690b57cec5SDimitry Andrictemplate <class _MoneyT>
270cb14a3feSDimitry Andricclass __iom_t8 {
2710b57cec5SDimitry Andric  const _MoneyT& __mon_;
2720b57cec5SDimitry Andric  bool __intl_;
273cb14a3feSDimitry Andric
2740b57cec5SDimitry Andricpublic:
275cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __iom_t8(const _MoneyT& __mon, bool __intl) : __mon_(__mon), __intl_(__intl) {}
2760b57cec5SDimitry Andric
2770b57cec5SDimitry Andric  template <class _CharT, class _Traits, class _Mp>
278cb14a3feSDimitry Andric  friend basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_Mp>& __x);
2790b57cec5SDimitry Andric};
2800b57cec5SDimitry Andric
2810b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT>
282bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
283cb14a3feSDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x) {
28406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
285cb14a3feSDimitry Andric  try {
28606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2870b57cec5SDimitry Andric    typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
288cb14a3feSDimitry Andric    if (__s) {
2890b57cec5SDimitry Andric      typedef ostreambuf_iterator<_CharT, _Traits> _Op;
2900b57cec5SDimitry Andric      typedef money_put<_CharT, _Op> _Fp;
291bdd1243dSDimitry Andric      const _Fp& __mf = std::use_facet<_Fp>(__os.getloc());
2920b57cec5SDimitry Andric      if (__mf.put(_Op(__os), __x.__intl_, __os, __os.fill(), __x.__mon_).failed())
2930b57cec5SDimitry Andric        __os.setstate(ios_base::badbit);
2940b57cec5SDimitry Andric    }
29506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
296cb14a3feSDimitry Andric  } catch (...) {
2970b57cec5SDimitry Andric    __os.__set_badbit_and_consider_rethrow();
2980b57cec5SDimitry Andric  }
29906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3000b57cec5SDimitry Andric  return __os;
3010b57cec5SDimitry Andric}
3020b57cec5SDimitry Andric
3030b57cec5SDimitry Andrictemplate <class _MoneyT>
304cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t8<_MoneyT> put_money(const _MoneyT& __mon, bool __intl = false) {
3050b57cec5SDimitry Andric  return __iom_t8<_MoneyT>(__mon, __intl);
3060b57cec5SDimitry Andric}
3070b57cec5SDimitry Andric
3080b57cec5SDimitry Andric// get_time
3090b57cec5SDimitry Andric
310cb14a3feSDimitry Andrictemplate <class _CharT>
311cb14a3feSDimitry Andricclass __iom_t9;
3120b57cec5SDimitry Andric
3130b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
314bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
3150b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x);
3160b57cec5SDimitry Andric
3170b57cec5SDimitry Andrictemplate <class _CharT>
318cb14a3feSDimitry Andricclass __iom_t9 {
3190b57cec5SDimitry Andric  tm* __tm_;
3200b57cec5SDimitry Andric  const _CharT* __fmt_;
321cb14a3feSDimitry Andric
3220b57cec5SDimitry Andricpublic:
323cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __iom_t9(tm* __tm, const _CharT* __fmt) : __tm_(__tm), __fmt_(__fmt) {}
3240b57cec5SDimitry Andric
3250b57cec5SDimitry Andric  template <class _Cp, class _Traits>
326cb14a3feSDimitry Andric  friend basic_istream<_Cp, _Traits>& operator>>(basic_istream<_Cp, _Traits>& __is, const __iom_t9<_Cp>& __x);
3270b57cec5SDimitry Andric};
3280b57cec5SDimitry Andric
3290b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
330bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
331cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x) {
33206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
333cb14a3feSDimitry Andric  try {
33406c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3350b57cec5SDimitry Andric    typename basic_istream<_CharT, _Traits>::sentry __s(__is);
336cb14a3feSDimitry Andric    if (__s) {
3370b57cec5SDimitry Andric      typedef istreambuf_iterator<_CharT, _Traits> _Ip;
3380b57cec5SDimitry Andric      typedef time_get<_CharT, _Ip> _Fp;
3390b57cec5SDimitry Andric      ios_base::iostate __err = ios_base::goodbit;
340bdd1243dSDimitry Andric      const _Fp& __tf         = std::use_facet<_Fp>(__is.getloc());
341cb14a3feSDimitry Andric      __tf.get(_Ip(__is), _Ip(), __is, __err, __x.__tm_, __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_));
3420b57cec5SDimitry Andric      __is.setstate(__err);
3430b57cec5SDimitry Andric    }
34406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
345cb14a3feSDimitry Andric  } catch (...) {
3460b57cec5SDimitry Andric    __is.__set_badbit_and_consider_rethrow();
3470b57cec5SDimitry Andric  }
34806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3490b57cec5SDimitry Andric  return __is;
3500b57cec5SDimitry Andric}
3510b57cec5SDimitry Andric
3520b57cec5SDimitry Andrictemplate <class _CharT>
353cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t9<_CharT> get_time(tm* __tm, const _CharT* __fmt) {
3540b57cec5SDimitry Andric  return __iom_t9<_CharT>(__tm, __fmt);
3550b57cec5SDimitry Andric}
3560b57cec5SDimitry Andric
3570b57cec5SDimitry Andric// put_time
3580b57cec5SDimitry Andric
359cb14a3feSDimitry Andrictemplate <class _CharT>
360cb14a3feSDimitry Andricclass __iom_t10;
3610b57cec5SDimitry Andric
3620b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
363bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
3640b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x);
3650b57cec5SDimitry Andric
3660b57cec5SDimitry Andrictemplate <class _CharT>
367cb14a3feSDimitry Andricclass __iom_t10 {
3680b57cec5SDimitry Andric  const tm* __tm_;
3690b57cec5SDimitry Andric  const _CharT* __fmt_;
370cb14a3feSDimitry Andric
3710b57cec5SDimitry Andricpublic:
372cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __iom_t10(const tm* __tm, const _CharT* __fmt) : __tm_(__tm), __fmt_(__fmt) {}
3730b57cec5SDimitry Andric
3740b57cec5SDimitry Andric  template <class _Cp, class _Traits>
375cb14a3feSDimitry Andric  friend basic_ostream<_Cp, _Traits>& operator<<(basic_ostream<_Cp, _Traits>& __os, const __iom_t10<_Cp>& __x);
3760b57cec5SDimitry Andric};
3770b57cec5SDimitry Andric
3780b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
379bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
380cb14a3feSDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x) {
38106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
382cb14a3feSDimitry Andric  try {
38306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3840b57cec5SDimitry Andric    typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
385cb14a3feSDimitry Andric    if (__s) {
3860b57cec5SDimitry Andric      typedef ostreambuf_iterator<_CharT, _Traits> _Op;
3870b57cec5SDimitry Andric      typedef time_put<_CharT, _Op> _Fp;
388bdd1243dSDimitry Andric      const _Fp& __tf = std::use_facet<_Fp>(__os.getloc());
389cb14a3feSDimitry Andric      if (__tf.put(_Op(__os), __os, __os.fill(), __x.__tm_, __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_))
390cb14a3feSDimitry Andric              .failed())
3910b57cec5SDimitry Andric        __os.setstate(ios_base::badbit);
3920b57cec5SDimitry Andric    }
39306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
394cb14a3feSDimitry Andric  } catch (...) {
3950b57cec5SDimitry Andric    __os.__set_badbit_and_consider_rethrow();
3960b57cec5SDimitry Andric  }
39706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3980b57cec5SDimitry Andric  return __os;
3990b57cec5SDimitry Andric}
4000b57cec5SDimitry Andric
4010b57cec5SDimitry Andrictemplate <class _CharT>
402cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t10<_CharT> put_time(const tm* __tm, const _CharT* __fmt) {
4030b57cec5SDimitry Andric  return __iom_t10<_CharT>(__tm, __fmt);
4040b57cec5SDimitry Andric}
4050b57cec5SDimitry Andric
40681ad6265SDimitry Andrictemplate <class _CharT, class _Traits>
407cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& __quoted_output(
408cb14a3feSDimitry Andric    basic_ostream<_CharT, _Traits>& __os,
409cb14a3feSDimitry Andric    const _CharT* __first,
410cb14a3feSDimitry Andric    const _CharT* __last,
411cb14a3feSDimitry Andric    _CharT __delim,
412cb14a3feSDimitry Andric    _CharT __escape) {
413fe6060f1SDimitry Andric  basic_string<_CharT, _Traits> __str;
4140b57cec5SDimitry Andric  __str.push_back(__delim);
41581ad6265SDimitry Andric  for (; __first != __last; ++__first) {
4160b57cec5SDimitry Andric    if (_Traits::eq(*__first, __escape) || _Traits::eq(*__first, __delim))
4170b57cec5SDimitry Andric      __str.push_back(__escape);
4180b57cec5SDimitry Andric    __str.push_back(*__first);
4190b57cec5SDimitry Andric  }
4200b57cec5SDimitry Andric  __str.push_back(__delim);
4215f757f3fSDimitry Andric  return std::__put_character_sequence(__os, __str.data(), __str.size());
4220b57cec5SDimitry Andric}
4230b57cec5SDimitry Andric
4240b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _String>
42581ad6265SDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
426cb14a3feSDimitry Andric__quoted_input(basic_istream<_CharT, _Traits>& __is, _String& __string, _CharT __delim, _CharT __escape) {
4270b57cec5SDimitry Andric  __string.clear();
4280b57cec5SDimitry Andric  _CharT __c;
4290b57cec5SDimitry Andric  __is >> __c;
4300b57cec5SDimitry Andric  if (__is.fail())
4310b57cec5SDimitry Andric    return __is;
4320b57cec5SDimitry Andric
43381ad6265SDimitry Andric  if (!_Traits::eq(__c, __delim)) {
43481ad6265SDimitry Andric    // no delimiter, read the whole string
4350b57cec5SDimitry Andric    __is.unget();
4360b57cec5SDimitry Andric    __is >> __string;
4370b57cec5SDimitry Andric    return __is;
4380b57cec5SDimitry Andric  }
4390b57cec5SDimitry Andric
44081ad6265SDimitry Andric  __save_flags<_CharT, _Traits> __sf(__is);
44181ad6265SDimitry Andric  std::noskipws(__is);
44281ad6265SDimitry Andric  while (true) {
4430b57cec5SDimitry Andric    __is >> __c;
4440b57cec5SDimitry Andric    if (__is.fail())
4450b57cec5SDimitry Andric      break;
44681ad6265SDimitry Andric    if (_Traits::eq(__c, __escape)) {
4470b57cec5SDimitry Andric      __is >> __c;
4480b57cec5SDimitry Andric      if (__is.fail())
4490b57cec5SDimitry Andric        break;
45081ad6265SDimitry Andric    } else if (_Traits::eq(__c, __delim))
4510b57cec5SDimitry Andric      break;
4520b57cec5SDimitry Andric    __string.push_back(__c);
4530b57cec5SDimitry Andric  }
4540b57cec5SDimitry Andric  return __is;
4550b57cec5SDimitry Andric}
4560b57cec5SDimitry Andric
45781ad6265SDimitry Andrictemplate <class _CharT, class _Traits>
458cb14a3feSDimitry Andricstruct _LIBCPP_HIDDEN __quoted_output_proxy {
45981ad6265SDimitry Andric  const _CharT* __first_;
46081ad6265SDimitry Andric  const _CharT* __last_;
46181ad6265SDimitry Andric  _CharT __delim_;
46281ad6265SDimitry Andric  _CharT __escape_;
46381ad6265SDimitry Andric
464cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __quoted_output_proxy(const _CharT* __f, const _CharT* __l, _CharT __d, _CharT __e)
46581ad6265SDimitry Andric      : __first_(__f), __last_(__l), __delim_(__d), __escape_(__e) {}
46681ad6265SDimitry Andric
46781ad6265SDimitry Andric  template <class _T2, __enable_if_t<_IsSame<_Traits, void>::value || _IsSame<_Traits, _T2>::value>* = nullptr>
46881ad6265SDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _T2>&
46981ad6265SDimitry Andric  operator<<(basic_ostream<_CharT, _T2>& __os, const __quoted_output_proxy& __p) {
47081ad6265SDimitry Andric    return std::__quoted_output(__os, __p.__first_, __p.__last_, __p.__delim_, __p.__escape_);
4710b57cec5SDimitry Andric  }
4720b57cec5SDimitry Andric};
4730b57cec5SDimitry Andric
4740b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
475cb14a3feSDimitry Andricstruct _LIBCPP_HIDDEN __quoted_proxy {
47681ad6265SDimitry Andric  basic_string<_CharT, _Traits, _Allocator>& __string_;
47781ad6265SDimitry Andric  _CharT __delim_;
47881ad6265SDimitry Andric  _CharT __escape_;
47981ad6265SDimitry Andric
480cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __quoted_proxy(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __d, _CharT __e)
48181ad6265SDimitry Andric      : __string_(__s), __delim_(__d), __escape_(__e) {}
48281ad6265SDimitry Andric
48381ad6265SDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
48481ad6265SDimitry Andric  operator<<(basic_ostream<_CharT, _Traits>& __os, const __quoted_proxy& __p) {
485cb14a3feSDimitry Andric    return std::__quoted_output(
486cb14a3feSDimitry Andric        __os, __p.__string_.data(), __p.__string_.data() + __p.__string_.size(), __p.__delim_, __p.__escape_);
4870b57cec5SDimitry Andric  }
4880b57cec5SDimitry Andric
48981ad6265SDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
49081ad6265SDimitry Andric  operator>>(basic_istream<_CharT, _Traits>& __is, const __quoted_proxy& __p) {
49181ad6265SDimitry Andric    return std::__quoted_input(__is, __p.__string_, __p.__delim_, __p.__escape_);
4920b57cec5SDimitry Andric  }
49381ad6265SDimitry Andric};
4940b57cec5SDimitry Andric
4950b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
496cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI __quoted_output_proxy<_CharT, _Traits>
497cb14a3feSDimitry Andric__quoted(const basic_string<_CharT, _Traits, _Allocator>& __s,
498cb14a3feSDimitry Andric         _CharT __delim  = _CharT('"'),
499cb14a3feSDimitry Andric         _CharT __escape = _CharT('\\')) {
50081ad6265SDimitry Andric  return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape);
5010b57cec5SDimitry Andric}
5020b57cec5SDimitry Andric
5030b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
504cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI __quoted_proxy<_CharT, _Traits, _Allocator>
505cb14a3feSDimitry Andric__quoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {
5060b57cec5SDimitry Andric  return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape);
5070b57cec5SDimitry Andric}
5080b57cec5SDimitry Andric
50906c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 14
5100b57cec5SDimitry Andric
51181ad6265SDimitry Andrictemplate <class _CharT>
512cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI auto quoted(const _CharT* __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {
51381ad6265SDimitry Andric  const _CharT* __end = __s;
514cb14a3feSDimitry Andric  while (*__end)
515cb14a3feSDimitry Andric    ++__end;
51681ad6265SDimitry Andric  return __quoted_output_proxy<_CharT, void>(__s, __end, __delim, __escape);
5170b57cec5SDimitry Andric}
5180b57cec5SDimitry Andric
5190b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
520cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI auto
521cb14a3feSDimitry Andricquoted(const basic_string<_CharT, _Traits, _Allocator>& __s,
522cb14a3feSDimitry Andric       _CharT __delim  = _CharT('"'),
523cb14a3feSDimitry Andric       _CharT __escape = _CharT('\\')) {
52481ad6265SDimitry Andric  return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape);
52581ad6265SDimitry Andric}
52681ad6265SDimitry Andric
52781ad6265SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
528cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI auto
529cb14a3feSDimitry Andricquoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {
53081ad6265SDimitry Andric  return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape);
5310b57cec5SDimitry Andric}
5320b57cec5SDimitry Andric
5330b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
534cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI auto
535cb14a3feSDimitry Andricquoted(basic_string_view<_CharT, _Traits> __sv, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {
53681ad6265SDimitry Andric  return __quoted_output_proxy<_CharT, _Traits>(__sv.data(), __sv.data() + __sv.size(), __delim, __escape);
5370b57cec5SDimitry Andric}
53881ad6265SDimitry Andric
53906c3fb27SDimitry Andric#endif // _LIBCPP_STD_VER >= 14
5400b57cec5SDimitry Andric
5410b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
5420b57cec5SDimitry Andric
5430b57cec5SDimitry Andric#endif // _LIBCPP_IOMANIP
544