xref: /freebsd/contrib/llvm-project/libcxx/include/iomanip (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
10b57cec5SDimitry Andric// -*- C++ -*-
2*349cc55cSDimitry 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
450b57cec5SDimitry Andric#include <__config>
460b57cec5SDimitry Andric#include <__string>
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>
2810b57cec5SDimitry Andricbasic_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>
3010b57cec5SDimitry Andricbasic_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;
3140b57cec5SDimitry Andric            const _Fp& __mf = 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>
3410b57cec5SDimitry Andricbasic_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>
3610b57cec5SDimitry Andricbasic_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;
3730b57cec5SDimitry Andric            const _Fp& __mf = 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>
4000b57cec5SDimitry Andricbasic_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>
4200b57cec5SDimitry Andricbasic_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;
4330b57cec5SDimitry Andric            const _Fp& __tf = 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>
4610b57cec5SDimitry Andricbasic_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>
4810b57cec5SDimitry Andricbasic_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;
4930b57cec5SDimitry Andric            const _Fp& __tf = 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
5160b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _ForwardIterator>
517e8d8bef9SDimitry Andricbasic_ostream<_CharT, _Traits> &
5180b57cec5SDimitry Andric__quoted_output ( basic_ostream<_CharT, _Traits> &__os,
5190b57cec5SDimitry Andric        _ForwardIterator __first, _ForwardIterator __last, _CharT __delim, _CharT __escape )
5200b57cec5SDimitry Andric{
521fe6060f1SDimitry Andric    basic_string<_CharT, _Traits> __str;
5220b57cec5SDimitry Andric    __str.push_back(__delim);
5230b57cec5SDimitry Andric    for ( ; __first != __last; ++ __first )
5240b57cec5SDimitry Andric    {
5250b57cec5SDimitry Andric        if (_Traits::eq (*__first, __escape) || _Traits::eq (*__first, __delim))
5260b57cec5SDimitry Andric            __str.push_back(__escape);
5270b57cec5SDimitry Andric        __str.push_back(*__first);
5280b57cec5SDimitry Andric    }
5290b57cec5SDimitry Andric    __str.push_back(__delim);
530e8d8bef9SDimitry Andric    return _VSTD::__put_character_sequence(__os, __str.data(), __str.size());
5310b57cec5SDimitry Andric}
5320b57cec5SDimitry Andric
5330b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _String>
5340b57cec5SDimitry Andricbasic_istream<_CharT, _Traits> &
5350b57cec5SDimitry Andric__quoted_input ( basic_istream<_CharT, _Traits> &__is, _String & __string, _CharT __delim, _CharT __escape )
5360b57cec5SDimitry Andric{
5370b57cec5SDimitry Andric    __string.clear ();
5380b57cec5SDimitry Andric    _CharT __c;
5390b57cec5SDimitry Andric    __is >> __c;
5400b57cec5SDimitry Andric    if ( __is.fail ())
5410b57cec5SDimitry Andric        return __is;
5420b57cec5SDimitry Andric
5430b57cec5SDimitry Andric    if (!_Traits::eq (__c, __delim))    // no delimiter, read the whole string
5440b57cec5SDimitry Andric    {
5450b57cec5SDimitry Andric        __is.unget ();
5460b57cec5SDimitry Andric        __is >> __string;
5470b57cec5SDimitry Andric        return __is;
5480b57cec5SDimitry Andric    }
5490b57cec5SDimitry Andric
5500b57cec5SDimitry Andric    __save_flags<_CharT, _Traits> sf(__is);
5510b57cec5SDimitry Andric    noskipws (__is);
5520b57cec5SDimitry Andric    while (true)
5530b57cec5SDimitry Andric        {
5540b57cec5SDimitry Andric        __is >> __c;
5550b57cec5SDimitry Andric        if ( __is.fail ())
5560b57cec5SDimitry Andric            break;
5570b57cec5SDimitry Andric        if (_Traits::eq (__c, __escape))
5580b57cec5SDimitry Andric        {
5590b57cec5SDimitry Andric            __is >> __c;
5600b57cec5SDimitry Andric            if ( __is.fail ())
5610b57cec5SDimitry Andric                break;
5620b57cec5SDimitry Andric        }
5630b57cec5SDimitry Andric        else if (_Traits::eq (__c, __delim))
5640b57cec5SDimitry Andric            break;
5650b57cec5SDimitry Andric        __string.push_back ( __c );
5660b57cec5SDimitry Andric        }
5670b57cec5SDimitry Andric    return __is;
5680b57cec5SDimitry Andric}
5690b57cec5SDimitry Andric
5700b57cec5SDimitry Andric
5710b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Iter>
5720b57cec5SDimitry Andricbasic_ostream<_CharT, _Traits>& operator<<(
5730b57cec5SDimitry Andric         basic_ostream<_CharT, _Traits>& __os,
5740b57cec5SDimitry Andric         const __quoted_output_proxy<_CharT, _Iter, _Traits> & __proxy)
5750b57cec5SDimitry Andric{
5760b57cec5SDimitry Andric    return __quoted_output (__os, __proxy.__first, __proxy.__last, __proxy.__delim, __proxy.__escape);
5770b57cec5SDimitry Andric}
5780b57cec5SDimitry Andric
5790b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
5800b57cec5SDimitry Andricstruct __quoted_proxy
5810b57cec5SDimitry Andric{
5820b57cec5SDimitry Andric    basic_string<_CharT, _Traits, _Allocator> &__string;
5830b57cec5SDimitry Andric    _CharT  __delim;
5840b57cec5SDimitry Andric    _CharT  __escape;
5850b57cec5SDimitry Andric
5860b57cec5SDimitry Andric    __quoted_proxy(basic_string<_CharT, _Traits, _Allocator> &__s, _CharT __d, _CharT __e)
5870b57cec5SDimitry Andric    : __string(__s), __delim(__d), __escape(__e) {}
5880b57cec5SDimitry Andric};
5890b57cec5SDimitry Andric
5900b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
5910b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
5920b57cec5SDimitry Andricbasic_ostream<_CharT, _Traits>& operator<<(
5930b57cec5SDimitry Andric        basic_ostream<_CharT, _Traits>& __os,
5940b57cec5SDimitry Andric        const __quoted_proxy<_CharT, _Traits, _Allocator> & __proxy)
5950b57cec5SDimitry Andric{
5960b57cec5SDimitry Andric    return __quoted_output (__os, __proxy.__string.cbegin (), __proxy.__string.cend (), __proxy.__delim, __proxy.__escape);
5970b57cec5SDimitry Andric}
5980b57cec5SDimitry Andric
5990b57cec5SDimitry Andric//  extractor for non-const basic_string& proxies
6000b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
6010b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
6020b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& operator>>(
6030b57cec5SDimitry Andric        basic_istream<_CharT, _Traits>& __is,
6040b57cec5SDimitry Andric        const __quoted_proxy<_CharT, _Traits, _Allocator> & __proxy)
6050b57cec5SDimitry Andric{
6060b57cec5SDimitry Andric    return __quoted_input ( __is, __proxy.__string, __proxy.__delim, __proxy.__escape );
6070b57cec5SDimitry Andric}
6080b57cec5SDimitry Andric
6090b57cec5SDimitry Andric
6100b57cec5SDimitry Andrictemplate <class _CharT>
6110b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
6120b57cec5SDimitry Andric__quoted_output_proxy<_CharT, const _CharT *>
6130b57cec5SDimitry Andricquoted ( const _CharT *__s, _CharT __delim = _CharT('"'), _CharT __escape =_CharT('\\'))
6140b57cec5SDimitry Andric{
6150b57cec5SDimitry Andric    const _CharT *__end = __s;
6160b57cec5SDimitry Andric    while ( *__end ) ++__end;
6170b57cec5SDimitry Andric    return __quoted_output_proxy<_CharT, const _CharT *> ( __s, __end, __delim, __escape );
6180b57cec5SDimitry Andric}
6190b57cec5SDimitry Andric
6200b57cec5SDimitry Andric
6210b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
6220b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
6230b57cec5SDimitry Andric__quoted_output_proxy<_CharT, typename basic_string <_CharT, _Traits, _Allocator>::const_iterator>
6240b57cec5SDimitry Andric__quoted ( const basic_string <_CharT, _Traits, _Allocator> &__s, _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\'))
6250b57cec5SDimitry Andric{
6260b57cec5SDimitry Andric    return __quoted_output_proxy<_CharT,
6270b57cec5SDimitry Andric            typename basic_string <_CharT, _Traits, _Allocator>::const_iterator>
6280b57cec5SDimitry Andric                    ( __s.cbegin(), __s.cend (), __delim, __escape );
6290b57cec5SDimitry Andric}
6300b57cec5SDimitry Andric
6310b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
6320b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
6330b57cec5SDimitry Andric__quoted_proxy<_CharT, _Traits, _Allocator>
6340b57cec5SDimitry Andric__quoted ( basic_string <_CharT, _Traits, _Allocator> &__s, _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\'))
6350b57cec5SDimitry Andric{
6360b57cec5SDimitry Andric    return __quoted_proxy<_CharT, _Traits, _Allocator>( __s, __delim, __escape );
6370b57cec5SDimitry Andric}
6380b57cec5SDimitry Andric
6390b57cec5SDimitry Andric
6400b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 11
6410b57cec5SDimitry Andric
6420b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
6430b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
6440b57cec5SDimitry Andric__quoted_output_proxy<_CharT, typename basic_string <_CharT, _Traits, _Allocator>::const_iterator>
6450b57cec5SDimitry Andricquoted ( const basic_string <_CharT, _Traits, _Allocator> &__s, _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\'))
6460b57cec5SDimitry Andric{
6470b57cec5SDimitry Andric    return __quoted(__s, __delim, __escape);
6480b57cec5SDimitry Andric}
6490b57cec5SDimitry Andric
6500b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
6510b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
6520b57cec5SDimitry Andric__quoted_proxy<_CharT, _Traits, _Allocator>
6530b57cec5SDimitry Andricquoted ( basic_string <_CharT, _Traits, _Allocator> &__s, _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\'))
6540b57cec5SDimitry Andric{
6550b57cec5SDimitry Andric    return __quoted(__s, __delim, __escape);
6560b57cec5SDimitry Andric}
6570b57cec5SDimitry Andric
6580b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
6590b57cec5SDimitry Andric__quoted_output_proxy<_CharT, const _CharT *, _Traits>
6600b57cec5SDimitry Andricquoted (basic_string_view <_CharT, _Traits> __sv,
6610b57cec5SDimitry Andric             _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\'))
6620b57cec5SDimitry Andric{
6630b57cec5SDimitry Andric    return __quoted_output_proxy<_CharT, const _CharT *, _Traits>
6640b57cec5SDimitry Andric         ( __sv.data(), __sv.data() + __sv.size(), __delim, __escape );
6650b57cec5SDimitry Andric}
6660b57cec5SDimitry Andric#endif
6670b57cec5SDimitry Andric
6680b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
6690b57cec5SDimitry Andric
6700b57cec5SDimitry Andric#endif // _LIBCPP_IOMANIP
671