xref: /freebsd/contrib/llvm-project/libcxx/include/ios (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric// -*- C++ -*-
2*0b57cec5SDimitry Andric//===---------------------------- ios -------------------------------------===//
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_IOS
11*0b57cec5SDimitry Andric#define _LIBCPP_IOS
12*0b57cec5SDimitry Andric
13*0b57cec5SDimitry Andric/*
14*0b57cec5SDimitry Andric    ios synopsis
15*0b57cec5SDimitry Andric
16*0b57cec5SDimitry Andric#include <iosfwd>
17*0b57cec5SDimitry Andric
18*0b57cec5SDimitry Andricnamespace std
19*0b57cec5SDimitry Andric{
20*0b57cec5SDimitry Andric
21*0b57cec5SDimitry Andrictypedef OFF_T streamoff;
22*0b57cec5SDimitry Andrictypedef SZ_T streamsize;
23*0b57cec5SDimitry Andrictemplate <class stateT> class fpos;
24*0b57cec5SDimitry Andric
25*0b57cec5SDimitry Andricclass ios_base
26*0b57cec5SDimitry Andric{
27*0b57cec5SDimitry Andricpublic:
28*0b57cec5SDimitry Andric    class failure;
29*0b57cec5SDimitry Andric
30*0b57cec5SDimitry Andric    typedef T1 fmtflags;
31*0b57cec5SDimitry Andric    static constexpr fmtflags boolalpha;
32*0b57cec5SDimitry Andric    static constexpr fmtflags dec;
33*0b57cec5SDimitry Andric    static constexpr fmtflags fixed;
34*0b57cec5SDimitry Andric    static constexpr fmtflags hex;
35*0b57cec5SDimitry Andric    static constexpr fmtflags internal;
36*0b57cec5SDimitry Andric    static constexpr fmtflags left;
37*0b57cec5SDimitry Andric    static constexpr fmtflags oct;
38*0b57cec5SDimitry Andric    static constexpr fmtflags right;
39*0b57cec5SDimitry Andric    static constexpr fmtflags scientific;
40*0b57cec5SDimitry Andric    static constexpr fmtflags showbase;
41*0b57cec5SDimitry Andric    static constexpr fmtflags showpoint;
42*0b57cec5SDimitry Andric    static constexpr fmtflags showpos;
43*0b57cec5SDimitry Andric    static constexpr fmtflags skipws;
44*0b57cec5SDimitry Andric    static constexpr fmtflags unitbuf;
45*0b57cec5SDimitry Andric    static constexpr fmtflags uppercase;
46*0b57cec5SDimitry Andric    static constexpr fmtflags adjustfield;
47*0b57cec5SDimitry Andric    static constexpr fmtflags basefield;
48*0b57cec5SDimitry Andric    static constexpr fmtflags floatfield;
49*0b57cec5SDimitry Andric
50*0b57cec5SDimitry Andric    typedef T2 iostate;
51*0b57cec5SDimitry Andric    static constexpr iostate badbit;
52*0b57cec5SDimitry Andric    static constexpr iostate eofbit;
53*0b57cec5SDimitry Andric    static constexpr iostate failbit;
54*0b57cec5SDimitry Andric    static constexpr iostate goodbit;
55*0b57cec5SDimitry Andric
56*0b57cec5SDimitry Andric    typedef T3 openmode;
57*0b57cec5SDimitry Andric    static constexpr openmode app;
58*0b57cec5SDimitry Andric    static constexpr openmode ate;
59*0b57cec5SDimitry Andric    static constexpr openmode binary;
60*0b57cec5SDimitry Andric    static constexpr openmode in;
61*0b57cec5SDimitry Andric    static constexpr openmode out;
62*0b57cec5SDimitry Andric    static constexpr openmode trunc;
63*0b57cec5SDimitry Andric
64*0b57cec5SDimitry Andric    typedef T4 seekdir;
65*0b57cec5SDimitry Andric    static constexpr seekdir beg;
66*0b57cec5SDimitry Andric    static constexpr seekdir cur;
67*0b57cec5SDimitry Andric    static constexpr seekdir end;
68*0b57cec5SDimitry Andric
69*0b57cec5SDimitry Andric    class Init;
70*0b57cec5SDimitry Andric
71*0b57cec5SDimitry Andric    // 27.5.2.2 fmtflags state:
72*0b57cec5SDimitry Andric    fmtflags flags() const;
73*0b57cec5SDimitry Andric    fmtflags flags(fmtflags fmtfl);
74*0b57cec5SDimitry Andric    fmtflags setf(fmtflags fmtfl);
75*0b57cec5SDimitry Andric    fmtflags setf(fmtflags fmtfl, fmtflags mask);
76*0b57cec5SDimitry Andric    void unsetf(fmtflags mask);
77*0b57cec5SDimitry Andric
78*0b57cec5SDimitry Andric    streamsize precision() const;
79*0b57cec5SDimitry Andric    streamsize precision(streamsize prec);
80*0b57cec5SDimitry Andric    streamsize width() const;
81*0b57cec5SDimitry Andric    streamsize width(streamsize wide);
82*0b57cec5SDimitry Andric
83*0b57cec5SDimitry Andric    // 27.5.2.3 locales:
84*0b57cec5SDimitry Andric    locale imbue(const locale& loc);
85*0b57cec5SDimitry Andric    locale getloc() const;
86*0b57cec5SDimitry Andric
87*0b57cec5SDimitry Andric    // 27.5.2.5 storage:
88*0b57cec5SDimitry Andric    static int xalloc();
89*0b57cec5SDimitry Andric    long& iword(int index);
90*0b57cec5SDimitry Andric    void*& pword(int index);
91*0b57cec5SDimitry Andric
92*0b57cec5SDimitry Andric    // destructor
93*0b57cec5SDimitry Andric    virtual ~ios_base();
94*0b57cec5SDimitry Andric
95*0b57cec5SDimitry Andric    // 27.5.2.6 callbacks;
96*0b57cec5SDimitry Andric    enum event { erase_event, imbue_event, copyfmt_event };
97*0b57cec5SDimitry Andric    typedef void (*event_callback)(event, ios_base&, int index);
98*0b57cec5SDimitry Andric    void register_callback(event_callback fn, int index);
99*0b57cec5SDimitry Andric
100*0b57cec5SDimitry Andric    ios_base(const ios_base&) = delete;
101*0b57cec5SDimitry Andric    ios_base& operator=(const ios_base&) = delete;
102*0b57cec5SDimitry Andric
103*0b57cec5SDimitry Andric    static bool sync_with_stdio(bool sync = true);
104*0b57cec5SDimitry Andric
105*0b57cec5SDimitry Andricprotected:
106*0b57cec5SDimitry Andric    ios_base();
107*0b57cec5SDimitry Andric};
108*0b57cec5SDimitry Andric
109*0b57cec5SDimitry Andrictemplate <class charT, class traits = char_traits<charT> >
110*0b57cec5SDimitry Andricclass basic_ios
111*0b57cec5SDimitry Andric    : public ios_base
112*0b57cec5SDimitry Andric{
113*0b57cec5SDimitry Andricpublic:
114*0b57cec5SDimitry Andric    // types:
115*0b57cec5SDimitry Andric    typedef charT char_type;
116*0b57cec5SDimitry Andric    typedef typename traits::int_type int_type;  // removed in C++17
117*0b57cec5SDimitry Andric    typedef typename traits::pos_type pos_type;  // removed in C++17
118*0b57cec5SDimitry Andric    typedef typename traits::off_type off_type;  // removed in C++17
119*0b57cec5SDimitry Andric    typedef traits traits_type;
120*0b57cec5SDimitry Andric
121*0b57cec5SDimitry Andric    operator unspecified-bool-type() const;
122*0b57cec5SDimitry Andric    bool operator!() const;
123*0b57cec5SDimitry Andric    iostate rdstate() const;
124*0b57cec5SDimitry Andric    void clear(iostate state = goodbit);
125*0b57cec5SDimitry Andric    void setstate(iostate state);
126*0b57cec5SDimitry Andric    bool good() const;
127*0b57cec5SDimitry Andric    bool eof() const;
128*0b57cec5SDimitry Andric    bool fail() const;
129*0b57cec5SDimitry Andric    bool bad() const;
130*0b57cec5SDimitry Andric
131*0b57cec5SDimitry Andric    iostate exceptions() const;
132*0b57cec5SDimitry Andric    void exceptions(iostate except);
133*0b57cec5SDimitry Andric
134*0b57cec5SDimitry Andric    // 27.5.4.1 Constructor/destructor:
135*0b57cec5SDimitry Andric    explicit basic_ios(basic_streambuf<charT,traits>* sb);
136*0b57cec5SDimitry Andric    virtual ~basic_ios();
137*0b57cec5SDimitry Andric
138*0b57cec5SDimitry Andric    // 27.5.4.2 Members:
139*0b57cec5SDimitry Andric    basic_ostream<charT,traits>* tie() const;
140*0b57cec5SDimitry Andric    basic_ostream<charT,traits>* tie(basic_ostream<charT,traits>* tiestr);
141*0b57cec5SDimitry Andric
142*0b57cec5SDimitry Andric    basic_streambuf<charT,traits>* rdbuf() const;
143*0b57cec5SDimitry Andric    basic_streambuf<charT,traits>* rdbuf(basic_streambuf<charT,traits>* sb);
144*0b57cec5SDimitry Andric
145*0b57cec5SDimitry Andric    basic_ios& copyfmt(const basic_ios& rhs);
146*0b57cec5SDimitry Andric
147*0b57cec5SDimitry Andric    char_type fill() const;
148*0b57cec5SDimitry Andric    char_type fill(char_type ch);
149*0b57cec5SDimitry Andric
150*0b57cec5SDimitry Andric    locale imbue(const locale& loc);
151*0b57cec5SDimitry Andric
152*0b57cec5SDimitry Andric    char narrow(char_type c, char dfault) const;
153*0b57cec5SDimitry Andric    char_type widen(char c) const;
154*0b57cec5SDimitry Andric
155*0b57cec5SDimitry Andric    basic_ios(const basic_ios& ) = delete;
156*0b57cec5SDimitry Andric    basic_ios& operator=(const basic_ios&) = delete;
157*0b57cec5SDimitry Andric
158*0b57cec5SDimitry Andricprotected:
159*0b57cec5SDimitry Andric    basic_ios();
160*0b57cec5SDimitry Andric    void init(basic_streambuf<charT,traits>* sb);
161*0b57cec5SDimitry Andric    void move(basic_ios& rhs);
162*0b57cec5SDimitry Andric    void swap(basic_ios& rhs) noexcept;
163*0b57cec5SDimitry Andric    void set_rdbuf(basic_streambuf<charT, traits>* sb);
164*0b57cec5SDimitry Andric};
165*0b57cec5SDimitry Andric
166*0b57cec5SDimitry Andric// 27.5.5, manipulators:
167*0b57cec5SDimitry Andricios_base& boolalpha (ios_base& str);
168*0b57cec5SDimitry Andricios_base& noboolalpha(ios_base& str);
169*0b57cec5SDimitry Andricios_base& showbase (ios_base& str);
170*0b57cec5SDimitry Andricios_base& noshowbase (ios_base& str);
171*0b57cec5SDimitry Andricios_base& showpoint (ios_base& str);
172*0b57cec5SDimitry Andricios_base& noshowpoint(ios_base& str);
173*0b57cec5SDimitry Andricios_base& showpos (ios_base& str);
174*0b57cec5SDimitry Andricios_base& noshowpos (ios_base& str);
175*0b57cec5SDimitry Andricios_base& skipws (ios_base& str);
176*0b57cec5SDimitry Andricios_base& noskipws (ios_base& str);
177*0b57cec5SDimitry Andricios_base& uppercase (ios_base& str);
178*0b57cec5SDimitry Andricios_base& nouppercase(ios_base& str);
179*0b57cec5SDimitry Andricios_base& unitbuf (ios_base& str);
180*0b57cec5SDimitry Andricios_base& nounitbuf (ios_base& str);
181*0b57cec5SDimitry Andric
182*0b57cec5SDimitry Andric// 27.5.5.2 adjustfield:
183*0b57cec5SDimitry Andricios_base& internal (ios_base& str);
184*0b57cec5SDimitry Andricios_base& left (ios_base& str);
185*0b57cec5SDimitry Andricios_base& right (ios_base& str);
186*0b57cec5SDimitry Andric
187*0b57cec5SDimitry Andric// 27.5.5.3 basefield:
188*0b57cec5SDimitry Andricios_base& dec (ios_base& str);
189*0b57cec5SDimitry Andricios_base& hex (ios_base& str);
190*0b57cec5SDimitry Andricios_base& oct (ios_base& str);
191*0b57cec5SDimitry Andric
192*0b57cec5SDimitry Andric// 27.5.5.4 floatfield:
193*0b57cec5SDimitry Andricios_base& fixed (ios_base& str);
194*0b57cec5SDimitry Andricios_base& scientific (ios_base& str);
195*0b57cec5SDimitry Andricios_base& hexfloat (ios_base& str);
196*0b57cec5SDimitry Andricios_base& defaultfloat(ios_base& str);
197*0b57cec5SDimitry Andric
198*0b57cec5SDimitry Andric// 27.5.5.5 error reporting:
199*0b57cec5SDimitry Andricenum class io_errc
200*0b57cec5SDimitry Andric{
201*0b57cec5SDimitry Andric    stream = 1
202*0b57cec5SDimitry Andric};
203*0b57cec5SDimitry Andric
204*0b57cec5SDimitry Andricconcept_map ErrorCodeEnum<io_errc> { };
205*0b57cec5SDimitry Andricerror_code make_error_code(io_errc e) noexcept;
206*0b57cec5SDimitry Andricerror_condition make_error_condition(io_errc e) noexcept;
207*0b57cec5SDimitry Andricstorage-class-specifier const error_category& iostream_category() noexcept;
208*0b57cec5SDimitry Andric
209*0b57cec5SDimitry Andric}  // std
210*0b57cec5SDimitry Andric
211*0b57cec5SDimitry Andric*/
212*0b57cec5SDimitry Andric
213*0b57cec5SDimitry Andric#include <__config>
214*0b57cec5SDimitry Andric#include <iosfwd>
215*0b57cec5SDimitry Andric#include <__locale>
216*0b57cec5SDimitry Andric#include <system_error>
217*0b57cec5SDimitry Andric
218*0b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
219*0b57cec5SDimitry Andric#include <atomic>     // for __xindex_
220*0b57cec5SDimitry Andric#endif
221*0b57cec5SDimitry Andric
222*0b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
223*0b57cec5SDimitry Andric#pragma GCC system_header
224*0b57cec5SDimitry Andric#endif
225*0b57cec5SDimitry Andric
226*0b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
227*0b57cec5SDimitry Andric
228*0b57cec5SDimitry Andrictypedef ptrdiff_t streamsize;
229*0b57cec5SDimitry Andric
230*0b57cec5SDimitry Andricclass _LIBCPP_TYPE_VIS ios_base
231*0b57cec5SDimitry Andric{
232*0b57cec5SDimitry Andricpublic:
233*0b57cec5SDimitry Andric    class _LIBCPP_EXCEPTION_ABI failure;
234*0b57cec5SDimitry Andric
235*0b57cec5SDimitry Andric    typedef unsigned int fmtflags;
236*0b57cec5SDimitry Andric    static const fmtflags boolalpha   = 0x0001;
237*0b57cec5SDimitry Andric    static const fmtflags dec         = 0x0002;
238*0b57cec5SDimitry Andric    static const fmtflags fixed       = 0x0004;
239*0b57cec5SDimitry Andric    static const fmtflags hex         = 0x0008;
240*0b57cec5SDimitry Andric    static const fmtflags internal    = 0x0010;
241*0b57cec5SDimitry Andric    static const fmtflags left        = 0x0020;
242*0b57cec5SDimitry Andric    static const fmtflags oct         = 0x0040;
243*0b57cec5SDimitry Andric    static const fmtflags right       = 0x0080;
244*0b57cec5SDimitry Andric    static const fmtflags scientific  = 0x0100;
245*0b57cec5SDimitry Andric    static const fmtflags showbase    = 0x0200;
246*0b57cec5SDimitry Andric    static const fmtflags showpoint   = 0x0400;
247*0b57cec5SDimitry Andric    static const fmtflags showpos     = 0x0800;
248*0b57cec5SDimitry Andric    static const fmtflags skipws      = 0x1000;
249*0b57cec5SDimitry Andric    static const fmtflags unitbuf     = 0x2000;
250*0b57cec5SDimitry Andric    static const fmtflags uppercase   = 0x4000;
251*0b57cec5SDimitry Andric    static const fmtflags adjustfield = left | right | internal;
252*0b57cec5SDimitry Andric    static const fmtflags basefield   = dec | oct | hex;
253*0b57cec5SDimitry Andric    static const fmtflags floatfield  = scientific | fixed;
254*0b57cec5SDimitry Andric
255*0b57cec5SDimitry Andric    typedef unsigned int iostate;
256*0b57cec5SDimitry Andric    static const iostate badbit  = 0x1;
257*0b57cec5SDimitry Andric    static const iostate eofbit  = 0x2;
258*0b57cec5SDimitry Andric    static const iostate failbit = 0x4;
259*0b57cec5SDimitry Andric    static const iostate goodbit = 0x0;
260*0b57cec5SDimitry Andric
261*0b57cec5SDimitry Andric    typedef unsigned int openmode;
262*0b57cec5SDimitry Andric    static const openmode app    = 0x01;
263*0b57cec5SDimitry Andric    static const openmode ate    = 0x02;
264*0b57cec5SDimitry Andric    static const openmode binary = 0x04;
265*0b57cec5SDimitry Andric    static const openmode in     = 0x08;
266*0b57cec5SDimitry Andric    static const openmode out    = 0x10;
267*0b57cec5SDimitry Andric    static const openmode trunc  = 0x20;
268*0b57cec5SDimitry Andric
269*0b57cec5SDimitry Andric    enum seekdir {beg, cur, end};
270*0b57cec5SDimitry Andric
271*0b57cec5SDimitry Andric#if _LIBCPP_STD_VER <= 14
272*0b57cec5SDimitry Andric    typedef iostate      io_state;
273*0b57cec5SDimitry Andric    typedef openmode     open_mode;
274*0b57cec5SDimitry Andric    typedef seekdir      seek_dir;
275*0b57cec5SDimitry Andric
276*0b57cec5SDimitry Andric    typedef _VSTD::streamoff streamoff;
277*0b57cec5SDimitry Andric    typedef _VSTD::streampos streampos;
278*0b57cec5SDimitry Andric#endif
279*0b57cec5SDimitry Andric
280*0b57cec5SDimitry Andric    class _LIBCPP_TYPE_VIS Init;
281*0b57cec5SDimitry Andric
282*0b57cec5SDimitry Andric    // 27.5.2.2 fmtflags state:
283*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY fmtflags flags() const;
284*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY fmtflags flags(fmtflags __fmtfl);
285*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY fmtflags setf(fmtflags __fmtfl);
286*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY fmtflags setf(fmtflags __fmtfl, fmtflags __mask);
287*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY void unsetf(fmtflags __mask);
288*0b57cec5SDimitry Andric
289*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY streamsize precision() const;
290*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY streamsize precision(streamsize __prec);
291*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY streamsize width() const;
292*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY streamsize width(streamsize __wide);
293*0b57cec5SDimitry Andric
294*0b57cec5SDimitry Andric    // 27.5.2.3 locales:
295*0b57cec5SDimitry Andric    locale imbue(const locale& __loc);
296*0b57cec5SDimitry Andric    locale getloc() const;
297*0b57cec5SDimitry Andric
298*0b57cec5SDimitry Andric    // 27.5.2.5 storage:
299*0b57cec5SDimitry Andric    static int xalloc();
300*0b57cec5SDimitry Andric    long& iword(int __index);
301*0b57cec5SDimitry Andric    void*& pword(int __index);
302*0b57cec5SDimitry Andric
303*0b57cec5SDimitry Andric    // destructor
304*0b57cec5SDimitry Andric    virtual ~ios_base();
305*0b57cec5SDimitry Andric
306*0b57cec5SDimitry Andric    // 27.5.2.6 callbacks;
307*0b57cec5SDimitry Andric    enum event { erase_event, imbue_event, copyfmt_event };
308*0b57cec5SDimitry Andric    typedef void (*event_callback)(event, ios_base&, int __index);
309*0b57cec5SDimitry Andric    void register_callback(event_callback __fn, int __index);
310*0b57cec5SDimitry Andric
311*0b57cec5SDimitry Andricprivate:
312*0b57cec5SDimitry Andric    ios_base(const ios_base&); // = delete;
313*0b57cec5SDimitry Andric    ios_base& operator=(const ios_base&); // = delete;
314*0b57cec5SDimitry Andric
315*0b57cec5SDimitry Andricpublic:
316*0b57cec5SDimitry Andric    static bool sync_with_stdio(bool __sync = true);
317*0b57cec5SDimitry Andric
318*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY iostate rdstate() const;
319*0b57cec5SDimitry Andric    void clear(iostate __state = goodbit);
320*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY void setstate(iostate __state);
321*0b57cec5SDimitry Andric
322*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY bool good() const;
323*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY bool eof() const;
324*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY bool fail() const;
325*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY bool bad() const;
326*0b57cec5SDimitry Andric
327*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY iostate exceptions() const;
328*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY void exceptions(iostate __iostate);
329*0b57cec5SDimitry Andric
330*0b57cec5SDimitry Andric    void __set_badbit_and_consider_rethrow();
331*0b57cec5SDimitry Andric    void __set_failbit_and_consider_rethrow();
332*0b57cec5SDimitry Andric
333*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
334*0b57cec5SDimitry Andric    void __setstate_nothrow(iostate __state)
335*0b57cec5SDimitry Andric    {
336*0b57cec5SDimitry Andric        if (__rdbuf_)
337*0b57cec5SDimitry Andric            __rdstate_ |= __state;
338*0b57cec5SDimitry Andric        else
339*0b57cec5SDimitry Andric            __rdstate_ |= __state | ios_base::badbit;
340*0b57cec5SDimitry Andric    }
341*0b57cec5SDimitry Andric
342*0b57cec5SDimitry Andricprotected:
343*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
344*0b57cec5SDimitry Andric    ios_base() {// purposefully does no initialization
345*0b57cec5SDimitry Andric               }
346*0b57cec5SDimitry Andric
347*0b57cec5SDimitry Andric    void init(void* __sb);
348*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY void* rdbuf() const {return __rdbuf_;}
349*0b57cec5SDimitry Andric
350*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
351*0b57cec5SDimitry Andric    void rdbuf(void* __sb)
352*0b57cec5SDimitry Andric    {
353*0b57cec5SDimitry Andric        __rdbuf_ = __sb;
354*0b57cec5SDimitry Andric        clear();
355*0b57cec5SDimitry Andric    }
356*0b57cec5SDimitry Andric
357*0b57cec5SDimitry Andric    void __call_callbacks(event);
358*0b57cec5SDimitry Andric    void copyfmt(const ios_base&);
359*0b57cec5SDimitry Andric    void move(ios_base&);
360*0b57cec5SDimitry Andric    void swap(ios_base&) _NOEXCEPT;
361*0b57cec5SDimitry Andric
362*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
363*0b57cec5SDimitry Andric    void set_rdbuf(void* __sb)
364*0b57cec5SDimitry Andric    {
365*0b57cec5SDimitry Andric        __rdbuf_ = __sb;
366*0b57cec5SDimitry Andric    }
367*0b57cec5SDimitry Andric
368*0b57cec5SDimitry Andricprivate:
369*0b57cec5SDimitry Andric    // All data members must be scalars
370*0b57cec5SDimitry Andric    fmtflags        __fmtflags_;
371*0b57cec5SDimitry Andric    streamsize      __precision_;
372*0b57cec5SDimitry Andric    streamsize      __width_;
373*0b57cec5SDimitry Andric    iostate         __rdstate_;
374*0b57cec5SDimitry Andric    iostate         __exceptions_;
375*0b57cec5SDimitry Andric    void*           __rdbuf_;
376*0b57cec5SDimitry Andric    void*           __loc_;
377*0b57cec5SDimitry Andric    event_callback* __fn_;
378*0b57cec5SDimitry Andric    int*            __index_;
379*0b57cec5SDimitry Andric    size_t          __event_size_;
380*0b57cec5SDimitry Andric    size_t          __event_cap_;
381*0b57cec5SDimitry Andric// TODO(EricWF): Enable this for both Clang and GCC. Currently it is only
382*0b57cec5SDimitry Andric// enabled with clang.
383*0b57cec5SDimitry Andric#if defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_THREADS)
384*0b57cec5SDimitry Andric    static atomic<int> __xindex_;
385*0b57cec5SDimitry Andric#else
386*0b57cec5SDimitry Andric    static int      __xindex_;
387*0b57cec5SDimitry Andric#endif
388*0b57cec5SDimitry Andric    long*           __iarray_;
389*0b57cec5SDimitry Andric    size_t          __iarray_size_;
390*0b57cec5SDimitry Andric    size_t          __iarray_cap_;
391*0b57cec5SDimitry Andric    void**          __parray_;
392*0b57cec5SDimitry Andric    size_t          __parray_size_;
393*0b57cec5SDimitry Andric    size_t          __parray_cap_;
394*0b57cec5SDimitry Andric};
395*0b57cec5SDimitry Andric
396*0b57cec5SDimitry Andric//enum class io_errc
397*0b57cec5SDimitry Andric_LIBCPP_DECLARE_STRONG_ENUM(io_errc)
398*0b57cec5SDimitry Andric{
399*0b57cec5SDimitry Andric    stream = 1
400*0b57cec5SDimitry Andric};
401*0b57cec5SDimitry Andric_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(io_errc)
402*0b57cec5SDimitry Andric
403*0b57cec5SDimitry Andrictemplate <>
404*0b57cec5SDimitry Andricstruct _LIBCPP_TEMPLATE_VIS is_error_code_enum<io_errc> : public true_type { };
405*0b57cec5SDimitry Andric
406*0b57cec5SDimitry Andric#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
407*0b57cec5SDimitry Andrictemplate <>
408*0b57cec5SDimitry Andricstruct _LIBCPP_TEMPLATE_VIS is_error_code_enum<io_errc::__lx> : public true_type { };
409*0b57cec5SDimitry Andric#endif
410*0b57cec5SDimitry Andric
411*0b57cec5SDimitry Andric_LIBCPP_FUNC_VIS
412*0b57cec5SDimitry Andricconst error_category& iostream_category() _NOEXCEPT;
413*0b57cec5SDimitry Andric
414*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
415*0b57cec5SDimitry Andricerror_code
416*0b57cec5SDimitry Andricmake_error_code(io_errc __e) _NOEXCEPT
417*0b57cec5SDimitry Andric{
418*0b57cec5SDimitry Andric    return error_code(static_cast<int>(__e), iostream_category());
419*0b57cec5SDimitry Andric}
420*0b57cec5SDimitry Andric
421*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
422*0b57cec5SDimitry Andricerror_condition
423*0b57cec5SDimitry Andricmake_error_condition(io_errc __e) _NOEXCEPT
424*0b57cec5SDimitry Andric{
425*0b57cec5SDimitry Andric    return error_condition(static_cast<int>(__e), iostream_category());
426*0b57cec5SDimitry Andric}
427*0b57cec5SDimitry Andric
428*0b57cec5SDimitry Andricclass _LIBCPP_EXCEPTION_ABI ios_base::failure
429*0b57cec5SDimitry Andric    : public system_error
430*0b57cec5SDimitry Andric{
431*0b57cec5SDimitry Andricpublic:
432*0b57cec5SDimitry Andric    explicit failure(const string& __msg, const error_code& __ec = io_errc::stream);
433*0b57cec5SDimitry Andric    explicit failure(const char* __msg, const error_code& __ec = io_errc::stream);
434*0b57cec5SDimitry Andric    virtual ~failure() throw();
435*0b57cec5SDimitry Andric};
436*0b57cec5SDimitry Andric
437*0b57cec5SDimitry Andric_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
438*0b57cec5SDimitry Andricvoid __throw_failure(char const* __msg) {
439*0b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
440*0b57cec5SDimitry Andric    throw ios_base::failure(__msg);
441*0b57cec5SDimitry Andric#else
442*0b57cec5SDimitry Andric    ((void)__msg);
443*0b57cec5SDimitry Andric    _VSTD::abort();
444*0b57cec5SDimitry Andric#endif
445*0b57cec5SDimitry Andric}
446*0b57cec5SDimitry Andric
447*0b57cec5SDimitry Andricclass _LIBCPP_TYPE_VIS ios_base::Init
448*0b57cec5SDimitry Andric{
449*0b57cec5SDimitry Andricpublic:
450*0b57cec5SDimitry Andric    Init();
451*0b57cec5SDimitry Andric    ~Init();
452*0b57cec5SDimitry Andric};
453*0b57cec5SDimitry Andric
454*0b57cec5SDimitry Andric// fmtflags
455*0b57cec5SDimitry Andric
456*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
457*0b57cec5SDimitry Andricios_base::fmtflags
458*0b57cec5SDimitry Andricios_base::flags() const
459*0b57cec5SDimitry Andric{
460*0b57cec5SDimitry Andric    return __fmtflags_;
461*0b57cec5SDimitry Andric}
462*0b57cec5SDimitry Andric
463*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
464*0b57cec5SDimitry Andricios_base::fmtflags
465*0b57cec5SDimitry Andricios_base::flags(fmtflags __fmtfl)
466*0b57cec5SDimitry Andric{
467*0b57cec5SDimitry Andric    fmtflags __r = __fmtflags_;
468*0b57cec5SDimitry Andric    __fmtflags_ = __fmtfl;
469*0b57cec5SDimitry Andric    return __r;
470*0b57cec5SDimitry Andric}
471*0b57cec5SDimitry Andric
472*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
473*0b57cec5SDimitry Andricios_base::fmtflags
474*0b57cec5SDimitry Andricios_base::setf(fmtflags __fmtfl)
475*0b57cec5SDimitry Andric{
476*0b57cec5SDimitry Andric    fmtflags __r = __fmtflags_;
477*0b57cec5SDimitry Andric    __fmtflags_ |= __fmtfl;
478*0b57cec5SDimitry Andric    return __r;
479*0b57cec5SDimitry Andric}
480*0b57cec5SDimitry Andric
481*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
482*0b57cec5SDimitry Andricvoid
483*0b57cec5SDimitry Andricios_base::unsetf(fmtflags __mask)
484*0b57cec5SDimitry Andric{
485*0b57cec5SDimitry Andric    __fmtflags_ &= ~__mask;
486*0b57cec5SDimitry Andric}
487*0b57cec5SDimitry Andric
488*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
489*0b57cec5SDimitry Andricios_base::fmtflags
490*0b57cec5SDimitry Andricios_base::setf(fmtflags __fmtfl, fmtflags __mask)
491*0b57cec5SDimitry Andric{
492*0b57cec5SDimitry Andric    fmtflags __r = __fmtflags_;
493*0b57cec5SDimitry Andric    unsetf(__mask);
494*0b57cec5SDimitry Andric    __fmtflags_ |= __fmtfl & __mask;
495*0b57cec5SDimitry Andric    return __r;
496*0b57cec5SDimitry Andric}
497*0b57cec5SDimitry Andric
498*0b57cec5SDimitry Andric// precision
499*0b57cec5SDimitry Andric
500*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
501*0b57cec5SDimitry Andricstreamsize
502*0b57cec5SDimitry Andricios_base::precision() const
503*0b57cec5SDimitry Andric{
504*0b57cec5SDimitry Andric    return __precision_;
505*0b57cec5SDimitry Andric}
506*0b57cec5SDimitry Andric
507*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
508*0b57cec5SDimitry Andricstreamsize
509*0b57cec5SDimitry Andricios_base::precision(streamsize __prec)
510*0b57cec5SDimitry Andric{
511*0b57cec5SDimitry Andric    streamsize __r = __precision_;
512*0b57cec5SDimitry Andric    __precision_ = __prec;
513*0b57cec5SDimitry Andric    return __r;
514*0b57cec5SDimitry Andric}
515*0b57cec5SDimitry Andric
516*0b57cec5SDimitry Andric// width
517*0b57cec5SDimitry Andric
518*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
519*0b57cec5SDimitry Andricstreamsize
520*0b57cec5SDimitry Andricios_base::width() const
521*0b57cec5SDimitry Andric{
522*0b57cec5SDimitry Andric    return __width_;
523*0b57cec5SDimitry Andric}
524*0b57cec5SDimitry Andric
525*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
526*0b57cec5SDimitry Andricstreamsize
527*0b57cec5SDimitry Andricios_base::width(streamsize __wide)
528*0b57cec5SDimitry Andric{
529*0b57cec5SDimitry Andric    streamsize __r = __width_;
530*0b57cec5SDimitry Andric    __width_ = __wide;
531*0b57cec5SDimitry Andric    return __r;
532*0b57cec5SDimitry Andric}
533*0b57cec5SDimitry Andric
534*0b57cec5SDimitry Andric// iostate
535*0b57cec5SDimitry Andric
536*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
537*0b57cec5SDimitry Andricios_base::iostate
538*0b57cec5SDimitry Andricios_base::rdstate() const
539*0b57cec5SDimitry Andric{
540*0b57cec5SDimitry Andric    return __rdstate_;
541*0b57cec5SDimitry Andric}
542*0b57cec5SDimitry Andric
543*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
544*0b57cec5SDimitry Andricvoid
545*0b57cec5SDimitry Andricios_base::setstate(iostate __state)
546*0b57cec5SDimitry Andric{
547*0b57cec5SDimitry Andric    clear(__rdstate_ | __state);
548*0b57cec5SDimitry Andric}
549*0b57cec5SDimitry Andric
550*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
551*0b57cec5SDimitry Andricbool
552*0b57cec5SDimitry Andricios_base::good() const
553*0b57cec5SDimitry Andric{
554*0b57cec5SDimitry Andric    return __rdstate_ == 0;
555*0b57cec5SDimitry Andric}
556*0b57cec5SDimitry Andric
557*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
558*0b57cec5SDimitry Andricbool
559*0b57cec5SDimitry Andricios_base::eof() const
560*0b57cec5SDimitry Andric{
561*0b57cec5SDimitry Andric    return (__rdstate_ & eofbit) != 0;
562*0b57cec5SDimitry Andric}
563*0b57cec5SDimitry Andric
564*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
565*0b57cec5SDimitry Andricbool
566*0b57cec5SDimitry Andricios_base::fail() const
567*0b57cec5SDimitry Andric{
568*0b57cec5SDimitry Andric    return (__rdstate_ & (failbit | badbit)) != 0;
569*0b57cec5SDimitry Andric}
570*0b57cec5SDimitry Andric
571*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
572*0b57cec5SDimitry Andricbool
573*0b57cec5SDimitry Andricios_base::bad() const
574*0b57cec5SDimitry Andric{
575*0b57cec5SDimitry Andric    return (__rdstate_ & badbit) != 0;
576*0b57cec5SDimitry Andric}
577*0b57cec5SDimitry Andric
578*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
579*0b57cec5SDimitry Andricios_base::iostate
580*0b57cec5SDimitry Andricios_base::exceptions() const
581*0b57cec5SDimitry Andric{
582*0b57cec5SDimitry Andric    return __exceptions_;
583*0b57cec5SDimitry Andric}
584*0b57cec5SDimitry Andric
585*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
586*0b57cec5SDimitry Andricvoid
587*0b57cec5SDimitry Andricios_base::exceptions(iostate __iostate)
588*0b57cec5SDimitry Andric{
589*0b57cec5SDimitry Andric    __exceptions_ = __iostate;
590*0b57cec5SDimitry Andric    clear(__rdstate_);
591*0b57cec5SDimitry Andric}
592*0b57cec5SDimitry Andric
593*0b57cec5SDimitry Andric#if defined(_LIBCPP_CXX03_LANG)
594*0b57cec5SDimitry Andricstruct _LIBCPP_TYPE_VIS __cxx03_bool {
595*0b57cec5SDimitry Andric  typedef void (__cxx03_bool::*__bool_type)();
596*0b57cec5SDimitry Andric  void __true_value() {}
597*0b57cec5SDimitry Andric};
598*0b57cec5SDimitry Andric#endif
599*0b57cec5SDimitry Andric
600*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
601*0b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_ios
602*0b57cec5SDimitry Andric    : public ios_base
603*0b57cec5SDimitry Andric{
604*0b57cec5SDimitry Andricpublic:
605*0b57cec5SDimitry Andric    // types:
606*0b57cec5SDimitry Andric    typedef _CharT char_type;
607*0b57cec5SDimitry Andric    typedef _Traits traits_type;
608*0b57cec5SDimitry Andric
609*0b57cec5SDimitry Andric    typedef typename traits_type::int_type int_type;
610*0b57cec5SDimitry Andric    typedef typename traits_type::pos_type pos_type;
611*0b57cec5SDimitry Andric    typedef typename traits_type::off_type off_type;
612*0b57cec5SDimitry Andric
613*0b57cec5SDimitry Andric    static_assert((is_same<_CharT, typename traits_type::char_type>::value),
614*0b57cec5SDimitry Andric                  "traits_type::char_type must be the same type as CharT");
615*0b57cec5SDimitry Andric
616*0b57cec5SDimitry Andric  // __true_value will generate undefined references when linking unless
617*0b57cec5SDimitry Andric  // we give it internal linkage.
618*0b57cec5SDimitry Andric
619*0b57cec5SDimitry Andric#if defined(_LIBCPP_CXX03_LANG)
620*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
621*0b57cec5SDimitry Andric    operator __cxx03_bool::__bool_type() const {
622*0b57cec5SDimitry Andric        return !fail() ? &__cxx03_bool::__true_value : nullptr;
623*0b57cec5SDimitry Andric    }
624*0b57cec5SDimitry Andric#else
625*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
626*0b57cec5SDimitry Andric    _LIBCPP_EXPLICIT operator bool() const {return !fail();}
627*0b57cec5SDimitry Andric#endif
628*0b57cec5SDimitry Andric
629*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY bool operator!() const    {return  fail();}
630*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY iostate rdstate() const   {return ios_base::rdstate();}
631*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY void clear(iostate __state = goodbit) {ios_base::clear(__state);}
632*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY void setstate(iostate __state) {ios_base::setstate(__state);}
633*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY bool good() const {return ios_base::good();}
634*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY bool eof() const  {return ios_base::eof();}
635*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY bool fail() const {return ios_base::fail();}
636*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY bool bad() const  {return ios_base::bad();}
637*0b57cec5SDimitry Andric
638*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY iostate exceptions() const {return ios_base::exceptions();}
639*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY void exceptions(iostate __iostate) {ios_base::exceptions(__iostate);}
640*0b57cec5SDimitry Andric
641*0b57cec5SDimitry Andric    // 27.5.4.1 Constructor/destructor:
642*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
643*0b57cec5SDimitry Andric    explicit basic_ios(basic_streambuf<char_type,traits_type>* __sb);
644*0b57cec5SDimitry Andric    virtual ~basic_ios();
645*0b57cec5SDimitry Andric
646*0b57cec5SDimitry Andric    // 27.5.4.2 Members:
647*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
648*0b57cec5SDimitry Andric    basic_ostream<char_type, traits_type>* tie() const;
649*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
650*0b57cec5SDimitry Andric    basic_ostream<char_type, traits_type>* tie(basic_ostream<char_type, traits_type>* __tiestr);
651*0b57cec5SDimitry Andric
652*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
653*0b57cec5SDimitry Andric    basic_streambuf<char_type, traits_type>* rdbuf() const;
654*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
655*0b57cec5SDimitry Andric    basic_streambuf<char_type, traits_type>* rdbuf(basic_streambuf<char_type, traits_type>* __sb);
656*0b57cec5SDimitry Andric
657*0b57cec5SDimitry Andric    basic_ios& copyfmt(const basic_ios& __rhs);
658*0b57cec5SDimitry Andric
659*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
660*0b57cec5SDimitry Andric    char_type fill() const;
661*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
662*0b57cec5SDimitry Andric    char_type fill(char_type __ch);
663*0b57cec5SDimitry Andric
664*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
665*0b57cec5SDimitry Andric    locale imbue(const locale& __loc);
666*0b57cec5SDimitry Andric
667*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
668*0b57cec5SDimitry Andric    char narrow(char_type __c, char __dfault) const;
669*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
670*0b57cec5SDimitry Andric    char_type widen(char __c) const;
671*0b57cec5SDimitry Andric
672*0b57cec5SDimitry Andricprotected:
673*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
674*0b57cec5SDimitry Andric    basic_ios() {// purposefully does no initialization
675*0b57cec5SDimitry Andric                }
676*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
677*0b57cec5SDimitry Andric    void init(basic_streambuf<char_type, traits_type>* __sb);
678*0b57cec5SDimitry Andric
679*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
680*0b57cec5SDimitry Andric    void move(basic_ios& __rhs);
681*0b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
682*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
683*0b57cec5SDimitry Andric    void move(basic_ios&& __rhs) {move(__rhs);}
684*0b57cec5SDimitry Andric#endif
685*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
686*0b57cec5SDimitry Andric    void swap(basic_ios& __rhs) _NOEXCEPT;
687*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
688*0b57cec5SDimitry Andric    void set_rdbuf(basic_streambuf<char_type, traits_type>* __sb);
689*0b57cec5SDimitry Andricprivate:
690*0b57cec5SDimitry Andric    basic_ostream<char_type, traits_type>* __tie_;
691*0b57cec5SDimitry Andric    mutable int_type __fill_;
692*0b57cec5SDimitry Andric};
693*0b57cec5SDimitry Andric
694*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
695*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
696*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>::basic_ios(basic_streambuf<char_type,traits_type>* __sb)
697*0b57cec5SDimitry Andric{
698*0b57cec5SDimitry Andric    init(__sb);
699*0b57cec5SDimitry Andric}
700*0b57cec5SDimitry Andric
701*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
702*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>::~basic_ios()
703*0b57cec5SDimitry Andric{
704*0b57cec5SDimitry Andric}
705*0b57cec5SDimitry Andric
706*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
707*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
708*0b57cec5SDimitry Andricvoid
709*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>::init(basic_streambuf<char_type, traits_type>* __sb)
710*0b57cec5SDimitry Andric{
711*0b57cec5SDimitry Andric    ios_base::init(__sb);
712*0b57cec5SDimitry Andric    __tie_ = 0;
713*0b57cec5SDimitry Andric    __fill_ = traits_type::eof();
714*0b57cec5SDimitry Andric}
715*0b57cec5SDimitry Andric
716*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
717*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
718*0b57cec5SDimitry Andricbasic_ostream<_CharT, _Traits>*
719*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>::tie() const
720*0b57cec5SDimitry Andric{
721*0b57cec5SDimitry Andric    return __tie_;
722*0b57cec5SDimitry Andric}
723*0b57cec5SDimitry Andric
724*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
725*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
726*0b57cec5SDimitry Andricbasic_ostream<_CharT, _Traits>*
727*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>::tie(basic_ostream<char_type, traits_type>* __tiestr)
728*0b57cec5SDimitry Andric{
729*0b57cec5SDimitry Andric    basic_ostream<char_type, traits_type>* __r = __tie_;
730*0b57cec5SDimitry Andric    __tie_ = __tiestr;
731*0b57cec5SDimitry Andric    return __r;
732*0b57cec5SDimitry Andric}
733*0b57cec5SDimitry Andric
734*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
735*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
736*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>*
737*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>::rdbuf() const
738*0b57cec5SDimitry Andric{
739*0b57cec5SDimitry Andric    return static_cast<basic_streambuf<char_type, traits_type>*>(ios_base::rdbuf());
740*0b57cec5SDimitry Andric}
741*0b57cec5SDimitry Andric
742*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
743*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
744*0b57cec5SDimitry Andricbasic_streambuf<_CharT, _Traits>*
745*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>::rdbuf(basic_streambuf<char_type, traits_type>* __sb)
746*0b57cec5SDimitry Andric{
747*0b57cec5SDimitry Andric    basic_streambuf<char_type, traits_type>* __r = rdbuf();
748*0b57cec5SDimitry Andric    ios_base::rdbuf(__sb);
749*0b57cec5SDimitry Andric    return __r;
750*0b57cec5SDimitry Andric}
751*0b57cec5SDimitry Andric
752*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
753*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
754*0b57cec5SDimitry Andriclocale
755*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>::imbue(const locale& __loc)
756*0b57cec5SDimitry Andric{
757*0b57cec5SDimitry Andric    locale __r = getloc();
758*0b57cec5SDimitry Andric    ios_base::imbue(__loc);
759*0b57cec5SDimitry Andric    if (rdbuf())
760*0b57cec5SDimitry Andric        rdbuf()->pubimbue(__loc);
761*0b57cec5SDimitry Andric    return __r;
762*0b57cec5SDimitry Andric}
763*0b57cec5SDimitry Andric
764*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
765*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
766*0b57cec5SDimitry Andricchar
767*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>::narrow(char_type __c, char __dfault) const
768*0b57cec5SDimitry Andric{
769*0b57cec5SDimitry Andric    return use_facet<ctype<char_type> >(getloc()).narrow(__c, __dfault);
770*0b57cec5SDimitry Andric}
771*0b57cec5SDimitry Andric
772*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
773*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
774*0b57cec5SDimitry Andric_CharT
775*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>::widen(char __c) const
776*0b57cec5SDimitry Andric{
777*0b57cec5SDimitry Andric    return use_facet<ctype<char_type> >(getloc()).widen(__c);
778*0b57cec5SDimitry Andric}
779*0b57cec5SDimitry Andric
780*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
781*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
782*0b57cec5SDimitry Andric_CharT
783*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>::fill() const
784*0b57cec5SDimitry Andric{
785*0b57cec5SDimitry Andric    if (traits_type::eq_int_type(traits_type::eof(), __fill_))
786*0b57cec5SDimitry Andric        __fill_ = widen(' ');
787*0b57cec5SDimitry Andric    return __fill_;
788*0b57cec5SDimitry Andric}
789*0b57cec5SDimitry Andric
790*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
791*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
792*0b57cec5SDimitry Andric_CharT
793*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>::fill(char_type __ch)
794*0b57cec5SDimitry Andric{
795*0b57cec5SDimitry Andric    char_type __r = __fill_;
796*0b57cec5SDimitry Andric    __fill_ = __ch;
797*0b57cec5SDimitry Andric    return __r;
798*0b57cec5SDimitry Andric}
799*0b57cec5SDimitry Andric
800*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
801*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>&
802*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>::copyfmt(const basic_ios& __rhs)
803*0b57cec5SDimitry Andric{
804*0b57cec5SDimitry Andric    if (this != &__rhs)
805*0b57cec5SDimitry Andric    {
806*0b57cec5SDimitry Andric        __call_callbacks(erase_event);
807*0b57cec5SDimitry Andric        ios_base::copyfmt(__rhs);
808*0b57cec5SDimitry Andric        __tie_ = __rhs.__tie_;
809*0b57cec5SDimitry Andric        __fill_ = __rhs.__fill_;
810*0b57cec5SDimitry Andric        __call_callbacks(copyfmt_event);
811*0b57cec5SDimitry Andric        exceptions(__rhs.exceptions());
812*0b57cec5SDimitry Andric    }
813*0b57cec5SDimitry Andric    return *this;
814*0b57cec5SDimitry Andric}
815*0b57cec5SDimitry Andric
816*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
817*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
818*0b57cec5SDimitry Andricvoid
819*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>::move(basic_ios& __rhs)
820*0b57cec5SDimitry Andric{
821*0b57cec5SDimitry Andric    ios_base::move(__rhs);
822*0b57cec5SDimitry Andric    __tie_ = __rhs.__tie_;
823*0b57cec5SDimitry Andric    __rhs.__tie_ = 0;
824*0b57cec5SDimitry Andric    __fill_ = __rhs.__fill_;
825*0b57cec5SDimitry Andric}
826*0b57cec5SDimitry Andric
827*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
828*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
829*0b57cec5SDimitry Andricvoid
830*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>::swap(basic_ios& __rhs) _NOEXCEPT
831*0b57cec5SDimitry Andric{
832*0b57cec5SDimitry Andric    ios_base::swap(__rhs);
833*0b57cec5SDimitry Andric    _VSTD::swap(__tie_, __rhs.__tie_);
834*0b57cec5SDimitry Andric    _VSTD::swap(__fill_, __rhs.__fill_);
835*0b57cec5SDimitry Andric}
836*0b57cec5SDimitry Andric
837*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
838*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
839*0b57cec5SDimitry Andricvoid
840*0b57cec5SDimitry Andricbasic_ios<_CharT, _Traits>::set_rdbuf(basic_streambuf<char_type, traits_type>* __sb)
841*0b57cec5SDimitry Andric{
842*0b57cec5SDimitry Andric    ios_base::set_rdbuf(__sb);
843*0b57cec5SDimitry Andric}
844*0b57cec5SDimitry Andric
845*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
846*0b57cec5SDimitry Andricios_base&
847*0b57cec5SDimitry Andricboolalpha(ios_base& __str)
848*0b57cec5SDimitry Andric{
849*0b57cec5SDimitry Andric    __str.setf(ios_base::boolalpha);
850*0b57cec5SDimitry Andric    return __str;
851*0b57cec5SDimitry Andric}
852*0b57cec5SDimitry Andric
853*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
854*0b57cec5SDimitry Andricios_base&
855*0b57cec5SDimitry Andricnoboolalpha(ios_base& __str)
856*0b57cec5SDimitry Andric{
857*0b57cec5SDimitry Andric    __str.unsetf(ios_base::boolalpha);
858*0b57cec5SDimitry Andric    return __str;
859*0b57cec5SDimitry Andric}
860*0b57cec5SDimitry Andric
861*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
862*0b57cec5SDimitry Andricios_base&
863*0b57cec5SDimitry Andricshowbase(ios_base& __str)
864*0b57cec5SDimitry Andric{
865*0b57cec5SDimitry Andric    __str.setf(ios_base::showbase);
866*0b57cec5SDimitry Andric    return __str;
867*0b57cec5SDimitry Andric}
868*0b57cec5SDimitry Andric
869*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
870*0b57cec5SDimitry Andricios_base&
871*0b57cec5SDimitry Andricnoshowbase(ios_base& __str)
872*0b57cec5SDimitry Andric{
873*0b57cec5SDimitry Andric    __str.unsetf(ios_base::showbase);
874*0b57cec5SDimitry Andric    return __str;
875*0b57cec5SDimitry Andric}
876*0b57cec5SDimitry Andric
877*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
878*0b57cec5SDimitry Andricios_base&
879*0b57cec5SDimitry Andricshowpoint(ios_base& __str)
880*0b57cec5SDimitry Andric{
881*0b57cec5SDimitry Andric    __str.setf(ios_base::showpoint);
882*0b57cec5SDimitry Andric    return __str;
883*0b57cec5SDimitry Andric}
884*0b57cec5SDimitry Andric
885*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
886*0b57cec5SDimitry Andricios_base&
887*0b57cec5SDimitry Andricnoshowpoint(ios_base& __str)
888*0b57cec5SDimitry Andric{
889*0b57cec5SDimitry Andric    __str.unsetf(ios_base::showpoint);
890*0b57cec5SDimitry Andric    return __str;
891*0b57cec5SDimitry Andric}
892*0b57cec5SDimitry Andric
893*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
894*0b57cec5SDimitry Andricios_base&
895*0b57cec5SDimitry Andricshowpos(ios_base& __str)
896*0b57cec5SDimitry Andric{
897*0b57cec5SDimitry Andric    __str.setf(ios_base::showpos);
898*0b57cec5SDimitry Andric    return __str;
899*0b57cec5SDimitry Andric}
900*0b57cec5SDimitry Andric
901*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
902*0b57cec5SDimitry Andricios_base&
903*0b57cec5SDimitry Andricnoshowpos(ios_base& __str)
904*0b57cec5SDimitry Andric{
905*0b57cec5SDimitry Andric    __str.unsetf(ios_base::showpos);
906*0b57cec5SDimitry Andric    return __str;
907*0b57cec5SDimitry Andric}
908*0b57cec5SDimitry Andric
909*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
910*0b57cec5SDimitry Andricios_base&
911*0b57cec5SDimitry Andricskipws(ios_base& __str)
912*0b57cec5SDimitry Andric{
913*0b57cec5SDimitry Andric    __str.setf(ios_base::skipws);
914*0b57cec5SDimitry Andric    return __str;
915*0b57cec5SDimitry Andric}
916*0b57cec5SDimitry Andric
917*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
918*0b57cec5SDimitry Andricios_base&
919*0b57cec5SDimitry Andricnoskipws(ios_base& __str)
920*0b57cec5SDimitry Andric{
921*0b57cec5SDimitry Andric    __str.unsetf(ios_base::skipws);
922*0b57cec5SDimitry Andric    return __str;
923*0b57cec5SDimitry Andric}
924*0b57cec5SDimitry Andric
925*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
926*0b57cec5SDimitry Andricios_base&
927*0b57cec5SDimitry Andricuppercase(ios_base& __str)
928*0b57cec5SDimitry Andric{
929*0b57cec5SDimitry Andric    __str.setf(ios_base::uppercase);
930*0b57cec5SDimitry Andric    return __str;
931*0b57cec5SDimitry Andric}
932*0b57cec5SDimitry Andric
933*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
934*0b57cec5SDimitry Andricios_base&
935*0b57cec5SDimitry Andricnouppercase(ios_base& __str)
936*0b57cec5SDimitry Andric{
937*0b57cec5SDimitry Andric    __str.unsetf(ios_base::uppercase);
938*0b57cec5SDimitry Andric    return __str;
939*0b57cec5SDimitry Andric}
940*0b57cec5SDimitry Andric
941*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
942*0b57cec5SDimitry Andricios_base&
943*0b57cec5SDimitry Andricunitbuf(ios_base& __str)
944*0b57cec5SDimitry Andric{
945*0b57cec5SDimitry Andric    __str.setf(ios_base::unitbuf);
946*0b57cec5SDimitry Andric    return __str;
947*0b57cec5SDimitry Andric}
948*0b57cec5SDimitry Andric
949*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
950*0b57cec5SDimitry Andricios_base&
951*0b57cec5SDimitry Andricnounitbuf(ios_base& __str)
952*0b57cec5SDimitry Andric{
953*0b57cec5SDimitry Andric    __str.unsetf(ios_base::unitbuf);
954*0b57cec5SDimitry Andric    return __str;
955*0b57cec5SDimitry Andric}
956*0b57cec5SDimitry Andric
957*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
958*0b57cec5SDimitry Andricios_base&
959*0b57cec5SDimitry Andricinternal(ios_base& __str)
960*0b57cec5SDimitry Andric{
961*0b57cec5SDimitry Andric    __str.setf(ios_base::internal, ios_base::adjustfield);
962*0b57cec5SDimitry Andric    return __str;
963*0b57cec5SDimitry Andric}
964*0b57cec5SDimitry Andric
965*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
966*0b57cec5SDimitry Andricios_base&
967*0b57cec5SDimitry Andricleft(ios_base& __str)
968*0b57cec5SDimitry Andric{
969*0b57cec5SDimitry Andric    __str.setf(ios_base::left, ios_base::adjustfield);
970*0b57cec5SDimitry Andric    return __str;
971*0b57cec5SDimitry Andric}
972*0b57cec5SDimitry Andric
973*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
974*0b57cec5SDimitry Andricios_base&
975*0b57cec5SDimitry Andricright(ios_base& __str)
976*0b57cec5SDimitry Andric{
977*0b57cec5SDimitry Andric    __str.setf(ios_base::right, ios_base::adjustfield);
978*0b57cec5SDimitry Andric    return __str;
979*0b57cec5SDimitry Andric}
980*0b57cec5SDimitry Andric
981*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
982*0b57cec5SDimitry Andricios_base&
983*0b57cec5SDimitry Andricdec(ios_base& __str)
984*0b57cec5SDimitry Andric{
985*0b57cec5SDimitry Andric    __str.setf(ios_base::dec, ios_base::basefield);
986*0b57cec5SDimitry Andric    return __str;
987*0b57cec5SDimitry Andric}
988*0b57cec5SDimitry Andric
989*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
990*0b57cec5SDimitry Andricios_base&
991*0b57cec5SDimitry Andrichex(ios_base& __str)
992*0b57cec5SDimitry Andric{
993*0b57cec5SDimitry Andric    __str.setf(ios_base::hex, ios_base::basefield);
994*0b57cec5SDimitry Andric    return __str;
995*0b57cec5SDimitry Andric}
996*0b57cec5SDimitry Andric
997*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
998*0b57cec5SDimitry Andricios_base&
999*0b57cec5SDimitry Andricoct(ios_base& __str)
1000*0b57cec5SDimitry Andric{
1001*0b57cec5SDimitry Andric    __str.setf(ios_base::oct, ios_base::basefield);
1002*0b57cec5SDimitry Andric    return __str;
1003*0b57cec5SDimitry Andric}
1004*0b57cec5SDimitry Andric
1005*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
1006*0b57cec5SDimitry Andricios_base&
1007*0b57cec5SDimitry Andricfixed(ios_base& __str)
1008*0b57cec5SDimitry Andric{
1009*0b57cec5SDimitry Andric    __str.setf(ios_base::fixed, ios_base::floatfield);
1010*0b57cec5SDimitry Andric    return __str;
1011*0b57cec5SDimitry Andric}
1012*0b57cec5SDimitry Andric
1013*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
1014*0b57cec5SDimitry Andricios_base&
1015*0b57cec5SDimitry Andricscientific(ios_base& __str)
1016*0b57cec5SDimitry Andric{
1017*0b57cec5SDimitry Andric    __str.setf(ios_base::scientific, ios_base::floatfield);
1018*0b57cec5SDimitry Andric    return __str;
1019*0b57cec5SDimitry Andric}
1020*0b57cec5SDimitry Andric
1021*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
1022*0b57cec5SDimitry Andricios_base&
1023*0b57cec5SDimitry Andrichexfloat(ios_base& __str)
1024*0b57cec5SDimitry Andric{
1025*0b57cec5SDimitry Andric    __str.setf(ios_base::fixed | ios_base::scientific, ios_base::floatfield);
1026*0b57cec5SDimitry Andric    return __str;
1027*0b57cec5SDimitry Andric}
1028*0b57cec5SDimitry Andric
1029*0b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
1030*0b57cec5SDimitry Andricios_base&
1031*0b57cec5SDimitry Andricdefaultfloat(ios_base& __str)
1032*0b57cec5SDimitry Andric{
1033*0b57cec5SDimitry Andric    __str.unsetf(ios_base::floatfield);
1034*0b57cec5SDimitry Andric    return __str;
1035*0b57cec5SDimitry Andric}
1036*0b57cec5SDimitry Andric
1037*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits>
1038*0b57cec5SDimitry Andricclass __save_flags
1039*0b57cec5SDimitry Andric{
1040*0b57cec5SDimitry Andric    typedef basic_ios<_CharT, _Traits> __stream_type;
1041*0b57cec5SDimitry Andric    typedef typename __stream_type::fmtflags fmtflags;
1042*0b57cec5SDimitry Andric
1043*0b57cec5SDimitry Andric    __stream_type& __stream_;
1044*0b57cec5SDimitry Andric    fmtflags       __fmtflags_;
1045*0b57cec5SDimitry Andric    _CharT         __fill_;
1046*0b57cec5SDimitry Andric
1047*0b57cec5SDimitry Andric    __save_flags(const __save_flags&);
1048*0b57cec5SDimitry Andric    __save_flags& operator=(const __save_flags&);
1049*0b57cec5SDimitry Andricpublic:
1050*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
1051*0b57cec5SDimitry Andric    explicit __save_flags(__stream_type& __stream)
1052*0b57cec5SDimitry Andric        : __stream_(__stream),
1053*0b57cec5SDimitry Andric          __fmtflags_(__stream.flags()),
1054*0b57cec5SDimitry Andric          __fill_(__stream.fill())
1055*0b57cec5SDimitry Andric        {}
1056*0b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
1057*0b57cec5SDimitry Andric    ~__save_flags()
1058*0b57cec5SDimitry Andric    {
1059*0b57cec5SDimitry Andric        __stream_.flags(__fmtflags_);
1060*0b57cec5SDimitry Andric        __stream_.fill(__fill_);
1061*0b57cec5SDimitry Andric    }
1062*0b57cec5SDimitry Andric};
1063*0b57cec5SDimitry Andric
1064*0b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
1065*0b57cec5SDimitry Andric
1066*0b57cec5SDimitry Andric#endif  // _LIBCPP_IOS
1067