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