511 lines · plain
1// -*- C++ -*-2//===----------------------------------------------------------------------===//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10#ifndef _LIBCPP___CXX03_IOMANIP11#define _LIBCPP___CXX03_IOMANIP12 13/*14 iomanip synopsis15 16namespace std {17 18// types T1, T2, ... are unspecified implementation types19T1 resetiosflags(ios_base::fmtflags mask);20T2 setiosflags (ios_base::fmtflags mask);21T3 setbase(int base);22template<charT> T4 setfill(charT c);23T5 setprecision(int n);24T6 setw(int n);25template <class moneyT> T7 get_money(moneyT& mon, bool intl = false);26template <class charT, class moneyT> T8 put_money(const moneyT& mon, bool intl = false);27template <class charT> T9 get_time(struct tm* tmb, const charT* fmt);28template <class charT> T10 put_time(const struct tm* tmb, const charT* fmt);29 30template <class charT>31 T11 quoted(const charT* s, charT delim=charT('"'), charT escape=charT('\\')); // C++1432 33template <class charT, class traits, class Allocator>34 T12 quoted(const basic_string<charT, traits, Allocator>& s,35 charT delim=charT('"'), charT escape=charT('\\')); // C++1436 37template <class charT, class traits, class Allocator>38 T13 quoted(basic_string<charT, traits, Allocator>& s,39 charT delim=charT('"'), charT escape=charT('\\')); // C++1440 41} // std42 43*/44 45#include <__cxx03/__config>46#include <__cxx03/istream>47#include <__cxx03/version>48 49#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)50# pragma GCC system_header51#endif52 53_LIBCPP_BEGIN_NAMESPACE_STD54 55// resetiosflags56 57class __iom_t1 {58 ios_base::fmtflags __mask_;59 60public:61 _LIBCPP_HIDE_FROM_ABI explicit __iom_t1(ios_base::fmtflags __m) : __mask_(__m) {}62 63 template <class _CharT, class _Traits>64 friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&65 operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t1& __x) {66 __is.unsetf(__x.__mask_);67 return __is;68 }69 70 template <class _CharT, class _Traits>71 friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&72 operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t1& __x) {73 __os.unsetf(__x.__mask_);74 return __os;75 }76};77 78inline _LIBCPP_HIDE_FROM_ABI __iom_t1 resetiosflags(ios_base::fmtflags __mask) { return __iom_t1(__mask); }79 80// setiosflags81 82class __iom_t2 {83 ios_base::fmtflags __mask_;84 85public:86 _LIBCPP_HIDE_FROM_ABI explicit __iom_t2(ios_base::fmtflags __m) : __mask_(__m) {}87 88 template <class _CharT, class _Traits>89 friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&90 operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t2& __x) {91 __is.setf(__x.__mask_);92 return __is;93 }94 95 template <class _CharT, class _Traits>96 friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&97 operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t2& __x) {98 __os.setf(__x.__mask_);99 return __os;100 }101};102 103inline _LIBCPP_HIDE_FROM_ABI __iom_t2 setiosflags(ios_base::fmtflags __mask) { return __iom_t2(__mask); }104 105// setbase106 107class __iom_t3 {108 int __base_;109 110public:111 _LIBCPP_HIDE_FROM_ABI explicit __iom_t3(int __b) : __base_(__b) {}112 113 template <class _CharT, class _Traits>114 friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&115 operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t3& __x) {116 __is.setf(__x.__base_ == 8 ? ios_base::oct117 : __x.__base_ == 10 ? ios_base::dec118 : __x.__base_ == 16 ? ios_base::hex119 : ios_base::fmtflags(0),120 ios_base::basefield);121 return __is;122 }123 124 template <class _CharT, class _Traits>125 friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&126 operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t3& __x) {127 __os.setf(__x.__base_ == 8 ? ios_base::oct128 : __x.__base_ == 10 ? ios_base::dec129 : __x.__base_ == 16 ? ios_base::hex130 : ios_base::fmtflags(0),131 ios_base::basefield);132 return __os;133 }134};135 136inline _LIBCPP_HIDE_FROM_ABI __iom_t3 setbase(int __base) { return __iom_t3(__base); }137 138// setfill139 140template <class _CharT>141class __iom_t4 {142 _CharT __fill_;143 144public:145 _LIBCPP_HIDE_FROM_ABI explicit __iom_t4(_CharT __c) : __fill_(__c) {}146 147 template <class _Traits>148 friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&149 operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t4& __x) {150 __os.fill(__x.__fill_);151 return __os;152 }153};154 155template <class _CharT>156inline _LIBCPP_HIDE_FROM_ABI __iom_t4<_CharT> setfill(_CharT __c) {157 return __iom_t4<_CharT>(__c);158}159 160// setprecision161 162class __iom_t5 {163 int __n_;164 165public:166 _LIBCPP_HIDE_FROM_ABI explicit __iom_t5(int __n) : __n_(__n) {}167 168 template <class _CharT, class _Traits>169 friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&170 operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t5& __x) {171 __is.precision(__x.__n_);172 return __is;173 }174 175 template <class _CharT, class _Traits>176 friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&177 operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t5& __x) {178 __os.precision(__x.__n_);179 return __os;180 }181};182 183inline _LIBCPP_HIDE_FROM_ABI __iom_t5 setprecision(int __n) { return __iom_t5(__n); }184 185// setw186 187class __iom_t6 {188 int __n_;189 190public:191 _LIBCPP_HIDE_FROM_ABI explicit __iom_t6(int __n) : __n_(__n) {}192 193 template <class _CharT, class _Traits>194 friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&195 operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t6& __x) {196 __is.width(__x.__n_);197 return __is;198 }199 200 template <class _CharT, class _Traits>201 friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&202 operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t6& __x) {203 __os.width(__x.__n_);204 return __os;205 }206};207 208inline _LIBCPP_HIDE_FROM_ABI __iom_t6 setw(int __n) { return __iom_t6(__n); }209 210// get_money211 212template <class _MoneyT>213class __iom_t7;214 215template <class _CharT, class _Traits, class _MoneyT>216_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&217operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x);218 219template <class _MoneyT>220class __iom_t7 {221 _MoneyT& __mon_;222 bool __intl_;223 224public:225 _LIBCPP_HIDE_FROM_ABI __iom_t7(_MoneyT& __mon, bool __intl) : __mon_(__mon), __intl_(__intl) {}226 227 template <class _CharT, class _Traits, class _Mp>228 friend basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_Mp>& __x);229};230 231template <class _CharT, class _Traits, class _MoneyT>232_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&233operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x) {234#ifndef _LIBCPP_HAS_NO_EXCEPTIONS235 try {236#endif // _LIBCPP_HAS_NO_EXCEPTIONS237 typename basic_istream<_CharT, _Traits>::sentry __s(__is);238 if (__s) {239 typedef istreambuf_iterator<_CharT, _Traits> _Ip;240 typedef money_get<_CharT, _Ip> _Fp;241 ios_base::iostate __err = ios_base::goodbit;242 const _Fp& __mf = std::use_facet<_Fp>(__is.getloc());243 __mf.get(_Ip(__is), _Ip(), __x.__intl_, __is, __err, __x.__mon_);244 __is.setstate(__err);245 }246#ifndef _LIBCPP_HAS_NO_EXCEPTIONS247 } catch (...) {248 __is.__set_badbit_and_consider_rethrow();249 }250#endif // _LIBCPP_HAS_NO_EXCEPTIONS251 return __is;252}253 254template <class _MoneyT>255inline _LIBCPP_HIDE_FROM_ABI __iom_t7<_MoneyT> get_money(_MoneyT& __mon, bool __intl = false) {256 return __iom_t7<_MoneyT>(__mon, __intl);257}258 259// put_money260 261template <class _MoneyT>262class __iom_t8;263 264template <class _CharT, class _Traits, class _MoneyT>265_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&266operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x);267 268template <class _MoneyT>269class __iom_t8 {270 const _MoneyT& __mon_;271 bool __intl_;272 273public:274 _LIBCPP_HIDE_FROM_ABI __iom_t8(const _MoneyT& __mon, bool __intl) : __mon_(__mon), __intl_(__intl) {}275 276 template <class _CharT, class _Traits, class _Mp>277 friend basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_Mp>& __x);278};279 280template <class _CharT, class _Traits, class _MoneyT>281_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&282operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x) {283#ifndef _LIBCPP_HAS_NO_EXCEPTIONS284 try {285#endif // _LIBCPP_HAS_NO_EXCEPTIONS286 typename basic_ostream<_CharT, _Traits>::sentry __s(__os);287 if (__s) {288 typedef ostreambuf_iterator<_CharT, _Traits> _Op;289 typedef money_put<_CharT, _Op> _Fp;290 const _Fp& __mf = std::use_facet<_Fp>(__os.getloc());291 if (__mf.put(_Op(__os), __x.__intl_, __os, __os.fill(), __x.__mon_).failed())292 __os.setstate(ios_base::badbit);293 }294#ifndef _LIBCPP_HAS_NO_EXCEPTIONS295 } catch (...) {296 __os.__set_badbit_and_consider_rethrow();297 }298#endif // _LIBCPP_HAS_NO_EXCEPTIONS299 return __os;300}301 302template <class _MoneyT>303inline _LIBCPP_HIDE_FROM_ABI __iom_t8<_MoneyT> put_money(const _MoneyT& __mon, bool __intl = false) {304 return __iom_t8<_MoneyT>(__mon, __intl);305}306 307// get_time308 309template <class _CharT>310class __iom_t9;311 312template <class _CharT, class _Traits>313_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&314operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x);315 316template <class _CharT>317class __iom_t9 {318 tm* __tm_;319 const _CharT* __fmt_;320 321public:322 _LIBCPP_HIDE_FROM_ABI __iom_t9(tm* __tm, const _CharT* __fmt) : __tm_(__tm), __fmt_(__fmt) {}323 324 template <class _Cp, class _Traits>325 friend basic_istream<_Cp, _Traits>& operator>>(basic_istream<_Cp, _Traits>& __is, const __iom_t9<_Cp>& __x);326};327 328template <class _CharT, class _Traits>329_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&330operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x) {331#ifndef _LIBCPP_HAS_NO_EXCEPTIONS332 try {333#endif // _LIBCPP_HAS_NO_EXCEPTIONS334 typename basic_istream<_CharT, _Traits>::sentry __s(__is);335 if (__s) {336 typedef istreambuf_iterator<_CharT, _Traits> _Ip;337 typedef time_get<_CharT, _Ip> _Fp;338 ios_base::iostate __err = ios_base::goodbit;339 const _Fp& __tf = std::use_facet<_Fp>(__is.getloc());340 __tf.get(_Ip(__is), _Ip(), __is, __err, __x.__tm_, __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_));341 __is.setstate(__err);342 }343#ifndef _LIBCPP_HAS_NO_EXCEPTIONS344 } catch (...) {345 __is.__set_badbit_and_consider_rethrow();346 }347#endif // _LIBCPP_HAS_NO_EXCEPTIONS348 return __is;349}350 351template <class _CharT>352inline _LIBCPP_HIDE_FROM_ABI __iom_t9<_CharT> get_time(tm* __tm, const _CharT* __fmt) {353 return __iom_t9<_CharT>(__tm, __fmt);354}355 356// put_time357 358template <class _CharT>359class __iom_t10;360 361template <class _CharT, class _Traits>362_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&363operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x);364 365template <class _CharT>366class __iom_t10 {367 const tm* __tm_;368 const _CharT* __fmt_;369 370public:371 _LIBCPP_HIDE_FROM_ABI __iom_t10(const tm* __tm, const _CharT* __fmt) : __tm_(__tm), __fmt_(__fmt) {}372 373 template <class _Cp, class _Traits>374 friend basic_ostream<_Cp, _Traits>& operator<<(basic_ostream<_Cp, _Traits>& __os, const __iom_t10<_Cp>& __x);375};376 377template <class _CharT, class _Traits>378_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&379operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x) {380#ifndef _LIBCPP_HAS_NO_EXCEPTIONS381 try {382#endif // _LIBCPP_HAS_NO_EXCEPTIONS383 typename basic_ostream<_CharT, _Traits>::sentry __s(__os);384 if (__s) {385 typedef ostreambuf_iterator<_CharT, _Traits> _Op;386 typedef time_put<_CharT, _Op> _Fp;387 const _Fp& __tf = std::use_facet<_Fp>(__os.getloc());388 if (__tf.put(_Op(__os), __os, __os.fill(), __x.__tm_, __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_))389 .failed())390 __os.setstate(ios_base::badbit);391 }392#ifndef _LIBCPP_HAS_NO_EXCEPTIONS393 } catch (...) {394 __os.__set_badbit_and_consider_rethrow();395 }396#endif // _LIBCPP_HAS_NO_EXCEPTIONS397 return __os;398}399 400template <class _CharT>401inline _LIBCPP_HIDE_FROM_ABI __iom_t10<_CharT> put_time(const tm* __tm, const _CharT* __fmt) {402 return __iom_t10<_CharT>(__tm, __fmt);403}404 405template <class _CharT, class _Traits>406_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& __quoted_output(407 basic_ostream<_CharT, _Traits>& __os,408 const _CharT* __first,409 const _CharT* __last,410 _CharT __delim,411 _CharT __escape) {412 basic_string<_CharT, _Traits> __str;413 __str.push_back(__delim);414 for (; __first != __last; ++__first) {415 if (_Traits::eq(*__first, __escape) || _Traits::eq(*__first, __delim))416 __str.push_back(__escape);417 __str.push_back(*__first);418 }419 __str.push_back(__delim);420 return std::__put_character_sequence(__os, __str.data(), __str.size());421}422 423template <class _CharT, class _Traits, class _String>424_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&425__quoted_input(basic_istream<_CharT, _Traits>& __is, _String& __string, _CharT __delim, _CharT __escape) {426 __string.clear();427 _CharT __c;428 __is >> __c;429 if (__is.fail())430 return __is;431 432 if (!_Traits::eq(__c, __delim)) {433 // no delimiter, read the whole string434 __is.unget();435 __is >> __string;436 return __is;437 }438 439 __save_flags<_CharT, _Traits> __sf(__is);440 std::noskipws(__is);441 while (true) {442 __is >> __c;443 if (__is.fail())444 break;445 if (_Traits::eq(__c, __escape)) {446 __is >> __c;447 if (__is.fail())448 break;449 } else if (_Traits::eq(__c, __delim))450 break;451 __string.push_back(__c);452 }453 return __is;454}455 456template <class _CharT, class _Traits>457struct _LIBCPP_HIDDEN __quoted_output_proxy {458 const _CharT* __first_;459 const _CharT* __last_;460 _CharT __delim_;461 _CharT __escape_;462 463 _LIBCPP_HIDE_FROM_ABI explicit __quoted_output_proxy(const _CharT* __f, const _CharT* __l, _CharT __d, _CharT __e)464 : __first_(__f), __last_(__l), __delim_(__d), __escape_(__e) {}465 466 template <class _T2, __enable_if_t<_IsSame<_Traits, void>::value || _IsSame<_Traits, _T2>::value, int> = 0>467 friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _T2>&468 operator<<(basic_ostream<_CharT, _T2>& __os, const __quoted_output_proxy& __p) {469 return std::__quoted_output(__os, __p.__first_, __p.__last_, __p.__delim_, __p.__escape_);470 }471};472 473template <class _CharT, class _Traits, class _Allocator>474struct _LIBCPP_HIDDEN __quoted_proxy {475 basic_string<_CharT, _Traits, _Allocator>& __string_;476 _CharT __delim_;477 _CharT __escape_;478 479 _LIBCPP_HIDE_FROM_ABI explicit __quoted_proxy(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __d, _CharT __e)480 : __string_(__s), __delim_(__d), __escape_(__e) {}481 482 friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&483 operator<<(basic_ostream<_CharT, _Traits>& __os, const __quoted_proxy& __p) {484 return std::__quoted_output(485 __os, __p.__string_.data(), __p.__string_.data() + __p.__string_.size(), __p.__delim_, __p.__escape_);486 }487 488 friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&489 operator>>(basic_istream<_CharT, _Traits>& __is, const __quoted_proxy& __p) {490 return std::__quoted_input(__is, __p.__string_, __p.__delim_, __p.__escape_);491 }492};493 494template <class _CharT, class _Traits, class _Allocator>495_LIBCPP_HIDE_FROM_ABI __quoted_output_proxy<_CharT, _Traits>496__quoted(const basic_string<_CharT, _Traits, _Allocator>& __s,497 _CharT __delim = _CharT('"'),498 _CharT __escape = _CharT('\\')) {499 return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape);500}501 502template <class _CharT, class _Traits, class _Allocator>503_LIBCPP_HIDE_FROM_ABI __quoted_proxy<_CharT, _Traits, _Allocator>504__quoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {505 return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape);506}507 508_LIBCPP_END_NAMESPACE_STD509 510#endif // _LIBCPP___CXX03_IOMANIP511