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