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 580b57cec5SDimitry Andricclass __iom_t1 590b57cec5SDimitry Andric{ 600b57cec5SDimitry Andric ios_base::fmtflags __mask_; 610b57cec5SDimitry Andricpublic: 620b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 630b57cec5SDimitry Andric explicit __iom_t1(ios_base::fmtflags __m) : __mask_(__m) {} 640b57cec5SDimitry Andric 650b57cec5SDimitry Andric template <class _CharT, class _Traits> 660b57cec5SDimitry Andric friend 670b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 680b57cec5SDimitry Andric basic_istream<_CharT, _Traits>& 690b57cec5SDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t1& __x) 700b57cec5SDimitry Andric { 710b57cec5SDimitry Andric __is.unsetf(__x.__mask_); 720b57cec5SDimitry Andric return __is; 730b57cec5SDimitry Andric } 740b57cec5SDimitry Andric 750b57cec5SDimitry Andric template <class _CharT, class _Traits> 760b57cec5SDimitry Andric friend 770b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 780b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>& 790b57cec5SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t1& __x) 800b57cec5SDimitry Andric { 810b57cec5SDimitry Andric __os.unsetf(__x.__mask_); 820b57cec5SDimitry Andric return __os; 830b57cec5SDimitry Andric } 840b57cec5SDimitry Andric}; 850b57cec5SDimitry Andric 860b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 870b57cec5SDimitry Andric__iom_t1 880b57cec5SDimitry Andricresetiosflags(ios_base::fmtflags __mask) 890b57cec5SDimitry Andric{ 900b57cec5SDimitry Andric return __iom_t1(__mask); 910b57cec5SDimitry Andric} 920b57cec5SDimitry Andric 930b57cec5SDimitry Andric// setiosflags 940b57cec5SDimitry Andric 950b57cec5SDimitry Andricclass __iom_t2 960b57cec5SDimitry Andric{ 970b57cec5SDimitry Andric ios_base::fmtflags __mask_; 980b57cec5SDimitry Andricpublic: 990b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 1000b57cec5SDimitry Andric explicit __iom_t2(ios_base::fmtflags __m) : __mask_(__m) {} 1010b57cec5SDimitry Andric 1020b57cec5SDimitry Andric template <class _CharT, class _Traits> 1030b57cec5SDimitry Andric friend 1040b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 1050b57cec5SDimitry Andric basic_istream<_CharT, _Traits>& 1060b57cec5SDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t2& __x) 1070b57cec5SDimitry Andric { 1080b57cec5SDimitry Andric __is.setf(__x.__mask_); 1090b57cec5SDimitry Andric return __is; 1100b57cec5SDimitry Andric } 1110b57cec5SDimitry Andric 1120b57cec5SDimitry Andric template <class _CharT, class _Traits> 1130b57cec5SDimitry Andric friend 1140b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 1150b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>& 1160b57cec5SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t2& __x) 1170b57cec5SDimitry Andric { 1180b57cec5SDimitry Andric __os.setf(__x.__mask_); 1190b57cec5SDimitry Andric return __os; 1200b57cec5SDimitry Andric } 1210b57cec5SDimitry Andric}; 1220b57cec5SDimitry Andric 1230b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 1240b57cec5SDimitry Andric__iom_t2 1250b57cec5SDimitry Andricsetiosflags(ios_base::fmtflags __mask) 1260b57cec5SDimitry Andric{ 1270b57cec5SDimitry Andric return __iom_t2(__mask); 1280b57cec5SDimitry Andric} 1290b57cec5SDimitry Andric 1300b57cec5SDimitry Andric// setbase 1310b57cec5SDimitry Andric 1320b57cec5SDimitry Andricclass __iom_t3 1330b57cec5SDimitry Andric{ 1340b57cec5SDimitry Andric int __base_; 1350b57cec5SDimitry Andricpublic: 1360b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 1370b57cec5SDimitry Andric explicit __iom_t3(int __b) : __base_(__b) {} 1380b57cec5SDimitry Andric 1390b57cec5SDimitry Andric template <class _CharT, class _Traits> 1400b57cec5SDimitry Andric friend 1410b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 1420b57cec5SDimitry Andric basic_istream<_CharT, _Traits>& 1430b57cec5SDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t3& __x) 1440b57cec5SDimitry Andric { 1450b57cec5SDimitry Andric __is.setf(__x.__base_ == 8 ? ios_base::oct : 1460b57cec5SDimitry Andric __x.__base_ == 10 ? ios_base::dec : 1470b57cec5SDimitry Andric __x.__base_ == 16 ? ios_base::hex : 1480b57cec5SDimitry Andric ios_base::fmtflags(0), ios_base::basefield); 1490b57cec5SDimitry Andric return __is; 1500b57cec5SDimitry Andric } 1510b57cec5SDimitry Andric 1520b57cec5SDimitry Andric template <class _CharT, class _Traits> 1530b57cec5SDimitry Andric friend 1540b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 1550b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>& 1560b57cec5SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t3& __x) 1570b57cec5SDimitry Andric { 1580b57cec5SDimitry Andric __os.setf(__x.__base_ == 8 ? ios_base::oct : 1590b57cec5SDimitry Andric __x.__base_ == 10 ? ios_base::dec : 1600b57cec5SDimitry Andric __x.__base_ == 16 ? ios_base::hex : 1610b57cec5SDimitry Andric ios_base::fmtflags(0), ios_base::basefield); 1620b57cec5SDimitry Andric return __os; 1630b57cec5SDimitry Andric } 1640b57cec5SDimitry Andric}; 1650b57cec5SDimitry Andric 1660b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 1670b57cec5SDimitry Andric__iom_t3 1680b57cec5SDimitry Andricsetbase(int __base) 1690b57cec5SDimitry Andric{ 1700b57cec5SDimitry Andric return __iom_t3(__base); 1710b57cec5SDimitry Andric} 1720b57cec5SDimitry Andric 1730b57cec5SDimitry Andric// setfill 1740b57cec5SDimitry Andric 1750b57cec5SDimitry Andrictemplate<class _CharT> 1760b57cec5SDimitry Andricclass __iom_t4 1770b57cec5SDimitry Andric{ 1780b57cec5SDimitry Andric _CharT __fill_; 1790b57cec5SDimitry Andricpublic: 1800b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 1810b57cec5SDimitry Andric explicit __iom_t4(_CharT __c) : __fill_(__c) {} 1820b57cec5SDimitry Andric 1830b57cec5SDimitry Andric template <class _Traits> 1840b57cec5SDimitry Andric friend 1850b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 1860b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>& 1870b57cec5SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t4& __x) 1880b57cec5SDimitry Andric { 1890b57cec5SDimitry Andric __os.fill(__x.__fill_); 1900b57cec5SDimitry Andric return __os; 1910b57cec5SDimitry Andric } 1920b57cec5SDimitry Andric}; 1930b57cec5SDimitry Andric 1940b57cec5SDimitry Andrictemplate<class _CharT> 1950b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 1960b57cec5SDimitry Andric__iom_t4<_CharT> 1970b57cec5SDimitry Andricsetfill(_CharT __c) 1980b57cec5SDimitry Andric{ 1990b57cec5SDimitry Andric return __iom_t4<_CharT>(__c); 2000b57cec5SDimitry Andric} 2010b57cec5SDimitry Andric 2020b57cec5SDimitry Andric// setprecision 2030b57cec5SDimitry Andric 2040b57cec5SDimitry Andricclass __iom_t5 2050b57cec5SDimitry Andric{ 2060b57cec5SDimitry Andric int __n_; 2070b57cec5SDimitry Andricpublic: 2080b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 2090b57cec5SDimitry Andric explicit __iom_t5(int __n) : __n_(__n) {} 2100b57cec5SDimitry Andric 2110b57cec5SDimitry Andric template <class _CharT, class _Traits> 2120b57cec5SDimitry Andric friend 2130b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 2140b57cec5SDimitry Andric basic_istream<_CharT, _Traits>& 2150b57cec5SDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t5& __x) 2160b57cec5SDimitry Andric { 2170b57cec5SDimitry Andric __is.precision(__x.__n_); 2180b57cec5SDimitry Andric return __is; 2190b57cec5SDimitry Andric } 2200b57cec5SDimitry Andric 2210b57cec5SDimitry Andric template <class _CharT, class _Traits> 2220b57cec5SDimitry Andric friend 2230b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 2240b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>& 2250b57cec5SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t5& __x) 2260b57cec5SDimitry Andric { 2270b57cec5SDimitry Andric __os.precision(__x.__n_); 2280b57cec5SDimitry Andric return __os; 2290b57cec5SDimitry Andric } 2300b57cec5SDimitry Andric}; 2310b57cec5SDimitry Andric 2320b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 2330b57cec5SDimitry Andric__iom_t5 2340b57cec5SDimitry Andricsetprecision(int __n) 2350b57cec5SDimitry Andric{ 2360b57cec5SDimitry Andric return __iom_t5(__n); 2370b57cec5SDimitry Andric} 2380b57cec5SDimitry Andric 2390b57cec5SDimitry Andric// setw 2400b57cec5SDimitry Andric 2410b57cec5SDimitry Andricclass __iom_t6 2420b57cec5SDimitry Andric{ 2430b57cec5SDimitry Andric int __n_; 2440b57cec5SDimitry Andricpublic: 2450b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 2460b57cec5SDimitry Andric explicit __iom_t6(int __n) : __n_(__n) {} 2470b57cec5SDimitry Andric 2480b57cec5SDimitry Andric template <class _CharT, class _Traits> 2490b57cec5SDimitry Andric friend 2500b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 2510b57cec5SDimitry Andric basic_istream<_CharT, _Traits>& 2520b57cec5SDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t6& __x) 2530b57cec5SDimitry Andric { 2540b57cec5SDimitry Andric __is.width(__x.__n_); 2550b57cec5SDimitry Andric return __is; 2560b57cec5SDimitry Andric } 2570b57cec5SDimitry Andric 2580b57cec5SDimitry Andric template <class _CharT, class _Traits> 2590b57cec5SDimitry Andric friend 2600b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 2610b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>& 2620b57cec5SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t6& __x) 2630b57cec5SDimitry Andric { 2640b57cec5SDimitry Andric __os.width(__x.__n_); 2650b57cec5SDimitry Andric return __os; 2660b57cec5SDimitry Andric } 2670b57cec5SDimitry Andric}; 2680b57cec5SDimitry Andric 2690b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 2700b57cec5SDimitry Andric__iom_t6 2710b57cec5SDimitry Andricsetw(int __n) 2720b57cec5SDimitry Andric{ 2730b57cec5SDimitry Andric return __iom_t6(__n); 2740b57cec5SDimitry Andric} 2750b57cec5SDimitry Andric 2760b57cec5SDimitry Andric// get_money 2770b57cec5SDimitry Andric 2780b57cec5SDimitry Andrictemplate <class _MoneyT> class __iom_t7; 2790b57cec5SDimitry Andric 2800b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT> 281*bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 2820b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x); 2830b57cec5SDimitry Andric 2840b57cec5SDimitry Andrictemplate <class _MoneyT> 2850b57cec5SDimitry Andricclass __iom_t7 2860b57cec5SDimitry Andric{ 2870b57cec5SDimitry Andric _MoneyT& __mon_; 2880b57cec5SDimitry Andric bool __intl_; 2890b57cec5SDimitry Andricpublic: 2900b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 2910b57cec5SDimitry Andric __iom_t7(_MoneyT& __mon, bool __intl) 2920b57cec5SDimitry Andric : __mon_(__mon), __intl_(__intl) {} 2930b57cec5SDimitry Andric 2940b57cec5SDimitry Andric template <class _CharT, class _Traits, class _Mp> 2950b57cec5SDimitry Andric friend 2960b57cec5SDimitry Andric basic_istream<_CharT, _Traits>& 2970b57cec5SDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_Mp>& __x); 2980b57cec5SDimitry Andric}; 2990b57cec5SDimitry Andric 3000b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT> 301*bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 3020b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x) 3030b57cec5SDimitry Andric{ 3040b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 3050b57cec5SDimitry Andric try 3060b57cec5SDimitry Andric { 3070b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 3080b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __s(__is); 3090b57cec5SDimitry Andric if (__s) 3100b57cec5SDimitry Andric { 3110b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 3120b57cec5SDimitry Andric typedef money_get<_CharT, _Ip> _Fp; 3130b57cec5SDimitry Andric ios_base::iostate __err = ios_base::goodbit; 314*bdd1243dSDimitry Andric const _Fp& __mf = std::use_facet<_Fp>(__is.getloc()); 3150b57cec5SDimitry Andric __mf.get(_Ip(__is), _Ip(), __x.__intl_, __is, __err, __x.__mon_); 3160b57cec5SDimitry Andric __is.setstate(__err); 3170b57cec5SDimitry Andric } 3180b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 3190b57cec5SDimitry Andric } 3200b57cec5SDimitry Andric catch (...) 3210b57cec5SDimitry Andric { 3220b57cec5SDimitry Andric __is.__set_badbit_and_consider_rethrow(); 3230b57cec5SDimitry Andric } 3240b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 3250b57cec5SDimitry Andric return __is; 3260b57cec5SDimitry Andric} 3270b57cec5SDimitry Andric 3280b57cec5SDimitry Andrictemplate <class _MoneyT> 3290b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 3300b57cec5SDimitry Andric__iom_t7<_MoneyT> 3310b57cec5SDimitry Andricget_money(_MoneyT& __mon, bool __intl = false) 3320b57cec5SDimitry Andric{ 3330b57cec5SDimitry Andric return __iom_t7<_MoneyT>(__mon, __intl); 3340b57cec5SDimitry Andric} 3350b57cec5SDimitry Andric 3360b57cec5SDimitry Andric// put_money 3370b57cec5SDimitry Andric 3380b57cec5SDimitry Andrictemplate <class _MoneyT> class __iom_t8; 3390b57cec5SDimitry Andric 3400b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT> 341*bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 3420b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x); 3430b57cec5SDimitry Andric 3440b57cec5SDimitry Andrictemplate <class _MoneyT> 3450b57cec5SDimitry Andricclass __iom_t8 3460b57cec5SDimitry Andric{ 3470b57cec5SDimitry Andric const _MoneyT& __mon_; 3480b57cec5SDimitry Andric bool __intl_; 3490b57cec5SDimitry Andricpublic: 3500b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 3510b57cec5SDimitry Andric __iom_t8(const _MoneyT& __mon, bool __intl) 3520b57cec5SDimitry Andric : __mon_(__mon), __intl_(__intl) {} 3530b57cec5SDimitry Andric 3540b57cec5SDimitry Andric template <class _CharT, class _Traits, class _Mp> 3550b57cec5SDimitry Andric friend 3560b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>& 3570b57cec5SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_Mp>& __x); 3580b57cec5SDimitry Andric}; 3590b57cec5SDimitry Andric 3600b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT> 361*bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 3620b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x) 3630b57cec5SDimitry Andric{ 3640b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 3650b57cec5SDimitry Andric try 3660b57cec5SDimitry Andric { 3670b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 3680b57cec5SDimitry Andric typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 3690b57cec5SDimitry Andric if (__s) 3700b57cec5SDimitry Andric { 3710b57cec5SDimitry Andric typedef ostreambuf_iterator<_CharT, _Traits> _Op; 3720b57cec5SDimitry Andric typedef money_put<_CharT, _Op> _Fp; 373*bdd1243dSDimitry Andric const _Fp& __mf = std::use_facet<_Fp>(__os.getloc()); 3740b57cec5SDimitry Andric if (__mf.put(_Op(__os), __x.__intl_, __os, __os.fill(), __x.__mon_).failed()) 3750b57cec5SDimitry Andric __os.setstate(ios_base::badbit); 3760b57cec5SDimitry Andric } 3770b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 3780b57cec5SDimitry Andric } 3790b57cec5SDimitry Andric catch (...) 3800b57cec5SDimitry Andric { 3810b57cec5SDimitry Andric __os.__set_badbit_and_consider_rethrow(); 3820b57cec5SDimitry Andric } 3830b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 3840b57cec5SDimitry Andric return __os; 3850b57cec5SDimitry Andric} 3860b57cec5SDimitry Andric 3870b57cec5SDimitry Andrictemplate <class _MoneyT> 3880b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 3890b57cec5SDimitry Andric__iom_t8<_MoneyT> 3900b57cec5SDimitry Andricput_money(const _MoneyT& __mon, bool __intl = false) 3910b57cec5SDimitry Andric{ 3920b57cec5SDimitry Andric return __iom_t8<_MoneyT>(__mon, __intl); 3930b57cec5SDimitry Andric} 3940b57cec5SDimitry Andric 3950b57cec5SDimitry Andric// get_time 3960b57cec5SDimitry Andric 3970b57cec5SDimitry Andrictemplate <class _CharT> class __iom_t9; 3980b57cec5SDimitry Andric 3990b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 400*bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 4010b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x); 4020b57cec5SDimitry Andric 4030b57cec5SDimitry Andrictemplate <class _CharT> 4040b57cec5SDimitry Andricclass __iom_t9 4050b57cec5SDimitry Andric{ 4060b57cec5SDimitry Andric tm* __tm_; 4070b57cec5SDimitry Andric const _CharT* __fmt_; 4080b57cec5SDimitry Andricpublic: 4090b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 4100b57cec5SDimitry Andric __iom_t9(tm* __tm, const _CharT* __fmt) 4110b57cec5SDimitry Andric : __tm_(__tm), __fmt_(__fmt) {} 4120b57cec5SDimitry Andric 4130b57cec5SDimitry Andric template <class _Cp, class _Traits> 4140b57cec5SDimitry Andric friend 4150b57cec5SDimitry Andric basic_istream<_Cp, _Traits>& 4160b57cec5SDimitry Andric operator>>(basic_istream<_Cp, _Traits>& __is, const __iom_t9<_Cp>& __x); 4170b57cec5SDimitry Andric}; 4180b57cec5SDimitry Andric 4190b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 420*bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 4210b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x) 4220b57cec5SDimitry Andric{ 4230b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 4240b57cec5SDimitry Andric try 4250b57cec5SDimitry Andric { 4260b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 4270b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __s(__is); 4280b57cec5SDimitry Andric if (__s) 4290b57cec5SDimitry Andric { 4300b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 4310b57cec5SDimitry Andric typedef time_get<_CharT, _Ip> _Fp; 4320b57cec5SDimitry Andric ios_base::iostate __err = ios_base::goodbit; 433*bdd1243dSDimitry Andric const _Fp& __tf = std::use_facet<_Fp>(__is.getloc()); 4340b57cec5SDimitry Andric __tf.get(_Ip(__is), _Ip(), __is, __err, __x.__tm_, 4350b57cec5SDimitry Andric __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_)); 4360b57cec5SDimitry Andric __is.setstate(__err); 4370b57cec5SDimitry Andric } 4380b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 4390b57cec5SDimitry Andric } 4400b57cec5SDimitry Andric catch (...) 4410b57cec5SDimitry Andric { 4420b57cec5SDimitry Andric __is.__set_badbit_and_consider_rethrow(); 4430b57cec5SDimitry Andric } 4440b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 4450b57cec5SDimitry Andric return __is; 4460b57cec5SDimitry Andric} 4470b57cec5SDimitry Andric 4480b57cec5SDimitry Andrictemplate <class _CharT> 4490b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 4500b57cec5SDimitry Andric__iom_t9<_CharT> 4510b57cec5SDimitry Andricget_time(tm* __tm, const _CharT* __fmt) 4520b57cec5SDimitry Andric{ 4530b57cec5SDimitry Andric return __iom_t9<_CharT>(__tm, __fmt); 4540b57cec5SDimitry Andric} 4550b57cec5SDimitry Andric 4560b57cec5SDimitry Andric// put_time 4570b57cec5SDimitry Andric 4580b57cec5SDimitry Andrictemplate <class _CharT> class __iom_t10; 4590b57cec5SDimitry Andric 4600b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 461*bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 4620b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x); 4630b57cec5SDimitry Andric 4640b57cec5SDimitry Andrictemplate <class _CharT> 4650b57cec5SDimitry Andricclass __iom_t10 4660b57cec5SDimitry Andric{ 4670b57cec5SDimitry Andric const tm* __tm_; 4680b57cec5SDimitry Andric const _CharT* __fmt_; 4690b57cec5SDimitry Andricpublic: 4700b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 4710b57cec5SDimitry Andric __iom_t10(const tm* __tm, const _CharT* __fmt) 4720b57cec5SDimitry Andric : __tm_(__tm), __fmt_(__fmt) {} 4730b57cec5SDimitry Andric 4740b57cec5SDimitry Andric template <class _Cp, class _Traits> 4750b57cec5SDimitry Andric friend 4760b57cec5SDimitry Andric basic_ostream<_Cp, _Traits>& 4770b57cec5SDimitry Andric operator<<(basic_ostream<_Cp, _Traits>& __os, const __iom_t10<_Cp>& __x); 4780b57cec5SDimitry Andric}; 4790b57cec5SDimitry Andric 4800b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 481*bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 4820b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x) 4830b57cec5SDimitry Andric{ 4840b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 4850b57cec5SDimitry Andric try 4860b57cec5SDimitry Andric { 4870b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 4880b57cec5SDimitry Andric typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 4890b57cec5SDimitry Andric if (__s) 4900b57cec5SDimitry Andric { 4910b57cec5SDimitry Andric typedef ostreambuf_iterator<_CharT, _Traits> _Op; 4920b57cec5SDimitry Andric typedef time_put<_CharT, _Op> _Fp; 493*bdd1243dSDimitry Andric const _Fp& __tf = std::use_facet<_Fp>(__os.getloc()); 4940b57cec5SDimitry Andric if (__tf.put(_Op(__os), __os, __os.fill(), __x.__tm_, 4950b57cec5SDimitry Andric __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_)).failed()) 4960b57cec5SDimitry Andric __os.setstate(ios_base::badbit); 4970b57cec5SDimitry Andric } 4980b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 4990b57cec5SDimitry Andric } 5000b57cec5SDimitry Andric catch (...) 5010b57cec5SDimitry Andric { 5020b57cec5SDimitry Andric __os.__set_badbit_and_consider_rethrow(); 5030b57cec5SDimitry Andric } 5040b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 5050b57cec5SDimitry Andric return __os; 5060b57cec5SDimitry Andric} 5070b57cec5SDimitry Andric 5080b57cec5SDimitry Andrictemplate <class _CharT> 5090b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 5100b57cec5SDimitry Andric__iom_t10<_CharT> 5110b57cec5SDimitry Andricput_time(const tm* __tm, const _CharT* __fmt) 5120b57cec5SDimitry Andric{ 5130b57cec5SDimitry Andric return __iom_t10<_CharT>(__tm, __fmt); 5140b57cec5SDimitry Andric} 5150b57cec5SDimitry Andric 51681ad6265SDimitry Andric#if _LIBCPP_STD_VER >= 11 51781ad6265SDimitry Andric 51881ad6265SDimitry Andrictemplate <class _CharT, class _Traits> 51981ad6265SDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 5200b57cec5SDimitry Andric__quoted_output(basic_ostream<_CharT, _Traits>& __os, 52181ad6265SDimitry Andric const _CharT *__first, const _CharT *__last, _CharT __delim, _CharT __escape) 5220b57cec5SDimitry Andric{ 523fe6060f1SDimitry Andric basic_string<_CharT, _Traits> __str; 5240b57cec5SDimitry Andric __str.push_back(__delim); 52581ad6265SDimitry Andric for (; __first != __last; ++__first) { 5260b57cec5SDimitry Andric if (_Traits::eq(*__first, __escape) || _Traits::eq(*__first, __delim)) 5270b57cec5SDimitry Andric __str.push_back(__escape); 5280b57cec5SDimitry Andric __str.push_back(*__first); 5290b57cec5SDimitry Andric } 5300b57cec5SDimitry Andric __str.push_back(__delim); 531e8d8bef9SDimitry Andric return _VSTD::__put_character_sequence(__os, __str.data(), __str.size()); 5320b57cec5SDimitry Andric} 5330b57cec5SDimitry Andric 5340b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _String> 53581ad6265SDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 5360b57cec5SDimitry Andric__quoted_input(basic_istream<_CharT, _Traits>& __is, _String& __string, _CharT __delim, _CharT __escape) 5370b57cec5SDimitry Andric{ 5380b57cec5SDimitry Andric __string.clear(); 5390b57cec5SDimitry Andric _CharT __c; 5400b57cec5SDimitry Andric __is >> __c; 5410b57cec5SDimitry Andric if (__is.fail()) 5420b57cec5SDimitry Andric return __is; 5430b57cec5SDimitry Andric 54481ad6265SDimitry Andric if (!_Traits::eq(__c, __delim)) { 54581ad6265SDimitry Andric // no delimiter, read the whole string 5460b57cec5SDimitry Andric __is.unget(); 5470b57cec5SDimitry Andric __is >> __string; 5480b57cec5SDimitry Andric return __is; 5490b57cec5SDimitry Andric } 5500b57cec5SDimitry Andric 55181ad6265SDimitry Andric __save_flags<_CharT, _Traits> __sf(__is); 55281ad6265SDimitry Andric std::noskipws(__is); 55381ad6265SDimitry Andric while (true) { 5540b57cec5SDimitry Andric __is >> __c; 5550b57cec5SDimitry Andric if (__is.fail()) 5560b57cec5SDimitry Andric break; 55781ad6265SDimitry Andric if (_Traits::eq(__c, __escape)) { 5580b57cec5SDimitry Andric __is >> __c; 5590b57cec5SDimitry Andric if (__is.fail()) 5600b57cec5SDimitry Andric break; 56181ad6265SDimitry Andric } else if (_Traits::eq(__c, __delim)) 5620b57cec5SDimitry Andric break; 5630b57cec5SDimitry Andric __string.push_back(__c); 5640b57cec5SDimitry Andric } 5650b57cec5SDimitry Andric return __is; 5660b57cec5SDimitry Andric} 5670b57cec5SDimitry Andric 56881ad6265SDimitry Andrictemplate <class _CharT, class _Traits> 56981ad6265SDimitry Andricstruct _LIBCPP_HIDDEN __quoted_output_proxy 5700b57cec5SDimitry Andric{ 57181ad6265SDimitry Andric const _CharT *__first_; 57281ad6265SDimitry Andric const _CharT *__last_; 57381ad6265SDimitry Andric _CharT __delim_; 57481ad6265SDimitry Andric _CharT __escape_; 57581ad6265SDimitry Andric 57681ad6265SDimitry Andric _LIBCPP_HIDE_FROM_ABI 57781ad6265SDimitry Andric explicit __quoted_output_proxy(const _CharT *__f, const _CharT *__l, _CharT __d, _CharT __e) 57881ad6265SDimitry Andric : __first_(__f), __last_(__l), __delim_(__d), __escape_(__e) {} 57981ad6265SDimitry Andric 58081ad6265SDimitry Andric template<class _T2, __enable_if_t<_IsSame<_Traits, void>::value || _IsSame<_Traits, _T2>::value>* = nullptr> 58181ad6265SDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _T2>& 58281ad6265SDimitry Andric operator<<(basic_ostream<_CharT, _T2>& __os, const __quoted_output_proxy& __p) { 58381ad6265SDimitry Andric return std::__quoted_output(__os, __p.__first_, __p.__last_, __p.__delim_, __p.__escape_); 5840b57cec5SDimitry Andric } 5850b57cec5SDimitry Andric}; 5860b57cec5SDimitry Andric 5870b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 58881ad6265SDimitry Andricstruct _LIBCPP_HIDDEN __quoted_proxy 5890b57cec5SDimitry Andric{ 59081ad6265SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& __string_; 59181ad6265SDimitry Andric _CharT __delim_; 59281ad6265SDimitry Andric _CharT __escape_; 59381ad6265SDimitry Andric 59481ad6265SDimitry Andric _LIBCPP_HIDE_FROM_ABI 59581ad6265SDimitry Andric explicit __quoted_proxy(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __d, _CharT __e) 59681ad6265SDimitry Andric : __string_(__s), __delim_(__d), __escape_(__e) {} 59781ad6265SDimitry Andric 59881ad6265SDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 59981ad6265SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __quoted_proxy& __p) { 60081ad6265SDimitry Andric return std::__quoted_output(__os, __p.__string_.data(), __p.__string_.data() + __p.__string_.size(), __p.__delim_, __p.__escape_); 6010b57cec5SDimitry Andric } 6020b57cec5SDimitry Andric 60381ad6265SDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 60481ad6265SDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __quoted_proxy& __p) { 60581ad6265SDimitry Andric return std::__quoted_input(__is, __p.__string_, __p.__delim_, __p.__escape_); 6060b57cec5SDimitry Andric } 60781ad6265SDimitry Andric}; 6080b57cec5SDimitry Andric 6090b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 61081ad6265SDimitry Andric_LIBCPP_HIDE_FROM_ABI 61181ad6265SDimitry Andric__quoted_output_proxy<_CharT, _Traits> 6120b57cec5SDimitry Andric__quoted(const basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) 6130b57cec5SDimitry Andric{ 61481ad6265SDimitry Andric return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape); 6150b57cec5SDimitry Andric} 6160b57cec5SDimitry Andric 6170b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 61881ad6265SDimitry Andric_LIBCPP_HIDE_FROM_ABI 6190b57cec5SDimitry Andric__quoted_proxy<_CharT, _Traits, _Allocator> 6200b57cec5SDimitry Andric__quoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) 6210b57cec5SDimitry Andric{ 6220b57cec5SDimitry Andric return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape); 6230b57cec5SDimitry Andric} 6240b57cec5SDimitry Andric 62581ad6265SDimitry Andric#endif // _LIBCPP_STD_VER >= 11 6260b57cec5SDimitry Andric 6270b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 11 6280b57cec5SDimitry Andric 62981ad6265SDimitry Andrictemplate <class _CharT> 63081ad6265SDimitry Andric_LIBCPP_HIDE_FROM_ABI 63181ad6265SDimitry Andricauto quoted(const _CharT *__s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) 6320b57cec5SDimitry Andric{ 63381ad6265SDimitry Andric const _CharT *__end = __s; 63481ad6265SDimitry Andric while (*__end) ++__end; 63581ad6265SDimitry Andric return __quoted_output_proxy<_CharT, void>(__s, __end, __delim, __escape); 6360b57cec5SDimitry Andric} 6370b57cec5SDimitry Andric 6380b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 63981ad6265SDimitry Andric_LIBCPP_HIDE_FROM_ABI 64081ad6265SDimitry Andricauto quoted(const basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) 6410b57cec5SDimitry Andric{ 64281ad6265SDimitry Andric return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape); 64381ad6265SDimitry Andric} 64481ad6265SDimitry Andric 64581ad6265SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 64681ad6265SDimitry Andric_LIBCPP_HIDE_FROM_ABI 64781ad6265SDimitry Andricauto quoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) 64881ad6265SDimitry Andric{ 64981ad6265SDimitry Andric return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape); 6500b57cec5SDimitry Andric} 6510b57cec5SDimitry Andric 6520b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 65381ad6265SDimitry Andric_LIBCPP_HIDE_FROM_ABI 65481ad6265SDimitry Andricauto quoted(basic_string_view<_CharT, _Traits> __sv, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) 6550b57cec5SDimitry Andric{ 65681ad6265SDimitry Andric return __quoted_output_proxy<_CharT, _Traits>(__sv.data(), __sv.data() + __sv.size(), __delim, __escape); 6570b57cec5SDimitry Andric} 65881ad6265SDimitry Andric 65981ad6265SDimitry Andric#endif // _LIBCPP_STD_VER > 11 6600b57cec5SDimitry Andric 6610b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 6620b57cec5SDimitry Andric 6630b57cec5SDimitry Andric#endif // _LIBCPP_IOMANIP 664