xref: /freebsd/contrib/llvm-project/libcxx/include/iomanip (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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
450b57cec5SDimitry Andric#include <__config>
460b57cec5SDimitry Andric#include <istream>
470b57cec5SDimitry Andric#include <version>
480b57cec5SDimitry Andric
490b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
500b57cec5SDimitry Andric#  pragma GCC system_header
510b57cec5SDimitry Andric#endif
520b57cec5SDimitry Andric
530b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
540b57cec5SDimitry Andric
550b57cec5SDimitry Andric// resetiosflags
560b57cec5SDimitry Andric
57cb14a3feSDimitry Andricclass __iom_t1 {
580b57cec5SDimitry Andric  ios_base::fmtflags __mask_;
59cb14a3feSDimitry Andric
600b57cec5SDimitry Andricpublic:
61cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __iom_t1(ios_base::fmtflags __m) : __mask_(__m) {}
620b57cec5SDimitry Andric
630b57cec5SDimitry Andric  template <class _CharT, class _Traits>
64cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
65cb14a3feSDimitry Andric  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t1& __x) {
660b57cec5SDimitry Andric    __is.unsetf(__x.__mask_);
670b57cec5SDimitry Andric    return __is;
680b57cec5SDimitry Andric  }
690b57cec5SDimitry Andric
700b57cec5SDimitry Andric  template <class _CharT, class _Traits>
71cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
72cb14a3feSDimitry Andric  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t1& __x) {
730b57cec5SDimitry Andric    __os.unsetf(__x.__mask_);
740b57cec5SDimitry Andric    return __os;
750b57cec5SDimitry Andric  }
760b57cec5SDimitry Andric};
770b57cec5SDimitry Andric
78cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t1 resetiosflags(ios_base::fmtflags __mask) { return __iom_t1(__mask); }
790b57cec5SDimitry Andric
800b57cec5SDimitry Andric// setiosflags
810b57cec5SDimitry Andric
82cb14a3feSDimitry Andricclass __iom_t2 {
830b57cec5SDimitry Andric  ios_base::fmtflags __mask_;
84cb14a3feSDimitry Andric
850b57cec5SDimitry Andricpublic:
86cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __iom_t2(ios_base::fmtflags __m) : __mask_(__m) {}
870b57cec5SDimitry Andric
880b57cec5SDimitry Andric  template <class _CharT, class _Traits>
89cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
90cb14a3feSDimitry Andric  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t2& __x) {
910b57cec5SDimitry Andric    __is.setf(__x.__mask_);
920b57cec5SDimitry Andric    return __is;
930b57cec5SDimitry Andric  }
940b57cec5SDimitry Andric
950b57cec5SDimitry Andric  template <class _CharT, class _Traits>
96cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
97cb14a3feSDimitry Andric  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t2& __x) {
980b57cec5SDimitry Andric    __os.setf(__x.__mask_);
990b57cec5SDimitry Andric    return __os;
1000b57cec5SDimitry Andric  }
1010b57cec5SDimitry Andric};
1020b57cec5SDimitry Andric
103cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t2 setiosflags(ios_base::fmtflags __mask) { return __iom_t2(__mask); }
1040b57cec5SDimitry Andric
1050b57cec5SDimitry Andric// setbase
1060b57cec5SDimitry Andric
107cb14a3feSDimitry Andricclass __iom_t3 {
1080b57cec5SDimitry Andric  int __base_;
109cb14a3feSDimitry Andric
1100b57cec5SDimitry Andricpublic:
111cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __iom_t3(int __b) : __base_(__b) {}
1120b57cec5SDimitry Andric
1130b57cec5SDimitry Andric  template <class _CharT, class _Traits>
114cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
115cb14a3feSDimitry Andric  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t3& __x) {
116cb14a3feSDimitry Andric    __is.setf(__x.__base_ == 8    ? ios_base::oct
117cb14a3feSDimitry Andric              : __x.__base_ == 10 ? ios_base::dec
118cb14a3feSDimitry Andric              : __x.__base_ == 16 ? ios_base::hex
119cb14a3feSDimitry Andric                                  : ios_base::fmtflags(0),
120cb14a3feSDimitry Andric              ios_base::basefield);
1210b57cec5SDimitry Andric    return __is;
1220b57cec5SDimitry Andric  }
1230b57cec5SDimitry Andric
1240b57cec5SDimitry Andric  template <class _CharT, class _Traits>
125cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
126cb14a3feSDimitry Andric  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t3& __x) {
127cb14a3feSDimitry Andric    __os.setf(__x.__base_ == 8    ? ios_base::oct
128cb14a3feSDimitry Andric              : __x.__base_ == 10 ? ios_base::dec
129cb14a3feSDimitry Andric              : __x.__base_ == 16 ? ios_base::hex
130cb14a3feSDimitry Andric                                  : ios_base::fmtflags(0),
131cb14a3feSDimitry Andric              ios_base::basefield);
1320b57cec5SDimitry Andric    return __os;
1330b57cec5SDimitry Andric  }
1340b57cec5SDimitry Andric};
1350b57cec5SDimitry Andric
136cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t3 setbase(int __base) { return __iom_t3(__base); }
1370b57cec5SDimitry Andric
1380b57cec5SDimitry Andric// setfill
1390b57cec5SDimitry Andric
1400b57cec5SDimitry Andrictemplate <class _CharT>
141cb14a3feSDimitry Andricclass __iom_t4 {
1420b57cec5SDimitry Andric  _CharT __fill_;
143cb14a3feSDimitry Andric
1440b57cec5SDimitry Andricpublic:
145cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __iom_t4(_CharT __c) : __fill_(__c) {}
1460b57cec5SDimitry Andric
1470b57cec5SDimitry Andric  template <class _Traits>
148cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
149cb14a3feSDimitry Andric  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t4& __x) {
1500b57cec5SDimitry Andric    __os.fill(__x.__fill_);
1510b57cec5SDimitry Andric    return __os;
1520b57cec5SDimitry Andric  }
1530b57cec5SDimitry Andric};
1540b57cec5SDimitry Andric
1550b57cec5SDimitry Andrictemplate <class _CharT>
156cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t4<_CharT> setfill(_CharT __c) {
1570b57cec5SDimitry Andric  return __iom_t4<_CharT>(__c);
1580b57cec5SDimitry Andric}
1590b57cec5SDimitry Andric
1600b57cec5SDimitry Andric// setprecision
1610b57cec5SDimitry Andric
162cb14a3feSDimitry Andricclass __iom_t5 {
1630b57cec5SDimitry Andric  int __n_;
164cb14a3feSDimitry Andric
1650b57cec5SDimitry Andricpublic:
166cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __iom_t5(int __n) : __n_(__n) {}
1670b57cec5SDimitry Andric
1680b57cec5SDimitry Andric  template <class _CharT, class _Traits>
169cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
170cb14a3feSDimitry Andric  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t5& __x) {
1710b57cec5SDimitry Andric    __is.precision(__x.__n_);
1720b57cec5SDimitry Andric    return __is;
1730b57cec5SDimitry Andric  }
1740b57cec5SDimitry Andric
1750b57cec5SDimitry Andric  template <class _CharT, class _Traits>
176cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
177cb14a3feSDimitry Andric  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t5& __x) {
1780b57cec5SDimitry Andric    __os.precision(__x.__n_);
1790b57cec5SDimitry Andric    return __os;
1800b57cec5SDimitry Andric  }
1810b57cec5SDimitry Andric};
1820b57cec5SDimitry Andric
183cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t5 setprecision(int __n) { return __iom_t5(__n); }
1840b57cec5SDimitry Andric
1850b57cec5SDimitry Andric// setw
1860b57cec5SDimitry Andric
187cb14a3feSDimitry Andricclass __iom_t6 {
1880b57cec5SDimitry Andric  int __n_;
189cb14a3feSDimitry Andric
1900b57cec5SDimitry Andricpublic:
191cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __iom_t6(int __n) : __n_(__n) {}
1920b57cec5SDimitry Andric
1930b57cec5SDimitry Andric  template <class _CharT, class _Traits>
194cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
195cb14a3feSDimitry Andric  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t6& __x) {
1960b57cec5SDimitry Andric    __is.width(__x.__n_);
1970b57cec5SDimitry Andric    return __is;
1980b57cec5SDimitry Andric  }
1990b57cec5SDimitry Andric
2000b57cec5SDimitry Andric  template <class _CharT, class _Traits>
201cb14a3feSDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
202cb14a3feSDimitry Andric  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t6& __x) {
2030b57cec5SDimitry Andric    __os.width(__x.__n_);
2040b57cec5SDimitry Andric    return __os;
2050b57cec5SDimitry Andric  }
2060b57cec5SDimitry Andric};
2070b57cec5SDimitry Andric
208cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t6 setw(int __n) { return __iom_t6(__n); }
2090b57cec5SDimitry Andric
2100b57cec5SDimitry Andric// get_money
2110b57cec5SDimitry Andric
212cb14a3feSDimitry Andrictemplate <class _MoneyT>
213cb14a3feSDimitry Andricclass __iom_t7;
2140b57cec5SDimitry Andric
2150b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT>
216bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
2170b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x);
2180b57cec5SDimitry Andric
2190b57cec5SDimitry Andrictemplate <class _MoneyT>
220cb14a3feSDimitry Andricclass __iom_t7 {
2210b57cec5SDimitry Andric  _MoneyT& __mon_;
2220b57cec5SDimitry Andric  bool __intl_;
223cb14a3feSDimitry Andric
2240b57cec5SDimitry Andricpublic:
225cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __iom_t7(_MoneyT& __mon, bool __intl) : __mon_(__mon), __intl_(__intl) {}
2260b57cec5SDimitry Andric
2270b57cec5SDimitry Andric  template <class _CharT, class _Traits, class _Mp>
228cb14a3feSDimitry Andric  friend basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_Mp>& __x);
2290b57cec5SDimitry Andric};
2300b57cec5SDimitry Andric
2310b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT>
232bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
233cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x) {
23406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
235cb14a3feSDimitry Andric  try {
23606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2370b57cec5SDimitry Andric    typename basic_istream<_CharT, _Traits>::sentry __s(__is);
238cb14a3feSDimitry Andric    if (__s) {
2390b57cec5SDimitry Andric      typedef istreambuf_iterator<_CharT, _Traits> _Ip;
2400b57cec5SDimitry Andric      typedef money_get<_CharT, _Ip> _Fp;
2410b57cec5SDimitry Andric      ios_base::iostate __err = ios_base::goodbit;
242bdd1243dSDimitry Andric      const _Fp& __mf         = std::use_facet<_Fp>(__is.getloc());
2430b57cec5SDimitry Andric      __mf.get(_Ip(__is), _Ip(), __x.__intl_, __is, __err, __x.__mon_);
2440b57cec5SDimitry Andric      __is.setstate(__err);
2450b57cec5SDimitry Andric    }
24606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
247cb14a3feSDimitry Andric  } catch (...) {
2480b57cec5SDimitry Andric    __is.__set_badbit_and_consider_rethrow();
2490b57cec5SDimitry Andric  }
25006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2510b57cec5SDimitry Andric  return __is;
2520b57cec5SDimitry Andric}
2530b57cec5SDimitry Andric
2540b57cec5SDimitry Andrictemplate <class _MoneyT>
255cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t7<_MoneyT> get_money(_MoneyT& __mon, bool __intl = false) {
2560b57cec5SDimitry Andric  return __iom_t7<_MoneyT>(__mon, __intl);
2570b57cec5SDimitry Andric}
2580b57cec5SDimitry Andric
2590b57cec5SDimitry Andric// put_money
2600b57cec5SDimitry Andric
261cb14a3feSDimitry Andrictemplate <class _MoneyT>
262cb14a3feSDimitry Andricclass __iom_t8;
2630b57cec5SDimitry Andric
2640b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT>
265bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
2660b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x);
2670b57cec5SDimitry Andric
2680b57cec5SDimitry Andrictemplate <class _MoneyT>
269cb14a3feSDimitry Andricclass __iom_t8 {
2700b57cec5SDimitry Andric  const _MoneyT& __mon_;
2710b57cec5SDimitry Andric  bool __intl_;
272cb14a3feSDimitry Andric
2730b57cec5SDimitry Andricpublic:
274cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __iom_t8(const _MoneyT& __mon, bool __intl) : __mon_(__mon), __intl_(__intl) {}
2750b57cec5SDimitry Andric
2760b57cec5SDimitry Andric  template <class _CharT, class _Traits, class _Mp>
277cb14a3feSDimitry Andric  friend basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_Mp>& __x);
2780b57cec5SDimitry Andric};
2790b57cec5SDimitry Andric
2800b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT>
281bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
282cb14a3feSDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x) {
28306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
284cb14a3feSDimitry Andric  try {
28506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2860b57cec5SDimitry Andric    typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
287cb14a3feSDimitry Andric    if (__s) {
2880b57cec5SDimitry Andric      typedef ostreambuf_iterator<_CharT, _Traits> _Op;
2890b57cec5SDimitry Andric      typedef money_put<_CharT, _Op> _Fp;
290bdd1243dSDimitry Andric      const _Fp& __mf = std::use_facet<_Fp>(__os.getloc());
2910b57cec5SDimitry Andric      if (__mf.put(_Op(__os), __x.__intl_, __os, __os.fill(), __x.__mon_).failed())
2920b57cec5SDimitry Andric        __os.setstate(ios_base::badbit);
2930b57cec5SDimitry Andric    }
29406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
295cb14a3feSDimitry Andric  } catch (...) {
2960b57cec5SDimitry Andric    __os.__set_badbit_and_consider_rethrow();
2970b57cec5SDimitry Andric  }
29806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2990b57cec5SDimitry Andric  return __os;
3000b57cec5SDimitry Andric}
3010b57cec5SDimitry Andric
3020b57cec5SDimitry Andrictemplate <class _MoneyT>
303cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t8<_MoneyT> put_money(const _MoneyT& __mon, bool __intl = false) {
3040b57cec5SDimitry Andric  return __iom_t8<_MoneyT>(__mon, __intl);
3050b57cec5SDimitry Andric}
3060b57cec5SDimitry Andric
3070b57cec5SDimitry Andric// get_time
3080b57cec5SDimitry Andric
309cb14a3feSDimitry Andrictemplate <class _CharT>
310cb14a3feSDimitry Andricclass __iom_t9;
3110b57cec5SDimitry Andric
3120b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
313bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
3140b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x);
3150b57cec5SDimitry Andric
3160b57cec5SDimitry Andrictemplate <class _CharT>
317cb14a3feSDimitry Andricclass __iom_t9 {
3180b57cec5SDimitry Andric  tm* __tm_;
3190b57cec5SDimitry Andric  const _CharT* __fmt_;
320cb14a3feSDimitry Andric
3210b57cec5SDimitry Andricpublic:
322cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __iom_t9(tm* __tm, const _CharT* __fmt) : __tm_(__tm), __fmt_(__fmt) {}
3230b57cec5SDimitry Andric
3240b57cec5SDimitry Andric  template <class _Cp, class _Traits>
325cb14a3feSDimitry Andric  friend basic_istream<_Cp, _Traits>& operator>>(basic_istream<_Cp, _Traits>& __is, const __iom_t9<_Cp>& __x);
3260b57cec5SDimitry Andric};
3270b57cec5SDimitry Andric
3280b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
329bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
330cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x) {
33106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
332cb14a3feSDimitry Andric  try {
33306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3340b57cec5SDimitry Andric    typename basic_istream<_CharT, _Traits>::sentry __s(__is);
335cb14a3feSDimitry Andric    if (__s) {
3360b57cec5SDimitry Andric      typedef istreambuf_iterator<_CharT, _Traits> _Ip;
3370b57cec5SDimitry Andric      typedef time_get<_CharT, _Ip> _Fp;
3380b57cec5SDimitry Andric      ios_base::iostate __err = ios_base::goodbit;
339bdd1243dSDimitry Andric      const _Fp& __tf         = std::use_facet<_Fp>(__is.getloc());
340cb14a3feSDimitry Andric      __tf.get(_Ip(__is), _Ip(), __is, __err, __x.__tm_, __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_));
3410b57cec5SDimitry Andric      __is.setstate(__err);
3420b57cec5SDimitry Andric    }
34306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
344cb14a3feSDimitry Andric  } catch (...) {
3450b57cec5SDimitry Andric    __is.__set_badbit_and_consider_rethrow();
3460b57cec5SDimitry Andric  }
34706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3480b57cec5SDimitry Andric  return __is;
3490b57cec5SDimitry Andric}
3500b57cec5SDimitry Andric
3510b57cec5SDimitry Andrictemplate <class _CharT>
352cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t9<_CharT> get_time(tm* __tm, const _CharT* __fmt) {
3530b57cec5SDimitry Andric  return __iom_t9<_CharT>(__tm, __fmt);
3540b57cec5SDimitry Andric}
3550b57cec5SDimitry Andric
3560b57cec5SDimitry Andric// put_time
3570b57cec5SDimitry Andric
358cb14a3feSDimitry Andrictemplate <class _CharT>
359cb14a3feSDimitry Andricclass __iom_t10;
3600b57cec5SDimitry Andric
3610b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
362bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
3630b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x);
3640b57cec5SDimitry Andric
3650b57cec5SDimitry Andrictemplate <class _CharT>
366cb14a3feSDimitry Andricclass __iom_t10 {
3670b57cec5SDimitry Andric  const tm* __tm_;
3680b57cec5SDimitry Andric  const _CharT* __fmt_;
369cb14a3feSDimitry Andric
3700b57cec5SDimitry Andricpublic:
371cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __iom_t10(const tm* __tm, const _CharT* __fmt) : __tm_(__tm), __fmt_(__fmt) {}
3720b57cec5SDimitry Andric
3730b57cec5SDimitry Andric  template <class _Cp, class _Traits>
374cb14a3feSDimitry Andric  friend basic_ostream<_Cp, _Traits>& operator<<(basic_ostream<_Cp, _Traits>& __os, const __iom_t10<_Cp>& __x);
3750b57cec5SDimitry Andric};
3760b57cec5SDimitry Andric
3770b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
378bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
379cb14a3feSDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x) {
38006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
381cb14a3feSDimitry Andric  try {
38206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3830b57cec5SDimitry Andric    typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
384cb14a3feSDimitry Andric    if (__s) {
3850b57cec5SDimitry Andric      typedef ostreambuf_iterator<_CharT, _Traits> _Op;
3860b57cec5SDimitry Andric      typedef time_put<_CharT, _Op> _Fp;
387bdd1243dSDimitry Andric      const _Fp& __tf = std::use_facet<_Fp>(__os.getloc());
388cb14a3feSDimitry Andric      if (__tf.put(_Op(__os), __os, __os.fill(), __x.__tm_, __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_))
389cb14a3feSDimitry Andric              .failed())
3900b57cec5SDimitry Andric        __os.setstate(ios_base::badbit);
3910b57cec5SDimitry Andric    }
39206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
393cb14a3feSDimitry Andric  } catch (...) {
3940b57cec5SDimitry Andric    __os.__set_badbit_and_consider_rethrow();
3950b57cec5SDimitry Andric  }
39606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
3970b57cec5SDimitry Andric  return __os;
3980b57cec5SDimitry Andric}
3990b57cec5SDimitry Andric
4000b57cec5SDimitry Andrictemplate <class _CharT>
401cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t10<_CharT> put_time(const tm* __tm, const _CharT* __fmt) {
4020b57cec5SDimitry Andric  return __iom_t10<_CharT>(__tm, __fmt);
4030b57cec5SDimitry Andric}
4040b57cec5SDimitry Andric
40581ad6265SDimitry Andrictemplate <class _CharT, class _Traits>
406cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& __quoted_output(
407cb14a3feSDimitry Andric    basic_ostream<_CharT, _Traits>& __os,
408cb14a3feSDimitry Andric    const _CharT* __first,
409cb14a3feSDimitry Andric    const _CharT* __last,
410cb14a3feSDimitry Andric    _CharT __delim,
411cb14a3feSDimitry Andric    _CharT __escape) {
412fe6060f1SDimitry Andric  basic_string<_CharT, _Traits> __str;
4130b57cec5SDimitry Andric  __str.push_back(__delim);
41481ad6265SDimitry Andric  for (; __first != __last; ++__first) {
4150b57cec5SDimitry Andric    if (_Traits::eq(*__first, __escape) || _Traits::eq(*__first, __delim))
4160b57cec5SDimitry Andric      __str.push_back(__escape);
4170b57cec5SDimitry Andric    __str.push_back(*__first);
4180b57cec5SDimitry Andric  }
4190b57cec5SDimitry Andric  __str.push_back(__delim);
4205f757f3fSDimitry Andric  return std::__put_character_sequence(__os, __str.data(), __str.size());
4210b57cec5SDimitry Andric}
4220b57cec5SDimitry Andric
4230b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _String>
42481ad6265SDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
425cb14a3feSDimitry Andric__quoted_input(basic_istream<_CharT, _Traits>& __is, _String& __string, _CharT __delim, _CharT __escape) {
4260b57cec5SDimitry Andric  __string.clear();
4270b57cec5SDimitry Andric  _CharT __c;
4280b57cec5SDimitry Andric  __is >> __c;
4290b57cec5SDimitry Andric  if (__is.fail())
4300b57cec5SDimitry Andric    return __is;
4310b57cec5SDimitry Andric
43281ad6265SDimitry Andric  if (!_Traits::eq(__c, __delim)) {
43381ad6265SDimitry Andric    // no delimiter, read the whole string
4340b57cec5SDimitry Andric    __is.unget();
4350b57cec5SDimitry Andric    __is >> __string;
4360b57cec5SDimitry Andric    return __is;
4370b57cec5SDimitry Andric  }
4380b57cec5SDimitry Andric
43981ad6265SDimitry Andric  __save_flags<_CharT, _Traits> __sf(__is);
44081ad6265SDimitry Andric  std::noskipws(__is);
44181ad6265SDimitry Andric  while (true) {
4420b57cec5SDimitry Andric    __is >> __c;
4430b57cec5SDimitry Andric    if (__is.fail())
4440b57cec5SDimitry Andric      break;
44581ad6265SDimitry Andric    if (_Traits::eq(__c, __escape)) {
4460b57cec5SDimitry Andric      __is >> __c;
4470b57cec5SDimitry Andric      if (__is.fail())
4480b57cec5SDimitry Andric        break;
44981ad6265SDimitry Andric    } else if (_Traits::eq(__c, __delim))
4500b57cec5SDimitry Andric      break;
4510b57cec5SDimitry Andric    __string.push_back(__c);
4520b57cec5SDimitry Andric  }
4530b57cec5SDimitry Andric  return __is;
4540b57cec5SDimitry Andric}
4550b57cec5SDimitry Andric
45681ad6265SDimitry Andrictemplate <class _CharT, class _Traits>
457cb14a3feSDimitry Andricstruct _LIBCPP_HIDDEN __quoted_output_proxy {
45881ad6265SDimitry Andric  const _CharT* __first_;
45981ad6265SDimitry Andric  const _CharT* __last_;
46081ad6265SDimitry Andric  _CharT __delim_;
46181ad6265SDimitry Andric  _CharT __escape_;
46281ad6265SDimitry Andric
463cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __quoted_output_proxy(const _CharT* __f, const _CharT* __l, _CharT __d, _CharT __e)
46481ad6265SDimitry Andric      : __first_(__f), __last_(__l), __delim_(__d), __escape_(__e) {}
46581ad6265SDimitry Andric
466*0fca6ea1SDimitry Andric  template <class _T2, __enable_if_t<_IsSame<_Traits, void>::value || _IsSame<_Traits, _T2>::value, int> = 0>
46781ad6265SDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _T2>&
46881ad6265SDimitry Andric  operator<<(basic_ostream<_CharT, _T2>& __os, const __quoted_output_proxy& __p) {
46981ad6265SDimitry Andric    return std::__quoted_output(__os, __p.__first_, __p.__last_, __p.__delim_, __p.__escape_);
4700b57cec5SDimitry Andric  }
4710b57cec5SDimitry Andric};
4720b57cec5SDimitry Andric
4730b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
474cb14a3feSDimitry Andricstruct _LIBCPP_HIDDEN __quoted_proxy {
47581ad6265SDimitry Andric  basic_string<_CharT, _Traits, _Allocator>& __string_;
47681ad6265SDimitry Andric  _CharT __delim_;
47781ad6265SDimitry Andric  _CharT __escape_;
47881ad6265SDimitry Andric
479cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __quoted_proxy(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __d, _CharT __e)
48081ad6265SDimitry Andric      : __string_(__s), __delim_(__d), __escape_(__e) {}
48181ad6265SDimitry Andric
48281ad6265SDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
48381ad6265SDimitry Andric  operator<<(basic_ostream<_CharT, _Traits>& __os, const __quoted_proxy& __p) {
484cb14a3feSDimitry Andric    return std::__quoted_output(
485cb14a3feSDimitry Andric        __os, __p.__string_.data(), __p.__string_.data() + __p.__string_.size(), __p.__delim_, __p.__escape_);
4860b57cec5SDimitry Andric  }
4870b57cec5SDimitry Andric
48881ad6265SDimitry Andric  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
48981ad6265SDimitry Andric  operator>>(basic_istream<_CharT, _Traits>& __is, const __quoted_proxy& __p) {
49081ad6265SDimitry Andric    return std::__quoted_input(__is, __p.__string_, __p.__delim_, __p.__escape_);
4910b57cec5SDimitry Andric  }
49281ad6265SDimitry Andric};
4930b57cec5SDimitry Andric
4940b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
495cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI __quoted_output_proxy<_CharT, _Traits>
496cb14a3feSDimitry Andric__quoted(const basic_string<_CharT, _Traits, _Allocator>& __s,
497cb14a3feSDimitry Andric         _CharT __delim  = _CharT('"'),
498cb14a3feSDimitry Andric         _CharT __escape = _CharT('\\')) {
49981ad6265SDimitry Andric  return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape);
5000b57cec5SDimitry Andric}
5010b57cec5SDimitry Andric
5020b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
503cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI __quoted_proxy<_CharT, _Traits, _Allocator>
504cb14a3feSDimitry Andric__quoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {
5050b57cec5SDimitry Andric  return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape);
5060b57cec5SDimitry Andric}
5070b57cec5SDimitry Andric
50806c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 14
5090b57cec5SDimitry Andric
51081ad6265SDimitry Andrictemplate <class _CharT>
511cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI auto quoted(const _CharT* __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {
51281ad6265SDimitry Andric  const _CharT* __end = __s;
513cb14a3feSDimitry Andric  while (*__end)
514cb14a3feSDimitry Andric    ++__end;
51581ad6265SDimitry Andric  return __quoted_output_proxy<_CharT, void>(__s, __end, __delim, __escape);
5160b57cec5SDimitry Andric}
5170b57cec5SDimitry Andric
5180b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
519cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI auto
520cb14a3feSDimitry Andricquoted(const basic_string<_CharT, _Traits, _Allocator>& __s,
521cb14a3feSDimitry Andric       _CharT __delim  = _CharT('"'),
522cb14a3feSDimitry Andric       _CharT __escape = _CharT('\\')) {
52381ad6265SDimitry Andric  return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape);
52481ad6265SDimitry Andric}
52581ad6265SDimitry Andric
52681ad6265SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
527cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI auto
528cb14a3feSDimitry Andricquoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {
52981ad6265SDimitry Andric  return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape);
5300b57cec5SDimitry Andric}
5310b57cec5SDimitry Andric
5320b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
533cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI auto
534cb14a3feSDimitry Andricquoted(basic_string_view<_CharT, _Traits> __sv, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {
53581ad6265SDimitry Andric  return __quoted_output_proxy<_CharT, _Traits>(__sv.data(), __sv.data() + __sv.size(), __delim, __escape);
5360b57cec5SDimitry Andric}
53781ad6265SDimitry Andric
53806c3fb27SDimitry Andric#endif // _LIBCPP_STD_VER >= 14
5390b57cec5SDimitry Andric
5400b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
5410b57cec5SDimitry Andric
5420b57cec5SDimitry Andric#endif // _LIBCPP_IOMANIP
543