fstream revision 232924
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>
183227825Stheravenclass _LIBCPP_VISIBLE 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;
209227825Stheraven    basic_filebuf* open(const char* __s, ios_base::openmode __mode);
210227825Stheraven    basic_filebuf* open(const string& __s, ios_base::openmode __mode);
211227825Stheraven    basic_filebuf* close();
212227825Stheraven
213227825Stheravenprotected:
214227825Stheraven    // 27.9.1.5 Overridden virtual functions:
215227825Stheraven    virtual int_type underflow();
216227825Stheraven    virtual int_type pbackfail(int_type __c = traits_type::eof());
217227825Stheraven    virtual int_type overflow (int_type __c = traits_type::eof());
218227825Stheraven    virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* __s, streamsize __n);
219227825Stheraven    virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
220227825Stheraven                             ios_base::openmode __wch = ios_base::in | ios_base::out);
221227825Stheraven    virtual pos_type seekpos(pos_type __sp,
222227825Stheraven                             ios_base::openmode __wch = ios_base::in | ios_base::out);
223227825Stheraven    virtual int sync();
224227825Stheraven    virtual void imbue(const locale& __loc);
225227825Stheraven
226227825Stheravenprivate:
227227825Stheraven    char*       __extbuf_;
228227825Stheraven    const char* __extbufnext_;
229227825Stheraven    const char* __extbufend_;
230227825Stheraven    char __extbuf_min_[8];
231227825Stheraven    size_t __ebs_;
232227825Stheraven    char_type* __intbuf_;
233227825Stheraven    size_t __ibs_;
234227825Stheraven    FILE* __file_;
235227825Stheraven    const codecvt<char_type, char, state_type>* __cv_;
236227825Stheraven    state_type __st_;
237227825Stheraven    ios_base::openmode __om_;
238227825Stheraven    ios_base::openmode __cm_;
239227825Stheraven    bool __owns_eb_;
240227825Stheraven    bool __owns_ib_;
241227825Stheraven    bool __always_noconv_;
242227825Stheraven
243227825Stheraven    bool __read_mode();
244227825Stheraven    void __write_mode();
245227825Stheraven};
246227825Stheraven
247227825Stheraventemplate <class _CharT, class _Traits>
248227825Stheravenbasic_filebuf<_CharT, _Traits>::basic_filebuf()
249227825Stheraven    : __extbuf_(0),
250227825Stheraven      __extbufnext_(0),
251227825Stheraven      __extbufend_(0),
252227825Stheraven      __ebs_(0),
253227825Stheraven      __intbuf_(0),
254227825Stheraven      __ibs_(0),
255227825Stheraven      __file_(0),
256227825Stheraven      __cv_(&use_facet<codecvt<char_type, char, state_type> >(this->getloc())),
257227825Stheraven      __st_(),
258227825Stheraven      __om_(0),
259227825Stheraven      __cm_(0),
260227825Stheraven      __owns_eb_(false),
261227825Stheraven      __owns_ib_(false),
262227825Stheraven      __always_noconv_(__cv_->always_noconv())
263227825Stheraven{
264227825Stheraven    setbuf(0, 4096);
265227825Stheraven}
266227825Stheraven
267227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
268227825Stheraven
269227825Stheraventemplate <class _CharT, class _Traits>
270227825Stheravenbasic_filebuf<_CharT, _Traits>::basic_filebuf(basic_filebuf&& __rhs)
271227825Stheraven    : basic_streambuf<_CharT, _Traits>(__rhs)
272227825Stheraven{
273227825Stheraven    if (__rhs.__extbuf_ == __rhs.__extbuf_min_)
274227825Stheraven    {
275227825Stheraven        __extbuf_ = __extbuf_min_;
276227825Stheraven        __extbufnext_ = __extbuf_ + (__rhs.__extbufnext_ - __rhs.__extbuf_);
277227825Stheraven        __extbufend_ = __extbuf_ + (__rhs.__extbufend_ - __rhs.__extbuf_);
278227825Stheraven    }
279227825Stheraven    else
280227825Stheraven    {
281227825Stheraven        __extbuf_ = __rhs.__extbuf_;
282227825Stheraven        __extbufnext_ = __rhs.__extbufnext_;
283227825Stheraven        __extbufend_ = __rhs.__extbufend_;
284227825Stheraven    }
285227825Stheraven    __ebs_ = __rhs.__ebs_;
286227825Stheraven    __intbuf_ = __rhs.__intbuf_;
287227825Stheraven    __ibs_ = __rhs.__ibs_;
288227825Stheraven    __file_ = __rhs.__file_;
289227825Stheraven    __cv_ = __rhs.__cv_;
290227825Stheraven    __st_ = __rhs.__st_;
291227825Stheraven    __om_ = __rhs.__om_;
292227825Stheraven    __cm_ = __rhs.__cm_;
293227825Stheraven    __owns_eb_ = __rhs.__owns_eb_;
294227825Stheraven    __owns_ib_ = __rhs.__owns_ib_;
295227825Stheraven    __always_noconv_ = __rhs.__always_noconv_;
296227825Stheraven    if (__rhs.pbase())
297227825Stheraven    {
298227825Stheraven        if (__rhs.pbase() == __rhs.__intbuf_)
299227825Stheraven            this->setp(__intbuf_, __intbuf_ + (__rhs. epptr() - __rhs.pbase()));
300227825Stheraven        else
301227825Stheraven            this->setp((char_type*)__extbuf_,
302227825Stheraven                       (char_type*)__extbuf_ + (__rhs. epptr() - __rhs.pbase()));
303227825Stheraven        this->pbump(__rhs. pptr() - __rhs.pbase());
304227825Stheraven    }
305227825Stheraven    else if (__rhs.eback())
306227825Stheraven    {
307227825Stheraven        if (__rhs.eback() == __rhs.__intbuf_)
308227825Stheraven            this->setg(__intbuf_, __intbuf_ + (__rhs.gptr() - __rhs.eback()),
309227825Stheraven                                  __intbuf_ + (__rhs.egptr() - __rhs.eback()));
310227825Stheraven        else
311227825Stheraven            this->setg((char_type*)__extbuf_,
312227825Stheraven                       (char_type*)__extbuf_ + (__rhs.gptr() - __rhs.eback()),
313227825Stheraven                       (char_type*)__extbuf_ + (__rhs.egptr() - __rhs.eback()));
314227825Stheraven    }
315227825Stheraven    __rhs.__extbuf_ = 0;
316227825Stheraven    __rhs.__extbufnext_ = 0;
317227825Stheraven    __rhs.__extbufend_ = 0;
318227825Stheraven    __rhs.__ebs_ = 0;
319227825Stheraven    __rhs.__intbuf_ = 0;
320227825Stheraven    __rhs.__ibs_ = 0;
321227825Stheraven    __rhs.__file_ = 0;
322227825Stheraven    __rhs.__st_ = state_type();
323227825Stheraven    __rhs.__om_ = 0;
324227825Stheraven    __rhs.__cm_ = 0;
325227825Stheraven    __rhs.__owns_eb_ = false;
326227825Stheraven    __rhs.__owns_ib_ = false;
327227825Stheraven    __rhs.setg(0, 0, 0);
328227825Stheraven    __rhs.setp(0, 0);
329227825Stheraven}
330227825Stheraven
331227825Stheraventemplate <class _CharT, class _Traits>
332227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
333227825Stheravenbasic_filebuf<_CharT, _Traits>&
334227825Stheravenbasic_filebuf<_CharT, _Traits>::operator=(basic_filebuf&& __rhs)
335227825Stheraven{
336227825Stheraven    close();
337227825Stheraven    swap(__rhs);
338227825Stheraven}
339227825Stheraven
340227825Stheraven#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
341227825Stheraven
342227825Stheraventemplate <class _CharT, class _Traits>
343227825Stheravenbasic_filebuf<_CharT, _Traits>::~basic_filebuf()
344227825Stheraven{
345227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS
346227825Stheraven    try
347227825Stheraven    {
348227825Stheraven#endif  // _LIBCPP_NO_EXCEPTIONS
349227825Stheraven        close();
350227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS
351227825Stheraven    }
352227825Stheraven    catch (...)
353227825Stheraven    {
354227825Stheraven    }
355227825Stheraven#endif  // _LIBCPP_NO_EXCEPTIONS
356227825Stheraven    if (__owns_eb_)
357227825Stheraven        delete [] __extbuf_;
358227825Stheraven    if (__owns_ib_)
359227825Stheraven        delete [] __intbuf_;
360227825Stheraven}
361227825Stheraven
362227825Stheraventemplate <class _CharT, class _Traits>
363227825Stheravenvoid
364227825Stheravenbasic_filebuf<_CharT, _Traits>::swap(basic_filebuf& __rhs)
365227825Stheraven{
366227825Stheraven    basic_streambuf<char_type, traits_type>::swap(__rhs);
367227825Stheraven    if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_)
368227825Stheraven    {
369227825Stheraven        _VSTD::swap(__extbuf_, __rhs.__extbuf_);
370227825Stheraven        _VSTD::swap(__extbufnext_, __rhs.__extbufnext_);
371227825Stheraven        _VSTD::swap(__extbufend_, __rhs.__extbufend_);
372227825Stheraven    }
373227825Stheraven    else
374227825Stheraven    {
375227825Stheraven        ptrdiff_t __ln = __extbufnext_ - __extbuf_;
376227825Stheraven        ptrdiff_t __le = __extbufend_ - __extbuf_;
377227825Stheraven        ptrdiff_t __rn = __rhs.__extbufnext_ - __rhs.__extbuf_;
378227825Stheraven        ptrdiff_t __re = __rhs.__extbufend_ - __rhs.__extbuf_;
379227825Stheraven        if (__extbuf_ == __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_)
380227825Stheraven        {
381227825Stheraven            __extbuf_ = __rhs.__extbuf_;
382227825Stheraven            __rhs.__extbuf_ = __rhs.__extbuf_min_;
383227825Stheraven        }
384227825Stheraven        else if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ == __rhs.__extbuf_min_)
385227825Stheraven        {
386227825Stheraven            __rhs.__extbuf_ = __extbuf_;
387227825Stheraven            __extbuf_ = __extbuf_min_;
388227825Stheraven        }
389227825Stheraven        __extbufnext_ = __extbuf_ + __rn;
390227825Stheraven        __extbufend_ = __extbuf_ + __re;
391227825Stheraven        __rhs.__extbufnext_ = __rhs.__extbuf_ + __ln;
392227825Stheraven        __rhs.__extbufend_ = __rhs.__extbuf_ + __le;
393227825Stheraven    }
394227825Stheraven    _VSTD::swap(__ebs_, __rhs.__ebs_);
395227825Stheraven    _VSTD::swap(__intbuf_, __rhs.__intbuf_);
396227825Stheraven    _VSTD::swap(__ibs_, __rhs.__ibs_);
397227825Stheraven    _VSTD::swap(__file_, __rhs.__file_);
398227825Stheraven    _VSTD::swap(__cv_, __rhs.__cv_);
399227825Stheraven    _VSTD::swap(__st_, __rhs.__st_);
400227825Stheraven    _VSTD::swap(__om_, __rhs.__om_);
401227825Stheraven    _VSTD::swap(__cm_, __rhs.__cm_);
402227825Stheraven    _VSTD::swap(__owns_eb_, __rhs.__owns_eb_);
403227825Stheraven    _VSTD::swap(__owns_ib_, __rhs.__owns_ib_);
404227825Stheraven    _VSTD::swap(__always_noconv_, __rhs.__always_noconv_);
405227825Stheraven    if (this->eback() == (char_type*)__rhs.__extbuf_min_)
406227825Stheraven    {
407227825Stheraven        ptrdiff_t __n = this->gptr() - this->eback();
408227825Stheraven        ptrdiff_t __e = this->egptr() - this->eback();
409227825Stheraven        this->setg((char_type*)__extbuf_min_,
410227825Stheraven                   (char_type*)__extbuf_min_ + __n,
411227825Stheraven                   (char_type*)__extbuf_min_ + __e);
412227825Stheraven    }
413227825Stheraven    else if (this->pbase() == (char_type*)__rhs.__extbuf_min_)
414227825Stheraven    {
415227825Stheraven        ptrdiff_t __n = this->pptr() - this->pbase();
416227825Stheraven        ptrdiff_t __e = this->epptr() - this->pbase();
417227825Stheraven        this->setp((char_type*)__extbuf_min_,
418227825Stheraven                   (char_type*)__extbuf_min_ + __e);
419227825Stheraven        this->pbump(__n);
420227825Stheraven    }
421227825Stheraven    if (__rhs.eback() == (char_type*)__extbuf_min_)
422227825Stheraven    {
423227825Stheraven        ptrdiff_t __n = __rhs.gptr() - __rhs.eback();
424227825Stheraven        ptrdiff_t __e = __rhs.egptr() - __rhs.eback();
425227825Stheraven        __rhs.setg((char_type*)__rhs.__extbuf_min_,
426227825Stheraven                   (char_type*)__rhs.__extbuf_min_ + __n,
427227825Stheraven                   (char_type*)__rhs.__extbuf_min_ + __e);
428227825Stheraven    }
429227825Stheraven    else if (__rhs.pbase() == (char_type*)__extbuf_min_)
430227825Stheraven    {
431227825Stheraven        ptrdiff_t __n = __rhs.pptr() - __rhs.pbase();
432227825Stheraven        ptrdiff_t __e = __rhs.epptr() - __rhs.pbase();
433227825Stheraven        __rhs.setp((char_type*)__rhs.__extbuf_min_,
434227825Stheraven                   (char_type*)__rhs.__extbuf_min_ + __e);
435227825Stheraven        __rhs.pbump(__n);
436227825Stheraven    }
437227825Stheraven}
438227825Stheraven
439227825Stheraventemplate <class _CharT, class _Traits>
440227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
441227825Stheravenvoid
442227825Stheravenswap(basic_filebuf<_CharT, _Traits>& __x, basic_filebuf<_CharT, _Traits>& __y)
443227825Stheraven{
444227825Stheraven    __x.swap(__y);
445227825Stheraven}
446227825Stheraven
447227825Stheraventemplate <class _CharT, class _Traits>
448227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
449227825Stheravenbool
450227825Stheravenbasic_filebuf<_CharT, _Traits>::is_open() const
451227825Stheraven{
452227825Stheraven    return __file_ != 0;
453227825Stheraven}
454227825Stheraven
455227825Stheraventemplate <class _CharT, class _Traits>
456227825Stheravenbasic_filebuf<_CharT, _Traits>*
457227825Stheravenbasic_filebuf<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
458227825Stheraven{
459227825Stheraven    basic_filebuf<_CharT, _Traits>* __rt = 0;
460227825Stheraven    if (__file_ == 0)
461227825Stheraven    {
462227825Stheraven        __rt = this;
463227825Stheraven        const char* __mdstr;
464227825Stheraven        switch (__mode & ~ios_base::ate)
465227825Stheraven        {
466227825Stheraven        case ios_base::out:
467227825Stheraven        case ios_base::out | ios_base::trunc:
468227825Stheraven            __mdstr = "w";
469227825Stheraven            break;
470227825Stheraven        case ios_base::out | ios_base::app:
471227825Stheraven        case ios_base::app:
472227825Stheraven            __mdstr = "a";
473227825Stheraven            break;
474227825Stheraven        case ios_base::in:
475227825Stheraven            __mdstr = "r";
476227825Stheraven            break;
477227825Stheraven        case ios_base::in | ios_base::out:
478227825Stheraven            __mdstr = "r+";
479227825Stheraven            break;
480227825Stheraven        case ios_base::in | ios_base::out | ios_base::trunc:
481227825Stheraven            __mdstr = "w+";
482227825Stheraven            break;
483227825Stheraven        case ios_base::in | ios_base::out | ios_base::app:
484227825Stheraven        case ios_base::in | ios_base::app:
485227825Stheraven            __mdstr = "a+";
486227825Stheraven            break;
487227825Stheraven        case ios_base::out | ios_base::binary:
488227825Stheraven        case ios_base::out | ios_base::trunc | ios_base::binary:
489227825Stheraven            __mdstr = "wb";
490227825Stheraven            break;
491227825Stheraven        case ios_base::out | ios_base::app | ios_base::binary:
492227825Stheraven        case ios_base::app | ios_base::binary:
493227825Stheraven            __mdstr = "ab";
494227825Stheraven            break;
495227825Stheraven        case ios_base::in | ios_base::binary:
496227825Stheraven            __mdstr = "rb";
497227825Stheraven            break;
498227825Stheraven        case ios_base::in | ios_base::out | ios_base::binary:
499227825Stheraven            __mdstr = "r+b";
500227825Stheraven            break;
501227825Stheraven        case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary:
502227825Stheraven            __mdstr = "w+b";
503227825Stheraven            break;
504227825Stheraven        case ios_base::in | ios_base::out | ios_base::app | ios_base::binary:
505227825Stheraven        case ios_base::in | ios_base::app | ios_base::binary:
506227825Stheraven            __mdstr = "a+b";
507227825Stheraven            break;
508227825Stheraven        default:
509227825Stheraven            __rt = 0;
510227825Stheraven            break;
511227825Stheraven        }
512227825Stheraven        if (__rt)
513227825Stheraven        {
514227825Stheraven            __file_ = fopen(__s, __mdstr);
515227825Stheraven            if (__file_)
516227825Stheraven            {
517227825Stheraven                __om_ = __mode;
518227825Stheraven                if (__mode & ios_base::ate)
519227825Stheraven                {
520227825Stheraven                    if (fseek(__file_, 0, SEEK_END))
521227825Stheraven                    {
522227825Stheraven                        fclose(__file_);
523227825Stheraven                        __file_ = 0;
524227825Stheraven                        __rt = 0;
525227825Stheraven                    }
526227825Stheraven                }
527227825Stheraven            }
528227825Stheraven            else
529227825Stheraven                __rt = 0;
530227825Stheraven        }
531227825Stheraven    }
532227825Stheraven    return __rt;
533227825Stheraven}
534227825Stheraven
535227825Stheraventemplate <class _CharT, class _Traits>
536227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
537227825Stheravenbasic_filebuf<_CharT, _Traits>*
538227825Stheravenbasic_filebuf<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
539227825Stheraven{
540227825Stheraven    return open(__s.c_str(), __mode);
541227825Stheraven}
542227825Stheraven
543227825Stheraventemplate <class _CharT, class _Traits>
544227825Stheravenbasic_filebuf<_CharT, _Traits>*
545227825Stheravenbasic_filebuf<_CharT, _Traits>::close()
546227825Stheraven{
547227825Stheraven    basic_filebuf<_CharT, _Traits>* __rt = 0;
548227825Stheraven    if (__file_)
549227825Stheraven    {
550227825Stheraven        __rt = this;
551227825Stheraven        unique_ptr<FILE, int(*)(FILE*)> __h(__file_, fclose);
552232924Stheraven        if (sync())
553227825Stheraven            __rt = 0;
554227825Stheraven        if (fclose(__h.release()) == 0)
555227825Stheraven            __file_ = 0;
556227825Stheraven        else
557227825Stheraven            __rt = 0;
558227825Stheraven    }
559227825Stheraven    return __rt;
560227825Stheraven}
561227825Stheraven
562227825Stheraventemplate <class _CharT, class _Traits>
563227825Stheraventypename basic_filebuf<_CharT, _Traits>::int_type
564227825Stheravenbasic_filebuf<_CharT, _Traits>::underflow()
565227825Stheraven{
566227825Stheraven    if (__file_ == 0)
567227825Stheraven        return traits_type::eof();
568227825Stheraven    bool __initial = __read_mode();
569227825Stheraven    char_type __1buf;
570227825Stheraven    if (this->gptr() == 0)
571227825Stheraven        this->setg(&__1buf, &__1buf+1, &__1buf+1);
572227825Stheraven    const size_t __unget_sz = __initial ? 0 : min<size_t>((this->egptr() - this->eback()) / 2, 4);
573227825Stheraven    int_type __c = traits_type::eof();
574227825Stheraven    if (this->gptr() == this->egptr())
575227825Stheraven    {
576227825Stheraven        memmove(this->eback(), this->egptr() - __unget_sz, __unget_sz * sizeof(char_type));
577227825Stheraven        if (__always_noconv_)
578227825Stheraven        {
579227825Stheraven            size_t __nmemb = static_cast<size_t>(this->egptr() - this->eback() - __unget_sz);
580227825Stheraven            __nmemb = fread(this->eback() + __unget_sz, 1, __nmemb, __file_);
581227825Stheraven            if (__nmemb != 0)
582227825Stheraven            {
583227825Stheraven                this->setg(this->eback(),
584227825Stheraven                           this->eback() + __unget_sz,
585227825Stheraven                           this->eback() + __unget_sz + __nmemb);
586227825Stheraven                __c = traits_type::to_int_type(*this->gptr());
587227825Stheraven            }
588227825Stheraven        }
589227825Stheraven        else
590227825Stheraven        {
591227825Stheraven            memmove(__extbuf_, __extbufnext_, __extbufend_ - __extbufnext_);
592227825Stheraven            __extbufnext_ = __extbuf_ + (__extbufend_ - __extbufnext_);
593227825Stheraven            __extbufend_ = __extbuf_ + (__extbuf_ == __extbuf_min_ ? sizeof(__extbuf_min_) : __ebs_);
594227825Stheraven            size_t __nmemb = _VSTD::min(static_cast<size_t>(this->egptr() - this->eback() - __unget_sz),
595227825Stheraven                                 static_cast<size_t>(__extbufend_ - __extbufnext_));
596227825Stheraven            codecvt_base::result __r;
597227825Stheraven            state_type __svs = __st_;
598227825Stheraven            size_t __nr = fread((void*)__extbufnext_, 1, __nmemb, __file_);
599227825Stheraven            if (__nr != 0)
600227825Stheraven            {
601227825Stheraven                __extbufend_ = __extbufnext_ + __nr;
602227825Stheraven                char_type*  __inext;
603227825Stheraven                __r = __cv_->in(__st_, __extbuf_, __extbufend_, __extbufnext_,
604227825Stheraven                                       this->eback() + __unget_sz,
605227825Stheraven                                       this->egptr(), __inext);
606227825Stheraven                if (__r == codecvt_base::noconv)
607227825Stheraven                {
608227825Stheraven                    this->setg((char_type*)__extbuf_, (char_type*)__extbuf_, (char_type*)__extbufend_);
609227825Stheraven                    __c = traits_type::to_int_type(*this->gptr());
610227825Stheraven                }
611227825Stheraven                else if (__inext != this->eback() + __unget_sz)
612227825Stheraven                {
613227825Stheraven                    this->setg(this->eback(), this->eback() + __unget_sz, __inext);
614227825Stheraven                    __c = traits_type::to_int_type(*this->gptr());
615227825Stheraven                }
616227825Stheraven            }
617227825Stheraven        }
618227825Stheraven    }
619227825Stheraven    else
620227825Stheraven        __c = traits_type::to_int_type(*this->gptr());
621227825Stheraven    if (this->eback() == &__1buf)
622227825Stheraven        this->setg(0, 0, 0);
623227825Stheraven    return __c;
624227825Stheraven}
625227825Stheraven
626227825Stheraventemplate <class _CharT, class _Traits>
627227825Stheraventypename basic_filebuf<_CharT, _Traits>::int_type
628227825Stheravenbasic_filebuf<_CharT, _Traits>::pbackfail(int_type __c)
629227825Stheraven{
630227825Stheraven    if (__file_ && this->eback() < this->gptr())
631227825Stheraven    {
632227825Stheraven        if (traits_type::eq_int_type(__c, traits_type::eof()))
633227825Stheraven        {
634227825Stheraven            this->gbump(-1);
635227825Stheraven            return traits_type::not_eof(__c);
636227825Stheraven        }
637227825Stheraven        if ((__om_ & ios_base::out) ||
638227825Stheraven            traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1]))
639227825Stheraven        {
640227825Stheraven            this->gbump(-1);
641227825Stheraven            *this->gptr() = traits_type::to_char_type(__c);
642227825Stheraven            return __c;
643227825Stheraven        }
644227825Stheraven    }
645227825Stheraven    return traits_type::eof();
646227825Stheraven}
647227825Stheraven
648227825Stheraventemplate <class _CharT, class _Traits>
649227825Stheraventypename basic_filebuf<_CharT, _Traits>::int_type
650227825Stheravenbasic_filebuf<_CharT, _Traits>::overflow(int_type __c)
651227825Stheraven{
652227825Stheraven    if (__file_ == 0)
653227825Stheraven        return traits_type::eof();
654227825Stheraven    __write_mode();
655227825Stheraven    char_type __1buf;
656227825Stheraven    char_type* __pb_save = this->pbase();
657227825Stheraven    char_type* __epb_save = this->epptr();
658227825Stheraven    if (!traits_type::eq_int_type(__c, traits_type::eof()))
659227825Stheraven    {
660227825Stheraven        if (this->pptr() == 0)
661227825Stheraven            this->setp(&__1buf, &__1buf+1);
662227825Stheraven        *this->pptr() = traits_type::to_char_type(__c);
663227825Stheraven        this->pbump(1);
664227825Stheraven    }
665227825Stheraven    if (this->pptr() != this->pbase())
666227825Stheraven    {
667227825Stheraven        if (__always_noconv_)
668227825Stheraven        {
669227825Stheraven            size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase());
670227825Stheraven            if (fwrite(this->pbase(), sizeof(char_type), __nmemb, __file_) != __nmemb)
671227825Stheraven                return traits_type::eof();
672227825Stheraven        }
673227825Stheraven        else
674227825Stheraven        {
675227825Stheraven            char* __extbe = __extbuf_;
676227825Stheraven            codecvt_base::result __r;
677227825Stheraven            do
678227825Stheraven            {
679227825Stheraven                const char_type* __e;
680227825Stheraven                __r = __cv_->out(__st_, this->pbase(), this->pptr(), __e,
681227825Stheraven                                        __extbuf_, __extbuf_ + __ebs_, __extbe);
682227825Stheraven                if (__e == this->pbase())
683227825Stheraven                    return traits_type::eof();
684227825Stheraven                if (__r == codecvt_base::noconv)
685227825Stheraven                {
686227825Stheraven                    size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase());
687227825Stheraven                    if (fwrite(this->pbase(), 1, __nmemb, __file_) != __nmemb)
688227825Stheraven                        return traits_type::eof();
689227825Stheraven                }
690227825Stheraven                else if (__r == codecvt_base::ok || __r == codecvt_base::partial)
691227825Stheraven                {
692227825Stheraven                    size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_);
693227825Stheraven                    if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb)
694227825Stheraven                        return traits_type::eof();
695227825Stheraven                    if (__r == codecvt_base::partial)
696227825Stheraven                    {
697227825Stheraven                        this->setp((char_type*)__e, this->pptr());
698227825Stheraven                        this->pbump(this->epptr() - this->pbase());
699227825Stheraven                    }
700227825Stheraven                }
701227825Stheraven                else
702227825Stheraven                    return traits_type::eof();
703227825Stheraven            } while (__r == codecvt_base::partial);
704227825Stheraven        }
705227825Stheraven        this->setp(__pb_save, __epb_save);
706227825Stheraven    }
707227825Stheraven    return traits_type::not_eof(__c);
708227825Stheraven}
709227825Stheraven
710227825Stheraventemplate <class _CharT, class _Traits>
711227825Stheravenbasic_streambuf<_CharT, _Traits>*
712227825Stheravenbasic_filebuf<_CharT, _Traits>::setbuf(char_type* __s, streamsize __n)
713227825Stheraven{
714227825Stheraven    this->setg(0, 0, 0);
715227825Stheraven    this->setp(0, 0);
716227825Stheraven    if (__owns_eb_)
717227825Stheraven        delete [] __extbuf_;
718227825Stheraven    if (__owns_ib_)
719227825Stheraven        delete [] __intbuf_;
720227825Stheraven    __ebs_ = __n;
721227825Stheraven    if (__ebs_ > sizeof(__extbuf_min_))
722227825Stheraven    {
723227825Stheraven        if (__always_noconv_ && __s)
724227825Stheraven        {
725227825Stheraven            __extbuf_ = (char*)__s;
726227825Stheraven            __owns_eb_ = false;
727227825Stheraven        }
728227825Stheraven        else
729227825Stheraven        {
730227825Stheraven            __extbuf_ = new char[__ebs_];
731227825Stheraven            __owns_eb_ = true;
732227825Stheraven        }
733227825Stheraven    }
734227825Stheraven    else
735227825Stheraven    {
736227825Stheraven        __extbuf_ = __extbuf_min_;
737227825Stheraven        __ebs_ = sizeof(__extbuf_min_);
738227825Stheraven        __owns_eb_ = false;
739227825Stheraven    }
740227825Stheraven    if (!__always_noconv_)
741227825Stheraven    {
742227825Stheraven        __ibs_ = max<streamsize>(__n, sizeof(__extbuf_min_));
743227825Stheraven        if (__s && __ibs_ >= sizeof(__extbuf_min_))
744227825Stheraven        {
745227825Stheraven            __intbuf_ = __s;
746227825Stheraven            __owns_ib_ = false;
747227825Stheraven        }
748227825Stheraven        else
749227825Stheraven        {
750227825Stheraven            __intbuf_ = new char_type[__ibs_];
751227825Stheraven            __owns_ib_ = true;
752227825Stheraven        }
753227825Stheraven    }
754227825Stheraven    else
755227825Stheraven    {
756227825Stheraven        __ibs_ = 0;
757227825Stheraven        __intbuf_ = 0;
758227825Stheraven        __owns_ib_ = false;
759227825Stheraven    }
760227825Stheraven    return this;
761227825Stheraven}
762227825Stheraven
763227825Stheraventemplate <class _CharT, class _Traits>
764227825Stheraventypename basic_filebuf<_CharT, _Traits>::pos_type
765227825Stheravenbasic_filebuf<_CharT, _Traits>::seekoff(off_type __off, ios_base::seekdir __way,
766227825Stheraven                                        ios_base::openmode)
767227825Stheraven{
768227825Stheraven    int __width = __cv_->encoding();
769227825Stheraven    if (__file_ == 0 || (__width <= 0 && __off != 0) || sync())
770227825Stheraven        return pos_type(off_type(-1));
771227825Stheraven    // __width > 0 || __off == 0
772227825Stheraven    int __whence;
773227825Stheraven    switch (__way)
774227825Stheraven    {
775227825Stheraven    case ios_base::beg:
776227825Stheraven        __whence = SEEK_SET;
777227825Stheraven        break;
778227825Stheraven    case ios_base::cur:
779227825Stheraven        __whence = SEEK_CUR;
780227825Stheraven        break;
781227825Stheraven    case ios_base::end:
782227825Stheraven        __whence = SEEK_END;
783227825Stheraven        break;
784227825Stheraven    default:
785227825Stheraven        return pos_type(off_type(-1));
786227825Stheraven    }
787227825Stheraven    if (fseeko(__file_, __width > 0 ? __width * __off : 0, __whence))
788227825Stheraven        return pos_type(off_type(-1));
789227825Stheraven    pos_type __r = ftello(__file_);
790227825Stheraven    __r.state(__st_);
791227825Stheraven    return __r;
792227825Stheraven}
793227825Stheraven
794227825Stheraventemplate <class _CharT, class _Traits>
795227825Stheraventypename basic_filebuf<_CharT, _Traits>::pos_type
796227825Stheravenbasic_filebuf<_CharT, _Traits>::seekpos(pos_type __sp, ios_base::openmode)
797227825Stheraven{
798227825Stheraven    if (__file_ == 0 || sync())
799227825Stheraven        return pos_type(off_type(-1));
800227825Stheraven    if (fseeko(__file_, __sp, SEEK_SET))
801227825Stheraven        return pos_type(off_type(-1));
802227825Stheraven    return __sp;
803227825Stheraven}
804227825Stheraven
805227825Stheraventemplate <class _CharT, class _Traits>
806227825Stheravenint
807227825Stheravenbasic_filebuf<_CharT, _Traits>::sync()
808227825Stheraven{
809227825Stheraven    if (__file_ == 0)
810227825Stheraven        return 0;
811227825Stheraven    if (__cm_ & ios_base::out)
812227825Stheraven    {
813227825Stheraven        if (this->pptr() != this->pbase())
814227825Stheraven            if (overflow() == traits_type::eof())
815227825Stheraven                return -1;
816227825Stheraven        codecvt_base::result __r;
817227825Stheraven        do
818227825Stheraven        {
819227825Stheraven            char* __extbe;
820227825Stheraven            __r = __cv_->unshift(__st_, __extbuf_, __extbuf_ + __ebs_, __extbe);
821227825Stheraven            size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_);
822227825Stheraven            if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb)
823227825Stheraven                return -1;
824227825Stheraven        } while (__r == codecvt_base::partial);
825227825Stheraven        if (__r == codecvt_base::error)
826227825Stheraven            return -1;
827227825Stheraven        if (fflush(__file_))
828227825Stheraven            return -1;
829227825Stheraven    }
830227825Stheraven    else if (__cm_ & ios_base::in)
831227825Stheraven    {
832227825Stheraven        off_type __c;
833227825Stheraven        if (__always_noconv_)
834227825Stheraven            __c = this->egptr() - this->gptr();
835227825Stheraven        else
836227825Stheraven        {
837227825Stheraven            int __width = __cv_->encoding();
838227825Stheraven            __c = __extbufend_ - __extbufnext_;
839227825Stheraven            if (__width > 0)
840227825Stheraven                __c += __width * (this->egptr() - this->gptr());
841227825Stheraven            else
842227825Stheraven            {
843227825Stheraven                if (this->gptr() != this->egptr())
844227825Stheraven                {
845227825Stheraven                    reverse(this->gptr(), this->egptr());
846227825Stheraven                    codecvt_base::result __r;
847227825Stheraven                    const char_type* __e = this->gptr();
848227825Stheraven                    char* __extbe;
849227825Stheraven                    do
850227825Stheraven                    {
851227825Stheraven                        __r = __cv_->out(__st_, __e, this->egptr(), __e,
852227825Stheraven                                         __extbuf_, __extbuf_ + __ebs_, __extbe);
853227825Stheraven                        switch (__r)
854227825Stheraven                        {
855227825Stheraven                        case codecvt_base::noconv:
856227825Stheraven                            __c += this->egptr() - this->gptr();
857227825Stheraven                            break;
858227825Stheraven                        case codecvt_base::ok:
859227825Stheraven                        case codecvt_base::partial:
860227825Stheraven                            __c += __extbe - __extbuf_;
861227825Stheraven                            break;
862227825Stheraven                        default:
863227825Stheraven                            return -1;
864227825Stheraven                        }
865227825Stheraven                    } while (__r == codecvt_base::partial);
866227825Stheraven                }
867227825Stheraven            }
868227825Stheraven        }
869227825Stheraven        if (fseeko(__file_, -__c, SEEK_CUR))
870227825Stheraven            return -1;
871227825Stheraven        this->setg(0, 0, 0);
872227825Stheraven        __cm_ = 0;
873227825Stheraven    }
874227825Stheraven    return 0;
875227825Stheraven}
876227825Stheraven
877227825Stheraventemplate <class _CharT, class _Traits>
878227825Stheravenvoid
879227825Stheravenbasic_filebuf<_CharT, _Traits>::imbue(const locale& __loc)
880227825Stheraven{
881227825Stheraven    sync();
882227825Stheraven    __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc);
883227825Stheraven    bool __old_anc = __always_noconv_;
884227825Stheraven    __always_noconv_ = __cv_->always_noconv();
885227825Stheraven    if (__old_anc != __always_noconv_)
886227825Stheraven    {
887227825Stheraven        this->setg(0, 0, 0);
888227825Stheraven        this->setp(0, 0);
889227825Stheraven        // invariant, char_type is char, else we couldn't get here
890227825Stheraven        if (__always_noconv_)  // need to dump __intbuf_
891227825Stheraven        {
892227825Stheraven            if (__owns_eb_)
893227825Stheraven                delete [] __extbuf_;
894227825Stheraven            __owns_eb_ = __owns_ib_;
895227825Stheraven            __ebs_ = __ibs_;
896227825Stheraven            __extbuf_ = (char*)__intbuf_;
897227825Stheraven            __ibs_ = 0;
898227825Stheraven            __intbuf_ = 0;
899227825Stheraven            __owns_ib_ = false;
900227825Stheraven        }
901227825Stheraven        else  // need to obtain an __intbuf_.
902227825Stheraven        {     // If __extbuf_ is user-supplied, use it, else new __intbuf_
903227825Stheraven            if (!__owns_eb_ && __extbuf_ != __extbuf_min_)
904227825Stheraven            {
905227825Stheraven                __ibs_ = __ebs_;
906227825Stheraven                __intbuf_ = (char_type*)__extbuf_;
907227825Stheraven                __owns_ib_ = false;
908227825Stheraven                __extbuf_ = new char[__ebs_];
909227825Stheraven                __owns_eb_ = true;
910227825Stheraven            }
911227825Stheraven            else
912227825Stheraven            {
913227825Stheraven                __ibs_ = __ebs_;
914227825Stheraven                __intbuf_ = new char_type[__ibs_];
915227825Stheraven                __owns_ib_ = true;
916227825Stheraven            }
917227825Stheraven        }
918227825Stheraven    }
919227825Stheraven}
920227825Stheraven
921227825Stheraventemplate <class _CharT, class _Traits>
922227825Stheravenbool
923227825Stheravenbasic_filebuf<_CharT, _Traits>::__read_mode()
924227825Stheraven{
925227825Stheraven    if (!(__cm_ & ios_base::in))
926227825Stheraven    {
927227825Stheraven        this->setp(0, 0);
928227825Stheraven        if (__always_noconv_)
929227825Stheraven            this->setg((char_type*)__extbuf_,
930227825Stheraven                       (char_type*)__extbuf_ + __ebs_,
931227825Stheraven                       (char_type*)__extbuf_ + __ebs_);
932227825Stheraven        else
933227825Stheraven            this->setg(__intbuf_, __intbuf_ + __ibs_, __intbuf_ + __ibs_);
934227825Stheraven        __cm_ = ios_base::in;
935227825Stheraven        return true;
936227825Stheraven    }
937227825Stheraven    return false;
938227825Stheraven}
939227825Stheraven
940227825Stheraventemplate <class _CharT, class _Traits>
941227825Stheravenvoid
942227825Stheravenbasic_filebuf<_CharT, _Traits>::__write_mode()
943227825Stheraven{
944227825Stheraven    if (!(__cm_ & ios_base::out))
945227825Stheraven    {
946227825Stheraven        this->setg(0, 0, 0);
947227825Stheraven        if (__ebs_ > sizeof(__extbuf_min_))
948227825Stheraven        {
949227825Stheraven            if (__always_noconv_)
950227825Stheraven                this->setp((char_type*)__extbuf_,
951227825Stheraven                           (char_type*)__extbuf_ + (__ebs_ - 1));
952227825Stheraven            else
953227825Stheraven                this->setp(__intbuf_, __intbuf_ + (__ibs_ - 1));
954227825Stheraven        }
955227825Stheraven        else
956227825Stheraven            this->setp(0, 0);
957227825Stheraven        __cm_ = ios_base::out;
958227825Stheraven    }
959227825Stheraven}
960227825Stheraven
961227825Stheraven// basic_ifstream
962227825Stheraven
963227825Stheraventemplate <class _CharT, class _Traits>
964227825Stheravenclass _LIBCPP_VISIBLE basic_ifstream
965227825Stheraven    : public basic_istream<_CharT, _Traits>
966227825Stheraven{
967227825Stheravenpublic:
968227825Stheraven    typedef _CharT                         char_type;
969227825Stheraven    typedef _Traits                        traits_type;
970227825Stheraven    typedef typename traits_type::int_type int_type;
971227825Stheraven    typedef typename traits_type::pos_type pos_type;
972227825Stheraven    typedef typename traits_type::off_type off_type;
973227825Stheraven
974227825Stheraven    basic_ifstream();
975227825Stheraven    explicit basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in);
976227825Stheraven    explicit basic_ifstream(const string& __s, ios_base::openmode __mode = ios_base::in);
977227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
978227825Stheraven    basic_ifstream(basic_ifstream&& __rhs);
979227825Stheraven#endif
980227825Stheraven
981227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
982227825Stheraven    basic_ifstream& operator=(basic_ifstream&& __rhs);
983227825Stheraven#endif
984227825Stheraven    void swap(basic_ifstream& __rhs);
985227825Stheraven
986227825Stheraven    basic_filebuf<char_type, traits_type>* rdbuf() const;
987227825Stheraven    bool is_open() const;
988227825Stheraven    void open(const char* __s, ios_base::openmode __mode = ios_base::in);
989227825Stheraven    void open(const string& __s, ios_base::openmode __mode = ios_base::in);
990227825Stheraven    void close();
991227825Stheraven
992227825Stheravenprivate:
993227825Stheraven    basic_filebuf<char_type, traits_type> __sb_;
994227825Stheraven};
995227825Stheraven
996227825Stheraventemplate <class _CharT, class _Traits>
997227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
998227825Stheravenbasic_ifstream<_CharT, _Traits>::basic_ifstream()
999227825Stheraven    : basic_istream<char_type, traits_type>(&__sb_)
1000227825Stheraven{
1001227825Stheraven}
1002227825Stheraven
1003227825Stheraventemplate <class _CharT, class _Traits>
1004227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1005227825Stheravenbasic_ifstream<_CharT, _Traits>::basic_ifstream(const char* __s, ios_base::openmode __mode)
1006227825Stheraven    : basic_istream<char_type, traits_type>(&__sb_)
1007227825Stheraven{
1008227825Stheraven    if (__sb_.open(__s, __mode | ios_base::in) == 0)
1009227825Stheraven        this->setstate(ios_base::failbit);
1010227825Stheraven}
1011227825Stheraven
1012227825Stheraventemplate <class _CharT, class _Traits>
1013227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1014227825Stheravenbasic_ifstream<_CharT, _Traits>::basic_ifstream(const string& __s, ios_base::openmode __mode)
1015227825Stheraven    : basic_istream<char_type, traits_type>(&__sb_)
1016227825Stheraven{
1017227825Stheraven    if (__sb_.open(__s, __mode | ios_base::in) == 0)
1018227825Stheraven        this->setstate(ios_base::failbit);
1019227825Stheraven}
1020227825Stheraven
1021227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1022227825Stheraven
1023227825Stheraventemplate <class _CharT, class _Traits>
1024227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1025227825Stheravenbasic_ifstream<_CharT, _Traits>::basic_ifstream(basic_ifstream&& __rhs)
1026227825Stheraven    : basic_istream<char_type, traits_type>(_VSTD::move(__rhs)),
1027227825Stheraven      __sb_(_VSTD::move(__rhs.__sb_))
1028227825Stheraven{
1029227825Stheraven    this->set_rdbuf(&__sb_);
1030227825Stheraven}
1031227825Stheraven
1032227825Stheraventemplate <class _CharT, class _Traits>
1033227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1034227825Stheravenbasic_ifstream<_CharT, _Traits>&
1035227825Stheravenbasic_ifstream<_CharT, _Traits>::operator=(basic_ifstream&& __rhs)
1036227825Stheraven{
1037227825Stheraven    basic_istream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
1038227825Stheraven    __sb_ = _VSTD::move(__rhs.__sb_);
1039227825Stheraven    return *this;
1040227825Stheraven}
1041227825Stheraven
1042227825Stheraven#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1043227825Stheraven
1044227825Stheraventemplate <class _CharT, class _Traits>
1045227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1046227825Stheravenvoid
1047227825Stheravenbasic_ifstream<_CharT, _Traits>::swap(basic_ifstream& __rhs)
1048227825Stheraven{
1049227825Stheraven    basic_istream<char_type, traits_type>::swap(__rhs);
1050227825Stheraven    __sb_.swap(__rhs.__sb_);
1051227825Stheraven}
1052227825Stheraven
1053227825Stheraventemplate <class _CharT, class _Traits>
1054227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1055227825Stheravenvoid
1056227825Stheravenswap(basic_ifstream<_CharT, _Traits>& __x, basic_ifstream<_CharT, _Traits>& __y)
1057227825Stheraven{
1058227825Stheraven    __x.swap(__y);
1059227825Stheraven}
1060227825Stheraven
1061227825Stheraventemplate <class _CharT, class _Traits>
1062227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1063227825Stheravenbasic_filebuf<_CharT, _Traits>*
1064227825Stheravenbasic_ifstream<_CharT, _Traits>::rdbuf() const
1065227825Stheraven{
1066227825Stheraven    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
1067227825Stheraven}
1068227825Stheraven
1069227825Stheraventemplate <class _CharT, class _Traits>
1070227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1071227825Stheravenbool
1072227825Stheravenbasic_ifstream<_CharT, _Traits>::is_open() const
1073227825Stheraven{
1074227825Stheraven    return __sb_.is_open();
1075227825Stheraven}
1076227825Stheraven
1077227825Stheraventemplate <class _CharT, class _Traits>
1078227825Stheravenvoid
1079227825Stheravenbasic_ifstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
1080227825Stheraven{
1081227825Stheraven    if (__sb_.open(__s, __mode | ios_base::in))
1082227825Stheraven        this->clear();
1083227825Stheraven    else
1084227825Stheraven        this->setstate(ios_base::failbit);
1085227825Stheraven}
1086227825Stheraven
1087227825Stheraventemplate <class _CharT, class _Traits>
1088227825Stheravenvoid
1089227825Stheravenbasic_ifstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
1090227825Stheraven{
1091227825Stheraven    if (__sb_.open(__s, __mode | ios_base::in))
1092227825Stheraven        this->clear();
1093227825Stheraven    else
1094227825Stheraven        this->setstate(ios_base::failbit);
1095227825Stheraven}
1096227825Stheraven
1097227825Stheraventemplate <class _CharT, class _Traits>
1098227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1099227825Stheravenvoid
1100227825Stheravenbasic_ifstream<_CharT, _Traits>::close()
1101227825Stheraven{
1102227825Stheraven    if (__sb_.close() == 0)
1103227825Stheraven        this->setstate(ios_base::failbit);
1104227825Stheraven}
1105227825Stheraven
1106227825Stheraven// basic_ofstream
1107227825Stheraven
1108227825Stheraventemplate <class _CharT, class _Traits>
1109227825Stheravenclass _LIBCPP_VISIBLE basic_ofstream
1110227825Stheraven    : public basic_ostream<_CharT, _Traits>
1111227825Stheraven{
1112227825Stheravenpublic:
1113227825Stheraven    typedef _CharT                         char_type;
1114227825Stheraven    typedef _Traits                        traits_type;
1115227825Stheraven    typedef typename traits_type::int_type int_type;
1116227825Stheraven    typedef typename traits_type::pos_type pos_type;
1117227825Stheraven    typedef typename traits_type::off_type off_type;
1118227825Stheraven
1119227825Stheraven    basic_ofstream();
1120227825Stheraven    explicit basic_ofstream(const char* __s, ios_base::openmode __mode = ios_base::out);
1121227825Stheraven    explicit basic_ofstream(const string& __s, ios_base::openmode __mode = ios_base::out);
1122227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1123227825Stheraven    basic_ofstream(basic_ofstream&& __rhs);
1124227825Stheraven#endif
1125227825Stheraven
1126227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1127227825Stheraven    basic_ofstream& operator=(basic_ofstream&& __rhs);
1128227825Stheraven#endif
1129227825Stheraven    void swap(basic_ofstream& __rhs);
1130227825Stheraven
1131227825Stheraven    basic_filebuf<char_type, traits_type>* rdbuf() const;
1132227825Stheraven    bool is_open() const;
1133227825Stheraven    void open(const char* __s, ios_base::openmode __mode = ios_base::out);
1134227825Stheraven    void open(const string& __s, ios_base::openmode __mode = ios_base::out);
1135227825Stheraven    void close();
1136227825Stheraven
1137227825Stheravenprivate:
1138227825Stheraven    basic_filebuf<char_type, traits_type> __sb_;
1139227825Stheraven};
1140227825Stheraven
1141227825Stheraventemplate <class _CharT, class _Traits>
1142227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1143227825Stheravenbasic_ofstream<_CharT, _Traits>::basic_ofstream()
1144227825Stheraven    : basic_ostream<char_type, traits_type>(&__sb_)
1145227825Stheraven{
1146227825Stheraven}
1147227825Stheraven
1148227825Stheraventemplate <class _CharT, class _Traits>
1149227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1150227825Stheravenbasic_ofstream<_CharT, _Traits>::basic_ofstream(const char* __s, ios_base::openmode __mode)
1151227825Stheraven    : basic_ostream<char_type, traits_type>(&__sb_)
1152227825Stheraven{
1153227825Stheraven    if (__sb_.open(__s, __mode | ios_base::out) == 0)
1154227825Stheraven        this->setstate(ios_base::failbit);
1155227825Stheraven}
1156227825Stheraven
1157227825Stheraventemplate <class _CharT, class _Traits>
1158227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1159227825Stheravenbasic_ofstream<_CharT, _Traits>::basic_ofstream(const string& __s, ios_base::openmode __mode)
1160227825Stheraven    : basic_ostream<char_type, traits_type>(&__sb_)
1161227825Stheraven{
1162227825Stheraven    if (__sb_.open(__s, __mode | ios_base::out) == 0)
1163227825Stheraven        this->setstate(ios_base::failbit);
1164227825Stheraven}
1165227825Stheraven
1166227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1167227825Stheraven
1168227825Stheraventemplate <class _CharT, class _Traits>
1169227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1170227825Stheravenbasic_ofstream<_CharT, _Traits>::basic_ofstream(basic_ofstream&& __rhs)
1171227825Stheraven    : basic_ostream<char_type, traits_type>(_VSTD::move(__rhs)),
1172227825Stheraven      __sb_(_VSTD::move(__rhs.__sb_))
1173227825Stheraven{
1174227825Stheraven    this->set_rdbuf(&__sb_);
1175227825Stheraven}
1176227825Stheraven
1177227825Stheraventemplate <class _CharT, class _Traits>
1178227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1179227825Stheravenbasic_ofstream<_CharT, _Traits>&
1180227825Stheravenbasic_ofstream<_CharT, _Traits>::operator=(basic_ofstream&& __rhs)
1181227825Stheraven{
1182227825Stheraven    basic_ostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
1183227825Stheraven    __sb_ = _VSTD::move(__rhs.__sb_);
1184227825Stheraven    return *this;
1185227825Stheraven}
1186227825Stheraven
1187227825Stheraven#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1188227825Stheraven
1189227825Stheraventemplate <class _CharT, class _Traits>
1190227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1191227825Stheravenvoid
1192227825Stheravenbasic_ofstream<_CharT, _Traits>::swap(basic_ofstream& __rhs)
1193227825Stheraven{
1194227825Stheraven    basic_ostream<char_type, traits_type>::swap(__rhs);
1195227825Stheraven    __sb_.swap(__rhs.__sb_);
1196227825Stheraven}
1197227825Stheraven
1198227825Stheraventemplate <class _CharT, class _Traits>
1199227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1200227825Stheravenvoid
1201227825Stheravenswap(basic_ofstream<_CharT, _Traits>& __x, basic_ofstream<_CharT, _Traits>& __y)
1202227825Stheraven{
1203227825Stheraven    __x.swap(__y);
1204227825Stheraven}
1205227825Stheraven
1206227825Stheraventemplate <class _CharT, class _Traits>
1207227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1208227825Stheravenbasic_filebuf<_CharT, _Traits>*
1209227825Stheravenbasic_ofstream<_CharT, _Traits>::rdbuf() const
1210227825Stheraven{
1211227825Stheraven    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
1212227825Stheraven}
1213227825Stheraven
1214227825Stheraventemplate <class _CharT, class _Traits>
1215227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1216227825Stheravenbool
1217227825Stheravenbasic_ofstream<_CharT, _Traits>::is_open() const
1218227825Stheraven{
1219227825Stheraven    return __sb_.is_open();
1220227825Stheraven}
1221227825Stheraven
1222227825Stheraventemplate <class _CharT, class _Traits>
1223227825Stheravenvoid
1224227825Stheravenbasic_ofstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
1225227825Stheraven{
1226227825Stheraven    if (__sb_.open(__s, __mode | ios_base::out))
1227227825Stheraven        this->clear();
1228227825Stheraven    else
1229227825Stheraven        this->setstate(ios_base::failbit);
1230227825Stheraven}
1231227825Stheraven
1232227825Stheraventemplate <class _CharT, class _Traits>
1233227825Stheravenvoid
1234227825Stheravenbasic_ofstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
1235227825Stheraven{
1236227825Stheraven    if (__sb_.open(__s, __mode | ios_base::out))
1237227825Stheraven        this->clear();
1238227825Stheraven    else
1239227825Stheraven        this->setstate(ios_base::failbit);
1240227825Stheraven}
1241227825Stheraven
1242227825Stheraventemplate <class _CharT, class _Traits>
1243227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1244227825Stheravenvoid
1245227825Stheravenbasic_ofstream<_CharT, _Traits>::close()
1246227825Stheraven{
1247227825Stheraven    if (__sb_.close() == 0)
1248227825Stheraven        this->setstate(ios_base::failbit);
1249227825Stheraven}
1250227825Stheraven
1251227825Stheraven// basic_fstream
1252227825Stheraven
1253227825Stheraventemplate <class _CharT, class _Traits>
1254227825Stheravenclass _LIBCPP_VISIBLE basic_fstream
1255227825Stheraven    : public basic_iostream<_CharT, _Traits>
1256227825Stheraven{
1257227825Stheravenpublic:
1258227825Stheraven    typedef _CharT                         char_type;
1259227825Stheraven    typedef _Traits                        traits_type;
1260227825Stheraven    typedef typename traits_type::int_type int_type;
1261227825Stheraven    typedef typename traits_type::pos_type pos_type;
1262227825Stheraven    typedef typename traits_type::off_type off_type;
1263227825Stheraven
1264227825Stheraven    basic_fstream();
1265227825Stheraven    explicit basic_fstream(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
1266227825Stheraven    explicit basic_fstream(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
1267227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1268227825Stheraven    basic_fstream(basic_fstream&& __rhs);
1269227825Stheraven#endif
1270227825Stheraven
1271227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1272227825Stheraven    basic_fstream& operator=(basic_fstream&& __rhs);
1273227825Stheraven#endif
1274227825Stheraven    void swap(basic_fstream& __rhs);
1275227825Stheraven
1276227825Stheraven    basic_filebuf<char_type, traits_type>* rdbuf() const;
1277227825Stheraven    bool is_open() const;
1278227825Stheraven    void open(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
1279227825Stheraven    void open(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
1280227825Stheraven    void close();
1281227825Stheraven
1282227825Stheravenprivate:
1283227825Stheraven    basic_filebuf<char_type, traits_type> __sb_;
1284227825Stheraven};
1285227825Stheraven
1286227825Stheraventemplate <class _CharT, class _Traits>
1287227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1288227825Stheravenbasic_fstream<_CharT, _Traits>::basic_fstream()
1289227825Stheraven    : basic_iostream<char_type, traits_type>(&__sb_)
1290227825Stheraven{
1291227825Stheraven}
1292227825Stheraven
1293227825Stheraventemplate <class _CharT, class _Traits>
1294227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1295227825Stheravenbasic_fstream<_CharT, _Traits>::basic_fstream(const char* __s, ios_base::openmode __mode)
1296227825Stheraven    : basic_iostream<char_type, traits_type>(&__sb_)
1297227825Stheraven{
1298227825Stheraven    if (__sb_.open(__s, __mode) == 0)
1299227825Stheraven        this->setstate(ios_base::failbit);
1300227825Stheraven}
1301227825Stheraven
1302227825Stheraventemplate <class _CharT, class _Traits>
1303227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1304227825Stheravenbasic_fstream<_CharT, _Traits>::basic_fstream(const string& __s, ios_base::openmode __mode)
1305227825Stheraven    : basic_iostream<char_type, traits_type>(&__sb_)
1306227825Stheraven{
1307227825Stheraven    if (__sb_.open(__s, __mode) == 0)
1308227825Stheraven        this->setstate(ios_base::failbit);
1309227825Stheraven}
1310227825Stheraven
1311227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1312227825Stheraven
1313227825Stheraventemplate <class _CharT, class _Traits>
1314227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1315227825Stheravenbasic_fstream<_CharT, _Traits>::basic_fstream(basic_fstream&& __rhs)
1316227825Stheraven    : basic_iostream<char_type, traits_type>(_VSTD::move(__rhs)),
1317227825Stheraven      __sb_(_VSTD::move(__rhs.__sb_))
1318227825Stheraven{
1319227825Stheraven    this->set_rdbuf(&__sb_);
1320227825Stheraven}
1321227825Stheraven
1322227825Stheraventemplate <class _CharT, class _Traits>
1323227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1324227825Stheravenbasic_fstream<_CharT, _Traits>&
1325227825Stheravenbasic_fstream<_CharT, _Traits>::operator=(basic_fstream&& __rhs)
1326227825Stheraven{
1327227825Stheraven    basic_iostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
1328227825Stheraven    __sb_ = _VSTD::move(__rhs.__sb_);
1329227825Stheraven    return *this;
1330227825Stheraven}
1331227825Stheraven
1332227825Stheraven#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1333227825Stheraven
1334227825Stheraventemplate <class _CharT, class _Traits>
1335227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1336227825Stheravenvoid
1337227825Stheravenbasic_fstream<_CharT, _Traits>::swap(basic_fstream& __rhs)
1338227825Stheraven{
1339227825Stheraven    basic_iostream<char_type, traits_type>::swap(__rhs);
1340227825Stheraven    __sb_.swap(__rhs.__sb_);
1341227825Stheraven}
1342227825Stheraven
1343227825Stheraventemplate <class _CharT, class _Traits>
1344227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1345227825Stheravenvoid
1346227825Stheravenswap(basic_fstream<_CharT, _Traits>& __x, basic_fstream<_CharT, _Traits>& __y)
1347227825Stheraven{
1348227825Stheraven    __x.swap(__y);
1349227825Stheraven}
1350227825Stheraven
1351227825Stheraventemplate <class _CharT, class _Traits>
1352227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1353227825Stheravenbasic_filebuf<_CharT, _Traits>*
1354227825Stheravenbasic_fstream<_CharT, _Traits>::rdbuf() const
1355227825Stheraven{
1356227825Stheraven    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
1357227825Stheraven}
1358227825Stheraven
1359227825Stheraventemplate <class _CharT, class _Traits>
1360227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1361227825Stheravenbool
1362227825Stheravenbasic_fstream<_CharT, _Traits>::is_open() const
1363227825Stheraven{
1364227825Stheraven    return __sb_.is_open();
1365227825Stheraven}
1366227825Stheraven
1367227825Stheraventemplate <class _CharT, class _Traits>
1368227825Stheravenvoid
1369227825Stheravenbasic_fstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
1370227825Stheraven{
1371227825Stheraven    if (__sb_.open(__s, __mode))
1372227825Stheraven        this->clear();
1373227825Stheraven    else
1374227825Stheraven        this->setstate(ios_base::failbit);
1375227825Stheraven}
1376227825Stheraven
1377227825Stheraventemplate <class _CharT, class _Traits>
1378227825Stheravenvoid
1379227825Stheravenbasic_fstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
1380227825Stheraven{
1381227825Stheraven    if (__sb_.open(__s, __mode))
1382227825Stheraven        this->clear();
1383227825Stheraven    else
1384227825Stheraven        this->setstate(ios_base::failbit);
1385227825Stheraven}
1386227825Stheraven
1387227825Stheraventemplate <class _CharT, class _Traits>
1388227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1389227825Stheravenvoid
1390227825Stheravenbasic_fstream<_CharT, _Traits>::close()
1391227825Stheraven{
1392227825Stheraven    if (__sb_.close() == 0)
1393227825Stheraven        this->setstate(ios_base::failbit);
1394227825Stheraven}
1395227825Stheraven
1396227825Stheraven_LIBCPP_END_NAMESPACE_STD
1397227825Stheraven
1398227825Stheraven#endif  // _LIBCPP_FSTREAM
1399