xref: /netbsd-src/external/apache2/llvm/dist/libcxx/include/fstream (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
1*4d6fc14bSjoerg// -*- C++ -*-
2*4d6fc14bSjoerg//===------------------------- fstream ------------------------------------===//
3*4d6fc14bSjoerg//
4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information.
6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*4d6fc14bSjoerg//
8*4d6fc14bSjoerg//===----------------------------------------------------------------------===//
9*4d6fc14bSjoerg
10*4d6fc14bSjoerg#ifndef _LIBCPP_FSTREAM
11*4d6fc14bSjoerg#define _LIBCPP_FSTREAM
12*4d6fc14bSjoerg
13*4d6fc14bSjoerg/*
14*4d6fc14bSjoerg    fstream synopsis
15*4d6fc14bSjoerg
16*4d6fc14bSjoergtemplate <class charT, class traits = char_traits<charT> >
17*4d6fc14bSjoergclass basic_filebuf
18*4d6fc14bSjoerg    : public basic_streambuf<charT, traits>
19*4d6fc14bSjoerg{
20*4d6fc14bSjoergpublic:
21*4d6fc14bSjoerg    typedef charT                          char_type;
22*4d6fc14bSjoerg    typedef traits                         traits_type;
23*4d6fc14bSjoerg    typedef typename traits_type::int_type int_type;
24*4d6fc14bSjoerg    typedef typename traits_type::pos_type pos_type;
25*4d6fc14bSjoerg    typedef typename traits_type::off_type off_type;
26*4d6fc14bSjoerg
27*4d6fc14bSjoerg    // 27.9.1.2 Constructors/destructor:
28*4d6fc14bSjoerg    basic_filebuf();
29*4d6fc14bSjoerg    basic_filebuf(basic_filebuf&& rhs);
30*4d6fc14bSjoerg    virtual ~basic_filebuf();
31*4d6fc14bSjoerg
32*4d6fc14bSjoerg    // 27.9.1.3 Assign/swap:
33*4d6fc14bSjoerg    basic_filebuf& operator=(basic_filebuf&& rhs);
34*4d6fc14bSjoerg    void swap(basic_filebuf& rhs);
35*4d6fc14bSjoerg
36*4d6fc14bSjoerg    // 27.9.1.4 Members:
37*4d6fc14bSjoerg    bool is_open() const;
38*4d6fc14bSjoerg    basic_filebuf* open(const char* s, ios_base::openmode mode);
39*4d6fc14bSjoerg    basic_filebuf* open(const string& s, ios_base::openmode mode);
40*4d6fc14bSjoerg    basic_filebuf* open(const filesystem::path& p, ios_base::openmode mode); // C++17
41*4d6fc14bSjoerg    basic_filebuf* close();
42*4d6fc14bSjoerg
43*4d6fc14bSjoergprotected:
44*4d6fc14bSjoerg    // 27.9.1.5 Overridden virtual functions:
45*4d6fc14bSjoerg    virtual streamsize showmanyc();
46*4d6fc14bSjoerg    virtual int_type underflow();
47*4d6fc14bSjoerg    virtual int_type uflow();
48*4d6fc14bSjoerg    virtual int_type pbackfail(int_type c = traits_type::eof());
49*4d6fc14bSjoerg    virtual int_type overflow (int_type c = traits_type::eof());
50*4d6fc14bSjoerg    virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* s, streamsize n);
51*4d6fc14bSjoerg    virtual pos_type seekoff(off_type off, ios_base::seekdir way,
52*4d6fc14bSjoerg                             ios_base::openmode which = ios_base::in | ios_base::out);
53*4d6fc14bSjoerg    virtual pos_type seekpos(pos_type sp,
54*4d6fc14bSjoerg                             ios_base::openmode which = ios_base::in | ios_base::out);
55*4d6fc14bSjoerg    virtual int sync();
56*4d6fc14bSjoerg    virtual void imbue(const locale& loc);
57*4d6fc14bSjoerg};
58*4d6fc14bSjoerg
59*4d6fc14bSjoergtemplate <class charT, class traits>
60*4d6fc14bSjoerg  void
61*4d6fc14bSjoerg  swap(basic_filebuf<charT, traits>& x, basic_filebuf<charT, traits>& y);
62*4d6fc14bSjoerg
63*4d6fc14bSjoergtypedef basic_filebuf<char>    filebuf;
64*4d6fc14bSjoergtypedef basic_filebuf<wchar_t> wfilebuf;
65*4d6fc14bSjoerg
66*4d6fc14bSjoergtemplate <class charT, class traits = char_traits<charT> >
67*4d6fc14bSjoergclass basic_ifstream
68*4d6fc14bSjoerg    : public basic_istream<charT,traits>
69*4d6fc14bSjoerg{
70*4d6fc14bSjoergpublic:
71*4d6fc14bSjoerg    typedef charT                          char_type;
72*4d6fc14bSjoerg    typedef traits                         traits_type;
73*4d6fc14bSjoerg    typedef typename traits_type::int_type int_type;
74*4d6fc14bSjoerg    typedef typename traits_type::pos_type pos_type;
75*4d6fc14bSjoerg    typedef typename traits_type::off_type off_type;
76*4d6fc14bSjoerg
77*4d6fc14bSjoerg    basic_ifstream();
78*4d6fc14bSjoerg    explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in);
79*4d6fc14bSjoerg    explicit basic_ifstream(const string& s, ios_base::openmode mode = ios_base::in);
80*4d6fc14bSjoerg    explicit basic_ifstream(const filesystem::path& p,
81*4d6fc14bSjoerg                            ios_base::openmode mode = ios_base::in); // C++17
82*4d6fc14bSjoerg    basic_ifstream(basic_ifstream&& rhs);
83*4d6fc14bSjoerg
84*4d6fc14bSjoerg    basic_ifstream& operator=(basic_ifstream&& rhs);
85*4d6fc14bSjoerg    void swap(basic_ifstream& rhs);
86*4d6fc14bSjoerg
87*4d6fc14bSjoerg    basic_filebuf<char_type, traits_type>* rdbuf() const;
88*4d6fc14bSjoerg    bool is_open() const;
89*4d6fc14bSjoerg    void open(const char* s, ios_base::openmode mode = ios_base::in);
90*4d6fc14bSjoerg    void open(const string& s, ios_base::openmode mode = ios_base::in);
91*4d6fc14bSjoerg    void open(const filesystem::path& s, ios_base::openmode mode = ios_base::in); // C++17
92*4d6fc14bSjoerg
93*4d6fc14bSjoerg    void close();
94*4d6fc14bSjoerg};
95*4d6fc14bSjoerg
96*4d6fc14bSjoergtemplate <class charT, class traits>
97*4d6fc14bSjoerg  void
98*4d6fc14bSjoerg  swap(basic_ifstream<charT, traits>& x, basic_ifstream<charT, traits>& y);
99*4d6fc14bSjoerg
100*4d6fc14bSjoergtypedef basic_ifstream<char>    ifstream;
101*4d6fc14bSjoergtypedef basic_ifstream<wchar_t> wifstream;
102*4d6fc14bSjoerg
103*4d6fc14bSjoergtemplate <class charT, class traits = char_traits<charT> >
104*4d6fc14bSjoergclass basic_ofstream
105*4d6fc14bSjoerg    : public basic_ostream<charT,traits>
106*4d6fc14bSjoerg{
107*4d6fc14bSjoergpublic:
108*4d6fc14bSjoerg    typedef charT                          char_type;
109*4d6fc14bSjoerg    typedef traits                         traits_type;
110*4d6fc14bSjoerg    typedef typename traits_type::int_type int_type;
111*4d6fc14bSjoerg    typedef typename traits_type::pos_type pos_type;
112*4d6fc14bSjoerg    typedef typename traits_type::off_type off_type;
113*4d6fc14bSjoerg
114*4d6fc14bSjoerg    basic_ofstream();
115*4d6fc14bSjoerg    explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out);
116*4d6fc14bSjoerg    explicit basic_ofstream(const string& s, ios_base::openmode mode = ios_base::out);
117*4d6fc14bSjoerg    explicit basic_ofstream(const filesystem::path& p,
118*4d6fc14bSjoerg                            ios_base::openmode mode = ios_base::out); // C++17
119*4d6fc14bSjoerg    basic_ofstream(basic_ofstream&& rhs);
120*4d6fc14bSjoerg
121*4d6fc14bSjoerg    basic_ofstream& operator=(basic_ofstream&& rhs);
122*4d6fc14bSjoerg    void swap(basic_ofstream& rhs);
123*4d6fc14bSjoerg
124*4d6fc14bSjoerg    basic_filebuf<char_type, traits_type>* rdbuf() const;
125*4d6fc14bSjoerg    bool is_open() const;
126*4d6fc14bSjoerg    void open(const char* s, ios_base::openmode mode = ios_base::out);
127*4d6fc14bSjoerg    void open(const string& s, ios_base::openmode mode = ios_base::out);
128*4d6fc14bSjoerg    void open(const filesystem::path& p,
129*4d6fc14bSjoerg              ios_base::openmode mode = ios_base::out); // C++17
130*4d6fc14bSjoerg
131*4d6fc14bSjoerg    void close();
132*4d6fc14bSjoerg};
133*4d6fc14bSjoerg
134*4d6fc14bSjoergtemplate <class charT, class traits>
135*4d6fc14bSjoerg  void
136*4d6fc14bSjoerg  swap(basic_ofstream<charT, traits>& x, basic_ofstream<charT, traits>& y);
137*4d6fc14bSjoerg
138*4d6fc14bSjoergtypedef basic_ofstream<char>    ofstream;
139*4d6fc14bSjoergtypedef basic_ofstream<wchar_t> wofstream;
140*4d6fc14bSjoerg
141*4d6fc14bSjoergtemplate <class charT, class traits=char_traits<charT> >
142*4d6fc14bSjoergclass basic_fstream
143*4d6fc14bSjoerg    : public basic_iostream<charT,traits>
144*4d6fc14bSjoerg{
145*4d6fc14bSjoergpublic:
146*4d6fc14bSjoerg    typedef charT                          char_type;
147*4d6fc14bSjoerg    typedef traits                         traits_type;
148*4d6fc14bSjoerg    typedef typename traits_type::int_type int_type;
149*4d6fc14bSjoerg    typedef typename traits_type::pos_type pos_type;
150*4d6fc14bSjoerg    typedef typename traits_type::off_type off_type;
151*4d6fc14bSjoerg
152*4d6fc14bSjoerg    basic_fstream();
153*4d6fc14bSjoerg    explicit basic_fstream(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out);
154*4d6fc14bSjoerg    explicit basic_fstream(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out);
155*4d6fc14bSjoerg    explicit basic_fstream(const filesystem::path& p,
156*4d6fc14bSjoerg                           ios_base::openmode mode = ios_base::in|ios_base::out); C++17
157*4d6fc14bSjoerg    basic_fstream(basic_fstream&& rhs);
158*4d6fc14bSjoerg
159*4d6fc14bSjoerg    basic_fstream& operator=(basic_fstream&& rhs);
160*4d6fc14bSjoerg    void swap(basic_fstream& rhs);
161*4d6fc14bSjoerg
162*4d6fc14bSjoerg    basic_filebuf<char_type, traits_type>* rdbuf() const;
163*4d6fc14bSjoerg    bool is_open() const;
164*4d6fc14bSjoerg    void open(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out);
165*4d6fc14bSjoerg    void open(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out);
166*4d6fc14bSjoerg    void open(const filesystem::path& s,
167*4d6fc14bSjoerg              ios_base::openmode mode = ios_base::in|ios_base::out); // C++17
168*4d6fc14bSjoerg
169*4d6fc14bSjoerg    void close();
170*4d6fc14bSjoerg};
171*4d6fc14bSjoerg
172*4d6fc14bSjoergtemplate <class charT, class traits>
173*4d6fc14bSjoerg  void swap(basic_fstream<charT, traits>& x, basic_fstream<charT, traits>& y);
174*4d6fc14bSjoerg
175*4d6fc14bSjoergtypedef basic_fstream<char>    fstream;
176*4d6fc14bSjoergtypedef basic_fstream<wchar_t> wfstream;
177*4d6fc14bSjoerg
178*4d6fc14bSjoerg}  // std
179*4d6fc14bSjoerg
180*4d6fc14bSjoerg*/
181*4d6fc14bSjoerg
182*4d6fc14bSjoerg#include <__config>
183*4d6fc14bSjoerg#include <__availability>
184*4d6fc14bSjoerg#include <__debug>
185*4d6fc14bSjoerg#include <__locale>
186*4d6fc14bSjoerg#include <cstdio>
187*4d6fc14bSjoerg#include <cstdlib>
188*4d6fc14bSjoerg#include <istream>
189*4d6fc14bSjoerg#include <ostream>
190*4d6fc14bSjoerg
191*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
192*4d6fc14bSjoerg#   include <filesystem>
193*4d6fc14bSjoerg#endif
194*4d6fc14bSjoerg
195*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
196*4d6fc14bSjoerg#pragma GCC system_header
197*4d6fc14bSjoerg#endif
198*4d6fc14bSjoerg
199*4d6fc14bSjoerg_LIBCPP_PUSH_MACROS
200*4d6fc14bSjoerg#include <__undef_macros>
201*4d6fc14bSjoerg
202*4d6fc14bSjoerg#if defined(_LIBCPP_MSVCRT) || defined(_NEWLIB_VERSION)
203*4d6fc14bSjoerg#  define _LIBCPP_HAS_NO_OFF_T_FUNCTIONS
204*4d6fc14bSjoerg#endif
205*4d6fc14bSjoerg
206*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD
207*4d6fc14bSjoerg
208*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
209*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS basic_filebuf
210*4d6fc14bSjoerg    : public basic_streambuf<_CharT, _Traits>
211*4d6fc14bSjoerg{
212*4d6fc14bSjoergpublic:
213*4d6fc14bSjoerg    typedef _CharT                           char_type;
214*4d6fc14bSjoerg    typedef _Traits                          traits_type;
215*4d6fc14bSjoerg    typedef typename traits_type::int_type   int_type;
216*4d6fc14bSjoerg    typedef typename traits_type::pos_type   pos_type;
217*4d6fc14bSjoerg    typedef typename traits_type::off_type   off_type;
218*4d6fc14bSjoerg    typedef typename traits_type::state_type state_type;
219*4d6fc14bSjoerg
220*4d6fc14bSjoerg    // 27.9.1.2 Constructors/destructor:
221*4d6fc14bSjoerg    basic_filebuf();
222*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
223*4d6fc14bSjoerg    basic_filebuf(basic_filebuf&& __rhs);
224*4d6fc14bSjoerg#endif
225*4d6fc14bSjoerg    virtual ~basic_filebuf();
226*4d6fc14bSjoerg
227*4d6fc14bSjoerg    // 27.9.1.3 Assign/swap:
228*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
229*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
230*4d6fc14bSjoerg    basic_filebuf& operator=(basic_filebuf&& __rhs);
231*4d6fc14bSjoerg#endif
232*4d6fc14bSjoerg    void swap(basic_filebuf& __rhs);
233*4d6fc14bSjoerg
234*4d6fc14bSjoerg    // 27.9.1.4 Members:
235*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
236*4d6fc14bSjoerg    bool is_open() const;
237*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
238*4d6fc14bSjoerg    basic_filebuf* open(const char* __s, ios_base::openmode __mode);
239*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
240*4d6fc14bSjoerg    basic_filebuf* open(const wchar_t* __s, ios_base::openmode __mode);
241*4d6fc14bSjoerg#endif
242*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
243*4d6fc14bSjoerg    basic_filebuf* open(const string& __s, ios_base::openmode __mode);
244*4d6fc14bSjoerg
245*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
246*4d6fc14bSjoerg    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
247*4d6fc14bSjoerg    basic_filebuf* open(const _VSTD_FS::path& __p, ios_base::openmode __mode) {
248*4d6fc14bSjoerg      return open(__p.c_str(), __mode);
249*4d6fc14bSjoerg    }
250*4d6fc14bSjoerg#endif
251*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
252*4d6fc14bSjoerg    basic_filebuf* __open(int __fd, ios_base::openmode __mode);
253*4d6fc14bSjoerg#endif
254*4d6fc14bSjoerg    basic_filebuf* close();
255*4d6fc14bSjoerg
256*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
257*4d6fc14bSjoerg    inline static const char*
258*4d6fc14bSjoerg    __make_mdstring(ios_base::openmode __mode) _NOEXCEPT;
259*4d6fc14bSjoerg
260*4d6fc14bSjoerg  protected:
261*4d6fc14bSjoerg    // 27.9.1.5 Overridden virtual functions:
262*4d6fc14bSjoerg    virtual int_type underflow();
263*4d6fc14bSjoerg    virtual int_type pbackfail(int_type __c = traits_type::eof());
264*4d6fc14bSjoerg    virtual int_type overflow (int_type __c = traits_type::eof());
265*4d6fc14bSjoerg    virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* __s, streamsize __n);
266*4d6fc14bSjoerg    virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
267*4d6fc14bSjoerg                             ios_base::openmode __wch = ios_base::in | ios_base::out);
268*4d6fc14bSjoerg    virtual pos_type seekpos(pos_type __sp,
269*4d6fc14bSjoerg                             ios_base::openmode __wch = ios_base::in | ios_base::out);
270*4d6fc14bSjoerg    virtual int sync();
271*4d6fc14bSjoerg    virtual void imbue(const locale& __loc);
272*4d6fc14bSjoerg
273*4d6fc14bSjoergprivate:
274*4d6fc14bSjoerg  char* __extbuf_;
275*4d6fc14bSjoerg  const char* __extbufnext_;
276*4d6fc14bSjoerg  const char* __extbufend_;
277*4d6fc14bSjoerg  char __extbuf_min_[8];
278*4d6fc14bSjoerg  size_t __ebs_;
279*4d6fc14bSjoerg  char_type* __intbuf_;
280*4d6fc14bSjoerg  size_t __ibs_;
281*4d6fc14bSjoerg  FILE* __file_;
282*4d6fc14bSjoerg  const codecvt<char_type, char, state_type>* __cv_;
283*4d6fc14bSjoerg  state_type __st_;
284*4d6fc14bSjoerg  state_type __st_last_;
285*4d6fc14bSjoerg  ios_base::openmode __om_;
286*4d6fc14bSjoerg  ios_base::openmode __cm_;
287*4d6fc14bSjoerg  bool __owns_eb_;
288*4d6fc14bSjoerg  bool __owns_ib_;
289*4d6fc14bSjoerg  bool __always_noconv_;
290*4d6fc14bSjoerg
291*4d6fc14bSjoerg  bool __read_mode();
292*4d6fc14bSjoerg  void __write_mode();
293*4d6fc14bSjoerg};
294*4d6fc14bSjoerg
295*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
296*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::basic_filebuf()
297*4d6fc14bSjoerg    : __extbuf_(nullptr),
298*4d6fc14bSjoerg      __extbufnext_(nullptr),
299*4d6fc14bSjoerg      __extbufend_(nullptr),
300*4d6fc14bSjoerg      __ebs_(0),
301*4d6fc14bSjoerg      __intbuf_(nullptr),
302*4d6fc14bSjoerg      __ibs_(0),
303*4d6fc14bSjoerg      __file_(nullptr),
304*4d6fc14bSjoerg      __cv_(nullptr),
305*4d6fc14bSjoerg      __st_(),
306*4d6fc14bSjoerg      __st_last_(),
307*4d6fc14bSjoerg      __om_(0),
308*4d6fc14bSjoerg      __cm_(0),
309*4d6fc14bSjoerg      __owns_eb_(false),
310*4d6fc14bSjoerg      __owns_ib_(false),
311*4d6fc14bSjoerg      __always_noconv_(false)
312*4d6fc14bSjoerg{
313*4d6fc14bSjoerg    if (has_facet<codecvt<char_type, char, state_type> >(this->getloc()))
314*4d6fc14bSjoerg    {
315*4d6fc14bSjoerg        __cv_ = &use_facet<codecvt<char_type, char, state_type> >(this->getloc());
316*4d6fc14bSjoerg        __always_noconv_ = __cv_->always_noconv();
317*4d6fc14bSjoerg    }
318*4d6fc14bSjoerg    setbuf(nullptr, 4096);
319*4d6fc14bSjoerg}
320*4d6fc14bSjoerg
321*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
322*4d6fc14bSjoerg
323*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
324*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::basic_filebuf(basic_filebuf&& __rhs)
325*4d6fc14bSjoerg    : basic_streambuf<_CharT, _Traits>(__rhs)
326*4d6fc14bSjoerg{
327*4d6fc14bSjoerg    if (__rhs.__extbuf_ == __rhs.__extbuf_min_)
328*4d6fc14bSjoerg    {
329*4d6fc14bSjoerg        __extbuf_ = __extbuf_min_;
330*4d6fc14bSjoerg        __extbufnext_ = __extbuf_ + (__rhs.__extbufnext_ - __rhs.__extbuf_);
331*4d6fc14bSjoerg        __extbufend_ = __extbuf_ + (__rhs.__extbufend_ - __rhs.__extbuf_);
332*4d6fc14bSjoerg    }
333*4d6fc14bSjoerg    else
334*4d6fc14bSjoerg    {
335*4d6fc14bSjoerg        __extbuf_ = __rhs.__extbuf_;
336*4d6fc14bSjoerg        __extbufnext_ = __rhs.__extbufnext_;
337*4d6fc14bSjoerg        __extbufend_ = __rhs.__extbufend_;
338*4d6fc14bSjoerg    }
339*4d6fc14bSjoerg    __ebs_ = __rhs.__ebs_;
340*4d6fc14bSjoerg    __intbuf_ = __rhs.__intbuf_;
341*4d6fc14bSjoerg    __ibs_ = __rhs.__ibs_;
342*4d6fc14bSjoerg    __file_ = __rhs.__file_;
343*4d6fc14bSjoerg    __cv_ = __rhs.__cv_;
344*4d6fc14bSjoerg    __st_ = __rhs.__st_;
345*4d6fc14bSjoerg    __st_last_ = __rhs.__st_last_;
346*4d6fc14bSjoerg    __om_ = __rhs.__om_;
347*4d6fc14bSjoerg    __cm_ = __rhs.__cm_;
348*4d6fc14bSjoerg    __owns_eb_ = __rhs.__owns_eb_;
349*4d6fc14bSjoerg    __owns_ib_ = __rhs.__owns_ib_;
350*4d6fc14bSjoerg    __always_noconv_ = __rhs.__always_noconv_;
351*4d6fc14bSjoerg    if (__rhs.pbase())
352*4d6fc14bSjoerg    {
353*4d6fc14bSjoerg        if (__rhs.pbase() == __rhs.__intbuf_)
354*4d6fc14bSjoerg            this->setp(__intbuf_, __intbuf_ + (__rhs. epptr() - __rhs.pbase()));
355*4d6fc14bSjoerg        else
356*4d6fc14bSjoerg            this->setp((char_type*)__extbuf_,
357*4d6fc14bSjoerg                       (char_type*)__extbuf_ + (__rhs. epptr() - __rhs.pbase()));
358*4d6fc14bSjoerg        this->__pbump(__rhs. pptr() - __rhs.pbase());
359*4d6fc14bSjoerg    }
360*4d6fc14bSjoerg    else if (__rhs.eback())
361*4d6fc14bSjoerg    {
362*4d6fc14bSjoerg        if (__rhs.eback() == __rhs.__intbuf_)
363*4d6fc14bSjoerg            this->setg(__intbuf_, __intbuf_ + (__rhs.gptr() - __rhs.eback()),
364*4d6fc14bSjoerg                                  __intbuf_ + (__rhs.egptr() - __rhs.eback()));
365*4d6fc14bSjoerg        else
366*4d6fc14bSjoerg            this->setg((char_type*)__extbuf_,
367*4d6fc14bSjoerg                       (char_type*)__extbuf_ + (__rhs.gptr() - __rhs.eback()),
368*4d6fc14bSjoerg                       (char_type*)__extbuf_ + (__rhs.egptr() - __rhs.eback()));
369*4d6fc14bSjoerg    }
370*4d6fc14bSjoerg    __rhs.__extbuf_ = nullptr;
371*4d6fc14bSjoerg    __rhs.__extbufnext_ = nullptr;
372*4d6fc14bSjoerg    __rhs.__extbufend_ = nullptr;
373*4d6fc14bSjoerg    __rhs.__ebs_ = 0;
374*4d6fc14bSjoerg    __rhs.__intbuf_ = 0;
375*4d6fc14bSjoerg    __rhs.__ibs_ = 0;
376*4d6fc14bSjoerg    __rhs.__file_ = nullptr;
377*4d6fc14bSjoerg    __rhs.__st_ = state_type();
378*4d6fc14bSjoerg    __rhs.__st_last_ = state_type();
379*4d6fc14bSjoerg    __rhs.__om_ = 0;
380*4d6fc14bSjoerg    __rhs.__cm_ = 0;
381*4d6fc14bSjoerg    __rhs.__owns_eb_ = false;
382*4d6fc14bSjoerg    __rhs.__owns_ib_ = false;
383*4d6fc14bSjoerg    __rhs.setg(0, 0, 0);
384*4d6fc14bSjoerg    __rhs.setp(0, 0);
385*4d6fc14bSjoerg}
386*4d6fc14bSjoerg
387*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
388*4d6fc14bSjoerginline
389*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>&
390*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::operator=(basic_filebuf&& __rhs)
391*4d6fc14bSjoerg{
392*4d6fc14bSjoerg    close();
393*4d6fc14bSjoerg    swap(__rhs);
394*4d6fc14bSjoerg    return *this;
395*4d6fc14bSjoerg}
396*4d6fc14bSjoerg
397*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG
398*4d6fc14bSjoerg
399*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
400*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::~basic_filebuf()
401*4d6fc14bSjoerg{
402*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
403*4d6fc14bSjoerg    try
404*4d6fc14bSjoerg    {
405*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
406*4d6fc14bSjoerg        close();
407*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS
408*4d6fc14bSjoerg    }
409*4d6fc14bSjoerg    catch (...)
410*4d6fc14bSjoerg    {
411*4d6fc14bSjoerg    }
412*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS
413*4d6fc14bSjoerg    if (__owns_eb_)
414*4d6fc14bSjoerg        delete [] __extbuf_;
415*4d6fc14bSjoerg    if (__owns_ib_)
416*4d6fc14bSjoerg        delete [] __intbuf_;
417*4d6fc14bSjoerg}
418*4d6fc14bSjoerg
419*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
420*4d6fc14bSjoergvoid
421*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::swap(basic_filebuf& __rhs)
422*4d6fc14bSjoerg{
423*4d6fc14bSjoerg    basic_streambuf<char_type, traits_type>::swap(__rhs);
424*4d6fc14bSjoerg    if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_)
425*4d6fc14bSjoerg    {
426*4d6fc14bSjoerg        _VSTD::swap(__extbuf_, __rhs.__extbuf_);
427*4d6fc14bSjoerg        _VSTD::swap(__extbufnext_, __rhs.__extbufnext_);
428*4d6fc14bSjoerg        _VSTD::swap(__extbufend_, __rhs.__extbufend_);
429*4d6fc14bSjoerg    }
430*4d6fc14bSjoerg    else
431*4d6fc14bSjoerg    {
432*4d6fc14bSjoerg        ptrdiff_t __ln = __extbufnext_ - __extbuf_;
433*4d6fc14bSjoerg        ptrdiff_t __le = __extbufend_ - __extbuf_;
434*4d6fc14bSjoerg        ptrdiff_t __rn = __rhs.__extbufnext_ - __rhs.__extbuf_;
435*4d6fc14bSjoerg        ptrdiff_t __re = __rhs.__extbufend_ - __rhs.__extbuf_;
436*4d6fc14bSjoerg        if (__extbuf_ == __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_)
437*4d6fc14bSjoerg        {
438*4d6fc14bSjoerg            __extbuf_ = __rhs.__extbuf_;
439*4d6fc14bSjoerg            __rhs.__extbuf_ = __rhs.__extbuf_min_;
440*4d6fc14bSjoerg        }
441*4d6fc14bSjoerg        else if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ == __rhs.__extbuf_min_)
442*4d6fc14bSjoerg        {
443*4d6fc14bSjoerg            __rhs.__extbuf_ = __extbuf_;
444*4d6fc14bSjoerg            __extbuf_ = __extbuf_min_;
445*4d6fc14bSjoerg        }
446*4d6fc14bSjoerg        __extbufnext_ = __extbuf_ + __rn;
447*4d6fc14bSjoerg        __extbufend_ = __extbuf_ + __re;
448*4d6fc14bSjoerg        __rhs.__extbufnext_ = __rhs.__extbuf_ + __ln;
449*4d6fc14bSjoerg        __rhs.__extbufend_ = __rhs.__extbuf_ + __le;
450*4d6fc14bSjoerg    }
451*4d6fc14bSjoerg    _VSTD::swap(__ebs_, __rhs.__ebs_);
452*4d6fc14bSjoerg    _VSTD::swap(__intbuf_, __rhs.__intbuf_);
453*4d6fc14bSjoerg    _VSTD::swap(__ibs_, __rhs.__ibs_);
454*4d6fc14bSjoerg    _VSTD::swap(__file_, __rhs.__file_);
455*4d6fc14bSjoerg    _VSTD::swap(__cv_, __rhs.__cv_);
456*4d6fc14bSjoerg    _VSTD::swap(__st_, __rhs.__st_);
457*4d6fc14bSjoerg    _VSTD::swap(__st_last_, __rhs.__st_last_);
458*4d6fc14bSjoerg    _VSTD::swap(__om_, __rhs.__om_);
459*4d6fc14bSjoerg    _VSTD::swap(__cm_, __rhs.__cm_);
460*4d6fc14bSjoerg    _VSTD::swap(__owns_eb_, __rhs.__owns_eb_);
461*4d6fc14bSjoerg    _VSTD::swap(__owns_ib_, __rhs.__owns_ib_);
462*4d6fc14bSjoerg    _VSTD::swap(__always_noconv_, __rhs.__always_noconv_);
463*4d6fc14bSjoerg    if (this->eback() == (char_type*)__rhs.__extbuf_min_)
464*4d6fc14bSjoerg    {
465*4d6fc14bSjoerg        ptrdiff_t __n = this->gptr() - this->eback();
466*4d6fc14bSjoerg        ptrdiff_t __e = this->egptr() - this->eback();
467*4d6fc14bSjoerg        this->setg((char_type*)__extbuf_min_,
468*4d6fc14bSjoerg                   (char_type*)__extbuf_min_ + __n,
469*4d6fc14bSjoerg                   (char_type*)__extbuf_min_ + __e);
470*4d6fc14bSjoerg    }
471*4d6fc14bSjoerg    else if (this->pbase() == (char_type*)__rhs.__extbuf_min_)
472*4d6fc14bSjoerg    {
473*4d6fc14bSjoerg        ptrdiff_t __n = this->pptr() - this->pbase();
474*4d6fc14bSjoerg        ptrdiff_t __e = this->epptr() - this->pbase();
475*4d6fc14bSjoerg        this->setp((char_type*)__extbuf_min_,
476*4d6fc14bSjoerg                   (char_type*)__extbuf_min_ + __e);
477*4d6fc14bSjoerg        this->__pbump(__n);
478*4d6fc14bSjoerg    }
479*4d6fc14bSjoerg    if (__rhs.eback() == (char_type*)__extbuf_min_)
480*4d6fc14bSjoerg    {
481*4d6fc14bSjoerg        ptrdiff_t __n = __rhs.gptr() - __rhs.eback();
482*4d6fc14bSjoerg        ptrdiff_t __e = __rhs.egptr() - __rhs.eback();
483*4d6fc14bSjoerg        __rhs.setg((char_type*)__rhs.__extbuf_min_,
484*4d6fc14bSjoerg                   (char_type*)__rhs.__extbuf_min_ + __n,
485*4d6fc14bSjoerg                   (char_type*)__rhs.__extbuf_min_ + __e);
486*4d6fc14bSjoerg    }
487*4d6fc14bSjoerg    else if (__rhs.pbase() == (char_type*)__extbuf_min_)
488*4d6fc14bSjoerg    {
489*4d6fc14bSjoerg        ptrdiff_t __n = __rhs.pptr() - __rhs.pbase();
490*4d6fc14bSjoerg        ptrdiff_t __e = __rhs.epptr() - __rhs.pbase();
491*4d6fc14bSjoerg        __rhs.setp((char_type*)__rhs.__extbuf_min_,
492*4d6fc14bSjoerg                   (char_type*)__rhs.__extbuf_min_ + __e);
493*4d6fc14bSjoerg        __rhs.__pbump(__n);
494*4d6fc14bSjoerg    }
495*4d6fc14bSjoerg}
496*4d6fc14bSjoerg
497*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
498*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY
499*4d6fc14bSjoergvoid
500*4d6fc14bSjoergswap(basic_filebuf<_CharT, _Traits>& __x, basic_filebuf<_CharT, _Traits>& __y)
501*4d6fc14bSjoerg{
502*4d6fc14bSjoerg    __x.swap(__y);
503*4d6fc14bSjoerg}
504*4d6fc14bSjoerg
505*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
506*4d6fc14bSjoerginline
507*4d6fc14bSjoergbool
508*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::is_open() const
509*4d6fc14bSjoerg{
510*4d6fc14bSjoerg    return __file_ != nullptr;
511*4d6fc14bSjoerg}
512*4d6fc14bSjoerg
513*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
514*4d6fc14bSjoergconst char* basic_filebuf<_CharT, _Traits>::__make_mdstring(
515*4d6fc14bSjoerg    ios_base::openmode __mode) _NOEXCEPT {
516*4d6fc14bSjoerg  switch (__mode & ~ios_base::ate) {
517*4d6fc14bSjoerg  case ios_base::out:
518*4d6fc14bSjoerg  case ios_base::out | ios_base::trunc:
519*4d6fc14bSjoerg    return "w" _LIBCPP_FOPEN_CLOEXEC_MODE;
520*4d6fc14bSjoerg  case ios_base::out | ios_base::app:
521*4d6fc14bSjoerg  case ios_base::app:
522*4d6fc14bSjoerg    return "a" _LIBCPP_FOPEN_CLOEXEC_MODE;
523*4d6fc14bSjoerg  case ios_base::in:
524*4d6fc14bSjoerg    return "r" _LIBCPP_FOPEN_CLOEXEC_MODE;
525*4d6fc14bSjoerg  case ios_base::in | ios_base::out:
526*4d6fc14bSjoerg    return "r+" _LIBCPP_FOPEN_CLOEXEC_MODE;
527*4d6fc14bSjoerg  case ios_base::in | ios_base::out | ios_base::trunc:
528*4d6fc14bSjoerg    return "w+" _LIBCPP_FOPEN_CLOEXEC_MODE;
529*4d6fc14bSjoerg  case ios_base::in | ios_base::out | ios_base::app:
530*4d6fc14bSjoerg  case ios_base::in | ios_base::app:
531*4d6fc14bSjoerg    return "a+" _LIBCPP_FOPEN_CLOEXEC_MODE;
532*4d6fc14bSjoerg  case ios_base::out | ios_base::binary:
533*4d6fc14bSjoerg  case ios_base::out | ios_base::trunc | ios_base::binary:
534*4d6fc14bSjoerg    return "wb" _LIBCPP_FOPEN_CLOEXEC_MODE;
535*4d6fc14bSjoerg  case ios_base::out | ios_base::app | ios_base::binary:
536*4d6fc14bSjoerg  case ios_base::app | ios_base::binary:
537*4d6fc14bSjoerg    return "ab" _LIBCPP_FOPEN_CLOEXEC_MODE;
538*4d6fc14bSjoerg  case ios_base::in | ios_base::binary:
539*4d6fc14bSjoerg    return "rb" _LIBCPP_FOPEN_CLOEXEC_MODE;
540*4d6fc14bSjoerg  case ios_base::in | ios_base::out | ios_base::binary:
541*4d6fc14bSjoerg    return "r+b" _LIBCPP_FOPEN_CLOEXEC_MODE;
542*4d6fc14bSjoerg  case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary:
543*4d6fc14bSjoerg    return "w+b" _LIBCPP_FOPEN_CLOEXEC_MODE;
544*4d6fc14bSjoerg  case ios_base::in | ios_base::out | ios_base::app | ios_base::binary:
545*4d6fc14bSjoerg  case ios_base::in | ios_base::app | ios_base::binary:
546*4d6fc14bSjoerg    return "a+b" _LIBCPP_FOPEN_CLOEXEC_MODE;
547*4d6fc14bSjoerg  default:
548*4d6fc14bSjoerg    return nullptr;
549*4d6fc14bSjoerg  }
550*4d6fc14bSjoerg  _LIBCPP_UNREACHABLE();
551*4d6fc14bSjoerg}
552*4d6fc14bSjoerg
553*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
554*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
555*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>*
556*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
557*4d6fc14bSjoerg{
558*4d6fc14bSjoerg    basic_filebuf<_CharT, _Traits>* __rt = nullptr;
559*4d6fc14bSjoerg    if (__file_ == nullptr)
560*4d6fc14bSjoerg    {
561*4d6fc14bSjoerg      if (const char* __mdstr = __make_mdstring(__mode)) {
562*4d6fc14bSjoerg        __rt = this;
563*4d6fc14bSjoerg        __file_ = fopen(__s, __mdstr);
564*4d6fc14bSjoerg        if (__file_) {
565*4d6fc14bSjoerg          __om_ = __mode;
566*4d6fc14bSjoerg          if (__mode & ios_base::ate) {
567*4d6fc14bSjoerg            if (fseek(__file_, 0, SEEK_END)) {
568*4d6fc14bSjoerg              fclose(__file_);
569*4d6fc14bSjoerg              __file_ = nullptr;
570*4d6fc14bSjoerg              __rt = nullptr;
571*4d6fc14bSjoerg            }
572*4d6fc14bSjoerg          }
573*4d6fc14bSjoerg        } else
574*4d6fc14bSjoerg          __rt = nullptr;
575*4d6fc14bSjoerg      }
576*4d6fc14bSjoerg    }
577*4d6fc14bSjoerg    return __rt;
578*4d6fc14bSjoerg}
579*4d6fc14bSjoerg
580*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
581*4d6fc14bSjoerginline
582*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>*
583*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::__open(int __fd, ios_base::openmode __mode) {
584*4d6fc14bSjoerg  basic_filebuf<_CharT, _Traits>* __rt = nullptr;
585*4d6fc14bSjoerg  if (__file_ == nullptr) {
586*4d6fc14bSjoerg    if (const char* __mdstr = __make_mdstring(__mode)) {
587*4d6fc14bSjoerg      __rt = this;
588*4d6fc14bSjoerg      __file_ = fdopen(__fd, __mdstr);
589*4d6fc14bSjoerg      if (__file_) {
590*4d6fc14bSjoerg        __om_ = __mode;
591*4d6fc14bSjoerg        if (__mode & ios_base::ate) {
592*4d6fc14bSjoerg          if (fseek(__file_, 0, SEEK_END)) {
593*4d6fc14bSjoerg            fclose(__file_);
594*4d6fc14bSjoerg            __file_ = nullptr;
595*4d6fc14bSjoerg            __rt = nullptr;
596*4d6fc14bSjoerg          }
597*4d6fc14bSjoerg        }
598*4d6fc14bSjoerg      } else
599*4d6fc14bSjoerg        __rt = nullptr;
600*4d6fc14bSjoerg    }
601*4d6fc14bSjoerg  }
602*4d6fc14bSjoerg  return __rt;
603*4d6fc14bSjoerg}
604*4d6fc14bSjoerg
605*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
606*4d6fc14bSjoerg// This is basically the same as the char* overload except that it uses _wfopen
607*4d6fc14bSjoerg// and long mode strings.
608*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
609*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>*
610*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
611*4d6fc14bSjoerg{
612*4d6fc14bSjoerg    basic_filebuf<_CharT, _Traits>* __rt = nullptr;
613*4d6fc14bSjoerg    if (__file_ == nullptr)
614*4d6fc14bSjoerg    {
615*4d6fc14bSjoerg        __rt = this;
616*4d6fc14bSjoerg        const wchar_t* __mdstr;
617*4d6fc14bSjoerg        switch (__mode & ~ios_base::ate)
618*4d6fc14bSjoerg        {
619*4d6fc14bSjoerg        case ios_base::out:
620*4d6fc14bSjoerg        case ios_base::out | ios_base::trunc:
621*4d6fc14bSjoerg            __mdstr = L"w";
622*4d6fc14bSjoerg            break;
623*4d6fc14bSjoerg        case ios_base::out | ios_base::app:
624*4d6fc14bSjoerg        case ios_base::app:
625*4d6fc14bSjoerg            __mdstr = L"a";
626*4d6fc14bSjoerg            break;
627*4d6fc14bSjoerg        case ios_base::in:
628*4d6fc14bSjoerg            __mdstr = L"r";
629*4d6fc14bSjoerg            break;
630*4d6fc14bSjoerg        case ios_base::in | ios_base::out:
631*4d6fc14bSjoerg            __mdstr = L"r+";
632*4d6fc14bSjoerg            break;
633*4d6fc14bSjoerg        case ios_base::in | ios_base::out | ios_base::trunc:
634*4d6fc14bSjoerg            __mdstr = L"w+";
635*4d6fc14bSjoerg            break;
636*4d6fc14bSjoerg        case ios_base::in | ios_base::out | ios_base::app:
637*4d6fc14bSjoerg        case ios_base::in | ios_base::app:
638*4d6fc14bSjoerg            __mdstr = L"a+";
639*4d6fc14bSjoerg            break;
640*4d6fc14bSjoerg        case ios_base::out | ios_base::binary:
641*4d6fc14bSjoerg        case ios_base::out | ios_base::trunc | ios_base::binary:
642*4d6fc14bSjoerg            __mdstr = L"wb";
643*4d6fc14bSjoerg            break;
644*4d6fc14bSjoerg        case ios_base::out | ios_base::app | ios_base::binary:
645*4d6fc14bSjoerg        case ios_base::app | ios_base::binary:
646*4d6fc14bSjoerg            __mdstr = L"ab";
647*4d6fc14bSjoerg            break;
648*4d6fc14bSjoerg        case ios_base::in | ios_base::binary:
649*4d6fc14bSjoerg            __mdstr = L"rb";
650*4d6fc14bSjoerg            break;
651*4d6fc14bSjoerg        case ios_base::in | ios_base::out | ios_base::binary:
652*4d6fc14bSjoerg            __mdstr = L"r+b";
653*4d6fc14bSjoerg            break;
654*4d6fc14bSjoerg        case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary:
655*4d6fc14bSjoerg            __mdstr = L"w+b";
656*4d6fc14bSjoerg            break;
657*4d6fc14bSjoerg        case ios_base::in | ios_base::out | ios_base::app | ios_base::binary:
658*4d6fc14bSjoerg        case ios_base::in | ios_base::app | ios_base::binary:
659*4d6fc14bSjoerg            __mdstr = L"a+b";
660*4d6fc14bSjoerg            break;
661*4d6fc14bSjoerg        default:
662*4d6fc14bSjoerg            __rt = nullptr;
663*4d6fc14bSjoerg            break;
664*4d6fc14bSjoerg        }
665*4d6fc14bSjoerg        if (__rt)
666*4d6fc14bSjoerg        {
667*4d6fc14bSjoerg            __file_ = _wfopen(__s, __mdstr);
668*4d6fc14bSjoerg            if (__file_)
669*4d6fc14bSjoerg            {
670*4d6fc14bSjoerg                __om_ = __mode;
671*4d6fc14bSjoerg                if (__mode & ios_base::ate)
672*4d6fc14bSjoerg                {
673*4d6fc14bSjoerg                    if (fseek(__file_, 0, SEEK_END))
674*4d6fc14bSjoerg                    {
675*4d6fc14bSjoerg                        fclose(__file_);
676*4d6fc14bSjoerg                        __file_ = nullptr;
677*4d6fc14bSjoerg                        __rt = nullptr;
678*4d6fc14bSjoerg                    }
679*4d6fc14bSjoerg                }
680*4d6fc14bSjoerg            }
681*4d6fc14bSjoerg            else
682*4d6fc14bSjoerg                __rt = nullptr;
683*4d6fc14bSjoerg        }
684*4d6fc14bSjoerg    }
685*4d6fc14bSjoerg    return __rt;
686*4d6fc14bSjoerg}
687*4d6fc14bSjoerg#endif
688*4d6fc14bSjoerg
689*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
690*4d6fc14bSjoerginline
691*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>*
692*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
693*4d6fc14bSjoerg{
694*4d6fc14bSjoerg    return open(__s.c_str(), __mode);
695*4d6fc14bSjoerg}
696*4d6fc14bSjoerg#endif
697*4d6fc14bSjoerg
698*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
699*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>*
700*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::close()
701*4d6fc14bSjoerg{
702*4d6fc14bSjoerg    basic_filebuf<_CharT, _Traits>* __rt = nullptr;
703*4d6fc14bSjoerg    if (__file_)
704*4d6fc14bSjoerg    {
705*4d6fc14bSjoerg        __rt = this;
706*4d6fc14bSjoerg        unique_ptr<FILE, int(*)(FILE*)> __h(__file_, fclose);
707*4d6fc14bSjoerg        if (sync())
708*4d6fc14bSjoerg            __rt = nullptr;
709*4d6fc14bSjoerg        if (fclose(__h.release()))
710*4d6fc14bSjoerg            __rt = nullptr;
711*4d6fc14bSjoerg        __file_ = nullptr;
712*4d6fc14bSjoerg        setbuf(0, 0);
713*4d6fc14bSjoerg    }
714*4d6fc14bSjoerg    return __rt;
715*4d6fc14bSjoerg}
716*4d6fc14bSjoerg
717*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
718*4d6fc14bSjoergtypename basic_filebuf<_CharT, _Traits>::int_type
719*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::underflow()
720*4d6fc14bSjoerg{
721*4d6fc14bSjoerg    if (__file_ == nullptr)
722*4d6fc14bSjoerg        return traits_type::eof();
723*4d6fc14bSjoerg    bool __initial = __read_mode();
724*4d6fc14bSjoerg    char_type __1buf;
725*4d6fc14bSjoerg    if (this->gptr() == nullptr)
726*4d6fc14bSjoerg        this->setg(&__1buf, &__1buf+1, &__1buf+1);
727*4d6fc14bSjoerg    const size_t __unget_sz = __initial ? 0 : min<size_t>((this->egptr() - this->eback()) / 2, 4);
728*4d6fc14bSjoerg    int_type __c = traits_type::eof();
729*4d6fc14bSjoerg    if (this->gptr() == this->egptr())
730*4d6fc14bSjoerg    {
731*4d6fc14bSjoerg        _VSTD::memmove(this->eback(), this->egptr() - __unget_sz, __unget_sz * sizeof(char_type));
732*4d6fc14bSjoerg        if (__always_noconv_)
733*4d6fc14bSjoerg        {
734*4d6fc14bSjoerg            size_t __nmemb = static_cast<size_t>(this->egptr() - this->eback() - __unget_sz);
735*4d6fc14bSjoerg            __nmemb = fread(this->eback() + __unget_sz, 1, __nmemb, __file_);
736*4d6fc14bSjoerg            if (__nmemb != 0)
737*4d6fc14bSjoerg            {
738*4d6fc14bSjoerg                this->setg(this->eback(),
739*4d6fc14bSjoerg                           this->eback() + __unget_sz,
740*4d6fc14bSjoerg                           this->eback() + __unget_sz + __nmemb);
741*4d6fc14bSjoerg                __c = traits_type::to_int_type(*this->gptr());
742*4d6fc14bSjoerg            }
743*4d6fc14bSjoerg        }
744*4d6fc14bSjoerg        else
745*4d6fc14bSjoerg        {
746*4d6fc14bSjoerg            _LIBCPP_ASSERT ( !(__extbufnext_ == NULL && (__extbufend_ != __extbufnext_)), "underflow moving from NULL" );
747*4d6fc14bSjoerg            if (__extbufend_ != __extbufnext_)
748*4d6fc14bSjoerg                _VSTD::memmove(__extbuf_, __extbufnext_, __extbufend_ - __extbufnext_);
749*4d6fc14bSjoerg            __extbufnext_ = __extbuf_ + (__extbufend_ - __extbufnext_);
750*4d6fc14bSjoerg            __extbufend_ = __extbuf_ + (__extbuf_ == __extbuf_min_ ? sizeof(__extbuf_min_) : __ebs_);
751*4d6fc14bSjoerg            size_t __nmemb = _VSTD::min(static_cast<size_t>(__ibs_ - __unget_sz),
752*4d6fc14bSjoerg                                 static_cast<size_t>(__extbufend_ - __extbufnext_));
753*4d6fc14bSjoerg            codecvt_base::result __r;
754*4d6fc14bSjoerg            __st_last_ = __st_;
755*4d6fc14bSjoerg            size_t __nr = fread((void*) const_cast<char *>(__extbufnext_), 1, __nmemb, __file_);
756*4d6fc14bSjoerg            if (__nr != 0)
757*4d6fc14bSjoerg            {
758*4d6fc14bSjoerg                if (!__cv_)
759*4d6fc14bSjoerg                    __throw_bad_cast();
760*4d6fc14bSjoerg
761*4d6fc14bSjoerg                __extbufend_ = __extbufnext_ + __nr;
762*4d6fc14bSjoerg                char_type*  __inext;
763*4d6fc14bSjoerg                __r = __cv_->in(__st_, __extbuf_, __extbufend_, __extbufnext_,
764*4d6fc14bSjoerg                                       this->eback() + __unget_sz,
765*4d6fc14bSjoerg                                       this->eback() + __ibs_, __inext);
766*4d6fc14bSjoerg                if (__r == codecvt_base::noconv)
767*4d6fc14bSjoerg                {
768*4d6fc14bSjoerg                    this->setg((char_type*)__extbuf_, (char_type*)__extbuf_,
769*4d6fc14bSjoerg                                          (char_type*)const_cast<char *>(__extbufend_));
770*4d6fc14bSjoerg                    __c = traits_type::to_int_type(*this->gptr());
771*4d6fc14bSjoerg                }
772*4d6fc14bSjoerg                else if (__inext != this->eback() + __unget_sz)
773*4d6fc14bSjoerg                {
774*4d6fc14bSjoerg                    this->setg(this->eback(), this->eback() + __unget_sz, __inext);
775*4d6fc14bSjoerg                    __c = traits_type::to_int_type(*this->gptr());
776*4d6fc14bSjoerg                }
777*4d6fc14bSjoerg            }
778*4d6fc14bSjoerg        }
779*4d6fc14bSjoerg    }
780*4d6fc14bSjoerg    else
781*4d6fc14bSjoerg        __c = traits_type::to_int_type(*this->gptr());
782*4d6fc14bSjoerg    if (this->eback() == &__1buf)
783*4d6fc14bSjoerg        this->setg(nullptr, nullptr, nullptr);
784*4d6fc14bSjoerg    return __c;
785*4d6fc14bSjoerg}
786*4d6fc14bSjoerg
787*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
788*4d6fc14bSjoergtypename basic_filebuf<_CharT, _Traits>::int_type
789*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::pbackfail(int_type __c)
790*4d6fc14bSjoerg{
791*4d6fc14bSjoerg    if (__file_ && this->eback() < this->gptr())
792*4d6fc14bSjoerg    {
793*4d6fc14bSjoerg        if (traits_type::eq_int_type(__c, traits_type::eof()))
794*4d6fc14bSjoerg        {
795*4d6fc14bSjoerg            this->gbump(-1);
796*4d6fc14bSjoerg            return traits_type::not_eof(__c);
797*4d6fc14bSjoerg        }
798*4d6fc14bSjoerg        if ((__om_ & ios_base::out) ||
799*4d6fc14bSjoerg            traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1]))
800*4d6fc14bSjoerg        {
801*4d6fc14bSjoerg            this->gbump(-1);
802*4d6fc14bSjoerg            *this->gptr() = traits_type::to_char_type(__c);
803*4d6fc14bSjoerg            return __c;
804*4d6fc14bSjoerg        }
805*4d6fc14bSjoerg    }
806*4d6fc14bSjoerg    return traits_type::eof();
807*4d6fc14bSjoerg}
808*4d6fc14bSjoerg
809*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
810*4d6fc14bSjoergtypename basic_filebuf<_CharT, _Traits>::int_type
811*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::overflow(int_type __c)
812*4d6fc14bSjoerg{
813*4d6fc14bSjoerg    if (__file_ == nullptr)
814*4d6fc14bSjoerg        return traits_type::eof();
815*4d6fc14bSjoerg    __write_mode();
816*4d6fc14bSjoerg    char_type __1buf;
817*4d6fc14bSjoerg    char_type* __pb_save = this->pbase();
818*4d6fc14bSjoerg    char_type* __epb_save = this->epptr();
819*4d6fc14bSjoerg    if (!traits_type::eq_int_type(__c, traits_type::eof()))
820*4d6fc14bSjoerg    {
821*4d6fc14bSjoerg        if (this->pptr() == nullptr)
822*4d6fc14bSjoerg            this->setp(&__1buf, &__1buf+1);
823*4d6fc14bSjoerg        *this->pptr() = traits_type::to_char_type(__c);
824*4d6fc14bSjoerg        this->pbump(1);
825*4d6fc14bSjoerg    }
826*4d6fc14bSjoerg    if (this->pptr() != this->pbase())
827*4d6fc14bSjoerg    {
828*4d6fc14bSjoerg        if (__always_noconv_)
829*4d6fc14bSjoerg        {
830*4d6fc14bSjoerg            size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase());
831*4d6fc14bSjoerg            if (fwrite(this->pbase(), sizeof(char_type), __nmemb, __file_) != __nmemb)
832*4d6fc14bSjoerg                return traits_type::eof();
833*4d6fc14bSjoerg        }
834*4d6fc14bSjoerg        else
835*4d6fc14bSjoerg        {
836*4d6fc14bSjoerg            char* __extbe = __extbuf_;
837*4d6fc14bSjoerg            codecvt_base::result __r;
838*4d6fc14bSjoerg            do
839*4d6fc14bSjoerg            {
840*4d6fc14bSjoerg                if (!__cv_)
841*4d6fc14bSjoerg                    __throw_bad_cast();
842*4d6fc14bSjoerg
843*4d6fc14bSjoerg                const char_type* __e;
844*4d6fc14bSjoerg                __r = __cv_->out(__st_, this->pbase(), this->pptr(), __e,
845*4d6fc14bSjoerg                                        __extbuf_, __extbuf_ + __ebs_, __extbe);
846*4d6fc14bSjoerg                if (__e == this->pbase())
847*4d6fc14bSjoerg                    return traits_type::eof();
848*4d6fc14bSjoerg                if (__r == codecvt_base::noconv)
849*4d6fc14bSjoerg                {
850*4d6fc14bSjoerg                    size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase());
851*4d6fc14bSjoerg                    if (fwrite(this->pbase(), 1, __nmemb, __file_) != __nmemb)
852*4d6fc14bSjoerg                        return traits_type::eof();
853*4d6fc14bSjoerg                }
854*4d6fc14bSjoerg                else if (__r == codecvt_base::ok || __r == codecvt_base::partial)
855*4d6fc14bSjoerg                {
856*4d6fc14bSjoerg                    size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_);
857*4d6fc14bSjoerg                    if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb)
858*4d6fc14bSjoerg                        return traits_type::eof();
859*4d6fc14bSjoerg                    if (__r == codecvt_base::partial)
860*4d6fc14bSjoerg                    {
861*4d6fc14bSjoerg                        this->setp(const_cast<char_type*>(__e), this->pptr());
862*4d6fc14bSjoerg                        this->__pbump(this->epptr() - this->pbase());
863*4d6fc14bSjoerg                    }
864*4d6fc14bSjoerg                }
865*4d6fc14bSjoerg                else
866*4d6fc14bSjoerg                    return traits_type::eof();
867*4d6fc14bSjoerg            } while (__r == codecvt_base::partial);
868*4d6fc14bSjoerg        }
869*4d6fc14bSjoerg        this->setp(__pb_save, __epb_save);
870*4d6fc14bSjoerg    }
871*4d6fc14bSjoerg    return traits_type::not_eof(__c);
872*4d6fc14bSjoerg}
873*4d6fc14bSjoerg
874*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
875*4d6fc14bSjoergbasic_streambuf<_CharT, _Traits>*
876*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::setbuf(char_type* __s, streamsize __n)
877*4d6fc14bSjoerg{
878*4d6fc14bSjoerg    this->setg(nullptr, nullptr, nullptr);
879*4d6fc14bSjoerg    this->setp(nullptr, nullptr);
880*4d6fc14bSjoerg    if (__owns_eb_)
881*4d6fc14bSjoerg        delete [] __extbuf_;
882*4d6fc14bSjoerg    if (__owns_ib_)
883*4d6fc14bSjoerg        delete [] __intbuf_;
884*4d6fc14bSjoerg    __ebs_ = __n;
885*4d6fc14bSjoerg    if (__ebs_ > sizeof(__extbuf_min_))
886*4d6fc14bSjoerg    {
887*4d6fc14bSjoerg        if (__always_noconv_ && __s)
888*4d6fc14bSjoerg        {
889*4d6fc14bSjoerg            __extbuf_ = (char*)__s;
890*4d6fc14bSjoerg            __owns_eb_ = false;
891*4d6fc14bSjoerg        }
892*4d6fc14bSjoerg        else
893*4d6fc14bSjoerg        {
894*4d6fc14bSjoerg            __extbuf_ = new char[__ebs_];
895*4d6fc14bSjoerg            __owns_eb_ = true;
896*4d6fc14bSjoerg        }
897*4d6fc14bSjoerg    }
898*4d6fc14bSjoerg    else
899*4d6fc14bSjoerg    {
900*4d6fc14bSjoerg        __extbuf_ = __extbuf_min_;
901*4d6fc14bSjoerg        __ebs_ = sizeof(__extbuf_min_);
902*4d6fc14bSjoerg        __owns_eb_ = false;
903*4d6fc14bSjoerg    }
904*4d6fc14bSjoerg    if (!__always_noconv_)
905*4d6fc14bSjoerg    {
906*4d6fc14bSjoerg        __ibs_ = max<streamsize>(__n, sizeof(__extbuf_min_));
907*4d6fc14bSjoerg        if (__s && __ibs_ >= sizeof(__extbuf_min_))
908*4d6fc14bSjoerg        {
909*4d6fc14bSjoerg            __intbuf_ = __s;
910*4d6fc14bSjoerg            __owns_ib_ = false;
911*4d6fc14bSjoerg        }
912*4d6fc14bSjoerg        else
913*4d6fc14bSjoerg        {
914*4d6fc14bSjoerg            __intbuf_ = new char_type[__ibs_];
915*4d6fc14bSjoerg            __owns_ib_ = true;
916*4d6fc14bSjoerg        }
917*4d6fc14bSjoerg    }
918*4d6fc14bSjoerg    else
919*4d6fc14bSjoerg    {
920*4d6fc14bSjoerg        __ibs_ = 0;
921*4d6fc14bSjoerg        __intbuf_ = nullptr;
922*4d6fc14bSjoerg        __owns_ib_ = false;
923*4d6fc14bSjoerg    }
924*4d6fc14bSjoerg    return this;
925*4d6fc14bSjoerg}
926*4d6fc14bSjoerg
927*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
928*4d6fc14bSjoergtypename basic_filebuf<_CharT, _Traits>::pos_type
929*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::seekoff(off_type __off, ios_base::seekdir __way,
930*4d6fc14bSjoerg                                        ios_base::openmode)
931*4d6fc14bSjoerg{
932*4d6fc14bSjoerg    if (!__cv_)
933*4d6fc14bSjoerg        __throw_bad_cast();
934*4d6fc14bSjoerg
935*4d6fc14bSjoerg    int __width = __cv_->encoding();
936*4d6fc14bSjoerg    if (__file_ == nullptr || (__width <= 0 && __off != 0) || sync())
937*4d6fc14bSjoerg        return pos_type(off_type(-1));
938*4d6fc14bSjoerg    // __width > 0 || __off == 0
939*4d6fc14bSjoerg    int __whence;
940*4d6fc14bSjoerg    switch (__way)
941*4d6fc14bSjoerg    {
942*4d6fc14bSjoerg    case ios_base::beg:
943*4d6fc14bSjoerg        __whence = SEEK_SET;
944*4d6fc14bSjoerg        break;
945*4d6fc14bSjoerg    case ios_base::cur:
946*4d6fc14bSjoerg        __whence = SEEK_CUR;
947*4d6fc14bSjoerg        break;
948*4d6fc14bSjoerg    case ios_base::end:
949*4d6fc14bSjoerg        __whence = SEEK_END;
950*4d6fc14bSjoerg        break;
951*4d6fc14bSjoerg    default:
952*4d6fc14bSjoerg        return pos_type(off_type(-1));
953*4d6fc14bSjoerg    }
954*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
955*4d6fc14bSjoerg    if (fseek(__file_, __width > 0 ? __width * __off : 0, __whence))
956*4d6fc14bSjoerg        return pos_type(off_type(-1));
957*4d6fc14bSjoerg    pos_type __r = ftell(__file_);
958*4d6fc14bSjoerg#else
959*4d6fc14bSjoerg    if (fseeko(__file_, __width > 0 ? __width * __off : 0, __whence))
960*4d6fc14bSjoerg        return pos_type(off_type(-1));
961*4d6fc14bSjoerg    pos_type __r = ftello(__file_);
962*4d6fc14bSjoerg#endif
963*4d6fc14bSjoerg    __r.state(__st_);
964*4d6fc14bSjoerg    return __r;
965*4d6fc14bSjoerg}
966*4d6fc14bSjoerg
967*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
968*4d6fc14bSjoergtypename basic_filebuf<_CharT, _Traits>::pos_type
969*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::seekpos(pos_type __sp, ios_base::openmode)
970*4d6fc14bSjoerg{
971*4d6fc14bSjoerg    if (__file_ == nullptr || sync())
972*4d6fc14bSjoerg        return pos_type(off_type(-1));
973*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
974*4d6fc14bSjoerg    if (fseek(__file_, __sp, SEEK_SET))
975*4d6fc14bSjoerg        return pos_type(off_type(-1));
976*4d6fc14bSjoerg#else
977*4d6fc14bSjoerg    if (fseeko(__file_, __sp, SEEK_SET))
978*4d6fc14bSjoerg        return pos_type(off_type(-1));
979*4d6fc14bSjoerg#endif
980*4d6fc14bSjoerg    __st_ = __sp.state();
981*4d6fc14bSjoerg    return __sp;
982*4d6fc14bSjoerg}
983*4d6fc14bSjoerg
984*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
985*4d6fc14bSjoergint
986*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::sync()
987*4d6fc14bSjoerg{
988*4d6fc14bSjoerg    if (__file_ == nullptr)
989*4d6fc14bSjoerg        return 0;
990*4d6fc14bSjoerg    if (!__cv_)
991*4d6fc14bSjoerg        __throw_bad_cast();
992*4d6fc14bSjoerg
993*4d6fc14bSjoerg    if (__cm_ & ios_base::out)
994*4d6fc14bSjoerg    {
995*4d6fc14bSjoerg        if (this->pptr() != this->pbase())
996*4d6fc14bSjoerg            if (overflow() == traits_type::eof())
997*4d6fc14bSjoerg                return -1;
998*4d6fc14bSjoerg        codecvt_base::result __r;
999*4d6fc14bSjoerg        do
1000*4d6fc14bSjoerg        {
1001*4d6fc14bSjoerg            char* __extbe;
1002*4d6fc14bSjoerg            __r = __cv_->unshift(__st_, __extbuf_, __extbuf_ + __ebs_, __extbe);
1003*4d6fc14bSjoerg            size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_);
1004*4d6fc14bSjoerg            if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb)
1005*4d6fc14bSjoerg                return -1;
1006*4d6fc14bSjoerg        } while (__r == codecvt_base::partial);
1007*4d6fc14bSjoerg        if (__r == codecvt_base::error)
1008*4d6fc14bSjoerg            return -1;
1009*4d6fc14bSjoerg        if (fflush(__file_))
1010*4d6fc14bSjoerg            return -1;
1011*4d6fc14bSjoerg    }
1012*4d6fc14bSjoerg    else if (__cm_ & ios_base::in)
1013*4d6fc14bSjoerg    {
1014*4d6fc14bSjoerg        off_type __c;
1015*4d6fc14bSjoerg        state_type __state = __st_last_;
1016*4d6fc14bSjoerg        bool __update_st = false;
1017*4d6fc14bSjoerg        if (__always_noconv_)
1018*4d6fc14bSjoerg            __c = this->egptr() - this->gptr();
1019*4d6fc14bSjoerg        else
1020*4d6fc14bSjoerg        {
1021*4d6fc14bSjoerg            int __width = __cv_->encoding();
1022*4d6fc14bSjoerg            __c = __extbufend_ - __extbufnext_;
1023*4d6fc14bSjoerg            if (__width > 0)
1024*4d6fc14bSjoerg                __c += __width * (this->egptr() - this->gptr());
1025*4d6fc14bSjoerg            else
1026*4d6fc14bSjoerg            {
1027*4d6fc14bSjoerg                if (this->gptr() != this->egptr())
1028*4d6fc14bSjoerg                {
1029*4d6fc14bSjoerg                    const int __off =  __cv_->length(__state, __extbuf_,
1030*4d6fc14bSjoerg                                                     __extbufnext_,
1031*4d6fc14bSjoerg                                                     this->gptr() - this->eback());
1032*4d6fc14bSjoerg                    __c += __extbufnext_ - __extbuf_ - __off;
1033*4d6fc14bSjoerg                    __update_st = true;
1034*4d6fc14bSjoerg                }
1035*4d6fc14bSjoerg            }
1036*4d6fc14bSjoerg        }
1037*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
1038*4d6fc14bSjoerg        if (fseek(__file_, -__c, SEEK_CUR))
1039*4d6fc14bSjoerg            return -1;
1040*4d6fc14bSjoerg#else
1041*4d6fc14bSjoerg        if (fseeko(__file_, -__c, SEEK_CUR))
1042*4d6fc14bSjoerg            return -1;
1043*4d6fc14bSjoerg#endif
1044*4d6fc14bSjoerg        if (__update_st)
1045*4d6fc14bSjoerg            __st_ = __state;
1046*4d6fc14bSjoerg        __extbufnext_ = __extbufend_ = __extbuf_;
1047*4d6fc14bSjoerg        this->setg(nullptr, nullptr, nullptr);
1048*4d6fc14bSjoerg        __cm_ = 0;
1049*4d6fc14bSjoerg    }
1050*4d6fc14bSjoerg    return 0;
1051*4d6fc14bSjoerg}
1052*4d6fc14bSjoerg
1053*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1054*4d6fc14bSjoergvoid
1055*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::imbue(const locale& __loc)
1056*4d6fc14bSjoerg{
1057*4d6fc14bSjoerg    sync();
1058*4d6fc14bSjoerg    __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc);
1059*4d6fc14bSjoerg    bool __old_anc = __always_noconv_;
1060*4d6fc14bSjoerg    __always_noconv_ = __cv_->always_noconv();
1061*4d6fc14bSjoerg    if (__old_anc != __always_noconv_)
1062*4d6fc14bSjoerg    {
1063*4d6fc14bSjoerg        this->setg(nullptr, nullptr, nullptr);
1064*4d6fc14bSjoerg        this->setp(nullptr, nullptr);
1065*4d6fc14bSjoerg        // invariant, char_type is char, else we couldn't get here
1066*4d6fc14bSjoerg        if (__always_noconv_)  // need to dump __intbuf_
1067*4d6fc14bSjoerg        {
1068*4d6fc14bSjoerg            if (__owns_eb_)
1069*4d6fc14bSjoerg                delete [] __extbuf_;
1070*4d6fc14bSjoerg            __owns_eb_ = __owns_ib_;
1071*4d6fc14bSjoerg            __ebs_ = __ibs_;
1072*4d6fc14bSjoerg            __extbuf_ = (char*)__intbuf_;
1073*4d6fc14bSjoerg            __ibs_ = 0;
1074*4d6fc14bSjoerg            __intbuf_ = nullptr;
1075*4d6fc14bSjoerg            __owns_ib_ = false;
1076*4d6fc14bSjoerg        }
1077*4d6fc14bSjoerg        else  // need to obtain an __intbuf_.
1078*4d6fc14bSjoerg        {     // If __extbuf_ is user-supplied, use it, else new __intbuf_
1079*4d6fc14bSjoerg            if (!__owns_eb_ && __extbuf_ != __extbuf_min_)
1080*4d6fc14bSjoerg            {
1081*4d6fc14bSjoerg                __ibs_ = __ebs_;
1082*4d6fc14bSjoerg                __intbuf_ = (char_type*)__extbuf_;
1083*4d6fc14bSjoerg                __owns_ib_ = false;
1084*4d6fc14bSjoerg                __extbuf_ = new char[__ebs_];
1085*4d6fc14bSjoerg                __owns_eb_ = true;
1086*4d6fc14bSjoerg            }
1087*4d6fc14bSjoerg            else
1088*4d6fc14bSjoerg            {
1089*4d6fc14bSjoerg                __ibs_ = __ebs_;
1090*4d6fc14bSjoerg                __intbuf_ = new char_type[__ibs_];
1091*4d6fc14bSjoerg                __owns_ib_ = true;
1092*4d6fc14bSjoerg            }
1093*4d6fc14bSjoerg        }
1094*4d6fc14bSjoerg    }
1095*4d6fc14bSjoerg}
1096*4d6fc14bSjoerg
1097*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1098*4d6fc14bSjoergbool
1099*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::__read_mode()
1100*4d6fc14bSjoerg{
1101*4d6fc14bSjoerg    if (!(__cm_ & ios_base::in))
1102*4d6fc14bSjoerg    {
1103*4d6fc14bSjoerg        this->setp(nullptr, nullptr);
1104*4d6fc14bSjoerg        if (__always_noconv_)
1105*4d6fc14bSjoerg            this->setg((char_type*)__extbuf_,
1106*4d6fc14bSjoerg                       (char_type*)__extbuf_ + __ebs_,
1107*4d6fc14bSjoerg                       (char_type*)__extbuf_ + __ebs_);
1108*4d6fc14bSjoerg        else
1109*4d6fc14bSjoerg            this->setg(__intbuf_, __intbuf_ + __ibs_, __intbuf_ + __ibs_);
1110*4d6fc14bSjoerg        __cm_ = ios_base::in;
1111*4d6fc14bSjoerg        return true;
1112*4d6fc14bSjoerg    }
1113*4d6fc14bSjoerg    return false;
1114*4d6fc14bSjoerg}
1115*4d6fc14bSjoerg
1116*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1117*4d6fc14bSjoergvoid
1118*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::__write_mode()
1119*4d6fc14bSjoerg{
1120*4d6fc14bSjoerg    if (!(__cm_ & ios_base::out))
1121*4d6fc14bSjoerg    {
1122*4d6fc14bSjoerg        this->setg(nullptr, nullptr, nullptr);
1123*4d6fc14bSjoerg        if (__ebs_ > sizeof(__extbuf_min_))
1124*4d6fc14bSjoerg        {
1125*4d6fc14bSjoerg            if (__always_noconv_)
1126*4d6fc14bSjoerg                this->setp((char_type*)__extbuf_,
1127*4d6fc14bSjoerg                           (char_type*)__extbuf_ + (__ebs_ - 1));
1128*4d6fc14bSjoerg            else
1129*4d6fc14bSjoerg                this->setp(__intbuf_, __intbuf_ + (__ibs_ - 1));
1130*4d6fc14bSjoerg        }
1131*4d6fc14bSjoerg        else
1132*4d6fc14bSjoerg            this->setp(nullptr, nullptr);
1133*4d6fc14bSjoerg        __cm_ = ios_base::out;
1134*4d6fc14bSjoerg    }
1135*4d6fc14bSjoerg}
1136*4d6fc14bSjoerg
1137*4d6fc14bSjoerg// basic_ifstream
1138*4d6fc14bSjoerg
1139*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1140*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS basic_ifstream
1141*4d6fc14bSjoerg    : public basic_istream<_CharT, _Traits>
1142*4d6fc14bSjoerg{
1143*4d6fc14bSjoergpublic:
1144*4d6fc14bSjoerg    typedef _CharT                         char_type;
1145*4d6fc14bSjoerg    typedef _Traits                        traits_type;
1146*4d6fc14bSjoerg    typedef typename traits_type::int_type int_type;
1147*4d6fc14bSjoerg    typedef typename traits_type::pos_type pos_type;
1148*4d6fc14bSjoerg    typedef typename traits_type::off_type off_type;
1149*4d6fc14bSjoerg
1150*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1151*4d6fc14bSjoerg    basic_ifstream();
1152*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1153*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1154*4d6fc14bSjoerg    explicit basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in);
1155*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
1156*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1157*4d6fc14bSjoerg    explicit basic_ifstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::in);
1158*4d6fc14bSjoerg#endif
1159*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1160*4d6fc14bSjoerg    explicit basic_ifstream(const string& __s, ios_base::openmode __mode = ios_base::in);
1161*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
1162*4d6fc14bSjoerg    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
1163*4d6fc14bSjoerg    explicit basic_ifstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in)
1164*4d6fc14bSjoerg      : basic_ifstream(__p.c_str(), __mode) {}
1165*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER >= 17
1166*4d6fc14bSjoerg#endif
1167*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
1168*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1169*4d6fc14bSjoerg    basic_ifstream(basic_ifstream&& __rhs);
1170*4d6fc14bSjoerg
1171*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1172*4d6fc14bSjoerg    basic_ifstream& operator=(basic_ifstream&& __rhs);
1173*4d6fc14bSjoerg#endif
1174*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1175*4d6fc14bSjoerg    void swap(basic_ifstream& __rhs);
1176*4d6fc14bSjoerg
1177*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1178*4d6fc14bSjoerg    basic_filebuf<char_type, traits_type>* rdbuf() const;
1179*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1180*4d6fc14bSjoerg    bool is_open() const;
1181*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1182*4d6fc14bSjoerg    void open(const char* __s, ios_base::openmode __mode = ios_base::in);
1183*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
1184*4d6fc14bSjoerg    void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::in);
1185*4d6fc14bSjoerg#endif
1186*4d6fc14bSjoerg    void open(const string& __s, ios_base::openmode __mode = ios_base::in);
1187*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
1188*4d6fc14bSjoerg    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
1189*4d6fc14bSjoerg    void open(const filesystem::path& __p,
1190*4d6fc14bSjoerg              ios_base::openmode __mode = ios_base::in) {
1191*4d6fc14bSjoerg      return open(__p.c_str(), __mode);
1192*4d6fc14bSjoerg    }
1193*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER >= 17
1194*4d6fc14bSjoerg
1195*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1196*4d6fc14bSjoerg    void __open(int __fd, ios_base::openmode __mode);
1197*4d6fc14bSjoerg#endif
1198*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1199*4d6fc14bSjoerg    void close();
1200*4d6fc14bSjoerg
1201*4d6fc14bSjoergprivate:
1202*4d6fc14bSjoerg    basic_filebuf<char_type, traits_type> __sb_;
1203*4d6fc14bSjoerg};
1204*4d6fc14bSjoerg
1205*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1206*4d6fc14bSjoerginline
1207*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::basic_ifstream()
1208*4d6fc14bSjoerg    : basic_istream<char_type, traits_type>(&__sb_)
1209*4d6fc14bSjoerg{
1210*4d6fc14bSjoerg}
1211*4d6fc14bSjoerg
1212*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1213*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1214*4d6fc14bSjoerginline
1215*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::basic_ifstream(const char* __s, ios_base::openmode __mode)
1216*4d6fc14bSjoerg    : basic_istream<char_type, traits_type>(&__sb_)
1217*4d6fc14bSjoerg{
1218*4d6fc14bSjoerg    if (__sb_.open(__s, __mode | ios_base::in) == nullptr)
1219*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1220*4d6fc14bSjoerg}
1221*4d6fc14bSjoerg
1222*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
1223*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1224*4d6fc14bSjoerginline
1225*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::basic_ifstream(const wchar_t* __s, ios_base::openmode __mode)
1226*4d6fc14bSjoerg    : basic_istream<char_type, traits_type>(&__sb_)
1227*4d6fc14bSjoerg{
1228*4d6fc14bSjoerg    if (__sb_.open(__s, __mode | ios_base::in) == nullptr)
1229*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1230*4d6fc14bSjoerg}
1231*4d6fc14bSjoerg#endif
1232*4d6fc14bSjoerg
1233*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1234*4d6fc14bSjoerginline
1235*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::basic_ifstream(const string& __s, ios_base::openmode __mode)
1236*4d6fc14bSjoerg    : basic_istream<char_type, traits_type>(&__sb_)
1237*4d6fc14bSjoerg{
1238*4d6fc14bSjoerg    if (__sb_.open(__s, __mode | ios_base::in) == nullptr)
1239*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1240*4d6fc14bSjoerg}
1241*4d6fc14bSjoerg#endif
1242*4d6fc14bSjoerg
1243*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
1244*4d6fc14bSjoerg
1245*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1246*4d6fc14bSjoerginline
1247*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::basic_ifstream(basic_ifstream&& __rhs)
1248*4d6fc14bSjoerg    : basic_istream<char_type, traits_type>(_VSTD::move(__rhs)),
1249*4d6fc14bSjoerg      __sb_(_VSTD::move(__rhs.__sb_))
1250*4d6fc14bSjoerg{
1251*4d6fc14bSjoerg    this->set_rdbuf(&__sb_);
1252*4d6fc14bSjoerg}
1253*4d6fc14bSjoerg
1254*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1255*4d6fc14bSjoerginline
1256*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>&
1257*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::operator=(basic_ifstream&& __rhs)
1258*4d6fc14bSjoerg{
1259*4d6fc14bSjoerg    basic_istream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
1260*4d6fc14bSjoerg    __sb_ = _VSTD::move(__rhs.__sb_);
1261*4d6fc14bSjoerg    return *this;
1262*4d6fc14bSjoerg}
1263*4d6fc14bSjoerg
1264*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG
1265*4d6fc14bSjoerg
1266*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1267*4d6fc14bSjoerginline
1268*4d6fc14bSjoergvoid
1269*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::swap(basic_ifstream& __rhs)
1270*4d6fc14bSjoerg{
1271*4d6fc14bSjoerg    basic_istream<char_type, traits_type>::swap(__rhs);
1272*4d6fc14bSjoerg    __sb_.swap(__rhs.__sb_);
1273*4d6fc14bSjoerg}
1274*4d6fc14bSjoerg
1275*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1276*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY
1277*4d6fc14bSjoergvoid
1278*4d6fc14bSjoergswap(basic_ifstream<_CharT, _Traits>& __x, basic_ifstream<_CharT, _Traits>& __y)
1279*4d6fc14bSjoerg{
1280*4d6fc14bSjoerg    __x.swap(__y);
1281*4d6fc14bSjoerg}
1282*4d6fc14bSjoerg
1283*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1284*4d6fc14bSjoerginline
1285*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>*
1286*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::rdbuf() const
1287*4d6fc14bSjoerg{
1288*4d6fc14bSjoerg    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
1289*4d6fc14bSjoerg}
1290*4d6fc14bSjoerg
1291*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1292*4d6fc14bSjoerginline
1293*4d6fc14bSjoergbool
1294*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::is_open() const
1295*4d6fc14bSjoerg{
1296*4d6fc14bSjoerg    return __sb_.is_open();
1297*4d6fc14bSjoerg}
1298*4d6fc14bSjoerg
1299*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1300*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1301*4d6fc14bSjoergvoid
1302*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
1303*4d6fc14bSjoerg{
1304*4d6fc14bSjoerg    if (__sb_.open(__s, __mode | ios_base::in))
1305*4d6fc14bSjoerg        this->clear();
1306*4d6fc14bSjoerg    else
1307*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1308*4d6fc14bSjoerg}
1309*4d6fc14bSjoerg
1310*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
1311*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1312*4d6fc14bSjoergvoid
1313*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
1314*4d6fc14bSjoerg{
1315*4d6fc14bSjoerg    if (__sb_.open(__s, __mode | ios_base::in))
1316*4d6fc14bSjoerg        this->clear();
1317*4d6fc14bSjoerg    else
1318*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1319*4d6fc14bSjoerg}
1320*4d6fc14bSjoerg#endif
1321*4d6fc14bSjoerg
1322*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1323*4d6fc14bSjoergvoid
1324*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
1325*4d6fc14bSjoerg{
1326*4d6fc14bSjoerg    if (__sb_.open(__s, __mode | ios_base::in))
1327*4d6fc14bSjoerg        this->clear();
1328*4d6fc14bSjoerg    else
1329*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1330*4d6fc14bSjoerg}
1331*4d6fc14bSjoerg
1332*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1333*4d6fc14bSjoerginline
1334*4d6fc14bSjoergvoid basic_ifstream<_CharT, _Traits>::__open(int __fd,
1335*4d6fc14bSjoerg                                             ios_base::openmode __mode) {
1336*4d6fc14bSjoerg  if (__sb_.__open(__fd, __mode | ios_base::in))
1337*4d6fc14bSjoerg    this->clear();
1338*4d6fc14bSjoerg  else
1339*4d6fc14bSjoerg    this->setstate(ios_base::failbit);
1340*4d6fc14bSjoerg}
1341*4d6fc14bSjoerg#endif
1342*4d6fc14bSjoerg
1343*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1344*4d6fc14bSjoerginline
1345*4d6fc14bSjoergvoid
1346*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::close()
1347*4d6fc14bSjoerg{
1348*4d6fc14bSjoerg    if (__sb_.close() == 0)
1349*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1350*4d6fc14bSjoerg}
1351*4d6fc14bSjoerg
1352*4d6fc14bSjoerg// basic_ofstream
1353*4d6fc14bSjoerg
1354*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1355*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS basic_ofstream
1356*4d6fc14bSjoerg    : public basic_ostream<_CharT, _Traits>
1357*4d6fc14bSjoerg{
1358*4d6fc14bSjoergpublic:
1359*4d6fc14bSjoerg    typedef _CharT                         char_type;
1360*4d6fc14bSjoerg    typedef _Traits                        traits_type;
1361*4d6fc14bSjoerg    typedef typename traits_type::int_type int_type;
1362*4d6fc14bSjoerg    typedef typename traits_type::pos_type pos_type;
1363*4d6fc14bSjoerg    typedef typename traits_type::off_type off_type;
1364*4d6fc14bSjoerg
1365*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1366*4d6fc14bSjoerg    basic_ofstream();
1367*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1368*4d6fc14bSjoerg    explicit basic_ofstream(const char* __s, ios_base::openmode __mode = ios_base::out);
1369*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
1370*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1371*4d6fc14bSjoerg    explicit basic_ofstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::out);
1372*4d6fc14bSjoerg#endif
1373*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1374*4d6fc14bSjoerg    explicit basic_ofstream(const string& __s, ios_base::openmode __mode = ios_base::out);
1375*4d6fc14bSjoerg
1376*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
1377*4d6fc14bSjoerg    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
1378*4d6fc14bSjoerg    explicit basic_ofstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::out)
1379*4d6fc14bSjoerg      : basic_ofstream(__p.c_str(), __mode) {}
1380*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER >= 17
1381*4d6fc14bSjoerg
1382*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
1383*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1384*4d6fc14bSjoerg    basic_ofstream(basic_ofstream&& __rhs);
1385*4d6fc14bSjoerg
1386*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1387*4d6fc14bSjoerg    basic_ofstream& operator=(basic_ofstream&& __rhs);
1388*4d6fc14bSjoerg#endif
1389*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1390*4d6fc14bSjoerg    void swap(basic_ofstream& __rhs);
1391*4d6fc14bSjoerg
1392*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1393*4d6fc14bSjoerg    basic_filebuf<char_type, traits_type>* rdbuf() const;
1394*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1395*4d6fc14bSjoerg    bool is_open() const;
1396*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1397*4d6fc14bSjoerg    void open(const char* __s, ios_base::openmode __mode = ios_base::out);
1398*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
1399*4d6fc14bSjoerg    void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::out);
1400*4d6fc14bSjoerg#endif
1401*4d6fc14bSjoerg    void open(const string& __s, ios_base::openmode __mode = ios_base::out);
1402*4d6fc14bSjoerg
1403*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
1404*4d6fc14bSjoerg    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
1405*4d6fc14bSjoerg    void open(const filesystem::path& __p, ios_base::openmode __mode = ios_base::out)
1406*4d6fc14bSjoerg    { return open(__p.c_str(), __mode); }
1407*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER >= 17
1408*4d6fc14bSjoerg
1409*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1410*4d6fc14bSjoerg    void __open(int __fd, ios_base::openmode __mode);
1411*4d6fc14bSjoerg#endif
1412*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1413*4d6fc14bSjoerg    void close();
1414*4d6fc14bSjoerg
1415*4d6fc14bSjoergprivate:
1416*4d6fc14bSjoerg    basic_filebuf<char_type, traits_type> __sb_;
1417*4d6fc14bSjoerg};
1418*4d6fc14bSjoerg
1419*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1420*4d6fc14bSjoerginline
1421*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::basic_ofstream()
1422*4d6fc14bSjoerg    : basic_ostream<char_type, traits_type>(&__sb_)
1423*4d6fc14bSjoerg{
1424*4d6fc14bSjoerg}
1425*4d6fc14bSjoerg
1426*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1427*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1428*4d6fc14bSjoerginline
1429*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::basic_ofstream(const char* __s, ios_base::openmode __mode)
1430*4d6fc14bSjoerg    : basic_ostream<char_type, traits_type>(&__sb_)
1431*4d6fc14bSjoerg{
1432*4d6fc14bSjoerg    if (__sb_.open(__s, __mode | ios_base::out) == nullptr)
1433*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1434*4d6fc14bSjoerg}
1435*4d6fc14bSjoerg
1436*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
1437*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1438*4d6fc14bSjoerginline
1439*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::basic_ofstream(const wchar_t* __s, ios_base::openmode __mode)
1440*4d6fc14bSjoerg    : basic_ostream<char_type, traits_type>(&__sb_)
1441*4d6fc14bSjoerg{
1442*4d6fc14bSjoerg    if (__sb_.open(__s, __mode | ios_base::out) == nullptr)
1443*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1444*4d6fc14bSjoerg}
1445*4d6fc14bSjoerg#endif
1446*4d6fc14bSjoerg
1447*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1448*4d6fc14bSjoerginline
1449*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::basic_ofstream(const string& __s, ios_base::openmode __mode)
1450*4d6fc14bSjoerg    : basic_ostream<char_type, traits_type>(&__sb_)
1451*4d6fc14bSjoerg{
1452*4d6fc14bSjoerg    if (__sb_.open(__s, __mode | ios_base::out) == nullptr)
1453*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1454*4d6fc14bSjoerg}
1455*4d6fc14bSjoerg#endif
1456*4d6fc14bSjoerg
1457*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
1458*4d6fc14bSjoerg
1459*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1460*4d6fc14bSjoerginline
1461*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::basic_ofstream(basic_ofstream&& __rhs)
1462*4d6fc14bSjoerg    : basic_ostream<char_type, traits_type>(_VSTD::move(__rhs)),
1463*4d6fc14bSjoerg      __sb_(_VSTD::move(__rhs.__sb_))
1464*4d6fc14bSjoerg{
1465*4d6fc14bSjoerg    this->set_rdbuf(&__sb_);
1466*4d6fc14bSjoerg}
1467*4d6fc14bSjoerg
1468*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1469*4d6fc14bSjoerginline
1470*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>&
1471*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::operator=(basic_ofstream&& __rhs)
1472*4d6fc14bSjoerg{
1473*4d6fc14bSjoerg    basic_ostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
1474*4d6fc14bSjoerg    __sb_ = _VSTD::move(__rhs.__sb_);
1475*4d6fc14bSjoerg    return *this;
1476*4d6fc14bSjoerg}
1477*4d6fc14bSjoerg
1478*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG
1479*4d6fc14bSjoerg
1480*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1481*4d6fc14bSjoerginline
1482*4d6fc14bSjoergvoid
1483*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::swap(basic_ofstream& __rhs)
1484*4d6fc14bSjoerg{
1485*4d6fc14bSjoerg    basic_ostream<char_type, traits_type>::swap(__rhs);
1486*4d6fc14bSjoerg    __sb_.swap(__rhs.__sb_);
1487*4d6fc14bSjoerg}
1488*4d6fc14bSjoerg
1489*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1490*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY
1491*4d6fc14bSjoergvoid
1492*4d6fc14bSjoergswap(basic_ofstream<_CharT, _Traits>& __x, basic_ofstream<_CharT, _Traits>& __y)
1493*4d6fc14bSjoerg{
1494*4d6fc14bSjoerg    __x.swap(__y);
1495*4d6fc14bSjoerg}
1496*4d6fc14bSjoerg
1497*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1498*4d6fc14bSjoerginline
1499*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>*
1500*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::rdbuf() const
1501*4d6fc14bSjoerg{
1502*4d6fc14bSjoerg    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
1503*4d6fc14bSjoerg}
1504*4d6fc14bSjoerg
1505*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1506*4d6fc14bSjoerginline
1507*4d6fc14bSjoergbool
1508*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::is_open() const
1509*4d6fc14bSjoerg{
1510*4d6fc14bSjoerg    return __sb_.is_open();
1511*4d6fc14bSjoerg}
1512*4d6fc14bSjoerg
1513*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1514*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1515*4d6fc14bSjoergvoid
1516*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
1517*4d6fc14bSjoerg{
1518*4d6fc14bSjoerg    if (__sb_.open(__s, __mode | ios_base::out))
1519*4d6fc14bSjoerg        this->clear();
1520*4d6fc14bSjoerg    else
1521*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1522*4d6fc14bSjoerg}
1523*4d6fc14bSjoerg
1524*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
1525*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1526*4d6fc14bSjoergvoid
1527*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
1528*4d6fc14bSjoerg{
1529*4d6fc14bSjoerg    if (__sb_.open(__s, __mode | ios_base::out))
1530*4d6fc14bSjoerg        this->clear();
1531*4d6fc14bSjoerg    else
1532*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1533*4d6fc14bSjoerg}
1534*4d6fc14bSjoerg#endif
1535*4d6fc14bSjoerg
1536*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1537*4d6fc14bSjoergvoid
1538*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
1539*4d6fc14bSjoerg{
1540*4d6fc14bSjoerg    if (__sb_.open(__s, __mode | ios_base::out))
1541*4d6fc14bSjoerg        this->clear();
1542*4d6fc14bSjoerg    else
1543*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1544*4d6fc14bSjoerg}
1545*4d6fc14bSjoerg
1546*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1547*4d6fc14bSjoerginline
1548*4d6fc14bSjoergvoid basic_ofstream<_CharT, _Traits>::__open(int __fd,
1549*4d6fc14bSjoerg                                             ios_base::openmode __mode) {
1550*4d6fc14bSjoerg  if (__sb_.__open(__fd, __mode | ios_base::out))
1551*4d6fc14bSjoerg    this->clear();
1552*4d6fc14bSjoerg  else
1553*4d6fc14bSjoerg    this->setstate(ios_base::failbit);
1554*4d6fc14bSjoerg}
1555*4d6fc14bSjoerg#endif
1556*4d6fc14bSjoerg
1557*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1558*4d6fc14bSjoerginline
1559*4d6fc14bSjoergvoid
1560*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::close()
1561*4d6fc14bSjoerg{
1562*4d6fc14bSjoerg    if (__sb_.close() == nullptr)
1563*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1564*4d6fc14bSjoerg}
1565*4d6fc14bSjoerg
1566*4d6fc14bSjoerg// basic_fstream
1567*4d6fc14bSjoerg
1568*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1569*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS basic_fstream
1570*4d6fc14bSjoerg    : public basic_iostream<_CharT, _Traits>
1571*4d6fc14bSjoerg{
1572*4d6fc14bSjoergpublic:
1573*4d6fc14bSjoerg    typedef _CharT                         char_type;
1574*4d6fc14bSjoerg    typedef _Traits                        traits_type;
1575*4d6fc14bSjoerg    typedef typename traits_type::int_type int_type;
1576*4d6fc14bSjoerg    typedef typename traits_type::pos_type pos_type;
1577*4d6fc14bSjoerg    typedef typename traits_type::off_type off_type;
1578*4d6fc14bSjoerg
1579*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1580*4d6fc14bSjoerg    basic_fstream();
1581*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1582*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1583*4d6fc14bSjoerg    explicit basic_fstream(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
1584*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
1585*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1586*4d6fc14bSjoerg    explicit basic_fstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
1587*4d6fc14bSjoerg#endif
1588*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1589*4d6fc14bSjoerg    explicit basic_fstream(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
1590*4d6fc14bSjoerg
1591*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
1592*4d6fc14bSjoerg    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
1593*4d6fc14bSjoerg    explicit basic_fstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in | ios_base::out)
1594*4d6fc14bSjoerg      : basic_fstream(__p.c_str(), __mode) {}
1595*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER >= 17
1596*4d6fc14bSjoerg
1597*4d6fc14bSjoerg#endif
1598*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
1599*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1600*4d6fc14bSjoerg    basic_fstream(basic_fstream&& __rhs);
1601*4d6fc14bSjoerg
1602*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1603*4d6fc14bSjoerg    basic_fstream& operator=(basic_fstream&& __rhs);
1604*4d6fc14bSjoerg#endif
1605*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1606*4d6fc14bSjoerg    void swap(basic_fstream& __rhs);
1607*4d6fc14bSjoerg
1608*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1609*4d6fc14bSjoerg    basic_filebuf<char_type, traits_type>* rdbuf() const;
1610*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1611*4d6fc14bSjoerg    bool is_open() const;
1612*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1613*4d6fc14bSjoerg    void open(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
1614*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
1615*4d6fc14bSjoerg    void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
1616*4d6fc14bSjoerg#endif
1617*4d6fc14bSjoerg    void open(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
1618*4d6fc14bSjoerg
1619*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
1620*4d6fc14bSjoerg    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
1621*4d6fc14bSjoerg    void open(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in|ios_base::out)
1622*4d6fc14bSjoerg    { return open(__p.c_str(), __mode); }
1623*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER >= 17
1624*4d6fc14bSjoerg
1625*4d6fc14bSjoerg#endif
1626*4d6fc14bSjoerg    _LIBCPP_INLINE_VISIBILITY
1627*4d6fc14bSjoerg    void close();
1628*4d6fc14bSjoerg
1629*4d6fc14bSjoergprivate:
1630*4d6fc14bSjoerg    basic_filebuf<char_type, traits_type> __sb_;
1631*4d6fc14bSjoerg};
1632*4d6fc14bSjoerg
1633*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1634*4d6fc14bSjoerginline
1635*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::basic_fstream()
1636*4d6fc14bSjoerg    : basic_iostream<char_type, traits_type>(&__sb_)
1637*4d6fc14bSjoerg{
1638*4d6fc14bSjoerg}
1639*4d6fc14bSjoerg
1640*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1641*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1642*4d6fc14bSjoerginline
1643*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::basic_fstream(const char* __s, ios_base::openmode __mode)
1644*4d6fc14bSjoerg    : basic_iostream<char_type, traits_type>(&__sb_)
1645*4d6fc14bSjoerg{
1646*4d6fc14bSjoerg    if (__sb_.open(__s, __mode) == nullptr)
1647*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1648*4d6fc14bSjoerg}
1649*4d6fc14bSjoerg
1650*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
1651*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1652*4d6fc14bSjoerginline
1653*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::basic_fstream(const wchar_t* __s, ios_base::openmode __mode)
1654*4d6fc14bSjoerg    : basic_iostream<char_type, traits_type>(&__sb_)
1655*4d6fc14bSjoerg{
1656*4d6fc14bSjoerg    if (__sb_.open(__s, __mode) == nullptr)
1657*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1658*4d6fc14bSjoerg}
1659*4d6fc14bSjoerg#endif
1660*4d6fc14bSjoerg
1661*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1662*4d6fc14bSjoerginline
1663*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::basic_fstream(const string& __s, ios_base::openmode __mode)
1664*4d6fc14bSjoerg    : basic_iostream<char_type, traits_type>(&__sb_)
1665*4d6fc14bSjoerg{
1666*4d6fc14bSjoerg    if (__sb_.open(__s, __mode) == nullptr)
1667*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1668*4d6fc14bSjoerg}
1669*4d6fc14bSjoerg#endif
1670*4d6fc14bSjoerg
1671*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG
1672*4d6fc14bSjoerg
1673*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1674*4d6fc14bSjoerginline
1675*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::basic_fstream(basic_fstream&& __rhs)
1676*4d6fc14bSjoerg    : basic_iostream<char_type, traits_type>(_VSTD::move(__rhs)),
1677*4d6fc14bSjoerg      __sb_(_VSTD::move(__rhs.__sb_))
1678*4d6fc14bSjoerg{
1679*4d6fc14bSjoerg    this->set_rdbuf(&__sb_);
1680*4d6fc14bSjoerg}
1681*4d6fc14bSjoerg
1682*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1683*4d6fc14bSjoerginline
1684*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>&
1685*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::operator=(basic_fstream&& __rhs)
1686*4d6fc14bSjoerg{
1687*4d6fc14bSjoerg    basic_iostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
1688*4d6fc14bSjoerg    __sb_ = _VSTD::move(__rhs.__sb_);
1689*4d6fc14bSjoerg    return *this;
1690*4d6fc14bSjoerg}
1691*4d6fc14bSjoerg
1692*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG
1693*4d6fc14bSjoerg
1694*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1695*4d6fc14bSjoerginline
1696*4d6fc14bSjoergvoid
1697*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::swap(basic_fstream& __rhs)
1698*4d6fc14bSjoerg{
1699*4d6fc14bSjoerg    basic_iostream<char_type, traits_type>::swap(__rhs);
1700*4d6fc14bSjoerg    __sb_.swap(__rhs.__sb_);
1701*4d6fc14bSjoerg}
1702*4d6fc14bSjoerg
1703*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1704*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY
1705*4d6fc14bSjoergvoid
1706*4d6fc14bSjoergswap(basic_fstream<_CharT, _Traits>& __x, basic_fstream<_CharT, _Traits>& __y)
1707*4d6fc14bSjoerg{
1708*4d6fc14bSjoerg    __x.swap(__y);
1709*4d6fc14bSjoerg}
1710*4d6fc14bSjoerg
1711*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1712*4d6fc14bSjoerginline
1713*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>*
1714*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::rdbuf() const
1715*4d6fc14bSjoerg{
1716*4d6fc14bSjoerg    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
1717*4d6fc14bSjoerg}
1718*4d6fc14bSjoerg
1719*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1720*4d6fc14bSjoerginline
1721*4d6fc14bSjoergbool
1722*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::is_open() const
1723*4d6fc14bSjoerg{
1724*4d6fc14bSjoerg    return __sb_.is_open();
1725*4d6fc14bSjoerg}
1726*4d6fc14bSjoerg
1727*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
1728*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1729*4d6fc14bSjoergvoid
1730*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
1731*4d6fc14bSjoerg{
1732*4d6fc14bSjoerg    if (__sb_.open(__s, __mode))
1733*4d6fc14bSjoerg        this->clear();
1734*4d6fc14bSjoerg    else
1735*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1736*4d6fc14bSjoerg}
1737*4d6fc14bSjoerg
1738*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
1739*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1740*4d6fc14bSjoergvoid
1741*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
1742*4d6fc14bSjoerg{
1743*4d6fc14bSjoerg    if (__sb_.open(__s, __mode))
1744*4d6fc14bSjoerg        this->clear();
1745*4d6fc14bSjoerg    else
1746*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1747*4d6fc14bSjoerg}
1748*4d6fc14bSjoerg#endif
1749*4d6fc14bSjoerg
1750*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1751*4d6fc14bSjoergvoid
1752*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
1753*4d6fc14bSjoerg{
1754*4d6fc14bSjoerg    if (__sb_.open(__s, __mode))
1755*4d6fc14bSjoerg        this->clear();
1756*4d6fc14bSjoerg    else
1757*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1758*4d6fc14bSjoerg}
1759*4d6fc14bSjoerg#endif
1760*4d6fc14bSjoerg
1761*4d6fc14bSjoergtemplate <class _CharT, class _Traits>
1762*4d6fc14bSjoerginline
1763*4d6fc14bSjoergvoid
1764*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::close()
1765*4d6fc14bSjoerg{
1766*4d6fc14bSjoerg    if (__sb_.close() == nullptr)
1767*4d6fc14bSjoerg        this->setstate(ios_base::failbit);
1768*4d6fc14bSjoerg}
1769*4d6fc14bSjoerg
1770*4d6fc14bSjoerg#if defined(_LIBCPP_ABI_ENABLE_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1)
1771*4d6fc14bSjoerg_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ifstream<char>)
1772*4d6fc14bSjoerg_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ofstream<char>)
1773*4d6fc14bSjoerg_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_filebuf<char>)
1774*4d6fc14bSjoerg#endif
1775*4d6fc14bSjoerg
1776*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_STD
1777*4d6fc14bSjoerg
1778*4d6fc14bSjoerg_LIBCPP_POP_MACROS
1779*4d6fc14bSjoerg
1780*4d6fc14bSjoerg#endif // _LIBCPP_FSTREAM
1781