1227825Stheraven// -*- C++ -*-
2227825Stheraven//===------------------------- fstream ------------------------------------===//
3227825Stheraven//
4227825Stheraven//                     The LLVM Compiler Infrastructure
5227825Stheraven//
6227825Stheraven// This file is dual licensed under the MIT and the University of Illinois Open
7227825Stheraven// Source Licenses. See LICENSE.TXT for details.
8227825Stheraven//
9227825Stheraven//===----------------------------------------------------------------------===//
10227825Stheraven
11227825Stheraven#ifndef _LIBCPP_FSTREAM
12227825Stheraven#define _LIBCPP_FSTREAM
13227825Stheraven
14227825Stheraven/*
15227825Stheraven    fstream synopsis
16227825Stheraven
17227825Stheraventemplate <class charT, class traits = char_traits<charT> >
18227825Stheravenclass basic_filebuf
19227825Stheraven    : public basic_streambuf<charT, traits>
20227825Stheraven{
21227825Stheravenpublic:
22227825Stheraven    typedef charT                          char_type;
23227825Stheraven    typedef traits                         traits_type;
24227825Stheraven    typedef typename traits_type::int_type int_type;
25227825Stheraven    typedef typename traits_type::pos_type pos_type;
26227825Stheraven    typedef typename traits_type::off_type off_type;
27227825Stheraven
28227825Stheraven    // 27.9.1.2 Constructors/destructor:
29227825Stheraven    basic_filebuf();
30227825Stheraven    basic_filebuf(basic_filebuf&& rhs);
31227825Stheraven    virtual ~basic_filebuf();
32227825Stheraven
33227825Stheraven    // 27.9.1.3 Assign/swap:
34227825Stheraven    basic_filebuf& operator=(basic_filebuf&& rhs);
35227825Stheraven    void swap(basic_filebuf& rhs);
36227825Stheraven
37227825Stheraven    // 27.9.1.4 Members:
38227825Stheraven    bool is_open() const;
39227825Stheraven    basic_filebuf* open(const char* s, ios_base::openmode mode);
40227825Stheraven    basic_filebuf* open(const string& s, ios_base::openmode mode);
41227825Stheraven    basic_filebuf* close();
42227825Stheraven
43227825Stheravenprotected:
44227825Stheraven    // 27.9.1.5 Overridden virtual functions:
45227825Stheraven    virtual streamsize showmanyc();
46227825Stheraven    virtual int_type underflow();
47227825Stheraven    virtual int_type uflow();
48227825Stheraven    virtual int_type pbackfail(int_type c = traits_type::eof());
49227825Stheraven    virtual int_type overflow (int_type c = traits_type::eof());
50227825Stheraven    virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* s, streamsize n);
51227825Stheraven    virtual pos_type seekoff(off_type off, ios_base::seekdir way,
52227825Stheraven                             ios_base::openmode which = ios_base::in | ios_base::out);
53227825Stheraven    virtual pos_type seekpos(pos_type sp,
54227825Stheraven                             ios_base::openmode which = ios_base::in | ios_base::out);
55227825Stheraven    virtual int sync();
56227825Stheraven    virtual void imbue(const locale& loc);
57227825Stheraven};
58227825Stheraven
59227825Stheraventemplate <class charT, class traits>
60227825Stheraven  void
61227825Stheraven  swap(basic_filebuf<charT, traits>& x, basic_filebuf<charT, traits>& y);
62227825Stheraven
63227825Stheraventypedef basic_filebuf<char>    filebuf;
64227825Stheraventypedef basic_filebuf<wchar_t> wfilebuf;
65227825Stheraven
66227825Stheraventemplate <class charT, class traits = char_traits<charT> >
67227825Stheravenclass basic_ifstream
68227825Stheraven    : public basic_istream<charT,traits>
69227825Stheraven{
70227825Stheravenpublic:
71227825Stheraven    typedef charT                          char_type;
72227825Stheraven    typedef traits                         traits_type;
73227825Stheraven    typedef typename traits_type::int_type int_type;
74227825Stheraven    typedef typename traits_type::pos_type pos_type;
75227825Stheraven    typedef typename traits_type::off_type off_type;
76227825Stheraven
77227825Stheraven    basic_ifstream();
78227825Stheraven    explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in);
79227825Stheraven    explicit basic_ifstream(const string& s, ios_base::openmode mode = ios_base::in);
80227825Stheraven    basic_ifstream(basic_ifstream&& rhs);
81227825Stheraven
82227825Stheraven    basic_ifstream& operator=(basic_ifstream&& rhs);
83227825Stheraven    void swap(basic_ifstream& rhs);
84227825Stheraven
85227825Stheraven    basic_filebuf<char_type, traits_type>* rdbuf() const;
86227825Stheraven    bool is_open() const;
87227825Stheraven    void open(const char* s, ios_base::openmode mode = ios_base::in);
88227825Stheraven    void open(const string& s, ios_base::openmode mode = ios_base::in);
89227825Stheraven    void close();
90227825Stheraven};
91227825Stheraven
92227825Stheraventemplate <class charT, class traits>
93227825Stheraven  void
94227825Stheraven  swap(basic_ifstream<charT, traits>& x, basic_ifstream<charT, traits>& y);
95227825Stheraven
96227825Stheraventypedef basic_ifstream<char>    ifstream;
97227825Stheraventypedef basic_ifstream<wchar_t> wifstream;
98227825Stheraven
99227825Stheraventemplate <class charT, class traits = char_traits<charT> >
100227825Stheravenclass basic_ofstream
101227825Stheraven    : public basic_ostream<charT,traits>
102227825Stheraven{
103227825Stheravenpublic:
104227825Stheraven    typedef charT                          char_type;
105227825Stheraven    typedef traits                         traits_type;
106227825Stheraven    typedef typename traits_type::int_type int_type;
107227825Stheraven    typedef typename traits_type::pos_type pos_type;
108227825Stheraven    typedef typename traits_type::off_type off_type;
109227825Stheraven
110227825Stheraven    basic_ofstream();
111227825Stheraven    explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out);
112227825Stheraven    explicit basic_ofstream(const string& s, ios_base::openmode mode = ios_base::out);
113227825Stheraven    basic_ofstream(basic_ofstream&& rhs);
114227825Stheraven
115227825Stheraven    basic_ofstream& operator=(basic_ofstream&& rhs);
116227825Stheraven    void swap(basic_ofstream& rhs);
117227825Stheraven
118227825Stheraven    basic_filebuf<char_type, traits_type>* rdbuf() const;
119227825Stheraven    bool is_open() const;
120227825Stheraven    void open(const char* s, ios_base::openmode mode = ios_base::out);
121227825Stheraven    void open(const string& s, ios_base::openmode mode = ios_base::out);
122227825Stheraven    void close();
123227825Stheraven};
124227825Stheraven
125227825Stheraventemplate <class charT, class traits>
126227825Stheraven  void
127227825Stheraven  swap(basic_ofstream<charT, traits>& x, basic_ofstream<charT, traits>& y);
128227825Stheraven
129227825Stheraventypedef basic_ofstream<char>    ofstream;
130227825Stheraventypedef basic_ofstream<wchar_t> wofstream;
131227825Stheraven
132227825Stheraventemplate <class charT, class traits=char_traits<charT> >
133227825Stheravenclass basic_fstream
134227825Stheraven    : public basic_iostream<charT,traits>
135227825Stheraven{
136227825Stheravenpublic:
137227825Stheraven    typedef charT                          char_type;
138227825Stheraven    typedef traits                         traits_type;
139227825Stheraven    typedef typename traits_type::int_type int_type;
140227825Stheraven    typedef typename traits_type::pos_type pos_type;
141227825Stheraven    typedef typename traits_type::off_type off_type;
142227825Stheraven
143227825Stheraven    basic_fstream();
144227825Stheraven    explicit basic_fstream(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out);
145227825Stheraven    explicit basic_fstream(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out);
146227825Stheraven    basic_fstream(basic_fstream&& rhs);
147227825Stheraven
148227825Stheraven    basic_fstream& operator=(basic_fstream&& rhs);
149227825Stheraven    void swap(basic_fstream& rhs);
150227825Stheraven
151227825Stheraven    basic_filebuf<char_type, traits_type>* rdbuf() const;
152227825Stheraven    bool is_open() const;
153227825Stheraven    void open(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out);
154227825Stheraven    void open(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out);
155227825Stheraven    void close();
156227825Stheraven};
157227825Stheraven
158227825Stheraventemplate <class charT, class traits>
159227825Stheraven  void swap(basic_fstream<charT, traits>& x, basic_fstream<charT, traits>& y);
160227825Stheraven
161227825Stheraventypedef basic_fstream<char>    fstream;
162227825Stheraventypedef basic_fstream<wchar_t> wfstream;
163227825Stheraven
164227825Stheraven}  // std
165227825Stheraven
166227825Stheraven*/
167227825Stheraven
168227825Stheraven#include <__config>
169227825Stheraven#include <ostream>
170227825Stheraven#include <istream>
171227825Stheraven#include <__locale>
172227825Stheraven#include <cstdio>
173227825Stheraven
174232924Stheraven#include <__undef_min_max>
175232924Stheraven
176227825Stheraven#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
177227825Stheraven#pragma GCC system_header
178227825Stheraven#endif
179227825Stheraven
180227825Stheraven_LIBCPP_BEGIN_NAMESPACE_STD
181227825Stheraven
182227825Stheraventemplate <class _CharT, class _Traits>
183261272Sdimclass _LIBCPP_TYPE_VIS_ONLY basic_filebuf
184227825Stheraven    : public basic_streambuf<_CharT, _Traits>
185227825Stheraven{
186227825Stheravenpublic:
187227825Stheraven    typedef _CharT                           char_type;
188227825Stheraven    typedef _Traits                          traits_type;
189227825Stheraven    typedef typename traits_type::int_type   int_type;
190227825Stheraven    typedef typename traits_type::pos_type   pos_type;
191227825Stheraven    typedef typename traits_type::off_type   off_type;
192227825Stheraven    typedef typename traits_type::state_type state_type;
193227825Stheraven
194227825Stheraven    // 27.9.1.2 Constructors/destructor:
195227825Stheraven    basic_filebuf();
196227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
197227825Stheraven    basic_filebuf(basic_filebuf&& __rhs);
198227825Stheraven#endif
199227825Stheraven    virtual ~basic_filebuf();
200227825Stheraven
201227825Stheraven    // 27.9.1.3 Assign/swap:
202227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
203227825Stheraven    basic_filebuf& operator=(basic_filebuf&& __rhs);
204227825Stheraven#endif
205227825Stheraven    void swap(basic_filebuf& __rhs);
206227825Stheraven
207227825Stheraven    // 27.9.1.4 Members:
208227825Stheraven    bool is_open() const;
209288943Sdim#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
210227825Stheraven    basic_filebuf* open(const char* __s, ios_base::openmode __mode);
211227825Stheraven    basic_filebuf* open(const string& __s, ios_base::openmode __mode);
212288943Sdim#endif
213227825Stheraven    basic_filebuf* close();
214227825Stheraven
215227825Stheravenprotected:
216227825Stheraven    // 27.9.1.5 Overridden virtual functions:
217227825Stheraven    virtual int_type underflow();
218227825Stheraven    virtual int_type pbackfail(int_type __c = traits_type::eof());
219227825Stheraven    virtual int_type overflow (int_type __c = traits_type::eof());
220227825Stheraven    virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* __s, streamsize __n);
221227825Stheraven    virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
222227825Stheraven                             ios_base::openmode __wch = ios_base::in | ios_base::out);
223227825Stheraven    virtual pos_type seekpos(pos_type __sp,
224227825Stheraven                             ios_base::openmode __wch = ios_base::in | ios_base::out);
225227825Stheraven    virtual int sync();
226227825Stheraven    virtual void imbue(const locale& __loc);
227227825Stheraven
228227825Stheravenprivate:
229227825Stheraven    char*       __extbuf_;
230227825Stheraven    const char* __extbufnext_;
231227825Stheraven    const char* __extbufend_;
232227825Stheraven    char __extbuf_min_[8];
233227825Stheraven    size_t __ebs_;
234227825Stheraven    char_type* __intbuf_;
235227825Stheraven    size_t __ibs_;
236227825Stheraven    FILE* __file_;
237227825Stheraven    const codecvt<char_type, char, state_type>* __cv_;
238227825Stheraven    state_type __st_;
239241900Sdim    state_type __st_last_;
240227825Stheraven    ios_base::openmode __om_;
241227825Stheraven    ios_base::openmode __cm_;
242227825Stheraven    bool __owns_eb_;
243227825Stheraven    bool __owns_ib_;
244227825Stheraven    bool __always_noconv_;
245227825Stheraven
246227825Stheraven    bool __read_mode();
247227825Stheraven    void __write_mode();
248227825Stheraven};
249227825Stheraven
250227825Stheraventemplate <class _CharT, class _Traits>
251227825Stheravenbasic_filebuf<_CharT, _Traits>::basic_filebuf()
252227825Stheraven    : __extbuf_(0),
253227825Stheraven      __extbufnext_(0),
254227825Stheraven      __extbufend_(0),
255227825Stheraven      __ebs_(0),
256227825Stheraven      __intbuf_(0),
257227825Stheraven      __ibs_(0),
258227825Stheraven      __file_(0),
259241900Sdim      __cv_(nullptr),
260227825Stheraven      __st_(),
261241900Sdim      __st_last_(),
262227825Stheraven      __om_(0),
263227825Stheraven      __cm_(0),
264227825Stheraven      __owns_eb_(false),
265227825Stheraven      __owns_ib_(false),
266241900Sdim      __always_noconv_(false)
267227825Stheraven{
268241900Sdim    if (has_facet<codecvt<char_type, char, state_type> >(this->getloc()))
269241900Sdim    {
270241900Sdim        __cv_ = &use_facet<codecvt<char_type, char, state_type> >(this->getloc());
271241900Sdim        __always_noconv_ = __cv_->always_noconv();
272241900Sdim    }
273227825Stheraven    setbuf(0, 4096);
274227825Stheraven}
275227825Stheraven
276227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
277227825Stheraven
278227825Stheraventemplate <class _CharT, class _Traits>
279227825Stheravenbasic_filebuf<_CharT, _Traits>::basic_filebuf(basic_filebuf&& __rhs)
280227825Stheraven    : basic_streambuf<_CharT, _Traits>(__rhs)
281227825Stheraven{
282227825Stheraven    if (__rhs.__extbuf_ == __rhs.__extbuf_min_)
283227825Stheraven    {
284227825Stheraven        __extbuf_ = __extbuf_min_;
285227825Stheraven        __extbufnext_ = __extbuf_ + (__rhs.__extbufnext_ - __rhs.__extbuf_);
286227825Stheraven        __extbufend_ = __extbuf_ + (__rhs.__extbufend_ - __rhs.__extbuf_);
287227825Stheraven    }
288227825Stheraven    else
289227825Stheraven    {
290227825Stheraven        __extbuf_ = __rhs.__extbuf_;
291227825Stheraven        __extbufnext_ = __rhs.__extbufnext_;
292227825Stheraven        __extbufend_ = __rhs.__extbufend_;
293227825Stheraven    }
294227825Stheraven    __ebs_ = __rhs.__ebs_;
295227825Stheraven    __intbuf_ = __rhs.__intbuf_;
296227825Stheraven    __ibs_ = __rhs.__ibs_;
297227825Stheraven    __file_ = __rhs.__file_;
298227825Stheraven    __cv_ = __rhs.__cv_;
299227825Stheraven    __st_ = __rhs.__st_;
300241900Sdim    __st_last_ = __rhs.__st_last_;
301227825Stheraven    __om_ = __rhs.__om_;
302227825Stheraven    __cm_ = __rhs.__cm_;
303227825Stheraven    __owns_eb_ = __rhs.__owns_eb_;
304227825Stheraven    __owns_ib_ = __rhs.__owns_ib_;
305227825Stheraven    __always_noconv_ = __rhs.__always_noconv_;
306227825Stheraven    if (__rhs.pbase())
307227825Stheraven    {
308227825Stheraven        if (__rhs.pbase() == __rhs.__intbuf_)
309227825Stheraven            this->setp(__intbuf_, __intbuf_ + (__rhs. epptr() - __rhs.pbase()));
310227825Stheraven        else
311227825Stheraven            this->setp((char_type*)__extbuf_,
312227825Stheraven                       (char_type*)__extbuf_ + (__rhs. epptr() - __rhs.pbase()));
313227825Stheraven        this->pbump(__rhs. pptr() - __rhs.pbase());
314227825Stheraven    }
315227825Stheraven    else if (__rhs.eback())
316227825Stheraven    {
317227825Stheraven        if (__rhs.eback() == __rhs.__intbuf_)
318227825Stheraven            this->setg(__intbuf_, __intbuf_ + (__rhs.gptr() - __rhs.eback()),
319227825Stheraven                                  __intbuf_ + (__rhs.egptr() - __rhs.eback()));
320227825Stheraven        else
321227825Stheraven            this->setg((char_type*)__extbuf_,
322227825Stheraven                       (char_type*)__extbuf_ + (__rhs.gptr() - __rhs.eback()),
323227825Stheraven                       (char_type*)__extbuf_ + (__rhs.egptr() - __rhs.eback()));
324227825Stheraven    }
325227825Stheraven    __rhs.__extbuf_ = 0;
326227825Stheraven    __rhs.__extbufnext_ = 0;
327227825Stheraven    __rhs.__extbufend_ = 0;
328227825Stheraven    __rhs.__ebs_ = 0;
329227825Stheraven    __rhs.__intbuf_ = 0;
330227825Stheraven    __rhs.__ibs_ = 0;
331227825Stheraven    __rhs.__file_ = 0;
332227825Stheraven    __rhs.__st_ = state_type();
333241900Sdim    __rhs.__st_last_ = state_type();
334227825Stheraven    __rhs.__om_ = 0;
335227825Stheraven    __rhs.__cm_ = 0;
336227825Stheraven    __rhs.__owns_eb_ = false;
337227825Stheraven    __rhs.__owns_ib_ = false;
338227825Stheraven    __rhs.setg(0, 0, 0);
339227825Stheraven    __rhs.setp(0, 0);
340227825Stheraven}
341227825Stheraven
342227825Stheraventemplate <class _CharT, class _Traits>
343227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
344227825Stheravenbasic_filebuf<_CharT, _Traits>&
345227825Stheravenbasic_filebuf<_CharT, _Traits>::operator=(basic_filebuf&& __rhs)
346227825Stheraven{
347227825Stheraven    close();
348227825Stheraven    swap(__rhs);
349241900Sdim    return *this;
350227825Stheraven}
351227825Stheraven
352227825Stheraven#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
353227825Stheraven
354227825Stheraventemplate <class _CharT, class _Traits>
355227825Stheravenbasic_filebuf<_CharT, _Traits>::~basic_filebuf()
356227825Stheraven{
357227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS
358227825Stheraven    try
359227825Stheraven    {
360227825Stheraven#endif  // _LIBCPP_NO_EXCEPTIONS
361227825Stheraven        close();
362227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS
363227825Stheraven    }
364227825Stheraven    catch (...)
365227825Stheraven    {
366227825Stheraven    }
367227825Stheraven#endif  // _LIBCPP_NO_EXCEPTIONS
368227825Stheraven    if (__owns_eb_)
369227825Stheraven        delete [] __extbuf_;
370227825Stheraven    if (__owns_ib_)
371227825Stheraven        delete [] __intbuf_;
372227825Stheraven}
373227825Stheraven
374227825Stheraventemplate <class _CharT, class _Traits>
375227825Stheravenvoid
376227825Stheravenbasic_filebuf<_CharT, _Traits>::swap(basic_filebuf& __rhs)
377227825Stheraven{
378227825Stheraven    basic_streambuf<char_type, traits_type>::swap(__rhs);
379227825Stheraven    if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_)
380227825Stheraven    {
381227825Stheraven        _VSTD::swap(__extbuf_, __rhs.__extbuf_);
382227825Stheraven        _VSTD::swap(__extbufnext_, __rhs.__extbufnext_);
383227825Stheraven        _VSTD::swap(__extbufend_, __rhs.__extbufend_);
384227825Stheraven    }
385227825Stheraven    else
386227825Stheraven    {
387227825Stheraven        ptrdiff_t __ln = __extbufnext_ - __extbuf_;
388227825Stheraven        ptrdiff_t __le = __extbufend_ - __extbuf_;
389227825Stheraven        ptrdiff_t __rn = __rhs.__extbufnext_ - __rhs.__extbuf_;
390227825Stheraven        ptrdiff_t __re = __rhs.__extbufend_ - __rhs.__extbuf_;
391227825Stheraven        if (__extbuf_ == __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_)
392227825Stheraven        {
393227825Stheraven            __extbuf_ = __rhs.__extbuf_;
394227825Stheraven            __rhs.__extbuf_ = __rhs.__extbuf_min_;
395227825Stheraven        }
396227825Stheraven        else if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ == __rhs.__extbuf_min_)
397227825Stheraven        {
398227825Stheraven            __rhs.__extbuf_ = __extbuf_;
399227825Stheraven            __extbuf_ = __extbuf_min_;
400227825Stheraven        }
401227825Stheraven        __extbufnext_ = __extbuf_ + __rn;
402227825Stheraven        __extbufend_ = __extbuf_ + __re;
403227825Stheraven        __rhs.__extbufnext_ = __rhs.__extbuf_ + __ln;
404227825Stheraven        __rhs.__extbufend_ = __rhs.__extbuf_ + __le;
405227825Stheraven    }
406227825Stheraven    _VSTD::swap(__ebs_, __rhs.__ebs_);
407227825Stheraven    _VSTD::swap(__intbuf_, __rhs.__intbuf_);
408227825Stheraven    _VSTD::swap(__ibs_, __rhs.__ibs_);
409227825Stheraven    _VSTD::swap(__file_, __rhs.__file_);
410227825Stheraven    _VSTD::swap(__cv_, __rhs.__cv_);
411227825Stheraven    _VSTD::swap(__st_, __rhs.__st_);
412241900Sdim    _VSTD::swap(__st_last_, __rhs.__st_last_);
413227825Stheraven    _VSTD::swap(__om_, __rhs.__om_);
414227825Stheraven    _VSTD::swap(__cm_, __rhs.__cm_);
415227825Stheraven    _VSTD::swap(__owns_eb_, __rhs.__owns_eb_);
416227825Stheraven    _VSTD::swap(__owns_ib_, __rhs.__owns_ib_);
417227825Stheraven    _VSTD::swap(__always_noconv_, __rhs.__always_noconv_);
418227825Stheraven    if (this->eback() == (char_type*)__rhs.__extbuf_min_)
419227825Stheraven    {
420227825Stheraven        ptrdiff_t __n = this->gptr() - this->eback();
421227825Stheraven        ptrdiff_t __e = this->egptr() - this->eback();
422227825Stheraven        this->setg((char_type*)__extbuf_min_,
423227825Stheraven                   (char_type*)__extbuf_min_ + __n,
424227825Stheraven                   (char_type*)__extbuf_min_ + __e);
425227825Stheraven    }
426227825Stheraven    else if (this->pbase() == (char_type*)__rhs.__extbuf_min_)
427227825Stheraven    {
428227825Stheraven        ptrdiff_t __n = this->pptr() - this->pbase();
429227825Stheraven        ptrdiff_t __e = this->epptr() - this->pbase();
430227825Stheraven        this->setp((char_type*)__extbuf_min_,
431227825Stheraven                   (char_type*)__extbuf_min_ + __e);
432227825Stheraven        this->pbump(__n);
433227825Stheraven    }
434227825Stheraven    if (__rhs.eback() == (char_type*)__extbuf_min_)
435227825Stheraven    {
436227825Stheraven        ptrdiff_t __n = __rhs.gptr() - __rhs.eback();
437227825Stheraven        ptrdiff_t __e = __rhs.egptr() - __rhs.eback();
438227825Stheraven        __rhs.setg((char_type*)__rhs.__extbuf_min_,
439227825Stheraven                   (char_type*)__rhs.__extbuf_min_ + __n,
440227825Stheraven                   (char_type*)__rhs.__extbuf_min_ + __e);
441227825Stheraven    }
442227825Stheraven    else if (__rhs.pbase() == (char_type*)__extbuf_min_)
443227825Stheraven    {
444227825Stheraven        ptrdiff_t __n = __rhs.pptr() - __rhs.pbase();
445227825Stheraven        ptrdiff_t __e = __rhs.epptr() - __rhs.pbase();
446227825Stheraven        __rhs.setp((char_type*)__rhs.__extbuf_min_,
447227825Stheraven                   (char_type*)__rhs.__extbuf_min_ + __e);
448227825Stheraven        __rhs.pbump(__n);
449227825Stheraven    }
450227825Stheraven}
451227825Stheraven
452227825Stheraventemplate <class _CharT, class _Traits>
453227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
454227825Stheravenvoid
455227825Stheravenswap(basic_filebuf<_CharT, _Traits>& __x, basic_filebuf<_CharT, _Traits>& __y)
456227825Stheraven{
457227825Stheraven    __x.swap(__y);
458227825Stheraven}
459227825Stheraven
460227825Stheraventemplate <class _CharT, class _Traits>
461227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
462227825Stheravenbool
463227825Stheravenbasic_filebuf<_CharT, _Traits>::is_open() const
464227825Stheraven{
465227825Stheraven    return __file_ != 0;
466227825Stheraven}
467227825Stheraven
468288943Sdim#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
469227825Stheraventemplate <class _CharT, class _Traits>
470227825Stheravenbasic_filebuf<_CharT, _Traits>*
471227825Stheravenbasic_filebuf<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
472227825Stheraven{
473227825Stheraven    basic_filebuf<_CharT, _Traits>* __rt = 0;
474227825Stheraven    if (__file_ == 0)
475227825Stheraven    {
476227825Stheraven        __rt = this;
477227825Stheraven        const char* __mdstr;
478227825Stheraven        switch (__mode & ~ios_base::ate)
479227825Stheraven        {
480227825Stheraven        case ios_base::out:
481227825Stheraven        case ios_base::out | ios_base::trunc:
482227825Stheraven            __mdstr = "w";
483227825Stheraven            break;
484227825Stheraven        case ios_base::out | ios_base::app:
485227825Stheraven        case ios_base::app:
486227825Stheraven            __mdstr = "a";
487227825Stheraven            break;
488227825Stheraven        case ios_base::in:
489227825Stheraven            __mdstr = "r";
490227825Stheraven            break;
491227825Stheraven        case ios_base::in | ios_base::out:
492227825Stheraven            __mdstr = "r+";
493227825Stheraven            break;
494227825Stheraven        case ios_base::in | ios_base::out | ios_base::trunc:
495227825Stheraven            __mdstr = "w+";
496227825Stheraven            break;
497227825Stheraven        case ios_base::in | ios_base::out | ios_base::app:
498227825Stheraven        case ios_base::in | ios_base::app:
499227825Stheraven            __mdstr = "a+";
500227825Stheraven            break;
501227825Stheraven        case ios_base::out | ios_base::binary:
502227825Stheraven        case ios_base::out | ios_base::trunc | ios_base::binary:
503227825Stheraven            __mdstr = "wb";
504227825Stheraven            break;
505227825Stheraven        case ios_base::out | ios_base::app | ios_base::binary:
506227825Stheraven        case ios_base::app | ios_base::binary:
507227825Stheraven            __mdstr = "ab";
508227825Stheraven            break;
509227825Stheraven        case ios_base::in | ios_base::binary:
510227825Stheraven            __mdstr = "rb";
511227825Stheraven            break;
512227825Stheraven        case ios_base::in | ios_base::out | ios_base::binary:
513227825Stheraven            __mdstr = "r+b";
514227825Stheraven            break;
515227825Stheraven        case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary:
516227825Stheraven            __mdstr = "w+b";
517227825Stheraven            break;
518227825Stheraven        case ios_base::in | ios_base::out | ios_base::app | ios_base::binary:
519227825Stheraven        case ios_base::in | ios_base::app | ios_base::binary:
520227825Stheraven            __mdstr = "a+b";
521227825Stheraven            break;
522227825Stheraven        default:
523227825Stheraven            __rt = 0;
524227825Stheraven            break;
525227825Stheraven        }
526227825Stheraven        if (__rt)
527227825Stheraven        {
528227825Stheraven            __file_ = fopen(__s, __mdstr);
529227825Stheraven            if (__file_)
530227825Stheraven            {
531227825Stheraven                __om_ = __mode;
532227825Stheraven                if (__mode & ios_base::ate)
533227825Stheraven                {
534227825Stheraven                    if (fseek(__file_, 0, SEEK_END))
535227825Stheraven                    {
536227825Stheraven                        fclose(__file_);
537227825Stheraven                        __file_ = 0;
538227825Stheraven                        __rt = 0;
539227825Stheraven                    }
540227825Stheraven                }
541227825Stheraven            }
542227825Stheraven            else
543227825Stheraven                __rt = 0;
544227825Stheraven        }
545227825Stheraven    }
546227825Stheraven    return __rt;
547227825Stheraven}
548227825Stheraven
549227825Stheraventemplate <class _CharT, class _Traits>
550227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
551227825Stheravenbasic_filebuf<_CharT, _Traits>*
552227825Stheravenbasic_filebuf<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
553227825Stheraven{
554227825Stheraven    return open(__s.c_str(), __mode);
555227825Stheraven}
556288943Sdim#endif
557227825Stheraven
558227825Stheraventemplate <class _CharT, class _Traits>
559227825Stheravenbasic_filebuf<_CharT, _Traits>*
560227825Stheravenbasic_filebuf<_CharT, _Traits>::close()
561227825Stheraven{
562227825Stheraven    basic_filebuf<_CharT, _Traits>* __rt = 0;
563227825Stheraven    if (__file_)
564227825Stheraven    {
565227825Stheraven        __rt = this;
566227825Stheraven        unique_ptr<FILE, int(*)(FILE*)> __h(__file_, fclose);
567232924Stheraven        if (sync())
568227825Stheraven            __rt = 0;
569227825Stheraven        if (fclose(__h.release()) == 0)
570227825Stheraven            __file_ = 0;
571227825Stheraven        else
572227825Stheraven            __rt = 0;
573227825Stheraven    }
574227825Stheraven    return __rt;
575227825Stheraven}
576227825Stheraven
577227825Stheraventemplate <class _CharT, class _Traits>
578227825Stheraventypename basic_filebuf<_CharT, _Traits>::int_type
579227825Stheravenbasic_filebuf<_CharT, _Traits>::underflow()
580227825Stheraven{
581227825Stheraven    if (__file_ == 0)
582227825Stheraven        return traits_type::eof();
583227825Stheraven    bool __initial = __read_mode();
584227825Stheraven    char_type __1buf;
585227825Stheraven    if (this->gptr() == 0)
586227825Stheraven        this->setg(&__1buf, &__1buf+1, &__1buf+1);
587227825Stheraven    const size_t __unget_sz = __initial ? 0 : min<size_t>((this->egptr() - this->eback()) / 2, 4);
588227825Stheraven    int_type __c = traits_type::eof();
589227825Stheraven    if (this->gptr() == this->egptr())
590227825Stheraven    {
591227825Stheraven        memmove(this->eback(), this->egptr() - __unget_sz, __unget_sz * sizeof(char_type));
592227825Stheraven        if (__always_noconv_)
593227825Stheraven        {
594227825Stheraven            size_t __nmemb = static_cast<size_t>(this->egptr() - this->eback() - __unget_sz);
595227825Stheraven            __nmemb = fread(this->eback() + __unget_sz, 1, __nmemb, __file_);
596227825Stheraven            if (__nmemb != 0)
597227825Stheraven            {
598227825Stheraven                this->setg(this->eback(),
599227825Stheraven                           this->eback() + __unget_sz,
600227825Stheraven                           this->eback() + __unget_sz + __nmemb);
601227825Stheraven                __c = traits_type::to_int_type(*this->gptr());
602227825Stheraven            }
603227825Stheraven        }
604227825Stheraven        else
605227825Stheraven        {
606227825Stheraven            memmove(__extbuf_, __extbufnext_, __extbufend_ - __extbufnext_);
607227825Stheraven            __extbufnext_ = __extbuf_ + (__extbufend_ - __extbufnext_);
608227825Stheraven            __extbufend_ = __extbuf_ + (__extbuf_ == __extbuf_min_ ? sizeof(__extbuf_min_) : __ebs_);
609241900Sdim            size_t __nmemb = _VSTD::min(static_cast<size_t>(__ibs_ - __unget_sz),
610227825Stheraven                                 static_cast<size_t>(__extbufend_ - __extbufnext_));
611227825Stheraven            codecvt_base::result __r;
612241900Sdim            __st_last_ = __st_;
613227825Stheraven            size_t __nr = fread((void*)__extbufnext_, 1, __nmemb, __file_);
614227825Stheraven            if (__nr != 0)
615227825Stheraven            {
616241900Sdim#ifndef _LIBCPP_NO_EXCEPTIONS
617241900Sdim                if (!__cv_)
618241900Sdim                    throw bad_cast();
619241900Sdim#endif
620227825Stheraven                __extbufend_ = __extbufnext_ + __nr;
621227825Stheraven                char_type*  __inext;
622227825Stheraven                __r = __cv_->in(__st_, __extbuf_, __extbufend_, __extbufnext_,
623227825Stheraven                                       this->eback() + __unget_sz,
624241900Sdim                                       this->eback() + __ibs_, __inext);
625227825Stheraven                if (__r == codecvt_base::noconv)
626227825Stheraven                {
627227825Stheraven                    this->setg((char_type*)__extbuf_, (char_type*)__extbuf_, (char_type*)__extbufend_);
628227825Stheraven                    __c = traits_type::to_int_type(*this->gptr());
629227825Stheraven                }
630227825Stheraven                else if (__inext != this->eback() + __unget_sz)
631227825Stheraven                {
632227825Stheraven                    this->setg(this->eback(), this->eback() + __unget_sz, __inext);
633227825Stheraven                    __c = traits_type::to_int_type(*this->gptr());
634227825Stheraven                }
635227825Stheraven            }
636227825Stheraven        }
637227825Stheraven    }
638227825Stheraven    else
639227825Stheraven        __c = traits_type::to_int_type(*this->gptr());
640227825Stheraven    if (this->eback() == &__1buf)
641227825Stheraven        this->setg(0, 0, 0);
642227825Stheraven    return __c;
643227825Stheraven}
644227825Stheraven
645227825Stheraventemplate <class _CharT, class _Traits>
646227825Stheraventypename basic_filebuf<_CharT, _Traits>::int_type
647227825Stheravenbasic_filebuf<_CharT, _Traits>::pbackfail(int_type __c)
648227825Stheraven{
649227825Stheraven    if (__file_ && this->eback() < this->gptr())
650227825Stheraven    {
651227825Stheraven        if (traits_type::eq_int_type(__c, traits_type::eof()))
652227825Stheraven        {
653227825Stheraven            this->gbump(-1);
654227825Stheraven            return traits_type::not_eof(__c);
655227825Stheraven        }
656227825Stheraven        if ((__om_ & ios_base::out) ||
657227825Stheraven            traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1]))
658227825Stheraven        {
659227825Stheraven            this->gbump(-1);
660227825Stheraven            *this->gptr() = traits_type::to_char_type(__c);
661227825Stheraven            return __c;
662227825Stheraven        }
663227825Stheraven    }
664227825Stheraven    return traits_type::eof();
665227825Stheraven}
666227825Stheraven
667227825Stheraventemplate <class _CharT, class _Traits>
668227825Stheraventypename basic_filebuf<_CharT, _Traits>::int_type
669227825Stheravenbasic_filebuf<_CharT, _Traits>::overflow(int_type __c)
670227825Stheraven{
671227825Stheraven    if (__file_ == 0)
672227825Stheraven        return traits_type::eof();
673227825Stheraven    __write_mode();
674227825Stheraven    char_type __1buf;
675227825Stheraven    char_type* __pb_save = this->pbase();
676227825Stheraven    char_type* __epb_save = this->epptr();
677227825Stheraven    if (!traits_type::eq_int_type(__c, traits_type::eof()))
678227825Stheraven    {
679227825Stheraven        if (this->pptr() == 0)
680227825Stheraven            this->setp(&__1buf, &__1buf+1);
681227825Stheraven        *this->pptr() = traits_type::to_char_type(__c);
682227825Stheraven        this->pbump(1);
683227825Stheraven    }
684227825Stheraven    if (this->pptr() != this->pbase())
685227825Stheraven    {
686227825Stheraven        if (__always_noconv_)
687227825Stheraven        {
688227825Stheraven            size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase());
689227825Stheraven            if (fwrite(this->pbase(), sizeof(char_type), __nmemb, __file_) != __nmemb)
690227825Stheraven                return traits_type::eof();
691227825Stheraven        }
692227825Stheraven        else
693227825Stheraven        {
694227825Stheraven            char* __extbe = __extbuf_;
695227825Stheraven            codecvt_base::result __r;
696227825Stheraven            do
697227825Stheraven            {
698241900Sdim#ifndef _LIBCPP_NO_EXCEPTIONS
699241900Sdim                if (!__cv_)
700241900Sdim                    throw bad_cast();
701241900Sdim#endif
702227825Stheraven                const char_type* __e;
703227825Stheraven                __r = __cv_->out(__st_, this->pbase(), this->pptr(), __e,
704227825Stheraven                                        __extbuf_, __extbuf_ + __ebs_, __extbe);
705227825Stheraven                if (__e == this->pbase())
706227825Stheraven                    return traits_type::eof();
707227825Stheraven                if (__r == codecvt_base::noconv)
708227825Stheraven                {
709227825Stheraven                    size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase());
710227825Stheraven                    if (fwrite(this->pbase(), 1, __nmemb, __file_) != __nmemb)
711227825Stheraven                        return traits_type::eof();
712227825Stheraven                }
713227825Stheraven                else if (__r == codecvt_base::ok || __r == codecvt_base::partial)
714227825Stheraven                {
715227825Stheraven                    size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_);
716227825Stheraven                    if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb)
717227825Stheraven                        return traits_type::eof();
718227825Stheraven                    if (__r == codecvt_base::partial)
719227825Stheraven                    {
720227825Stheraven                        this->setp((char_type*)__e, this->pptr());
721227825Stheraven                        this->pbump(this->epptr() - this->pbase());
722227825Stheraven                    }
723227825Stheraven                }
724227825Stheraven                else
725227825Stheraven                    return traits_type::eof();
726227825Stheraven            } while (__r == codecvt_base::partial);
727227825Stheraven        }
728227825Stheraven        this->setp(__pb_save, __epb_save);
729227825Stheraven    }
730227825Stheraven    return traits_type::not_eof(__c);
731227825Stheraven}
732227825Stheraven
733227825Stheraventemplate <class _CharT, class _Traits>
734227825Stheravenbasic_streambuf<_CharT, _Traits>*
735227825Stheravenbasic_filebuf<_CharT, _Traits>::setbuf(char_type* __s, streamsize __n)
736227825Stheraven{
737227825Stheraven    this->setg(0, 0, 0);
738227825Stheraven    this->setp(0, 0);
739227825Stheraven    if (__owns_eb_)
740227825Stheraven        delete [] __extbuf_;
741227825Stheraven    if (__owns_ib_)
742227825Stheraven        delete [] __intbuf_;
743227825Stheraven    __ebs_ = __n;
744227825Stheraven    if (__ebs_ > sizeof(__extbuf_min_))
745227825Stheraven    {
746227825Stheraven        if (__always_noconv_ && __s)
747227825Stheraven        {
748227825Stheraven            __extbuf_ = (char*)__s;
749227825Stheraven            __owns_eb_ = false;
750227825Stheraven        }
751227825Stheraven        else
752227825Stheraven        {
753227825Stheraven            __extbuf_ = new char[__ebs_];
754227825Stheraven            __owns_eb_ = true;
755227825Stheraven        }
756227825Stheraven    }
757227825Stheraven    else
758227825Stheraven    {
759227825Stheraven        __extbuf_ = __extbuf_min_;
760227825Stheraven        __ebs_ = sizeof(__extbuf_min_);
761227825Stheraven        __owns_eb_ = false;
762227825Stheraven    }
763227825Stheraven    if (!__always_noconv_)
764227825Stheraven    {
765227825Stheraven        __ibs_ = max<streamsize>(__n, sizeof(__extbuf_min_));
766227825Stheraven        if (__s && __ibs_ >= sizeof(__extbuf_min_))
767227825Stheraven        {
768227825Stheraven            __intbuf_ = __s;
769227825Stheraven            __owns_ib_ = false;
770227825Stheraven        }
771227825Stheraven        else
772227825Stheraven        {
773227825Stheraven            __intbuf_ = new char_type[__ibs_];
774227825Stheraven            __owns_ib_ = true;
775227825Stheraven        }
776227825Stheraven    }
777227825Stheraven    else
778227825Stheraven    {
779227825Stheraven        __ibs_ = 0;
780227825Stheraven        __intbuf_ = 0;
781227825Stheraven        __owns_ib_ = false;
782227825Stheraven    }
783227825Stheraven    return this;
784227825Stheraven}
785227825Stheraven
786227825Stheraventemplate <class _CharT, class _Traits>
787227825Stheraventypename basic_filebuf<_CharT, _Traits>::pos_type
788227825Stheravenbasic_filebuf<_CharT, _Traits>::seekoff(off_type __off, ios_base::seekdir __way,
789227825Stheraven                                        ios_base::openmode)
790227825Stheraven{
791241900Sdim#ifndef _LIBCPP_NO_EXCEPTIONS
792241900Sdim    if (!__cv_)
793241900Sdim        throw bad_cast();
794241900Sdim#endif
795227825Stheraven    int __width = __cv_->encoding();
796227825Stheraven    if (__file_ == 0 || (__width <= 0 && __off != 0) || sync())
797227825Stheraven        return pos_type(off_type(-1));
798227825Stheraven    // __width > 0 || __off == 0
799227825Stheraven    int __whence;
800227825Stheraven    switch (__way)
801227825Stheraven    {
802227825Stheraven    case ios_base::beg:
803227825Stheraven        __whence = SEEK_SET;
804227825Stheraven        break;
805227825Stheraven    case ios_base::cur:
806227825Stheraven        __whence = SEEK_CUR;
807227825Stheraven        break;
808227825Stheraven    case ios_base::end:
809227825Stheraven        __whence = SEEK_END;
810227825Stheraven        break;
811227825Stheraven    default:
812227825Stheraven        return pos_type(off_type(-1));
813227825Stheraven    }
814288943Sdim#if defined(_WIN32) || defined(_NEWLIB_VERSION)
815249989Sdim    if (fseek(__file_, __width > 0 ? __width * __off : 0, __whence))
816249989Sdim        return pos_type(off_type(-1));
817249989Sdim    pos_type __r = ftell(__file_);
818249989Sdim#else
819227825Stheraven    if (fseeko(__file_, __width > 0 ? __width * __off : 0, __whence))
820227825Stheraven        return pos_type(off_type(-1));
821227825Stheraven    pos_type __r = ftello(__file_);
822249989Sdim#endif
823227825Stheraven    __r.state(__st_);
824227825Stheraven    return __r;
825227825Stheraven}
826227825Stheraven
827227825Stheraventemplate <class _CharT, class _Traits>
828227825Stheraventypename basic_filebuf<_CharT, _Traits>::pos_type
829227825Stheravenbasic_filebuf<_CharT, _Traits>::seekpos(pos_type __sp, ios_base::openmode)
830227825Stheraven{
831227825Stheraven    if (__file_ == 0 || sync())
832227825Stheraven        return pos_type(off_type(-1));
833288943Sdim#if defined(_WIN32) || defined(_NEWLIB_VERSION)
834249989Sdim    if (fseek(__file_, __sp, SEEK_SET))
835249989Sdim        return pos_type(off_type(-1));
836249989Sdim#else
837227825Stheraven    if (fseeko(__file_, __sp, SEEK_SET))
838227825Stheraven        return pos_type(off_type(-1));
839249989Sdim#endif
840241900Sdim    __st_ = __sp.state();
841227825Stheraven    return __sp;
842227825Stheraven}
843227825Stheraven
844227825Stheraventemplate <class _CharT, class _Traits>
845227825Stheravenint
846227825Stheravenbasic_filebuf<_CharT, _Traits>::sync()
847227825Stheraven{
848227825Stheraven    if (__file_ == 0)
849227825Stheraven        return 0;
850241900Sdim#ifndef _LIBCPP_NO_EXCEPTIONS
851241900Sdim    if (!__cv_)
852241900Sdim        throw bad_cast();
853241900Sdim#endif
854227825Stheraven    if (__cm_ & ios_base::out)
855227825Stheraven    {
856227825Stheraven        if (this->pptr() != this->pbase())
857227825Stheraven            if (overflow() == traits_type::eof())
858227825Stheraven                return -1;
859227825Stheraven        codecvt_base::result __r;
860227825Stheraven        do
861227825Stheraven        {
862227825Stheraven            char* __extbe;
863227825Stheraven            __r = __cv_->unshift(__st_, __extbuf_, __extbuf_ + __ebs_, __extbe);
864227825Stheraven            size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_);
865227825Stheraven            if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb)
866227825Stheraven                return -1;
867227825Stheraven        } while (__r == codecvt_base::partial);
868227825Stheraven        if (__r == codecvt_base::error)
869227825Stheraven            return -1;
870227825Stheraven        if (fflush(__file_))
871227825Stheraven            return -1;
872227825Stheraven    }
873227825Stheraven    else if (__cm_ & ios_base::in)
874227825Stheraven    {
875227825Stheraven        off_type __c;
876241900Sdim        state_type __state = __st_last_;
877241900Sdim        bool __update_st = false;
878227825Stheraven        if (__always_noconv_)
879227825Stheraven            __c = this->egptr() - this->gptr();
880227825Stheraven        else
881227825Stheraven        {
882227825Stheraven            int __width = __cv_->encoding();
883227825Stheraven            __c = __extbufend_ - __extbufnext_;
884227825Stheraven            if (__width > 0)
885227825Stheraven                __c += __width * (this->egptr() - this->gptr());
886227825Stheraven            else
887227825Stheraven            {
888227825Stheraven                if (this->gptr() != this->egptr())
889227825Stheraven                {
890241900Sdim                    const int __off =  __cv_->length(__state, __extbuf_,
891241900Sdim                                                     __extbufnext_,
892241900Sdim                                                     this->gptr() - this->eback());
893241900Sdim                    __c += __extbufnext_ - __extbuf_ - __off;
894241900Sdim                    __update_st = true;
895227825Stheraven                }
896227825Stheraven            }
897227825Stheraven        }
898288943Sdim#if defined(_WIN32) || defined(_NEWLIB_VERSION)
899249989Sdim        if (fseek(__file_, -__c, SEEK_CUR))
900249989Sdim            return -1;
901249989Sdim#else
902227825Stheraven        if (fseeko(__file_, -__c, SEEK_CUR))
903227825Stheraven            return -1;
904249989Sdim#endif
905241900Sdim        if (__update_st)
906241900Sdim            __st_ = __state;
907241900Sdim        __extbufnext_ = __extbufend_ = __extbuf_;
908227825Stheraven        this->setg(0, 0, 0);
909227825Stheraven        __cm_ = 0;
910227825Stheraven    }
911227825Stheraven    return 0;
912227825Stheraven}
913227825Stheraven
914227825Stheraventemplate <class _CharT, class _Traits>
915227825Stheravenvoid
916227825Stheravenbasic_filebuf<_CharT, _Traits>::imbue(const locale& __loc)
917227825Stheraven{
918227825Stheraven    sync();
919227825Stheraven    __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc);
920227825Stheraven    bool __old_anc = __always_noconv_;
921227825Stheraven    __always_noconv_ = __cv_->always_noconv();
922227825Stheraven    if (__old_anc != __always_noconv_)
923227825Stheraven    {
924227825Stheraven        this->setg(0, 0, 0);
925227825Stheraven        this->setp(0, 0);
926227825Stheraven        // invariant, char_type is char, else we couldn't get here
927227825Stheraven        if (__always_noconv_)  // need to dump __intbuf_
928227825Stheraven        {
929227825Stheraven            if (__owns_eb_)
930227825Stheraven                delete [] __extbuf_;
931227825Stheraven            __owns_eb_ = __owns_ib_;
932227825Stheraven            __ebs_ = __ibs_;
933227825Stheraven            __extbuf_ = (char*)__intbuf_;
934227825Stheraven            __ibs_ = 0;
935227825Stheraven            __intbuf_ = 0;
936227825Stheraven            __owns_ib_ = false;
937227825Stheraven        }
938227825Stheraven        else  // need to obtain an __intbuf_.
939227825Stheraven        {     // If __extbuf_ is user-supplied, use it, else new __intbuf_
940227825Stheraven            if (!__owns_eb_ && __extbuf_ != __extbuf_min_)
941227825Stheraven            {
942227825Stheraven                __ibs_ = __ebs_;
943227825Stheraven                __intbuf_ = (char_type*)__extbuf_;
944227825Stheraven                __owns_ib_ = false;
945227825Stheraven                __extbuf_ = new char[__ebs_];
946227825Stheraven                __owns_eb_ = true;
947227825Stheraven            }
948227825Stheraven            else
949227825Stheraven            {
950227825Stheraven                __ibs_ = __ebs_;
951227825Stheraven                __intbuf_ = new char_type[__ibs_];
952227825Stheraven                __owns_ib_ = true;
953227825Stheraven            }
954227825Stheraven        }
955227825Stheraven    }
956227825Stheraven}
957227825Stheraven
958227825Stheraventemplate <class _CharT, class _Traits>
959227825Stheravenbool
960227825Stheravenbasic_filebuf<_CharT, _Traits>::__read_mode()
961227825Stheraven{
962227825Stheraven    if (!(__cm_ & ios_base::in))
963227825Stheraven    {
964227825Stheraven        this->setp(0, 0);
965227825Stheraven        if (__always_noconv_)
966227825Stheraven            this->setg((char_type*)__extbuf_,
967227825Stheraven                       (char_type*)__extbuf_ + __ebs_,
968227825Stheraven                       (char_type*)__extbuf_ + __ebs_);
969227825Stheraven        else
970227825Stheraven            this->setg(__intbuf_, __intbuf_ + __ibs_, __intbuf_ + __ibs_);
971227825Stheraven        __cm_ = ios_base::in;
972227825Stheraven        return true;
973227825Stheraven    }
974227825Stheraven    return false;
975227825Stheraven}
976227825Stheraven
977227825Stheraventemplate <class _CharT, class _Traits>
978227825Stheravenvoid
979227825Stheravenbasic_filebuf<_CharT, _Traits>::__write_mode()
980227825Stheraven{
981227825Stheraven    if (!(__cm_ & ios_base::out))
982227825Stheraven    {
983227825Stheraven        this->setg(0, 0, 0);
984227825Stheraven        if (__ebs_ > sizeof(__extbuf_min_))
985227825Stheraven        {
986227825Stheraven            if (__always_noconv_)
987227825Stheraven                this->setp((char_type*)__extbuf_,
988227825Stheraven                           (char_type*)__extbuf_ + (__ebs_ - 1));
989227825Stheraven            else
990227825Stheraven                this->setp(__intbuf_, __intbuf_ + (__ibs_ - 1));
991227825Stheraven        }
992227825Stheraven        else
993227825Stheraven            this->setp(0, 0);
994227825Stheraven        __cm_ = ios_base::out;
995227825Stheraven    }
996227825Stheraven}
997227825Stheraven
998227825Stheraven// basic_ifstream
999227825Stheraven
1000227825Stheraventemplate <class _CharT, class _Traits>
1001261272Sdimclass _LIBCPP_TYPE_VIS_ONLY basic_ifstream
1002227825Stheraven    : public basic_istream<_CharT, _Traits>
1003227825Stheraven{
1004227825Stheravenpublic:
1005227825Stheraven    typedef _CharT                         char_type;
1006227825Stheraven    typedef _Traits                        traits_type;
1007227825Stheraven    typedef typename traits_type::int_type int_type;
1008227825Stheraven    typedef typename traits_type::pos_type pos_type;
1009227825Stheraven    typedef typename traits_type::off_type off_type;
1010227825Stheraven
1011227825Stheraven    basic_ifstream();
1012288943Sdim#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1013227825Stheraven    explicit basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in);
1014227825Stheraven    explicit basic_ifstream(const string& __s, ios_base::openmode __mode = ios_base::in);
1015288943Sdim#endif
1016227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1017227825Stheraven    basic_ifstream(basic_ifstream&& __rhs);
1018227825Stheraven#endif
1019227825Stheraven
1020227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1021227825Stheraven    basic_ifstream& operator=(basic_ifstream&& __rhs);
1022227825Stheraven#endif
1023227825Stheraven    void swap(basic_ifstream& __rhs);
1024227825Stheraven
1025227825Stheraven    basic_filebuf<char_type, traits_type>* rdbuf() const;
1026227825Stheraven    bool is_open() const;
1027288943Sdim#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1028227825Stheraven    void open(const char* __s, ios_base::openmode __mode = ios_base::in);
1029227825Stheraven    void open(const string& __s, ios_base::openmode __mode = ios_base::in);
1030288943Sdim#endif
1031227825Stheraven    void close();
1032227825Stheraven
1033227825Stheravenprivate:
1034227825Stheraven    basic_filebuf<char_type, traits_type> __sb_;
1035227825Stheraven};
1036227825Stheraven
1037227825Stheraventemplate <class _CharT, class _Traits>
1038227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1039227825Stheravenbasic_ifstream<_CharT, _Traits>::basic_ifstream()
1040227825Stheraven    : basic_istream<char_type, traits_type>(&__sb_)
1041227825Stheraven{
1042227825Stheraven}
1043227825Stheraven
1044288943Sdim#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1045227825Stheraventemplate <class _CharT, class _Traits>
1046227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1047227825Stheravenbasic_ifstream<_CharT, _Traits>::basic_ifstream(const char* __s, ios_base::openmode __mode)
1048227825Stheraven    : basic_istream<char_type, traits_type>(&__sb_)
1049227825Stheraven{
1050227825Stheraven    if (__sb_.open(__s, __mode | ios_base::in) == 0)
1051227825Stheraven        this->setstate(ios_base::failbit);
1052227825Stheraven}
1053227825Stheraven
1054227825Stheraventemplate <class _CharT, class _Traits>
1055227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1056227825Stheravenbasic_ifstream<_CharT, _Traits>::basic_ifstream(const string& __s, ios_base::openmode __mode)
1057227825Stheraven    : basic_istream<char_type, traits_type>(&__sb_)
1058227825Stheraven{
1059227825Stheraven    if (__sb_.open(__s, __mode | ios_base::in) == 0)
1060227825Stheraven        this->setstate(ios_base::failbit);
1061227825Stheraven}
1062288943Sdim#endif
1063227825Stheraven
1064227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1065227825Stheraven
1066227825Stheraventemplate <class _CharT, class _Traits>
1067227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1068227825Stheravenbasic_ifstream<_CharT, _Traits>::basic_ifstream(basic_ifstream&& __rhs)
1069227825Stheraven    : basic_istream<char_type, traits_type>(_VSTD::move(__rhs)),
1070227825Stheraven      __sb_(_VSTD::move(__rhs.__sb_))
1071227825Stheraven{
1072227825Stheraven    this->set_rdbuf(&__sb_);
1073227825Stheraven}
1074227825Stheraven
1075227825Stheraventemplate <class _CharT, class _Traits>
1076227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1077227825Stheravenbasic_ifstream<_CharT, _Traits>&
1078227825Stheravenbasic_ifstream<_CharT, _Traits>::operator=(basic_ifstream&& __rhs)
1079227825Stheraven{
1080227825Stheraven    basic_istream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
1081227825Stheraven    __sb_ = _VSTD::move(__rhs.__sb_);
1082227825Stheraven    return *this;
1083227825Stheraven}
1084227825Stheraven
1085227825Stheraven#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1086227825Stheraven
1087227825Stheraventemplate <class _CharT, class _Traits>
1088227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1089227825Stheravenvoid
1090227825Stheravenbasic_ifstream<_CharT, _Traits>::swap(basic_ifstream& __rhs)
1091227825Stheraven{
1092227825Stheraven    basic_istream<char_type, traits_type>::swap(__rhs);
1093227825Stheraven    __sb_.swap(__rhs.__sb_);
1094227825Stheraven}
1095227825Stheraven
1096227825Stheraventemplate <class _CharT, class _Traits>
1097227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1098227825Stheravenvoid
1099227825Stheravenswap(basic_ifstream<_CharT, _Traits>& __x, basic_ifstream<_CharT, _Traits>& __y)
1100227825Stheraven{
1101227825Stheraven    __x.swap(__y);
1102227825Stheraven}
1103227825Stheraven
1104227825Stheraventemplate <class _CharT, class _Traits>
1105227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1106227825Stheravenbasic_filebuf<_CharT, _Traits>*
1107227825Stheravenbasic_ifstream<_CharT, _Traits>::rdbuf() const
1108227825Stheraven{
1109227825Stheraven    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
1110227825Stheraven}
1111227825Stheraven
1112227825Stheraventemplate <class _CharT, class _Traits>
1113227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1114227825Stheravenbool
1115227825Stheravenbasic_ifstream<_CharT, _Traits>::is_open() const
1116227825Stheraven{
1117227825Stheraven    return __sb_.is_open();
1118227825Stheraven}
1119227825Stheraven
1120288943Sdim#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1121227825Stheraventemplate <class _CharT, class _Traits>
1122227825Stheravenvoid
1123227825Stheravenbasic_ifstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
1124227825Stheraven{
1125227825Stheraven    if (__sb_.open(__s, __mode | ios_base::in))
1126227825Stheraven        this->clear();
1127227825Stheraven    else
1128227825Stheraven        this->setstate(ios_base::failbit);
1129227825Stheraven}
1130227825Stheraven
1131227825Stheraventemplate <class _CharT, class _Traits>
1132227825Stheravenvoid
1133227825Stheravenbasic_ifstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
1134227825Stheraven{
1135227825Stheraven    if (__sb_.open(__s, __mode | ios_base::in))
1136227825Stheraven        this->clear();
1137227825Stheraven    else
1138227825Stheraven        this->setstate(ios_base::failbit);
1139227825Stheraven}
1140288943Sdim#endif
1141227825Stheraven
1142227825Stheraventemplate <class _CharT, class _Traits>
1143227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1144227825Stheravenvoid
1145227825Stheravenbasic_ifstream<_CharT, _Traits>::close()
1146227825Stheraven{
1147227825Stheraven    if (__sb_.close() == 0)
1148227825Stheraven        this->setstate(ios_base::failbit);
1149227825Stheraven}
1150227825Stheraven
1151227825Stheraven// basic_ofstream
1152227825Stheraven
1153227825Stheraventemplate <class _CharT, class _Traits>
1154261272Sdimclass _LIBCPP_TYPE_VIS_ONLY basic_ofstream
1155227825Stheraven    : public basic_ostream<_CharT, _Traits>
1156227825Stheraven{
1157227825Stheravenpublic:
1158227825Stheraven    typedef _CharT                         char_type;
1159227825Stheraven    typedef _Traits                        traits_type;
1160227825Stheraven    typedef typename traits_type::int_type int_type;
1161227825Stheraven    typedef typename traits_type::pos_type pos_type;
1162227825Stheraven    typedef typename traits_type::off_type off_type;
1163227825Stheraven
1164227825Stheraven    basic_ofstream();
1165227825Stheraven    explicit basic_ofstream(const char* __s, ios_base::openmode __mode = ios_base::out);
1166227825Stheraven    explicit basic_ofstream(const string& __s, ios_base::openmode __mode = ios_base::out);
1167227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1168227825Stheraven    basic_ofstream(basic_ofstream&& __rhs);
1169227825Stheraven#endif
1170227825Stheraven
1171227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1172227825Stheraven    basic_ofstream& operator=(basic_ofstream&& __rhs);
1173227825Stheraven#endif
1174227825Stheraven    void swap(basic_ofstream& __rhs);
1175227825Stheraven
1176227825Stheraven    basic_filebuf<char_type, traits_type>* rdbuf() const;
1177227825Stheraven    bool is_open() const;
1178288943Sdim#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1179227825Stheraven    void open(const char* __s, ios_base::openmode __mode = ios_base::out);
1180227825Stheraven    void open(const string& __s, ios_base::openmode __mode = ios_base::out);
1181288943Sdim#endif
1182227825Stheraven    void close();
1183227825Stheraven
1184227825Stheravenprivate:
1185227825Stheraven    basic_filebuf<char_type, traits_type> __sb_;
1186227825Stheraven};
1187227825Stheraven
1188227825Stheraventemplate <class _CharT, class _Traits>
1189227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1190227825Stheravenbasic_ofstream<_CharT, _Traits>::basic_ofstream()
1191227825Stheraven    : basic_ostream<char_type, traits_type>(&__sb_)
1192227825Stheraven{
1193227825Stheraven}
1194227825Stheraven
1195288943Sdim#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1196227825Stheraventemplate <class _CharT, class _Traits>
1197227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1198227825Stheravenbasic_ofstream<_CharT, _Traits>::basic_ofstream(const char* __s, ios_base::openmode __mode)
1199227825Stheraven    : basic_ostream<char_type, traits_type>(&__sb_)
1200227825Stheraven{
1201227825Stheraven    if (__sb_.open(__s, __mode | ios_base::out) == 0)
1202227825Stheraven        this->setstate(ios_base::failbit);
1203227825Stheraven}
1204227825Stheraven
1205227825Stheraventemplate <class _CharT, class _Traits>
1206227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1207227825Stheravenbasic_ofstream<_CharT, _Traits>::basic_ofstream(const string& __s, ios_base::openmode __mode)
1208227825Stheraven    : basic_ostream<char_type, traits_type>(&__sb_)
1209227825Stheraven{
1210227825Stheraven    if (__sb_.open(__s, __mode | ios_base::out) == 0)
1211227825Stheraven        this->setstate(ios_base::failbit);
1212227825Stheraven}
1213288943Sdim#endif
1214227825Stheraven
1215227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1216227825Stheraven
1217227825Stheraventemplate <class _CharT, class _Traits>
1218227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1219227825Stheravenbasic_ofstream<_CharT, _Traits>::basic_ofstream(basic_ofstream&& __rhs)
1220227825Stheraven    : basic_ostream<char_type, traits_type>(_VSTD::move(__rhs)),
1221227825Stheraven      __sb_(_VSTD::move(__rhs.__sb_))
1222227825Stheraven{
1223227825Stheraven    this->set_rdbuf(&__sb_);
1224227825Stheraven}
1225227825Stheraven
1226227825Stheraventemplate <class _CharT, class _Traits>
1227227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1228227825Stheravenbasic_ofstream<_CharT, _Traits>&
1229227825Stheravenbasic_ofstream<_CharT, _Traits>::operator=(basic_ofstream&& __rhs)
1230227825Stheraven{
1231227825Stheraven    basic_ostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
1232227825Stheraven    __sb_ = _VSTD::move(__rhs.__sb_);
1233227825Stheraven    return *this;
1234227825Stheraven}
1235227825Stheraven
1236227825Stheraven#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1237227825Stheraven
1238227825Stheraventemplate <class _CharT, class _Traits>
1239227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1240227825Stheravenvoid
1241227825Stheravenbasic_ofstream<_CharT, _Traits>::swap(basic_ofstream& __rhs)
1242227825Stheraven{
1243227825Stheraven    basic_ostream<char_type, traits_type>::swap(__rhs);
1244227825Stheraven    __sb_.swap(__rhs.__sb_);
1245227825Stheraven}
1246227825Stheraven
1247227825Stheraventemplate <class _CharT, class _Traits>
1248227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1249227825Stheravenvoid
1250227825Stheravenswap(basic_ofstream<_CharT, _Traits>& __x, basic_ofstream<_CharT, _Traits>& __y)
1251227825Stheraven{
1252227825Stheraven    __x.swap(__y);
1253227825Stheraven}
1254227825Stheraven
1255227825Stheraventemplate <class _CharT, class _Traits>
1256227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1257227825Stheravenbasic_filebuf<_CharT, _Traits>*
1258227825Stheravenbasic_ofstream<_CharT, _Traits>::rdbuf() const
1259227825Stheraven{
1260227825Stheraven    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
1261227825Stheraven}
1262227825Stheraven
1263227825Stheraventemplate <class _CharT, class _Traits>
1264227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1265227825Stheravenbool
1266227825Stheravenbasic_ofstream<_CharT, _Traits>::is_open() const
1267227825Stheraven{
1268227825Stheraven    return __sb_.is_open();
1269227825Stheraven}
1270227825Stheraven
1271288943Sdim#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1272227825Stheraventemplate <class _CharT, class _Traits>
1273227825Stheravenvoid
1274227825Stheravenbasic_ofstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
1275227825Stheraven{
1276227825Stheraven    if (__sb_.open(__s, __mode | ios_base::out))
1277227825Stheraven        this->clear();
1278227825Stheraven    else
1279227825Stheraven        this->setstate(ios_base::failbit);
1280227825Stheraven}
1281227825Stheraven
1282227825Stheraventemplate <class _CharT, class _Traits>
1283227825Stheravenvoid
1284227825Stheravenbasic_ofstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
1285227825Stheraven{
1286227825Stheraven    if (__sb_.open(__s, __mode | ios_base::out))
1287227825Stheraven        this->clear();
1288227825Stheraven    else
1289227825Stheraven        this->setstate(ios_base::failbit);
1290227825Stheraven}
1291288943Sdim#endif
1292227825Stheraven
1293227825Stheraventemplate <class _CharT, class _Traits>
1294227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1295227825Stheravenvoid
1296227825Stheravenbasic_ofstream<_CharT, _Traits>::close()
1297227825Stheraven{
1298227825Stheraven    if (__sb_.close() == 0)
1299227825Stheraven        this->setstate(ios_base::failbit);
1300227825Stheraven}
1301227825Stheraven
1302227825Stheraven// basic_fstream
1303227825Stheraven
1304227825Stheraventemplate <class _CharT, class _Traits>
1305261272Sdimclass _LIBCPP_TYPE_VIS_ONLY basic_fstream
1306227825Stheraven    : public basic_iostream<_CharT, _Traits>
1307227825Stheraven{
1308227825Stheravenpublic:
1309227825Stheraven    typedef _CharT                         char_type;
1310227825Stheraven    typedef _Traits                        traits_type;
1311227825Stheraven    typedef typename traits_type::int_type int_type;
1312227825Stheraven    typedef typename traits_type::pos_type pos_type;
1313227825Stheraven    typedef typename traits_type::off_type off_type;
1314227825Stheraven
1315227825Stheraven    basic_fstream();
1316288943Sdim#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1317227825Stheraven    explicit basic_fstream(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
1318227825Stheraven    explicit basic_fstream(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
1319288943Sdim#endif
1320227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1321227825Stheraven    basic_fstream(basic_fstream&& __rhs);
1322227825Stheraven#endif
1323227825Stheraven
1324227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1325227825Stheraven    basic_fstream& operator=(basic_fstream&& __rhs);
1326227825Stheraven#endif
1327227825Stheraven    void swap(basic_fstream& __rhs);
1328227825Stheraven
1329227825Stheraven    basic_filebuf<char_type, traits_type>* rdbuf() const;
1330227825Stheraven    bool is_open() const;
1331288943Sdim#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1332227825Stheraven    void open(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
1333227825Stheraven    void open(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
1334288943Sdim#endif
1335227825Stheraven    void close();
1336227825Stheraven
1337227825Stheravenprivate:
1338227825Stheraven    basic_filebuf<char_type, traits_type> __sb_;
1339227825Stheraven};
1340227825Stheraven
1341227825Stheraventemplate <class _CharT, class _Traits>
1342227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1343227825Stheravenbasic_fstream<_CharT, _Traits>::basic_fstream()
1344227825Stheraven    : basic_iostream<char_type, traits_type>(&__sb_)
1345227825Stheraven{
1346227825Stheraven}
1347227825Stheraven
1348288943Sdim#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1349227825Stheraventemplate <class _CharT, class _Traits>
1350227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1351227825Stheravenbasic_fstream<_CharT, _Traits>::basic_fstream(const char* __s, ios_base::openmode __mode)
1352227825Stheraven    : basic_iostream<char_type, traits_type>(&__sb_)
1353227825Stheraven{
1354227825Stheraven    if (__sb_.open(__s, __mode) == 0)
1355227825Stheraven        this->setstate(ios_base::failbit);
1356227825Stheraven}
1357227825Stheraven
1358227825Stheraventemplate <class _CharT, class _Traits>
1359227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1360227825Stheravenbasic_fstream<_CharT, _Traits>::basic_fstream(const string& __s, ios_base::openmode __mode)
1361227825Stheraven    : basic_iostream<char_type, traits_type>(&__sb_)
1362227825Stheraven{
1363227825Stheraven    if (__sb_.open(__s, __mode) == 0)
1364227825Stheraven        this->setstate(ios_base::failbit);
1365227825Stheraven}
1366288943Sdim#endif
1367227825Stheraven
1368227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1369227825Stheraven
1370227825Stheraventemplate <class _CharT, class _Traits>
1371227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1372227825Stheravenbasic_fstream<_CharT, _Traits>::basic_fstream(basic_fstream&& __rhs)
1373227825Stheraven    : basic_iostream<char_type, traits_type>(_VSTD::move(__rhs)),
1374227825Stheraven      __sb_(_VSTD::move(__rhs.__sb_))
1375227825Stheraven{
1376227825Stheraven    this->set_rdbuf(&__sb_);
1377227825Stheraven}
1378227825Stheraven
1379227825Stheraventemplate <class _CharT, class _Traits>
1380227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1381227825Stheravenbasic_fstream<_CharT, _Traits>&
1382227825Stheravenbasic_fstream<_CharT, _Traits>::operator=(basic_fstream&& __rhs)
1383227825Stheraven{
1384227825Stheraven    basic_iostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
1385227825Stheraven    __sb_ = _VSTD::move(__rhs.__sb_);
1386227825Stheraven    return *this;
1387227825Stheraven}
1388227825Stheraven
1389227825Stheraven#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1390227825Stheraven
1391227825Stheraventemplate <class _CharT, class _Traits>
1392227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1393227825Stheravenvoid
1394227825Stheravenbasic_fstream<_CharT, _Traits>::swap(basic_fstream& __rhs)
1395227825Stheraven{
1396227825Stheraven    basic_iostream<char_type, traits_type>::swap(__rhs);
1397227825Stheraven    __sb_.swap(__rhs.__sb_);
1398227825Stheraven}
1399227825Stheraven
1400227825Stheraventemplate <class _CharT, class _Traits>
1401227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1402227825Stheravenvoid
1403227825Stheravenswap(basic_fstream<_CharT, _Traits>& __x, basic_fstream<_CharT, _Traits>& __y)
1404227825Stheraven{
1405227825Stheraven    __x.swap(__y);
1406227825Stheraven}
1407227825Stheraven
1408227825Stheraventemplate <class _CharT, class _Traits>
1409227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1410227825Stheravenbasic_filebuf<_CharT, _Traits>*
1411227825Stheravenbasic_fstream<_CharT, _Traits>::rdbuf() const
1412227825Stheraven{
1413227825Stheraven    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
1414227825Stheraven}
1415227825Stheraven
1416227825Stheraventemplate <class _CharT, class _Traits>
1417227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1418227825Stheravenbool
1419227825Stheravenbasic_fstream<_CharT, _Traits>::is_open() const
1420227825Stheraven{
1421227825Stheraven    return __sb_.is_open();
1422227825Stheraven}
1423227825Stheraven
1424288943Sdim#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1425227825Stheraventemplate <class _CharT, class _Traits>
1426227825Stheravenvoid
1427227825Stheravenbasic_fstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
1428227825Stheraven{
1429227825Stheraven    if (__sb_.open(__s, __mode))
1430227825Stheraven        this->clear();
1431227825Stheraven    else
1432227825Stheraven        this->setstate(ios_base::failbit);
1433227825Stheraven}
1434227825Stheraven
1435227825Stheraventemplate <class _CharT, class _Traits>
1436227825Stheravenvoid
1437227825Stheravenbasic_fstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
1438227825Stheraven{
1439227825Stheraven    if (__sb_.open(__s, __mode))
1440227825Stheraven        this->clear();
1441227825Stheraven    else
1442227825Stheraven        this->setstate(ios_base::failbit);
1443227825Stheraven}
1444288943Sdim#endif
1445227825Stheraven
1446227825Stheraventemplate <class _CharT, class _Traits>
1447227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1448227825Stheravenvoid
1449227825Stheravenbasic_fstream<_CharT, _Traits>::close()
1450227825Stheraven{
1451227825Stheraven    if (__sb_.close() == 0)
1452227825Stheraven        this->setstate(ios_base::failbit);
1453227825Stheraven}
1454227825Stheraven
1455227825Stheraven_LIBCPP_END_NAMESPACE_STD
1456227825Stheraven
1457227825Stheraven#endif  // _LIBCPP_FSTREAM
1458