1*0b57cec5SDimitry Andric// -*- C++ -*- 2*0b57cec5SDimitry Andric//===--------------------------- iomanip ----------------------------------===// 3*0b57cec5SDimitry Andric// 4*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 6*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*0b57cec5SDimitry Andric// 8*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 9*0b57cec5SDimitry Andric 10*0b57cec5SDimitry Andric#ifndef _LIBCPP_IOMANIP 11*0b57cec5SDimitry Andric#define _LIBCPP_IOMANIP 12*0b57cec5SDimitry Andric 13*0b57cec5SDimitry Andric/* 14*0b57cec5SDimitry Andric iomanip synopsis 15*0b57cec5SDimitry Andric 16*0b57cec5SDimitry Andricnamespace std { 17*0b57cec5SDimitry Andric 18*0b57cec5SDimitry Andric// types T1, T2, ... are unspecified implementation types 19*0b57cec5SDimitry AndricT1 resetiosflags(ios_base::fmtflags mask); 20*0b57cec5SDimitry AndricT2 setiosflags (ios_base::fmtflags mask); 21*0b57cec5SDimitry AndricT3 setbase(int base); 22*0b57cec5SDimitry Andrictemplate<charT> T4 setfill(charT c); 23*0b57cec5SDimitry AndricT5 setprecision(int n); 24*0b57cec5SDimitry AndricT6 setw(int n); 25*0b57cec5SDimitry Andrictemplate <class moneyT> T7 get_money(moneyT& mon, bool intl = false); 26*0b57cec5SDimitry Andrictemplate <class charT, class moneyT> T8 put_money(const moneyT& mon, bool intl = false); 27*0b57cec5SDimitry Andrictemplate <class charT> T9 get_time(struct tm* tmb, const charT* fmt); 28*0b57cec5SDimitry Andrictemplate <class charT> T10 put_time(const struct tm* tmb, const charT* fmt); 29*0b57cec5SDimitry Andric 30*0b57cec5SDimitry Andrictemplate <class charT> 31*0b57cec5SDimitry Andric T11 quoted(const charT* s, charT delim=charT('"'), charT escape=charT('\\')); // C++14 32*0b57cec5SDimitry Andric 33*0b57cec5SDimitry Andrictemplate <class charT, class traits, class Allocator> 34*0b57cec5SDimitry Andric T12 quoted(const basic_string<charT, traits, Allocator>& s, 35*0b57cec5SDimitry Andric charT delim=charT('"'), charT escape=charT('\\')); // C++14 36*0b57cec5SDimitry Andric 37*0b57cec5SDimitry Andrictemplate <class charT, class traits, class Allocator> 38*0b57cec5SDimitry Andric T13 quoted(basic_string<charT, traits, Allocator>& s, 39*0b57cec5SDimitry Andric charT delim=charT('"'), charT escape=charT('\\')); // C++14 40*0b57cec5SDimitry Andric 41*0b57cec5SDimitry Andric} // std 42*0b57cec5SDimitry Andric 43*0b57cec5SDimitry Andric*/ 44*0b57cec5SDimitry Andric 45*0b57cec5SDimitry Andric#include <__config> 46*0b57cec5SDimitry Andric#include <__string> 47*0b57cec5SDimitry Andric#include <istream> 48*0b57cec5SDimitry Andric#include <version> 49*0b57cec5SDimitry Andric 50*0b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 51*0b57cec5SDimitry Andric#pragma GCC system_header 52*0b57cec5SDimitry Andric#endif 53*0b57cec5SDimitry Andric 54*0b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 55*0b57cec5SDimitry Andric 56*0b57cec5SDimitry Andric// resetiosflags 57*0b57cec5SDimitry Andric 58*0b57cec5SDimitry Andricclass __iom_t1 59*0b57cec5SDimitry Andric{ 60*0b57cec5SDimitry Andric ios_base::fmtflags __mask_; 61*0b57cec5SDimitry Andricpublic: 62*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 63*0b57cec5SDimitry Andric explicit __iom_t1(ios_base::fmtflags __m) : __mask_(__m) {} 64*0b57cec5SDimitry Andric 65*0b57cec5SDimitry Andric template <class _CharT, class _Traits> 66*0b57cec5SDimitry Andric friend 67*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 68*0b57cec5SDimitry Andric basic_istream<_CharT, _Traits>& 69*0b57cec5SDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t1& __x) 70*0b57cec5SDimitry Andric { 71*0b57cec5SDimitry Andric __is.unsetf(__x.__mask_); 72*0b57cec5SDimitry Andric return __is; 73*0b57cec5SDimitry Andric } 74*0b57cec5SDimitry Andric 75*0b57cec5SDimitry Andric template <class _CharT, class _Traits> 76*0b57cec5SDimitry Andric friend 77*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 78*0b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>& 79*0b57cec5SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t1& __x) 80*0b57cec5SDimitry Andric { 81*0b57cec5SDimitry Andric __os.unsetf(__x.__mask_); 82*0b57cec5SDimitry Andric return __os; 83*0b57cec5SDimitry Andric } 84*0b57cec5SDimitry Andric}; 85*0b57cec5SDimitry Andric 86*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 87*0b57cec5SDimitry Andric__iom_t1 88*0b57cec5SDimitry Andricresetiosflags(ios_base::fmtflags __mask) 89*0b57cec5SDimitry Andric{ 90*0b57cec5SDimitry Andric return __iom_t1(__mask); 91*0b57cec5SDimitry Andric} 92*0b57cec5SDimitry Andric 93*0b57cec5SDimitry Andric// setiosflags 94*0b57cec5SDimitry Andric 95*0b57cec5SDimitry Andricclass __iom_t2 96*0b57cec5SDimitry Andric{ 97*0b57cec5SDimitry Andric ios_base::fmtflags __mask_; 98*0b57cec5SDimitry Andricpublic: 99*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 100*0b57cec5SDimitry Andric explicit __iom_t2(ios_base::fmtflags __m) : __mask_(__m) {} 101*0b57cec5SDimitry Andric 102*0b57cec5SDimitry Andric template <class _CharT, class _Traits> 103*0b57cec5SDimitry Andric friend 104*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 105*0b57cec5SDimitry Andric basic_istream<_CharT, _Traits>& 106*0b57cec5SDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t2& __x) 107*0b57cec5SDimitry Andric { 108*0b57cec5SDimitry Andric __is.setf(__x.__mask_); 109*0b57cec5SDimitry Andric return __is; 110*0b57cec5SDimitry Andric } 111*0b57cec5SDimitry Andric 112*0b57cec5SDimitry Andric template <class _CharT, class _Traits> 113*0b57cec5SDimitry Andric friend 114*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 115*0b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>& 116*0b57cec5SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t2& __x) 117*0b57cec5SDimitry Andric { 118*0b57cec5SDimitry Andric __os.setf(__x.__mask_); 119*0b57cec5SDimitry Andric return __os; 120*0b57cec5SDimitry Andric } 121*0b57cec5SDimitry Andric}; 122*0b57cec5SDimitry Andric 123*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 124*0b57cec5SDimitry Andric__iom_t2 125*0b57cec5SDimitry Andricsetiosflags(ios_base::fmtflags __mask) 126*0b57cec5SDimitry Andric{ 127*0b57cec5SDimitry Andric return __iom_t2(__mask); 128*0b57cec5SDimitry Andric} 129*0b57cec5SDimitry Andric 130*0b57cec5SDimitry Andric// setbase 131*0b57cec5SDimitry Andric 132*0b57cec5SDimitry Andricclass __iom_t3 133*0b57cec5SDimitry Andric{ 134*0b57cec5SDimitry Andric int __base_; 135*0b57cec5SDimitry Andricpublic: 136*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 137*0b57cec5SDimitry Andric explicit __iom_t3(int __b) : __base_(__b) {} 138*0b57cec5SDimitry Andric 139*0b57cec5SDimitry Andric template <class _CharT, class _Traits> 140*0b57cec5SDimitry Andric friend 141*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 142*0b57cec5SDimitry Andric basic_istream<_CharT, _Traits>& 143*0b57cec5SDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t3& __x) 144*0b57cec5SDimitry Andric { 145*0b57cec5SDimitry Andric __is.setf(__x.__base_ == 8 ? ios_base::oct : 146*0b57cec5SDimitry Andric __x.__base_ == 10 ? ios_base::dec : 147*0b57cec5SDimitry Andric __x.__base_ == 16 ? ios_base::hex : 148*0b57cec5SDimitry Andric ios_base::fmtflags(0), ios_base::basefield); 149*0b57cec5SDimitry Andric return __is; 150*0b57cec5SDimitry Andric } 151*0b57cec5SDimitry Andric 152*0b57cec5SDimitry Andric template <class _CharT, class _Traits> 153*0b57cec5SDimitry Andric friend 154*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 155*0b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>& 156*0b57cec5SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t3& __x) 157*0b57cec5SDimitry Andric { 158*0b57cec5SDimitry Andric __os.setf(__x.__base_ == 8 ? ios_base::oct : 159*0b57cec5SDimitry Andric __x.__base_ == 10 ? ios_base::dec : 160*0b57cec5SDimitry Andric __x.__base_ == 16 ? ios_base::hex : 161*0b57cec5SDimitry Andric ios_base::fmtflags(0), ios_base::basefield); 162*0b57cec5SDimitry Andric return __os; 163*0b57cec5SDimitry Andric } 164*0b57cec5SDimitry Andric}; 165*0b57cec5SDimitry Andric 166*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 167*0b57cec5SDimitry Andric__iom_t3 168*0b57cec5SDimitry Andricsetbase(int __base) 169*0b57cec5SDimitry Andric{ 170*0b57cec5SDimitry Andric return __iom_t3(__base); 171*0b57cec5SDimitry Andric} 172*0b57cec5SDimitry Andric 173*0b57cec5SDimitry Andric// setfill 174*0b57cec5SDimitry Andric 175*0b57cec5SDimitry Andrictemplate<class _CharT> 176*0b57cec5SDimitry Andricclass __iom_t4 177*0b57cec5SDimitry Andric{ 178*0b57cec5SDimitry Andric _CharT __fill_; 179*0b57cec5SDimitry Andricpublic: 180*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 181*0b57cec5SDimitry Andric explicit __iom_t4(_CharT __c) : __fill_(__c) {} 182*0b57cec5SDimitry Andric 183*0b57cec5SDimitry Andric template <class _Traits> 184*0b57cec5SDimitry Andric friend 185*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 186*0b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>& 187*0b57cec5SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t4& __x) 188*0b57cec5SDimitry Andric { 189*0b57cec5SDimitry Andric __os.fill(__x.__fill_); 190*0b57cec5SDimitry Andric return __os; 191*0b57cec5SDimitry Andric } 192*0b57cec5SDimitry Andric}; 193*0b57cec5SDimitry Andric 194*0b57cec5SDimitry Andrictemplate<class _CharT> 195*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 196*0b57cec5SDimitry Andric__iom_t4<_CharT> 197*0b57cec5SDimitry Andricsetfill(_CharT __c) 198*0b57cec5SDimitry Andric{ 199*0b57cec5SDimitry Andric return __iom_t4<_CharT>(__c); 200*0b57cec5SDimitry Andric} 201*0b57cec5SDimitry Andric 202*0b57cec5SDimitry Andric// setprecision 203*0b57cec5SDimitry Andric 204*0b57cec5SDimitry Andricclass __iom_t5 205*0b57cec5SDimitry Andric{ 206*0b57cec5SDimitry Andric int __n_; 207*0b57cec5SDimitry Andricpublic: 208*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 209*0b57cec5SDimitry Andric explicit __iom_t5(int __n) : __n_(__n) {} 210*0b57cec5SDimitry Andric 211*0b57cec5SDimitry Andric template <class _CharT, class _Traits> 212*0b57cec5SDimitry Andric friend 213*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 214*0b57cec5SDimitry Andric basic_istream<_CharT, _Traits>& 215*0b57cec5SDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t5& __x) 216*0b57cec5SDimitry Andric { 217*0b57cec5SDimitry Andric __is.precision(__x.__n_); 218*0b57cec5SDimitry Andric return __is; 219*0b57cec5SDimitry Andric } 220*0b57cec5SDimitry Andric 221*0b57cec5SDimitry Andric template <class _CharT, class _Traits> 222*0b57cec5SDimitry Andric friend 223*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 224*0b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>& 225*0b57cec5SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t5& __x) 226*0b57cec5SDimitry Andric { 227*0b57cec5SDimitry Andric __os.precision(__x.__n_); 228*0b57cec5SDimitry Andric return __os; 229*0b57cec5SDimitry Andric } 230*0b57cec5SDimitry Andric}; 231*0b57cec5SDimitry Andric 232*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 233*0b57cec5SDimitry Andric__iom_t5 234*0b57cec5SDimitry Andricsetprecision(int __n) 235*0b57cec5SDimitry Andric{ 236*0b57cec5SDimitry Andric return __iom_t5(__n); 237*0b57cec5SDimitry Andric} 238*0b57cec5SDimitry Andric 239*0b57cec5SDimitry Andric// setw 240*0b57cec5SDimitry Andric 241*0b57cec5SDimitry Andricclass __iom_t6 242*0b57cec5SDimitry Andric{ 243*0b57cec5SDimitry Andric int __n_; 244*0b57cec5SDimitry Andricpublic: 245*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 246*0b57cec5SDimitry Andric explicit __iom_t6(int __n) : __n_(__n) {} 247*0b57cec5SDimitry Andric 248*0b57cec5SDimitry Andric template <class _CharT, class _Traits> 249*0b57cec5SDimitry Andric friend 250*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 251*0b57cec5SDimitry Andric basic_istream<_CharT, _Traits>& 252*0b57cec5SDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t6& __x) 253*0b57cec5SDimitry Andric { 254*0b57cec5SDimitry Andric __is.width(__x.__n_); 255*0b57cec5SDimitry Andric return __is; 256*0b57cec5SDimitry Andric } 257*0b57cec5SDimitry Andric 258*0b57cec5SDimitry Andric template <class _CharT, class _Traits> 259*0b57cec5SDimitry Andric friend 260*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 261*0b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>& 262*0b57cec5SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t6& __x) 263*0b57cec5SDimitry Andric { 264*0b57cec5SDimitry Andric __os.width(__x.__n_); 265*0b57cec5SDimitry Andric return __os; 266*0b57cec5SDimitry Andric } 267*0b57cec5SDimitry Andric}; 268*0b57cec5SDimitry Andric 269*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 270*0b57cec5SDimitry Andric__iom_t6 271*0b57cec5SDimitry Andricsetw(int __n) 272*0b57cec5SDimitry Andric{ 273*0b57cec5SDimitry Andric return __iom_t6(__n); 274*0b57cec5SDimitry Andric} 275*0b57cec5SDimitry Andric 276*0b57cec5SDimitry Andric// get_money 277*0b57cec5SDimitry Andric 278*0b57cec5SDimitry Andrictemplate <class _MoneyT> class __iom_t7; 279*0b57cec5SDimitry Andric 280*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT> 281*0b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 282*0b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x); 283*0b57cec5SDimitry Andric 284*0b57cec5SDimitry Andrictemplate <class _MoneyT> 285*0b57cec5SDimitry Andricclass __iom_t7 286*0b57cec5SDimitry Andric{ 287*0b57cec5SDimitry Andric _MoneyT& __mon_; 288*0b57cec5SDimitry Andric bool __intl_; 289*0b57cec5SDimitry Andricpublic: 290*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 291*0b57cec5SDimitry Andric __iom_t7(_MoneyT& __mon, bool __intl) 292*0b57cec5SDimitry Andric : __mon_(__mon), __intl_(__intl) {} 293*0b57cec5SDimitry Andric 294*0b57cec5SDimitry Andric template <class _CharT, class _Traits, class _Mp> 295*0b57cec5SDimitry Andric friend 296*0b57cec5SDimitry Andric basic_istream<_CharT, _Traits>& 297*0b57cec5SDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_Mp>& __x); 298*0b57cec5SDimitry Andric}; 299*0b57cec5SDimitry Andric 300*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT> 301*0b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 302*0b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x) 303*0b57cec5SDimitry Andric{ 304*0b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 305*0b57cec5SDimitry Andric try 306*0b57cec5SDimitry Andric { 307*0b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 308*0b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __s(__is); 309*0b57cec5SDimitry Andric if (__s) 310*0b57cec5SDimitry Andric { 311*0b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 312*0b57cec5SDimitry Andric typedef money_get<_CharT, _Ip> _Fp; 313*0b57cec5SDimitry Andric ios_base::iostate __err = ios_base::goodbit; 314*0b57cec5SDimitry Andric const _Fp& __mf = use_facet<_Fp>(__is.getloc()); 315*0b57cec5SDimitry Andric __mf.get(_Ip(__is), _Ip(), __x.__intl_, __is, __err, __x.__mon_); 316*0b57cec5SDimitry Andric __is.setstate(__err); 317*0b57cec5SDimitry Andric } 318*0b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 319*0b57cec5SDimitry Andric } 320*0b57cec5SDimitry Andric catch (...) 321*0b57cec5SDimitry Andric { 322*0b57cec5SDimitry Andric __is.__set_badbit_and_consider_rethrow(); 323*0b57cec5SDimitry Andric } 324*0b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 325*0b57cec5SDimitry Andric return __is; 326*0b57cec5SDimitry Andric} 327*0b57cec5SDimitry Andric 328*0b57cec5SDimitry Andrictemplate <class _MoneyT> 329*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 330*0b57cec5SDimitry Andric__iom_t7<_MoneyT> 331*0b57cec5SDimitry Andricget_money(_MoneyT& __mon, bool __intl = false) 332*0b57cec5SDimitry Andric{ 333*0b57cec5SDimitry Andric return __iom_t7<_MoneyT>(__mon, __intl); 334*0b57cec5SDimitry Andric} 335*0b57cec5SDimitry Andric 336*0b57cec5SDimitry Andric// put_money 337*0b57cec5SDimitry Andric 338*0b57cec5SDimitry Andrictemplate <class _MoneyT> class __iom_t8; 339*0b57cec5SDimitry Andric 340*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT> 341*0b57cec5SDimitry Andricbasic_ostream<_CharT, _Traits>& 342*0b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x); 343*0b57cec5SDimitry Andric 344*0b57cec5SDimitry Andrictemplate <class _MoneyT> 345*0b57cec5SDimitry Andricclass __iom_t8 346*0b57cec5SDimitry Andric{ 347*0b57cec5SDimitry Andric const _MoneyT& __mon_; 348*0b57cec5SDimitry Andric bool __intl_; 349*0b57cec5SDimitry Andricpublic: 350*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 351*0b57cec5SDimitry Andric __iom_t8(const _MoneyT& __mon, bool __intl) 352*0b57cec5SDimitry Andric : __mon_(__mon), __intl_(__intl) {} 353*0b57cec5SDimitry Andric 354*0b57cec5SDimitry Andric template <class _CharT, class _Traits, class _Mp> 355*0b57cec5SDimitry Andric friend 356*0b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>& 357*0b57cec5SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_Mp>& __x); 358*0b57cec5SDimitry Andric}; 359*0b57cec5SDimitry Andric 360*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT> 361*0b57cec5SDimitry Andricbasic_ostream<_CharT, _Traits>& 362*0b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x) 363*0b57cec5SDimitry Andric{ 364*0b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 365*0b57cec5SDimitry Andric try 366*0b57cec5SDimitry Andric { 367*0b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 368*0b57cec5SDimitry Andric typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 369*0b57cec5SDimitry Andric if (__s) 370*0b57cec5SDimitry Andric { 371*0b57cec5SDimitry Andric typedef ostreambuf_iterator<_CharT, _Traits> _Op; 372*0b57cec5SDimitry Andric typedef money_put<_CharT, _Op> _Fp; 373*0b57cec5SDimitry Andric const _Fp& __mf = use_facet<_Fp>(__os.getloc()); 374*0b57cec5SDimitry Andric if (__mf.put(_Op(__os), __x.__intl_, __os, __os.fill(), __x.__mon_).failed()) 375*0b57cec5SDimitry Andric __os.setstate(ios_base::badbit); 376*0b57cec5SDimitry Andric } 377*0b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 378*0b57cec5SDimitry Andric } 379*0b57cec5SDimitry Andric catch (...) 380*0b57cec5SDimitry Andric { 381*0b57cec5SDimitry Andric __os.__set_badbit_and_consider_rethrow(); 382*0b57cec5SDimitry Andric } 383*0b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 384*0b57cec5SDimitry Andric return __os; 385*0b57cec5SDimitry Andric} 386*0b57cec5SDimitry Andric 387*0b57cec5SDimitry Andrictemplate <class _MoneyT> 388*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 389*0b57cec5SDimitry Andric__iom_t8<_MoneyT> 390*0b57cec5SDimitry Andricput_money(const _MoneyT& __mon, bool __intl = false) 391*0b57cec5SDimitry Andric{ 392*0b57cec5SDimitry Andric return __iom_t8<_MoneyT>(__mon, __intl); 393*0b57cec5SDimitry Andric} 394*0b57cec5SDimitry Andric 395*0b57cec5SDimitry Andric// get_time 396*0b57cec5SDimitry Andric 397*0b57cec5SDimitry Andrictemplate <class _CharT> class __iom_t9; 398*0b57cec5SDimitry Andric 399*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 400*0b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 401*0b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x); 402*0b57cec5SDimitry Andric 403*0b57cec5SDimitry Andrictemplate <class _CharT> 404*0b57cec5SDimitry Andricclass __iom_t9 405*0b57cec5SDimitry Andric{ 406*0b57cec5SDimitry Andric tm* __tm_; 407*0b57cec5SDimitry Andric const _CharT* __fmt_; 408*0b57cec5SDimitry Andricpublic: 409*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 410*0b57cec5SDimitry Andric __iom_t9(tm* __tm, const _CharT* __fmt) 411*0b57cec5SDimitry Andric : __tm_(__tm), __fmt_(__fmt) {} 412*0b57cec5SDimitry Andric 413*0b57cec5SDimitry Andric template <class _Cp, class _Traits> 414*0b57cec5SDimitry Andric friend 415*0b57cec5SDimitry Andric basic_istream<_Cp, _Traits>& 416*0b57cec5SDimitry Andric operator>>(basic_istream<_Cp, _Traits>& __is, const __iom_t9<_Cp>& __x); 417*0b57cec5SDimitry Andric}; 418*0b57cec5SDimitry Andric 419*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 420*0b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 421*0b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x) 422*0b57cec5SDimitry Andric{ 423*0b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 424*0b57cec5SDimitry Andric try 425*0b57cec5SDimitry Andric { 426*0b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 427*0b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __s(__is); 428*0b57cec5SDimitry Andric if (__s) 429*0b57cec5SDimitry Andric { 430*0b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 431*0b57cec5SDimitry Andric typedef time_get<_CharT, _Ip> _Fp; 432*0b57cec5SDimitry Andric ios_base::iostate __err = ios_base::goodbit; 433*0b57cec5SDimitry Andric const _Fp& __tf = use_facet<_Fp>(__is.getloc()); 434*0b57cec5SDimitry Andric __tf.get(_Ip(__is), _Ip(), __is, __err, __x.__tm_, 435*0b57cec5SDimitry Andric __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_)); 436*0b57cec5SDimitry Andric __is.setstate(__err); 437*0b57cec5SDimitry Andric } 438*0b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 439*0b57cec5SDimitry Andric } 440*0b57cec5SDimitry Andric catch (...) 441*0b57cec5SDimitry Andric { 442*0b57cec5SDimitry Andric __is.__set_badbit_and_consider_rethrow(); 443*0b57cec5SDimitry Andric } 444*0b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 445*0b57cec5SDimitry Andric return __is; 446*0b57cec5SDimitry Andric} 447*0b57cec5SDimitry Andric 448*0b57cec5SDimitry Andrictemplate <class _CharT> 449*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 450*0b57cec5SDimitry Andric__iom_t9<_CharT> 451*0b57cec5SDimitry Andricget_time(tm* __tm, const _CharT* __fmt) 452*0b57cec5SDimitry Andric{ 453*0b57cec5SDimitry Andric return __iom_t9<_CharT>(__tm, __fmt); 454*0b57cec5SDimitry Andric} 455*0b57cec5SDimitry Andric 456*0b57cec5SDimitry Andric// put_time 457*0b57cec5SDimitry Andric 458*0b57cec5SDimitry Andrictemplate <class _CharT> class __iom_t10; 459*0b57cec5SDimitry Andric 460*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 461*0b57cec5SDimitry Andricbasic_ostream<_CharT, _Traits>& 462*0b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x); 463*0b57cec5SDimitry Andric 464*0b57cec5SDimitry Andrictemplate <class _CharT> 465*0b57cec5SDimitry Andricclass __iom_t10 466*0b57cec5SDimitry Andric{ 467*0b57cec5SDimitry Andric const tm* __tm_; 468*0b57cec5SDimitry Andric const _CharT* __fmt_; 469*0b57cec5SDimitry Andricpublic: 470*0b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 471*0b57cec5SDimitry Andric __iom_t10(const tm* __tm, const _CharT* __fmt) 472*0b57cec5SDimitry Andric : __tm_(__tm), __fmt_(__fmt) {} 473*0b57cec5SDimitry Andric 474*0b57cec5SDimitry Andric template <class _Cp, class _Traits> 475*0b57cec5SDimitry Andric friend 476*0b57cec5SDimitry Andric basic_ostream<_Cp, _Traits>& 477*0b57cec5SDimitry Andric operator<<(basic_ostream<_Cp, _Traits>& __os, const __iom_t10<_Cp>& __x); 478*0b57cec5SDimitry Andric}; 479*0b57cec5SDimitry Andric 480*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 481*0b57cec5SDimitry Andricbasic_ostream<_CharT, _Traits>& 482*0b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x) 483*0b57cec5SDimitry Andric{ 484*0b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 485*0b57cec5SDimitry Andric try 486*0b57cec5SDimitry Andric { 487*0b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 488*0b57cec5SDimitry Andric typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 489*0b57cec5SDimitry Andric if (__s) 490*0b57cec5SDimitry Andric { 491*0b57cec5SDimitry Andric typedef ostreambuf_iterator<_CharT, _Traits> _Op; 492*0b57cec5SDimitry Andric typedef time_put<_CharT, _Op> _Fp; 493*0b57cec5SDimitry Andric const _Fp& __tf = use_facet<_Fp>(__os.getloc()); 494*0b57cec5SDimitry Andric if (__tf.put(_Op(__os), __os, __os.fill(), __x.__tm_, 495*0b57cec5SDimitry Andric __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_)).failed()) 496*0b57cec5SDimitry Andric __os.setstate(ios_base::badbit); 497*0b57cec5SDimitry Andric } 498*0b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 499*0b57cec5SDimitry Andric } 500*0b57cec5SDimitry Andric catch (...) 501*0b57cec5SDimitry Andric { 502*0b57cec5SDimitry Andric __os.__set_badbit_and_consider_rethrow(); 503*0b57cec5SDimitry Andric } 504*0b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 505*0b57cec5SDimitry Andric return __os; 506*0b57cec5SDimitry Andric} 507*0b57cec5SDimitry Andric 508*0b57cec5SDimitry Andrictemplate <class _CharT> 509*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 510*0b57cec5SDimitry Andric__iom_t10<_CharT> 511*0b57cec5SDimitry Andricput_time(const tm* __tm, const _CharT* __fmt) 512*0b57cec5SDimitry Andric{ 513*0b57cec5SDimitry Andric return __iom_t10<_CharT>(__tm, __fmt); 514*0b57cec5SDimitry Andric} 515*0b57cec5SDimitry Andric 516*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _ForwardIterator> 517*0b57cec5SDimitry Andricstd::basic_ostream<_CharT, _Traits> & 518*0b57cec5SDimitry Andric__quoted_output ( basic_ostream<_CharT, _Traits> &__os, 519*0b57cec5SDimitry Andric _ForwardIterator __first, _ForwardIterator __last, _CharT __delim, _CharT __escape ) 520*0b57cec5SDimitry Andric{ 521*0b57cec5SDimitry Andric _VSTD::basic_string<_CharT, _Traits> __str; 522*0b57cec5SDimitry Andric __str.push_back(__delim); 523*0b57cec5SDimitry Andric for ( ; __first != __last; ++ __first ) 524*0b57cec5SDimitry Andric { 525*0b57cec5SDimitry Andric if (_Traits::eq (*__first, __escape) || _Traits::eq (*__first, __delim)) 526*0b57cec5SDimitry Andric __str.push_back(__escape); 527*0b57cec5SDimitry Andric __str.push_back(*__first); 528*0b57cec5SDimitry Andric } 529*0b57cec5SDimitry Andric __str.push_back(__delim); 530*0b57cec5SDimitry Andric return __put_character_sequence(__os, __str.data(), __str.size()); 531*0b57cec5SDimitry Andric} 532*0b57cec5SDimitry Andric 533*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _String> 534*0b57cec5SDimitry Andricbasic_istream<_CharT, _Traits> & 535*0b57cec5SDimitry Andric__quoted_input ( basic_istream<_CharT, _Traits> &__is, _String & __string, _CharT __delim, _CharT __escape ) 536*0b57cec5SDimitry Andric{ 537*0b57cec5SDimitry Andric __string.clear (); 538*0b57cec5SDimitry Andric _CharT __c; 539*0b57cec5SDimitry Andric __is >> __c; 540*0b57cec5SDimitry Andric if ( __is.fail ()) 541*0b57cec5SDimitry Andric return __is; 542*0b57cec5SDimitry Andric 543*0b57cec5SDimitry Andric if (!_Traits::eq (__c, __delim)) // no delimiter, read the whole string 544*0b57cec5SDimitry Andric { 545*0b57cec5SDimitry Andric __is.unget (); 546*0b57cec5SDimitry Andric __is >> __string; 547*0b57cec5SDimitry Andric return __is; 548*0b57cec5SDimitry Andric } 549*0b57cec5SDimitry Andric 550*0b57cec5SDimitry Andric __save_flags<_CharT, _Traits> sf(__is); 551*0b57cec5SDimitry Andric noskipws (__is); 552*0b57cec5SDimitry Andric while (true) 553*0b57cec5SDimitry Andric { 554*0b57cec5SDimitry Andric __is >> __c; 555*0b57cec5SDimitry Andric if ( __is.fail ()) 556*0b57cec5SDimitry Andric break; 557*0b57cec5SDimitry Andric if (_Traits::eq (__c, __escape)) 558*0b57cec5SDimitry Andric { 559*0b57cec5SDimitry Andric __is >> __c; 560*0b57cec5SDimitry Andric if ( __is.fail ()) 561*0b57cec5SDimitry Andric break; 562*0b57cec5SDimitry Andric } 563*0b57cec5SDimitry Andric else if (_Traits::eq (__c, __delim)) 564*0b57cec5SDimitry Andric break; 565*0b57cec5SDimitry Andric __string.push_back ( __c ); 566*0b57cec5SDimitry Andric } 567*0b57cec5SDimitry Andric return __is; 568*0b57cec5SDimitry Andric} 569*0b57cec5SDimitry Andric 570*0b57cec5SDimitry Andric 571*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Iter> 572*0b57cec5SDimitry Andricbasic_ostream<_CharT, _Traits>& operator<<( 573*0b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>& __os, 574*0b57cec5SDimitry Andric const __quoted_output_proxy<_CharT, _Iter, _Traits> & __proxy) 575*0b57cec5SDimitry Andric{ 576*0b57cec5SDimitry Andric return __quoted_output (__os, __proxy.__first, __proxy.__last, __proxy.__delim, __proxy.__escape); 577*0b57cec5SDimitry Andric} 578*0b57cec5SDimitry Andric 579*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 580*0b57cec5SDimitry Andricstruct __quoted_proxy 581*0b57cec5SDimitry Andric{ 582*0b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator> &__string; 583*0b57cec5SDimitry Andric _CharT __delim; 584*0b57cec5SDimitry Andric _CharT __escape; 585*0b57cec5SDimitry Andric 586*0b57cec5SDimitry Andric __quoted_proxy(basic_string<_CharT, _Traits, _Allocator> &__s, _CharT __d, _CharT __e) 587*0b57cec5SDimitry Andric : __string(__s), __delim(__d), __escape(__e) {} 588*0b57cec5SDimitry Andric}; 589*0b57cec5SDimitry Andric 590*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 591*0b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 592*0b57cec5SDimitry Andricbasic_ostream<_CharT, _Traits>& operator<<( 593*0b57cec5SDimitry Andric basic_ostream<_CharT, _Traits>& __os, 594*0b57cec5SDimitry Andric const __quoted_proxy<_CharT, _Traits, _Allocator> & __proxy) 595*0b57cec5SDimitry Andric{ 596*0b57cec5SDimitry Andric return __quoted_output (__os, __proxy.__string.cbegin (), __proxy.__string.cend (), __proxy.__delim, __proxy.__escape); 597*0b57cec5SDimitry Andric} 598*0b57cec5SDimitry Andric 599*0b57cec5SDimitry Andric// extractor for non-const basic_string& proxies 600*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 601*0b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 602*0b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& operator>>( 603*0b57cec5SDimitry Andric basic_istream<_CharT, _Traits>& __is, 604*0b57cec5SDimitry Andric const __quoted_proxy<_CharT, _Traits, _Allocator> & __proxy) 605*0b57cec5SDimitry Andric{ 606*0b57cec5SDimitry Andric return __quoted_input ( __is, __proxy.__string, __proxy.__delim, __proxy.__escape ); 607*0b57cec5SDimitry Andric} 608*0b57cec5SDimitry Andric 609*0b57cec5SDimitry Andric 610*0b57cec5SDimitry Andrictemplate <class _CharT> 611*0b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 612*0b57cec5SDimitry Andric__quoted_output_proxy<_CharT, const _CharT *> 613*0b57cec5SDimitry Andricquoted ( const _CharT *__s, _CharT __delim = _CharT('"'), _CharT __escape =_CharT('\\')) 614*0b57cec5SDimitry Andric{ 615*0b57cec5SDimitry Andric const _CharT *__end = __s; 616*0b57cec5SDimitry Andric while ( *__end ) ++__end; 617*0b57cec5SDimitry Andric return __quoted_output_proxy<_CharT, const _CharT *> ( __s, __end, __delim, __escape ); 618*0b57cec5SDimitry Andric} 619*0b57cec5SDimitry Andric 620*0b57cec5SDimitry Andric 621*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 622*0b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 623*0b57cec5SDimitry Andric__quoted_output_proxy<_CharT, typename basic_string <_CharT, _Traits, _Allocator>::const_iterator> 624*0b57cec5SDimitry Andric__quoted ( const basic_string <_CharT, _Traits, _Allocator> &__s, _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\')) 625*0b57cec5SDimitry Andric{ 626*0b57cec5SDimitry Andric return __quoted_output_proxy<_CharT, 627*0b57cec5SDimitry Andric typename basic_string <_CharT, _Traits, _Allocator>::const_iterator> 628*0b57cec5SDimitry Andric ( __s.cbegin(), __s.cend (), __delim, __escape ); 629*0b57cec5SDimitry Andric} 630*0b57cec5SDimitry Andric 631*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 632*0b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 633*0b57cec5SDimitry Andric__quoted_proxy<_CharT, _Traits, _Allocator> 634*0b57cec5SDimitry Andric__quoted ( basic_string <_CharT, _Traits, _Allocator> &__s, _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\')) 635*0b57cec5SDimitry Andric{ 636*0b57cec5SDimitry Andric return __quoted_proxy<_CharT, _Traits, _Allocator>( __s, __delim, __escape ); 637*0b57cec5SDimitry Andric} 638*0b57cec5SDimitry Andric 639*0b57cec5SDimitry Andric 640*0b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 11 641*0b57cec5SDimitry Andric 642*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 643*0b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 644*0b57cec5SDimitry Andric__quoted_output_proxy<_CharT, typename basic_string <_CharT, _Traits, _Allocator>::const_iterator> 645*0b57cec5SDimitry Andricquoted ( const basic_string <_CharT, _Traits, _Allocator> &__s, _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\')) 646*0b57cec5SDimitry Andric{ 647*0b57cec5SDimitry Andric return __quoted(__s, __delim, __escape); 648*0b57cec5SDimitry Andric} 649*0b57cec5SDimitry Andric 650*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 651*0b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY 652*0b57cec5SDimitry Andric__quoted_proxy<_CharT, _Traits, _Allocator> 653*0b57cec5SDimitry Andricquoted ( basic_string <_CharT, _Traits, _Allocator> &__s, _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\')) 654*0b57cec5SDimitry Andric{ 655*0b57cec5SDimitry Andric return __quoted(__s, __delim, __escape); 656*0b57cec5SDimitry Andric} 657*0b57cec5SDimitry Andric 658*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 659*0b57cec5SDimitry Andric__quoted_output_proxy<_CharT, const _CharT *, _Traits> 660*0b57cec5SDimitry Andricquoted (basic_string_view <_CharT, _Traits> __sv, 661*0b57cec5SDimitry Andric _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\')) 662*0b57cec5SDimitry Andric{ 663*0b57cec5SDimitry Andric return __quoted_output_proxy<_CharT, const _CharT *, _Traits> 664*0b57cec5SDimitry Andric ( __sv.data(), __sv.data() + __sv.size(), __delim, __escape ); 665*0b57cec5SDimitry Andric} 666*0b57cec5SDimitry Andric#endif 667*0b57cec5SDimitry Andric 668*0b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 669*0b57cec5SDimitry Andric 670*0b57cec5SDimitry Andric#endif // _LIBCPP_IOMANIP 671