577 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_IOMANIP11#define _LIBCPP_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#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)46# include <__cxx03/iomanip>47#else48# include <__config>49 50# if _LIBCPP_HAS_LOCALIZATION51 52# include <__iterator/istreambuf_iterator.h>53# include <__locale_dir/money.h>54# include <__locale_dir/time.h>55# include <__ostream/put_character_sequence.h>56# include <ios>57# include <iosfwd>58# include <version>59 60# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)61# pragma GCC system_header62# endif63 64_LIBCPP_BEGIN_NAMESPACE_STD65 66// resetiosflags67 68class __iom_t1 {69 ios_base::fmtflags __mask_;70 71public:72 _LIBCPP_HIDE_FROM_ABI explicit __iom_t1(ios_base::fmtflags __m) : __mask_(__m) {}73 74 template <class _CharT, class _Traits>75 friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&76 operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t1& __x) {77 __is.unsetf(__x.__mask_);78 return __is;79 }80 81 template <class _CharT, class _Traits>82 friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&83 operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t1& __x) {84 __os.unsetf(__x.__mask_);85 return __os;86 }87};88 89inline _LIBCPP_HIDE_FROM_ABI __iom_t1 resetiosflags(ios_base::fmtflags __mask) { return __iom_t1(__mask); }90 91// setiosflags92 93class __iom_t2 {94 ios_base::fmtflags __mask_;95 96public:97 _LIBCPP_HIDE_FROM_ABI explicit __iom_t2(ios_base::fmtflags __m) : __mask_(__m) {}98 99 template <class _CharT, class _Traits>100 friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&101 operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t2& __x) {102 __is.setf(__x.__mask_);103 return __is;104 }105 106 template <class _CharT, class _Traits>107 friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&108 operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t2& __x) {109 __os.setf(__x.__mask_);110 return __os;111 }112};113 114inline _LIBCPP_HIDE_FROM_ABI __iom_t2 setiosflags(ios_base::fmtflags __mask) { return __iom_t2(__mask); }115 116// setbase117 118class __iom_t3 {119 int __base_;120 121public:122 _LIBCPP_HIDE_FROM_ABI explicit __iom_t3(int __b) : __base_(__b) {}123 124 template <class _CharT, class _Traits>125 friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&126 operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t3& __x) {127 __is.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 __is;133 }134 135 template <class _CharT, class _Traits>136 friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&137 operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t3& __x) {138 __os.setf(__x.__base_ == 8 ? ios_base::oct139 : __x.__base_ == 10 ? ios_base::dec140 : __x.__base_ == 16 ? ios_base::hex141 : ios_base::fmtflags(0),142 ios_base::basefield);143 return __os;144 }145};146 147inline _LIBCPP_HIDE_FROM_ABI __iom_t3 setbase(int __base) { return __iom_t3(__base); }148 149// setfill150 151template <class _CharT>152class __iom_t4 {153 _CharT __fill_;154 155public:156 _LIBCPP_HIDE_FROM_ABI explicit __iom_t4(_CharT __c) : __fill_(__c) {}157 158 template <class _Traits>159 friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&160 operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t4& __x) {161 __os.fill(__x.__fill_);162 return __os;163 }164};165 166template <class _CharT>167inline _LIBCPP_HIDE_FROM_ABI __iom_t4<_CharT> setfill(_CharT __c) {168 return __iom_t4<_CharT>(__c);169}170 171// setprecision172 173class __iom_t5 {174 int __n_;175 176public:177 _LIBCPP_HIDE_FROM_ABI explicit __iom_t5(int __n) : __n_(__n) {}178 179 template <class _CharT, class _Traits>180 friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&181 operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t5& __x) {182 __is.precision(__x.__n_);183 return __is;184 }185 186 template <class _CharT, class _Traits>187 friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&188 operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t5& __x) {189 __os.precision(__x.__n_);190 return __os;191 }192};193 194inline _LIBCPP_HIDE_FROM_ABI __iom_t5 setprecision(int __n) { return __iom_t5(__n); }195 196// setw197 198class __iom_t6 {199 int __n_;200 201public:202 _LIBCPP_HIDE_FROM_ABI explicit __iom_t6(int __n) : __n_(__n) {}203 204 template <class _CharT, class _Traits>205 friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&206 operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t6& __x) {207 __is.width(__x.__n_);208 return __is;209 }210 211 template <class _CharT, class _Traits>212 friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&213 operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t6& __x) {214 __os.width(__x.__n_);215 return __os;216 }217};218 219inline _LIBCPP_HIDE_FROM_ABI __iom_t6 setw(int __n) { return __iom_t6(__n); }220 221// get_money222 223template <class _MoneyT>224class __iom_t7;225 226template <class _CharT, class _Traits, class _MoneyT>227_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&228operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x);229 230template <class _MoneyT>231class __iom_t7 {232 _MoneyT& __mon_;233 bool __intl_;234 235public:236 _LIBCPP_HIDE_FROM_ABI __iom_t7(_MoneyT& __mon, bool __intl) : __mon_(__mon), __intl_(__intl) {}237 238 template <class _CharT, class _Traits, class _Mp>239 friend basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_Mp>& __x);240};241 242template <class _CharT, class _Traits, class _MoneyT>243_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&244operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x) {245# if _LIBCPP_HAS_EXCEPTIONS246 try {247# endif // _LIBCPP_HAS_EXCEPTIONS248 typename basic_istream<_CharT, _Traits>::sentry __s(__is);249 if (__s) {250 typedef istreambuf_iterator<_CharT, _Traits> _Ip;251 typedef money_get<_CharT, _Ip> _Fp;252 ios_base::iostate __err = ios_base::goodbit;253 const _Fp& __mf = std::use_facet<_Fp>(__is.getloc());254 __mf.get(_Ip(__is), _Ip(), __x.__intl_, __is, __err, __x.__mon_);255 __is.setstate(__err);256 }257# if _LIBCPP_HAS_EXCEPTIONS258 } catch (...) {259 __is.__set_badbit_and_consider_rethrow();260 }261# endif // _LIBCPP_HAS_EXCEPTIONS262 return __is;263}264 265template <class _MoneyT>266inline _LIBCPP_HIDE_FROM_ABI __iom_t7<_MoneyT> get_money(_MoneyT& __mon, bool __intl = false) {267 return __iom_t7<_MoneyT>(__mon, __intl);268}269 270// put_money271 272template <class _MoneyT>273class __iom_t8;274 275template <class _CharT, class _Traits, class _MoneyT>276_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&277operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x);278 279template <class _MoneyT>280class __iom_t8 {281 const _MoneyT& __mon_;282 bool __intl_;283 284public:285 _LIBCPP_HIDE_FROM_ABI __iom_t8(const _MoneyT& __mon, bool __intl) : __mon_(__mon), __intl_(__intl) {}286 287 template <class _CharT, class _Traits, class _Mp>288 friend basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_Mp>& __x);289};290 291template <class _CharT, class _Traits, class _MoneyT>292_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&293operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x) {294# if _LIBCPP_HAS_EXCEPTIONS295 try {296# endif // _LIBCPP_HAS_EXCEPTIONS297 typename basic_ostream<_CharT, _Traits>::sentry __s(__os);298 if (__s) {299 typedef ostreambuf_iterator<_CharT, _Traits> _Op;300 typedef money_put<_CharT, _Op> _Fp;301 const _Fp& __mf = std::use_facet<_Fp>(__os.getloc());302 if (__mf.put(_Op(__os), __x.__intl_, __os, __os.fill(), __x.__mon_).failed())303 __os.setstate(ios_base::badbit);304 }305# if _LIBCPP_HAS_EXCEPTIONS306 } catch (...) {307 __os.__set_badbit_and_consider_rethrow();308 }309# endif // _LIBCPP_HAS_EXCEPTIONS310 return __os;311}312 313template <class _MoneyT>314inline _LIBCPP_HIDE_FROM_ABI __iom_t8<_MoneyT> put_money(const _MoneyT& __mon, bool __intl = false) {315 return __iom_t8<_MoneyT>(__mon, __intl);316}317 318// get_time319 320template <class _CharT>321class __iom_t9;322 323template <class _CharT, class _Traits>324_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&325operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x);326 327template <class _CharT>328class __iom_t9 {329 tm* __tm_;330 const _CharT* __fmt_;331 332public:333 _LIBCPP_HIDE_FROM_ABI __iom_t9(tm* __tm, const _CharT* __fmt) : __tm_(__tm), __fmt_(__fmt) {}334 335 template <class _Cp, class _Traits>336 friend basic_istream<_Cp, _Traits>& operator>>(basic_istream<_Cp, _Traits>& __is, const __iom_t9<_Cp>& __x);337};338 339template <class _CharT, class _Traits>340_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&341operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x) {342# if _LIBCPP_HAS_EXCEPTIONS343 try {344# endif // _LIBCPP_HAS_EXCEPTIONS345 typename basic_istream<_CharT, _Traits>::sentry __s(__is);346 if (__s) {347 typedef istreambuf_iterator<_CharT, _Traits> _Ip;348 typedef time_get<_CharT, _Ip> _Fp;349 ios_base::iostate __err = ios_base::goodbit;350 const _Fp& __tf = std::use_facet<_Fp>(__is.getloc());351 __tf.get(_Ip(__is), _Ip(), __is, __err, __x.__tm_, __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_));352 __is.setstate(__err);353 }354# if _LIBCPP_HAS_EXCEPTIONS355 } catch (...) {356 __is.__set_badbit_and_consider_rethrow();357 }358# endif // _LIBCPP_HAS_EXCEPTIONS359 return __is;360}361 362template <class _CharT>363inline _LIBCPP_HIDE_FROM_ABI __iom_t9<_CharT> get_time(tm* __tm, const _CharT* __fmt) {364 return __iom_t9<_CharT>(__tm, __fmt);365}366 367// put_time368 369template <class _CharT>370class __iom_t10;371 372template <class _CharT, class _Traits>373_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&374operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x);375 376template <class _CharT>377class __iom_t10 {378 const tm* __tm_;379 const _CharT* __fmt_;380 381public:382 _LIBCPP_HIDE_FROM_ABI __iom_t10(const tm* __tm, const _CharT* __fmt) : __tm_(__tm), __fmt_(__fmt) {}383 384 template <class _Cp, class _Traits>385 friend basic_ostream<_Cp, _Traits>& operator<<(basic_ostream<_Cp, _Traits>& __os, const __iom_t10<_Cp>& __x);386};387 388template <class _CharT, class _Traits>389_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&390operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x) {391# if _LIBCPP_HAS_EXCEPTIONS392 try {393# endif // _LIBCPP_HAS_EXCEPTIONS394 typename basic_ostream<_CharT, _Traits>::sentry __s(__os);395 if (__s) {396 typedef ostreambuf_iterator<_CharT, _Traits> _Op;397 typedef time_put<_CharT, _Op> _Fp;398 const _Fp& __tf = std::use_facet<_Fp>(__os.getloc());399 if (__tf.put(_Op(__os), __os, __os.fill(), __x.__tm_, __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_))400 .failed())401 __os.setstate(ios_base::badbit);402 }403# if _LIBCPP_HAS_EXCEPTIONS404 } catch (...) {405 __os.__set_badbit_and_consider_rethrow();406 }407# endif // _LIBCPP_HAS_EXCEPTIONS408 return __os;409}410 411template <class _CharT>412inline _LIBCPP_HIDE_FROM_ABI __iom_t10<_CharT> put_time(const tm* __tm, const _CharT* __fmt) {413 return __iom_t10<_CharT>(__tm, __fmt);414}415 416template <class _CharT, class _Traits>417_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& __quoted_output(418 basic_ostream<_CharT, _Traits>& __os,419 const _CharT* __first,420 const _CharT* __last,421 _CharT __delim,422 _CharT __escape) {423 basic_string<_CharT, _Traits> __str;424 __str.push_back(__delim);425 for (; __first != __last; ++__first) {426 if (_Traits::eq(*__first, __escape) || _Traits::eq(*__first, __delim))427 __str.push_back(__escape);428 __str.push_back(*__first);429 }430 __str.push_back(__delim);431 return std::__put_character_sequence(__os, __str.data(), __str.size());432}433 434template <class _CharT, class _Traits, class _String>435_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&436__quoted_input(basic_istream<_CharT, _Traits>& __is, _String& __string, _CharT __delim, _CharT __escape) {437 __string.clear();438 _CharT __c;439 __is >> __c;440 if (__is.fail())441 return __is;442 443 if (!_Traits::eq(__c, __delim)) {444 // no delimiter, read the whole string445 __is.unget();446 __is >> __string;447 return __is;448 }449 450 __save_flags<_CharT, _Traits> __sf(__is);451 std::noskipws(__is);452 while (true) {453 __is >> __c;454 if (__is.fail())455 break;456 if (_Traits::eq(__c, __escape)) {457 __is >> __c;458 if (__is.fail())459 break;460 } else if (_Traits::eq(__c, __delim))461 break;462 __string.push_back(__c);463 }464 return __is;465}466 467template <class _CharT, class _Traits>468struct _LIBCPP_HIDDEN __quoted_output_proxy {469 const _CharT* __first_;470 const _CharT* __last_;471 _CharT __delim_;472 _CharT __escape_;473 474 _LIBCPP_HIDE_FROM_ABI explicit __quoted_output_proxy(const _CharT* __f, const _CharT* __l, _CharT __d, _CharT __e)475 : __first_(__f), __last_(__l), __delim_(__d), __escape_(__e) {}476 477 template <class _T2, __enable_if_t<_IsSame<_Traits, void>::value || _IsSame<_Traits, _T2>::value, int> = 0>478 friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _T2>&479 operator<<(basic_ostream<_CharT, _T2>& __os, const __quoted_output_proxy& __p) {480 return std::__quoted_output(__os, __p.__first_, __p.__last_, __p.__delim_, __p.__escape_);481 }482};483 484template <class _CharT, class _Traits, class _Allocator>485struct _LIBCPP_HIDDEN __quoted_proxy {486 basic_string<_CharT, _Traits, _Allocator>& __string_;487 _CharT __delim_;488 _CharT __escape_;489 490 _LIBCPP_HIDE_FROM_ABI explicit __quoted_proxy(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __d, _CharT __e)491 : __string_(__s), __delim_(__d), __escape_(__e) {}492 493 friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&494 operator<<(basic_ostream<_CharT, _Traits>& __os, const __quoted_proxy& __p) {495 return std::__quoted_output(496 __os, __p.__string_.data(), __p.__string_.data() + __p.__string_.size(), __p.__delim_, __p.__escape_);497 }498 499 friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&500 operator>>(basic_istream<_CharT, _Traits>& __is, const __quoted_proxy& __p) {501 return std::__quoted_input(__is, __p.__string_, __p.__delim_, __p.__escape_);502 }503};504 505template <class _CharT, class _Traits, class _Allocator>506_LIBCPP_HIDE_FROM_ABI __quoted_output_proxy<_CharT, _Traits>507__quoted(const basic_string<_CharT, _Traits, _Allocator>& __s,508 _CharT __delim = _CharT('"'),509 _CharT __escape = _CharT('\\')) {510 return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape);511}512 513template <class _CharT, class _Traits, class _Allocator>514_LIBCPP_HIDE_FROM_ABI __quoted_proxy<_CharT, _Traits, _Allocator>515__quoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {516 return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape);517}518 519# if _LIBCPP_STD_VER >= 14520 521template <class _CharT>522_LIBCPP_HIDE_FROM_ABI auto quoted(const _CharT* __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {523 const _CharT* __end = __s;524 while (*__end)525 ++__end;526 return __quoted_output_proxy<_CharT, void>(__s, __end, __delim, __escape);527}528 529template <class _CharT, class _Traits, class _Allocator>530_LIBCPP_HIDE_FROM_ABI auto531quoted(const basic_string<_CharT, _Traits, _Allocator>& __s,532 _CharT __delim = _CharT('"'),533 _CharT __escape = _CharT('\\')) {534 return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape);535}536 537template <class _CharT, class _Traits, class _Allocator>538_LIBCPP_HIDE_FROM_ABI auto539quoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {540 return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape);541}542 543template <class _CharT, class _Traits>544_LIBCPP_HIDE_FROM_ABI auto545quoted(basic_string_view<_CharT, _Traits> __sv, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {546 return __quoted_output_proxy<_CharT, _Traits>(__sv.data(), __sv.data() + __sv.size(), __delim, __escape);547}548 549# endif // _LIBCPP_STD_VER >= 14550 551_LIBCPP_END_NAMESPACE_STD552 553# endif // _LIBCPP_HAS_LOCALIZATION554 555# if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20556# include <array>557# include <bitset>558# include <deque>559# include <format>560# include <functional>561# include <istream>562# include <ostream>563# include <print>564# include <queue>565# include <stack>566# include <unordered_map>567# include <vector>568# endif569 570# if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 23571# include <locale>572# endif573 574#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)575 576#endif // _LIBCPP_IOMANIP577