xref: /freebsd/contrib/llvm-project/libcxx/include/iomanip (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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