xref: /openbsd-src/gnu/llvm/libcxx/include/fstream (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
146035553Spatrick// -*- C++ -*-
2*4bdff4beSrobert//===----------------------------------------------------------------------===//
346035553Spatrick//
446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
546035553Spatrick// See https://llvm.org/LICENSE.txt for license information.
646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
746035553Spatrick//
846035553Spatrick//===----------------------------------------------------------------------===//
946035553Spatrick
1046035553Spatrick#ifndef _LIBCPP_FSTREAM
1146035553Spatrick#define _LIBCPP_FSTREAM
1246035553Spatrick
1346035553Spatrick/*
1446035553Spatrick    fstream synopsis
1546035553Spatrick
1646035553Spatricktemplate <class charT, class traits = char_traits<charT> >
1746035553Spatrickclass basic_filebuf
1846035553Spatrick    : public basic_streambuf<charT, traits>
1946035553Spatrick{
2046035553Spatrickpublic:
2146035553Spatrick    typedef charT                          char_type;
2246035553Spatrick    typedef traits                         traits_type;
2346035553Spatrick    typedef typename traits_type::int_type int_type;
2446035553Spatrick    typedef typename traits_type::pos_type pos_type;
2546035553Spatrick    typedef typename traits_type::off_type off_type;
2646035553Spatrick
2746035553Spatrick    // 27.9.1.2 Constructors/destructor:
2846035553Spatrick    basic_filebuf();
2946035553Spatrick    basic_filebuf(basic_filebuf&& rhs);
3046035553Spatrick    virtual ~basic_filebuf();
3146035553Spatrick
3246035553Spatrick    // 27.9.1.3 Assign/swap:
3346035553Spatrick    basic_filebuf& operator=(basic_filebuf&& rhs);
3446035553Spatrick    void swap(basic_filebuf& rhs);
3546035553Spatrick
3646035553Spatrick    // 27.9.1.4 Members:
3746035553Spatrick    bool is_open() const;
3846035553Spatrick    basic_filebuf* open(const char* s, ios_base::openmode mode);
3946035553Spatrick    basic_filebuf* open(const string& s, ios_base::openmode mode);
4046035553Spatrick    basic_filebuf* open(const filesystem::path& p, ios_base::openmode mode); // C++17
4146035553Spatrick    basic_filebuf* close();
4246035553Spatrick
4346035553Spatrickprotected:
4446035553Spatrick    // 27.9.1.5 Overridden virtual functions:
4546035553Spatrick    virtual streamsize showmanyc();
4646035553Spatrick    virtual int_type underflow();
4746035553Spatrick    virtual int_type uflow();
4846035553Spatrick    virtual int_type pbackfail(int_type c = traits_type::eof());
4946035553Spatrick    virtual int_type overflow (int_type c = traits_type::eof());
5046035553Spatrick    virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* s, streamsize n);
5146035553Spatrick    virtual pos_type seekoff(off_type off, ios_base::seekdir way,
5246035553Spatrick                             ios_base::openmode which = ios_base::in | ios_base::out);
5346035553Spatrick    virtual pos_type seekpos(pos_type sp,
5446035553Spatrick                             ios_base::openmode which = ios_base::in | ios_base::out);
5546035553Spatrick    virtual int sync();
5646035553Spatrick    virtual void imbue(const locale& loc);
5746035553Spatrick};
5846035553Spatrick
5946035553Spatricktemplate <class charT, class traits>
6046035553Spatrick  void
6146035553Spatrick  swap(basic_filebuf<charT, traits>& x, basic_filebuf<charT, traits>& y);
6246035553Spatrick
6346035553Spatricktypedef basic_filebuf<char>    filebuf;
6446035553Spatricktypedef basic_filebuf<wchar_t> wfilebuf;
6546035553Spatrick
6646035553Spatricktemplate <class charT, class traits = char_traits<charT> >
6746035553Spatrickclass basic_ifstream
6846035553Spatrick    : public basic_istream<charT,traits>
6946035553Spatrick{
7046035553Spatrickpublic:
7146035553Spatrick    typedef charT                          char_type;
7246035553Spatrick    typedef traits                         traits_type;
7346035553Spatrick    typedef typename traits_type::int_type int_type;
7446035553Spatrick    typedef typename traits_type::pos_type pos_type;
7546035553Spatrick    typedef typename traits_type::off_type off_type;
7646035553Spatrick
7746035553Spatrick    basic_ifstream();
7846035553Spatrick    explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in);
7946035553Spatrick    explicit basic_ifstream(const string& s, ios_base::openmode mode = ios_base::in);
8046035553Spatrick    explicit basic_ifstream(const filesystem::path& p,
8146035553Spatrick                            ios_base::openmode mode = ios_base::in); // C++17
8246035553Spatrick    basic_ifstream(basic_ifstream&& rhs);
8346035553Spatrick
8446035553Spatrick    basic_ifstream& operator=(basic_ifstream&& rhs);
8546035553Spatrick    void swap(basic_ifstream& rhs);
8646035553Spatrick
8746035553Spatrick    basic_filebuf<char_type, traits_type>* rdbuf() const;
8846035553Spatrick    bool is_open() const;
8946035553Spatrick    void open(const char* s, ios_base::openmode mode = ios_base::in);
9046035553Spatrick    void open(const string& s, ios_base::openmode mode = ios_base::in);
9146035553Spatrick    void open(const filesystem::path& s, ios_base::openmode mode = ios_base::in); // C++17
9246035553Spatrick
9346035553Spatrick    void close();
9446035553Spatrick};
9546035553Spatrick
9646035553Spatricktemplate <class charT, class traits>
9746035553Spatrick  void
9846035553Spatrick  swap(basic_ifstream<charT, traits>& x, basic_ifstream<charT, traits>& y);
9946035553Spatrick
10046035553Spatricktypedef basic_ifstream<char>    ifstream;
10146035553Spatricktypedef basic_ifstream<wchar_t> wifstream;
10246035553Spatrick
10346035553Spatricktemplate <class charT, class traits = char_traits<charT> >
10446035553Spatrickclass basic_ofstream
10546035553Spatrick    : public basic_ostream<charT,traits>
10646035553Spatrick{
10746035553Spatrickpublic:
10846035553Spatrick    typedef charT                          char_type;
10946035553Spatrick    typedef traits                         traits_type;
11046035553Spatrick    typedef typename traits_type::int_type int_type;
11146035553Spatrick    typedef typename traits_type::pos_type pos_type;
11246035553Spatrick    typedef typename traits_type::off_type off_type;
11346035553Spatrick
11446035553Spatrick    basic_ofstream();
11546035553Spatrick    explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out);
11646035553Spatrick    explicit basic_ofstream(const string& s, ios_base::openmode mode = ios_base::out);
11746035553Spatrick    explicit basic_ofstream(const filesystem::path& p,
11846035553Spatrick                            ios_base::openmode mode = ios_base::out); // C++17
11946035553Spatrick    basic_ofstream(basic_ofstream&& rhs);
12046035553Spatrick
12146035553Spatrick    basic_ofstream& operator=(basic_ofstream&& rhs);
12246035553Spatrick    void swap(basic_ofstream& rhs);
12346035553Spatrick
12446035553Spatrick    basic_filebuf<char_type, traits_type>* rdbuf() const;
12546035553Spatrick    bool is_open() const;
12646035553Spatrick    void open(const char* s, ios_base::openmode mode = ios_base::out);
12746035553Spatrick    void open(const string& s, ios_base::openmode mode = ios_base::out);
12846035553Spatrick    void open(const filesystem::path& p,
12946035553Spatrick              ios_base::openmode mode = ios_base::out); // C++17
13046035553Spatrick
13146035553Spatrick    void close();
13246035553Spatrick};
13346035553Spatrick
13446035553Spatricktemplate <class charT, class traits>
13546035553Spatrick  void
13646035553Spatrick  swap(basic_ofstream<charT, traits>& x, basic_ofstream<charT, traits>& y);
13746035553Spatrick
13846035553Spatricktypedef basic_ofstream<char>    ofstream;
13946035553Spatricktypedef basic_ofstream<wchar_t> wofstream;
14046035553Spatrick
14146035553Spatricktemplate <class charT, class traits=char_traits<charT> >
14246035553Spatrickclass basic_fstream
14346035553Spatrick    : public basic_iostream<charT,traits>
14446035553Spatrick{
14546035553Spatrickpublic:
14646035553Spatrick    typedef charT                          char_type;
14746035553Spatrick    typedef traits                         traits_type;
14846035553Spatrick    typedef typename traits_type::int_type int_type;
14946035553Spatrick    typedef typename traits_type::pos_type pos_type;
15046035553Spatrick    typedef typename traits_type::off_type off_type;
15146035553Spatrick
15246035553Spatrick    basic_fstream();
15346035553Spatrick    explicit basic_fstream(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out);
15446035553Spatrick    explicit basic_fstream(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out);
15546035553Spatrick    explicit basic_fstream(const filesystem::path& p,
15646035553Spatrick                           ios_base::openmode mode = ios_base::in|ios_base::out); C++17
15746035553Spatrick    basic_fstream(basic_fstream&& rhs);
15846035553Spatrick
15946035553Spatrick    basic_fstream& operator=(basic_fstream&& rhs);
16046035553Spatrick    void swap(basic_fstream& rhs);
16146035553Spatrick
16246035553Spatrick    basic_filebuf<char_type, traits_type>* rdbuf() const;
16346035553Spatrick    bool is_open() const;
16446035553Spatrick    void open(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out);
16546035553Spatrick    void open(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out);
16646035553Spatrick    void open(const filesystem::path& s,
16746035553Spatrick              ios_base::openmode mode = ios_base::in|ios_base::out); // C++17
16846035553Spatrick
16946035553Spatrick    void close();
17046035553Spatrick};
17146035553Spatrick
17246035553Spatricktemplate <class charT, class traits>
17346035553Spatrick  void swap(basic_fstream<charT, traits>& x, basic_fstream<charT, traits>& y);
17446035553Spatrick
17546035553Spatricktypedef basic_fstream<char>    fstream;
17646035553Spatricktypedef basic_fstream<wchar_t> wfstream;
17746035553Spatrick
17846035553Spatrick}  // std
17946035553Spatrick
18046035553Spatrick*/
18146035553Spatrick
182*4bdff4beSrobert#include <__algorithm/max.h>
183*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler
18476d0caaeSpatrick#include <__availability>
18546035553Spatrick#include <__config>
18646035553Spatrick#include <__locale>
187*4bdff4beSrobert#include <__utility/move.h>
188*4bdff4beSrobert#include <__utility/swap.h>
189*4bdff4beSrobert#include <__utility/unreachable.h>
19046035553Spatrick#include <cstdio>
19146035553Spatrick#include <cstdlib>
192*4bdff4beSrobert#include <cstring>
19376d0caaeSpatrick#include <istream>
19476d0caaeSpatrick#include <ostream>
195*4bdff4beSrobert#include <typeinfo>
196*4bdff4beSrobert#include <version>
19776d0caaeSpatrick
19876d0caaeSpatrick#if !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
19946035553Spatrick#   include <filesystem>
20076d0caaeSpatrick#endif
20146035553Spatrick
20246035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
20346035553Spatrick#  pragma GCC system_header
20446035553Spatrick#endif
20546035553Spatrick
20646035553Spatrick_LIBCPP_PUSH_MACROS
20746035553Spatrick#include <__undef_macros>
20846035553Spatrick
20976d0caaeSpatrick#if defined(_LIBCPP_MSVCRT) || defined(_NEWLIB_VERSION)
21076d0caaeSpatrick#  define _LIBCPP_HAS_NO_OFF_T_FUNCTIONS
21176d0caaeSpatrick#endif
21246035553Spatrick
213*4bdff4beSrobert#if !defined(_LIBCPP_HAS_NO_FSTREAM)
214*4bdff4beSrobert
21546035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD
21646035553Spatrick
21746035553Spatricktemplate <class _CharT, class _Traits>
21846035553Spatrickclass _LIBCPP_TEMPLATE_VIS basic_filebuf
21946035553Spatrick    : public basic_streambuf<_CharT, _Traits>
22046035553Spatrick{
22146035553Spatrickpublic:
22246035553Spatrick    typedef _CharT                           char_type;
22346035553Spatrick    typedef _Traits                          traits_type;
22446035553Spatrick    typedef typename traits_type::int_type   int_type;
22546035553Spatrick    typedef typename traits_type::pos_type   pos_type;
22646035553Spatrick    typedef typename traits_type::off_type   off_type;
22746035553Spatrick    typedef typename traits_type::state_type state_type;
22846035553Spatrick
22946035553Spatrick    // 27.9.1.2 Constructors/destructor:
23046035553Spatrick    basic_filebuf();
23146035553Spatrick    basic_filebuf(basic_filebuf&& __rhs);
232*4bdff4beSrobert    ~basic_filebuf() override;
23346035553Spatrick
23446035553Spatrick    // 27.9.1.3 Assign/swap:
23546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
23646035553Spatrick    basic_filebuf& operator=(basic_filebuf&& __rhs);
23746035553Spatrick    void swap(basic_filebuf& __rhs);
23846035553Spatrick
23946035553Spatrick    // 27.9.1.4 Members:
24046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
24146035553Spatrick    bool is_open() const;
24246035553Spatrick    basic_filebuf* open(const char* __s, ios_base::openmode __mode);
24346035553Spatrick#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
24446035553Spatrick    basic_filebuf* open(const wchar_t* __s, ios_base::openmode __mode);
24546035553Spatrick#endif
24646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
24746035553Spatrick    basic_filebuf* open(const string& __s, ios_base::openmode __mode);
24846035553Spatrick
24976d0caaeSpatrick#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
25046035553Spatrick    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
25146035553Spatrick    basic_filebuf* open(const _VSTD_FS::path& __p, ios_base::openmode __mode) {
25246035553Spatrick      return open(__p.c_str(), __mode);
25346035553Spatrick    }
25446035553Spatrick#endif
25546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
25646035553Spatrick    basic_filebuf* __open(int __fd, ios_base::openmode __mode);
25746035553Spatrick    basic_filebuf* close();
25846035553Spatrick
25946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
26046035553Spatrick    inline static const char*
26146035553Spatrick    __make_mdstring(ios_base::openmode __mode) _NOEXCEPT;
26246035553Spatrick
26346035553Spatrick  protected:
26446035553Spatrick    // 27.9.1.5 Overridden virtual functions:
265*4bdff4beSrobert    int_type underflow() override;
266*4bdff4beSrobert    int_type pbackfail(int_type __c = traits_type::eof()) override;
267*4bdff4beSrobert    int_type overflow (int_type __c = traits_type::eof()) override;
268*4bdff4beSrobert    basic_streambuf<char_type, traits_type>* setbuf(char_type* __s, streamsize __n) override;
269*4bdff4beSrobert    pos_type seekoff(off_type __off, ios_base::seekdir __way,
270*4bdff4beSrobert                     ios_base::openmode __wch = ios_base::in | ios_base::out) override;
271*4bdff4beSrobert    pos_type seekpos(pos_type __sp,
272*4bdff4beSrobert                     ios_base::openmode __wch = ios_base::in | ios_base::out) override;
273*4bdff4beSrobert    int sync() override;
274*4bdff4beSrobert    void imbue(const locale& __loc) override;
27546035553Spatrick
27646035553Spatrickprivate:
27746035553Spatrick  char* __extbuf_;
27846035553Spatrick  const char* __extbufnext_;
27946035553Spatrick  const char* __extbufend_;
28046035553Spatrick  char __extbuf_min_[8];
28146035553Spatrick  size_t __ebs_;
28246035553Spatrick  char_type* __intbuf_;
28346035553Spatrick  size_t __ibs_;
28446035553Spatrick  FILE* __file_;
28546035553Spatrick  const codecvt<char_type, char, state_type>* __cv_;
28646035553Spatrick  state_type __st_;
28746035553Spatrick  state_type __st_last_;
28846035553Spatrick  ios_base::openmode __om_;
28946035553Spatrick  ios_base::openmode __cm_;
29046035553Spatrick  bool __owns_eb_;
29146035553Spatrick  bool __owns_ib_;
29246035553Spatrick  bool __always_noconv_;
29346035553Spatrick
29446035553Spatrick  bool __read_mode();
29546035553Spatrick  void __write_mode();
29646035553Spatrick};
29746035553Spatrick
29846035553Spatricktemplate <class _CharT, class _Traits>
29946035553Spatrickbasic_filebuf<_CharT, _Traits>::basic_filebuf()
30076d0caaeSpatrick    : __extbuf_(nullptr),
30176d0caaeSpatrick      __extbufnext_(nullptr),
30276d0caaeSpatrick      __extbufend_(nullptr),
30346035553Spatrick      __ebs_(0),
30476d0caaeSpatrick      __intbuf_(nullptr),
30546035553Spatrick      __ibs_(0),
30676d0caaeSpatrick      __file_(nullptr),
30746035553Spatrick      __cv_(nullptr),
30846035553Spatrick      __st_(),
30946035553Spatrick      __st_last_(),
31046035553Spatrick      __om_(0),
31146035553Spatrick      __cm_(0),
31246035553Spatrick      __owns_eb_(false),
31346035553Spatrick      __owns_ib_(false),
31446035553Spatrick      __always_noconv_(false)
31546035553Spatrick{
316*4bdff4beSrobert    if (std::has_facet<codecvt<char_type, char, state_type> >(this->getloc()))
31746035553Spatrick    {
318*4bdff4beSrobert        __cv_ = &std::use_facet<codecvt<char_type, char, state_type> >(this->getloc());
31946035553Spatrick        __always_noconv_ = __cv_->always_noconv();
32046035553Spatrick    }
32176d0caaeSpatrick    setbuf(nullptr, 4096);
32246035553Spatrick}
32346035553Spatrick
32446035553Spatricktemplate <class _CharT, class _Traits>
32546035553Spatrickbasic_filebuf<_CharT, _Traits>::basic_filebuf(basic_filebuf&& __rhs)
32646035553Spatrick    : basic_streambuf<_CharT, _Traits>(__rhs)
32746035553Spatrick{
32846035553Spatrick    if (__rhs.__extbuf_ == __rhs.__extbuf_min_)
32946035553Spatrick    {
33046035553Spatrick        __extbuf_ = __extbuf_min_;
33146035553Spatrick        __extbufnext_ = __extbuf_ + (__rhs.__extbufnext_ - __rhs.__extbuf_);
33246035553Spatrick        __extbufend_ = __extbuf_ + (__rhs.__extbufend_ - __rhs.__extbuf_);
33346035553Spatrick    }
33446035553Spatrick    else
33546035553Spatrick    {
33646035553Spatrick        __extbuf_ = __rhs.__extbuf_;
33746035553Spatrick        __extbufnext_ = __rhs.__extbufnext_;
33846035553Spatrick        __extbufend_ = __rhs.__extbufend_;
33946035553Spatrick    }
34046035553Spatrick    __ebs_ = __rhs.__ebs_;
34146035553Spatrick    __intbuf_ = __rhs.__intbuf_;
34246035553Spatrick    __ibs_ = __rhs.__ibs_;
34346035553Spatrick    __file_ = __rhs.__file_;
34446035553Spatrick    __cv_ = __rhs.__cv_;
34546035553Spatrick    __st_ = __rhs.__st_;
34646035553Spatrick    __st_last_ = __rhs.__st_last_;
34746035553Spatrick    __om_ = __rhs.__om_;
34846035553Spatrick    __cm_ = __rhs.__cm_;
34946035553Spatrick    __owns_eb_ = __rhs.__owns_eb_;
35046035553Spatrick    __owns_ib_ = __rhs.__owns_ib_;
35146035553Spatrick    __always_noconv_ = __rhs.__always_noconv_;
35246035553Spatrick    if (__rhs.pbase())
35346035553Spatrick    {
35446035553Spatrick        if (__rhs.pbase() == __rhs.__intbuf_)
35546035553Spatrick            this->setp(__intbuf_, __intbuf_ + (__rhs. epptr() - __rhs.pbase()));
35646035553Spatrick        else
35746035553Spatrick            this->setp((char_type*)__extbuf_,
35846035553Spatrick                       (char_type*)__extbuf_ + (__rhs. epptr() - __rhs.pbase()));
35946035553Spatrick        this->__pbump(__rhs. pptr() - __rhs.pbase());
36046035553Spatrick    }
36146035553Spatrick    else if (__rhs.eback())
36246035553Spatrick    {
36346035553Spatrick        if (__rhs.eback() == __rhs.__intbuf_)
36446035553Spatrick            this->setg(__intbuf_, __intbuf_ + (__rhs.gptr() - __rhs.eback()),
36546035553Spatrick                                  __intbuf_ + (__rhs.egptr() - __rhs.eback()));
36646035553Spatrick        else
36746035553Spatrick            this->setg((char_type*)__extbuf_,
36846035553Spatrick                       (char_type*)__extbuf_ + (__rhs.gptr() - __rhs.eback()),
36946035553Spatrick                       (char_type*)__extbuf_ + (__rhs.egptr() - __rhs.eback()));
37046035553Spatrick    }
37176d0caaeSpatrick    __rhs.__extbuf_ = nullptr;
37276d0caaeSpatrick    __rhs.__extbufnext_ = nullptr;
37376d0caaeSpatrick    __rhs.__extbufend_ = nullptr;
37446035553Spatrick    __rhs.__ebs_ = 0;
37546035553Spatrick    __rhs.__intbuf_ = 0;
37646035553Spatrick    __rhs.__ibs_ = 0;
37776d0caaeSpatrick    __rhs.__file_ = nullptr;
37846035553Spatrick    __rhs.__st_ = state_type();
37946035553Spatrick    __rhs.__st_last_ = state_type();
38046035553Spatrick    __rhs.__om_ = 0;
38146035553Spatrick    __rhs.__cm_ = 0;
38246035553Spatrick    __rhs.__owns_eb_ = false;
38346035553Spatrick    __rhs.__owns_ib_ = false;
38446035553Spatrick    __rhs.setg(0, 0, 0);
38546035553Spatrick    __rhs.setp(0, 0);
38646035553Spatrick}
38746035553Spatrick
38846035553Spatricktemplate <class _CharT, class _Traits>
38946035553Spatrickinline
39046035553Spatrickbasic_filebuf<_CharT, _Traits>&
39146035553Spatrickbasic_filebuf<_CharT, _Traits>::operator=(basic_filebuf&& __rhs)
39246035553Spatrick{
39346035553Spatrick    close();
39446035553Spatrick    swap(__rhs);
39546035553Spatrick    return *this;
39646035553Spatrick}
39746035553Spatrick
39846035553Spatricktemplate <class _CharT, class _Traits>
39946035553Spatrickbasic_filebuf<_CharT, _Traits>::~basic_filebuf()
40046035553Spatrick{
40146035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
40246035553Spatrick    try
40346035553Spatrick    {
40446035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
40546035553Spatrick        close();
40646035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
40746035553Spatrick    }
40846035553Spatrick    catch (...)
40946035553Spatrick    {
41046035553Spatrick    }
41146035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
41246035553Spatrick    if (__owns_eb_)
41346035553Spatrick        delete [] __extbuf_;
41446035553Spatrick    if (__owns_ib_)
41546035553Spatrick        delete [] __intbuf_;
41646035553Spatrick}
41746035553Spatrick
41846035553Spatricktemplate <class _CharT, class _Traits>
41946035553Spatrickvoid
42046035553Spatrickbasic_filebuf<_CharT, _Traits>::swap(basic_filebuf& __rhs)
42146035553Spatrick{
42246035553Spatrick    basic_streambuf<char_type, traits_type>::swap(__rhs);
42346035553Spatrick    if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_)
42446035553Spatrick    {
425*4bdff4beSrobert        // Neither *this nor __rhs uses the small buffer, so we can simply swap the pointers.
426*4bdff4beSrobert        std::swap(__extbuf_, __rhs.__extbuf_);
427*4bdff4beSrobert        std::swap(__extbufnext_, __rhs.__extbufnext_);
428*4bdff4beSrobert        std::swap(__extbufend_, __rhs.__extbufend_);
42946035553Spatrick    }
43046035553Spatrick    else
43146035553Spatrick    {
432*4bdff4beSrobert        ptrdiff_t __ln = __extbufnext_       ? __extbufnext_ - __extbuf_             : 0;
433*4bdff4beSrobert        ptrdiff_t __le = __extbufend_        ? __extbufend_ - __extbuf_              : 0;
434*4bdff4beSrobert        ptrdiff_t __rn = __rhs.__extbufnext_ ? __rhs.__extbufnext_ - __rhs.__extbuf_ : 0;
435*4bdff4beSrobert        ptrdiff_t __re = __rhs.__extbufend_  ? __rhs.__extbufend_ - __rhs.__extbuf_  : 0;
43646035553Spatrick        if (__extbuf_ == __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_)
43746035553Spatrick        {
438*4bdff4beSrobert            // *this uses the small buffer, but __rhs doesn't.
43946035553Spatrick            __extbuf_ = __rhs.__extbuf_;
44046035553Spatrick            __rhs.__extbuf_ = __rhs.__extbuf_min_;
441*4bdff4beSrobert            std::memmove(__rhs.__extbuf_min_, __extbuf_min_, sizeof(__extbuf_min_));
44246035553Spatrick        }
44346035553Spatrick        else if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ == __rhs.__extbuf_min_)
44446035553Spatrick        {
445*4bdff4beSrobert            // *this doesn't use the small buffer, but __rhs does.
44646035553Spatrick            __rhs.__extbuf_ = __extbuf_;
44746035553Spatrick            __extbuf_ = __extbuf_min_;
448*4bdff4beSrobert            std::memmove(__extbuf_min_, __rhs.__extbuf_min_, sizeof(__extbuf_min_));
449*4bdff4beSrobert        }
450*4bdff4beSrobert        else
451*4bdff4beSrobert        {
452*4bdff4beSrobert            // Both *this and __rhs use the small buffer.
453*4bdff4beSrobert            char __tmp[sizeof(__extbuf_min_)];
454*4bdff4beSrobert            std::memmove(__tmp, __extbuf_min_, sizeof(__extbuf_min_));
455*4bdff4beSrobert            std::memmove(__extbuf_min_, __rhs.__extbuf_min_, sizeof(__extbuf_min_));
456*4bdff4beSrobert            std::memmove(__rhs.__extbuf_min_, __tmp, sizeof(__extbuf_min_));
45746035553Spatrick        }
45846035553Spatrick        __extbufnext_ = __extbuf_ + __rn;
45946035553Spatrick        __extbufend_ = __extbuf_ + __re;
46046035553Spatrick        __rhs.__extbufnext_ = __rhs.__extbuf_ + __ln;
46146035553Spatrick        __rhs.__extbufend_ = __rhs.__extbuf_ + __le;
46246035553Spatrick    }
46346035553Spatrick    _VSTD::swap(__ebs_, __rhs.__ebs_);
46446035553Spatrick    _VSTD::swap(__intbuf_, __rhs.__intbuf_);
46546035553Spatrick    _VSTD::swap(__ibs_, __rhs.__ibs_);
46646035553Spatrick    _VSTD::swap(__file_, __rhs.__file_);
46746035553Spatrick    _VSTD::swap(__cv_, __rhs.__cv_);
46846035553Spatrick    _VSTD::swap(__st_, __rhs.__st_);
46946035553Spatrick    _VSTD::swap(__st_last_, __rhs.__st_last_);
47046035553Spatrick    _VSTD::swap(__om_, __rhs.__om_);
47146035553Spatrick    _VSTD::swap(__cm_, __rhs.__cm_);
47246035553Spatrick    _VSTD::swap(__owns_eb_, __rhs.__owns_eb_);
47346035553Spatrick    _VSTD::swap(__owns_ib_, __rhs.__owns_ib_);
47446035553Spatrick    _VSTD::swap(__always_noconv_, __rhs.__always_noconv_);
47546035553Spatrick    if (this->eback() == (char_type*)__rhs.__extbuf_min_)
47646035553Spatrick    {
47746035553Spatrick        ptrdiff_t __n = this->gptr() - this->eback();
47846035553Spatrick        ptrdiff_t __e = this->egptr() - this->eback();
47946035553Spatrick        this->setg((char_type*)__extbuf_min_,
48046035553Spatrick                   (char_type*)__extbuf_min_ + __n,
48146035553Spatrick                   (char_type*)__extbuf_min_ + __e);
48246035553Spatrick    }
48346035553Spatrick    else if (this->pbase() == (char_type*)__rhs.__extbuf_min_)
48446035553Spatrick    {
48546035553Spatrick        ptrdiff_t __n = this->pptr() - this->pbase();
48646035553Spatrick        ptrdiff_t __e = this->epptr() - this->pbase();
48746035553Spatrick        this->setp((char_type*)__extbuf_min_,
48846035553Spatrick                   (char_type*)__extbuf_min_ + __e);
48946035553Spatrick        this->__pbump(__n);
49046035553Spatrick    }
49146035553Spatrick    if (__rhs.eback() == (char_type*)__extbuf_min_)
49246035553Spatrick    {
49346035553Spatrick        ptrdiff_t __n = __rhs.gptr() - __rhs.eback();
49446035553Spatrick        ptrdiff_t __e = __rhs.egptr() - __rhs.eback();
49546035553Spatrick        __rhs.setg((char_type*)__rhs.__extbuf_min_,
49646035553Spatrick                   (char_type*)__rhs.__extbuf_min_ + __n,
49746035553Spatrick                   (char_type*)__rhs.__extbuf_min_ + __e);
49846035553Spatrick    }
49946035553Spatrick    else if (__rhs.pbase() == (char_type*)__extbuf_min_)
50046035553Spatrick    {
50146035553Spatrick        ptrdiff_t __n = __rhs.pptr() - __rhs.pbase();
50246035553Spatrick        ptrdiff_t __e = __rhs.epptr() - __rhs.pbase();
50346035553Spatrick        __rhs.setp((char_type*)__rhs.__extbuf_min_,
50446035553Spatrick                   (char_type*)__rhs.__extbuf_min_ + __e);
50546035553Spatrick        __rhs.__pbump(__n);
50646035553Spatrick    }
50746035553Spatrick}
50846035553Spatrick
50946035553Spatricktemplate <class _CharT, class _Traits>
51046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
51146035553Spatrickvoid
51246035553Spatrickswap(basic_filebuf<_CharT, _Traits>& __x, basic_filebuf<_CharT, _Traits>& __y)
51346035553Spatrick{
51446035553Spatrick    __x.swap(__y);
51546035553Spatrick}
51646035553Spatrick
51746035553Spatricktemplate <class _CharT, class _Traits>
51846035553Spatrickinline
51946035553Spatrickbool
52046035553Spatrickbasic_filebuf<_CharT, _Traits>::is_open() const
52146035553Spatrick{
52276d0caaeSpatrick    return __file_ != nullptr;
52346035553Spatrick}
52446035553Spatrick
52546035553Spatricktemplate <class _CharT, class _Traits>
52646035553Spatrickconst char* basic_filebuf<_CharT, _Traits>::__make_mdstring(
52746035553Spatrick    ios_base::openmode __mode) _NOEXCEPT {
52846035553Spatrick  switch (__mode & ~ios_base::ate) {
52946035553Spatrick  case ios_base::out:
53046035553Spatrick  case ios_base::out | ios_base::trunc:
53146035553Spatrick    return "w" _LIBCPP_FOPEN_CLOEXEC_MODE;
53246035553Spatrick  case ios_base::out | ios_base::app:
53346035553Spatrick  case ios_base::app:
53446035553Spatrick    return "a" _LIBCPP_FOPEN_CLOEXEC_MODE;
53546035553Spatrick  case ios_base::in:
53646035553Spatrick    return "r" _LIBCPP_FOPEN_CLOEXEC_MODE;
53746035553Spatrick  case ios_base::in | ios_base::out:
53846035553Spatrick    return "r+" _LIBCPP_FOPEN_CLOEXEC_MODE;
53946035553Spatrick  case ios_base::in | ios_base::out | ios_base::trunc:
54046035553Spatrick    return "w+" _LIBCPP_FOPEN_CLOEXEC_MODE;
54146035553Spatrick  case ios_base::in | ios_base::out | ios_base::app:
54246035553Spatrick  case ios_base::in | ios_base::app:
54346035553Spatrick    return "a+" _LIBCPP_FOPEN_CLOEXEC_MODE;
54446035553Spatrick  case ios_base::out | ios_base::binary:
54546035553Spatrick  case ios_base::out | ios_base::trunc | ios_base::binary:
54646035553Spatrick    return "wb" _LIBCPP_FOPEN_CLOEXEC_MODE;
54746035553Spatrick  case ios_base::out | ios_base::app | ios_base::binary:
54846035553Spatrick  case ios_base::app | ios_base::binary:
54946035553Spatrick    return "ab" _LIBCPP_FOPEN_CLOEXEC_MODE;
55046035553Spatrick  case ios_base::in | ios_base::binary:
55146035553Spatrick    return "rb" _LIBCPP_FOPEN_CLOEXEC_MODE;
55246035553Spatrick  case ios_base::in | ios_base::out | ios_base::binary:
55346035553Spatrick    return "r+b" _LIBCPP_FOPEN_CLOEXEC_MODE;
55446035553Spatrick  case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary:
55546035553Spatrick    return "w+b" _LIBCPP_FOPEN_CLOEXEC_MODE;
55646035553Spatrick  case ios_base::in | ios_base::out | ios_base::app | ios_base::binary:
55746035553Spatrick  case ios_base::in | ios_base::app | ios_base::binary:
55846035553Spatrick    return "a+b" _LIBCPP_FOPEN_CLOEXEC_MODE;
55946035553Spatrick  default:
56046035553Spatrick    return nullptr;
56146035553Spatrick  }
562*4bdff4beSrobert  __libcpp_unreachable();
56346035553Spatrick}
56446035553Spatrick
56546035553Spatricktemplate <class _CharT, class _Traits>
56646035553Spatrickbasic_filebuf<_CharT, _Traits>*
56746035553Spatrickbasic_filebuf<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
56846035553Spatrick{
56976d0caaeSpatrick    basic_filebuf<_CharT, _Traits>* __rt = nullptr;
57076d0caaeSpatrick    if (__file_ == nullptr)
57146035553Spatrick    {
57246035553Spatrick      if (const char* __mdstr = __make_mdstring(__mode)) {
57346035553Spatrick        __rt = this;
57446035553Spatrick        __file_ = fopen(__s, __mdstr);
57546035553Spatrick        if (__file_) {
57646035553Spatrick          __om_ = __mode;
57746035553Spatrick          if (__mode & ios_base::ate) {
57846035553Spatrick            if (fseek(__file_, 0, SEEK_END)) {
57946035553Spatrick              fclose(__file_);
58076d0caaeSpatrick              __file_ = nullptr;
58176d0caaeSpatrick              __rt = nullptr;
58246035553Spatrick            }
58346035553Spatrick          }
58446035553Spatrick        } else
58576d0caaeSpatrick          __rt = nullptr;
58646035553Spatrick      }
58746035553Spatrick    }
58846035553Spatrick    return __rt;
58946035553Spatrick}
59046035553Spatrick
59146035553Spatricktemplate <class _CharT, class _Traits>
59276d0caaeSpatrickinline
59376d0caaeSpatrickbasic_filebuf<_CharT, _Traits>*
59446035553Spatrickbasic_filebuf<_CharT, _Traits>::__open(int __fd, ios_base::openmode __mode) {
59576d0caaeSpatrick  basic_filebuf<_CharT, _Traits>* __rt = nullptr;
59676d0caaeSpatrick  if (__file_ == nullptr) {
59746035553Spatrick    if (const char* __mdstr = __make_mdstring(__mode)) {
59846035553Spatrick      __rt = this;
59946035553Spatrick      __file_ = fdopen(__fd, __mdstr);
60046035553Spatrick      if (__file_) {
60146035553Spatrick        __om_ = __mode;
60246035553Spatrick        if (__mode & ios_base::ate) {
60346035553Spatrick          if (fseek(__file_, 0, SEEK_END)) {
60446035553Spatrick            fclose(__file_);
60576d0caaeSpatrick            __file_ = nullptr;
60676d0caaeSpatrick            __rt = nullptr;
60746035553Spatrick          }
60846035553Spatrick        }
60946035553Spatrick      } else
61076d0caaeSpatrick        __rt = nullptr;
61146035553Spatrick    }
61246035553Spatrick  }
61346035553Spatrick  return __rt;
61446035553Spatrick}
61546035553Spatrick
61646035553Spatrick#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
61746035553Spatrick// This is basically the same as the char* overload except that it uses _wfopen
61846035553Spatrick// and long mode strings.
61946035553Spatricktemplate <class _CharT, class _Traits>
62046035553Spatrickbasic_filebuf<_CharT, _Traits>*
62146035553Spatrickbasic_filebuf<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
62246035553Spatrick{
62376d0caaeSpatrick    basic_filebuf<_CharT, _Traits>* __rt = nullptr;
62476d0caaeSpatrick    if (__file_ == nullptr)
62546035553Spatrick    {
62646035553Spatrick        __rt = this;
62746035553Spatrick        const wchar_t* __mdstr;
62846035553Spatrick        switch (__mode & ~ios_base::ate)
62946035553Spatrick        {
63046035553Spatrick        case ios_base::out:
63146035553Spatrick        case ios_base::out | ios_base::trunc:
63246035553Spatrick            __mdstr = L"w";
63346035553Spatrick            break;
63446035553Spatrick        case ios_base::out | ios_base::app:
63546035553Spatrick        case ios_base::app:
63646035553Spatrick            __mdstr = L"a";
63746035553Spatrick            break;
63846035553Spatrick        case ios_base::in:
63946035553Spatrick            __mdstr = L"r";
64046035553Spatrick            break;
64146035553Spatrick        case ios_base::in | ios_base::out:
64246035553Spatrick            __mdstr = L"r+";
64346035553Spatrick            break;
64446035553Spatrick        case ios_base::in | ios_base::out | ios_base::trunc:
64546035553Spatrick            __mdstr = L"w+";
64646035553Spatrick            break;
64746035553Spatrick        case ios_base::in | ios_base::out | ios_base::app:
64846035553Spatrick        case ios_base::in | ios_base::app:
64946035553Spatrick            __mdstr = L"a+";
65046035553Spatrick            break;
65146035553Spatrick        case ios_base::out | ios_base::binary:
65246035553Spatrick        case ios_base::out | ios_base::trunc | ios_base::binary:
65346035553Spatrick            __mdstr = L"wb";
65446035553Spatrick            break;
65546035553Spatrick        case ios_base::out | ios_base::app | ios_base::binary:
65646035553Spatrick        case ios_base::app | ios_base::binary:
65746035553Spatrick            __mdstr = L"ab";
65846035553Spatrick            break;
65946035553Spatrick        case ios_base::in | ios_base::binary:
66046035553Spatrick            __mdstr = L"rb";
66146035553Spatrick            break;
66246035553Spatrick        case ios_base::in | ios_base::out | ios_base::binary:
66346035553Spatrick            __mdstr = L"r+b";
66446035553Spatrick            break;
66546035553Spatrick        case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary:
66646035553Spatrick            __mdstr = L"w+b";
66746035553Spatrick            break;
66846035553Spatrick        case ios_base::in | ios_base::out | ios_base::app | ios_base::binary:
66946035553Spatrick        case ios_base::in | ios_base::app | ios_base::binary:
67046035553Spatrick            __mdstr = L"a+b";
67146035553Spatrick            break;
67246035553Spatrick        default:
67376d0caaeSpatrick            __rt = nullptr;
67446035553Spatrick            break;
67546035553Spatrick        }
67646035553Spatrick        if (__rt)
67746035553Spatrick        {
67846035553Spatrick            __file_ = _wfopen(__s, __mdstr);
67946035553Spatrick            if (__file_)
68046035553Spatrick            {
68146035553Spatrick                __om_ = __mode;
68246035553Spatrick                if (__mode & ios_base::ate)
68346035553Spatrick                {
68446035553Spatrick                    if (fseek(__file_, 0, SEEK_END))
68546035553Spatrick                    {
68646035553Spatrick                        fclose(__file_);
68776d0caaeSpatrick                        __file_ = nullptr;
68876d0caaeSpatrick                        __rt = nullptr;
68946035553Spatrick                    }
69046035553Spatrick                }
69146035553Spatrick            }
69246035553Spatrick            else
69376d0caaeSpatrick                __rt = nullptr;
69446035553Spatrick        }
69546035553Spatrick    }
69646035553Spatrick    return __rt;
69746035553Spatrick}
69846035553Spatrick#endif
69946035553Spatrick
70046035553Spatricktemplate <class _CharT, class _Traits>
70146035553Spatrickinline
70246035553Spatrickbasic_filebuf<_CharT, _Traits>*
70346035553Spatrickbasic_filebuf<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
70446035553Spatrick{
70546035553Spatrick    return open(__s.c_str(), __mode);
70646035553Spatrick}
70746035553Spatrick
70846035553Spatricktemplate <class _CharT, class _Traits>
70946035553Spatrickbasic_filebuf<_CharT, _Traits>*
71046035553Spatrickbasic_filebuf<_CharT, _Traits>::close()
71146035553Spatrick{
71276d0caaeSpatrick    basic_filebuf<_CharT, _Traits>* __rt = nullptr;
71346035553Spatrick    if (__file_)
71446035553Spatrick    {
71546035553Spatrick        __rt = this;
71646035553Spatrick        unique_ptr<FILE, int(*)(FILE*)> __h(__file_, fclose);
71746035553Spatrick        if (sync())
71876d0caaeSpatrick            __rt = nullptr;
71946035553Spatrick        if (fclose(__h.release()))
72076d0caaeSpatrick            __rt = nullptr;
72176d0caaeSpatrick        __file_ = nullptr;
72246035553Spatrick        setbuf(0, 0);
72346035553Spatrick    }
72446035553Spatrick    return __rt;
72546035553Spatrick}
72646035553Spatrick
72746035553Spatricktemplate <class _CharT, class _Traits>
72846035553Spatricktypename basic_filebuf<_CharT, _Traits>::int_type
72946035553Spatrickbasic_filebuf<_CharT, _Traits>::underflow()
73046035553Spatrick{
73176d0caaeSpatrick    if (__file_ == nullptr)
73246035553Spatrick        return traits_type::eof();
73346035553Spatrick    bool __initial = __read_mode();
73446035553Spatrick    char_type __1buf;
73576d0caaeSpatrick    if (this->gptr() == nullptr)
73646035553Spatrick        this->setg(&__1buf, &__1buf+1, &__1buf+1);
737*4bdff4beSrobert    const size_t __unget_sz = __initial ? 0 : std::min<size_t>((this->egptr() - this->eback()) / 2, 4);
73846035553Spatrick    int_type __c = traits_type::eof();
73946035553Spatrick    if (this->gptr() == this->egptr())
74046035553Spatrick    {
74176d0caaeSpatrick        _VSTD::memmove(this->eback(), this->egptr() - __unget_sz, __unget_sz * sizeof(char_type));
74246035553Spatrick        if (__always_noconv_)
74346035553Spatrick        {
74446035553Spatrick            size_t __nmemb = static_cast<size_t>(this->egptr() - this->eback() - __unget_sz);
745*4bdff4beSrobert            __nmemb = ::fread(this->eback() + __unget_sz, 1, __nmemb, __file_);
74646035553Spatrick            if (__nmemb != 0)
74746035553Spatrick            {
74846035553Spatrick                this->setg(this->eback(),
74946035553Spatrick                           this->eback() + __unget_sz,
75046035553Spatrick                           this->eback() + __unget_sz + __nmemb);
75146035553Spatrick                __c = traits_type::to_int_type(*this->gptr());
75246035553Spatrick            }
75346035553Spatrick        }
75446035553Spatrick        else
75546035553Spatrick        {
756*4bdff4beSrobert            if (__extbufend_ != __extbufnext_) {
757*4bdff4beSrobert                _LIBCPP_ASSERT(__extbufnext_ != nullptr, "underflow moving from nullptr");
758*4bdff4beSrobert                _LIBCPP_ASSERT(__extbuf_ != nullptr, "underflow moving into nullptr");
75976d0caaeSpatrick                _VSTD::memmove(__extbuf_, __extbufnext_, __extbufend_ - __extbufnext_);
760*4bdff4beSrobert            }
76146035553Spatrick            __extbufnext_ = __extbuf_ + (__extbufend_ - __extbufnext_);
76246035553Spatrick            __extbufend_ = __extbuf_ + (__extbuf_ == __extbuf_min_ ? sizeof(__extbuf_min_) : __ebs_);
76346035553Spatrick            size_t __nmemb = _VSTD::min(static_cast<size_t>(__ibs_ - __unget_sz),
76446035553Spatrick                                 static_cast<size_t>(__extbufend_ - __extbufnext_));
76546035553Spatrick            codecvt_base::result __r;
76646035553Spatrick            __st_last_ = __st_;
76746035553Spatrick            size_t __nr = fread((void*) const_cast<char *>(__extbufnext_), 1, __nmemb, __file_);
76846035553Spatrick            if (__nr != 0)
76946035553Spatrick            {
77046035553Spatrick                if (!__cv_)
77146035553Spatrick                    __throw_bad_cast();
77246035553Spatrick
77346035553Spatrick                __extbufend_ = __extbufnext_ + __nr;
77446035553Spatrick                char_type*  __inext;
77546035553Spatrick                __r = __cv_->in(__st_, __extbuf_, __extbufend_, __extbufnext_,
77646035553Spatrick                                       this->eback() + __unget_sz,
77746035553Spatrick                                       this->eback() + __ibs_, __inext);
77846035553Spatrick                if (__r == codecvt_base::noconv)
77946035553Spatrick                {
78046035553Spatrick                    this->setg((char_type*)__extbuf_, (char_type*)__extbuf_,
78146035553Spatrick                                          (char_type*)const_cast<char *>(__extbufend_));
78246035553Spatrick                    __c = traits_type::to_int_type(*this->gptr());
78346035553Spatrick                }
78446035553Spatrick                else if (__inext != this->eback() + __unget_sz)
78546035553Spatrick                {
78646035553Spatrick                    this->setg(this->eback(), this->eback() + __unget_sz, __inext);
78746035553Spatrick                    __c = traits_type::to_int_type(*this->gptr());
78846035553Spatrick                }
78946035553Spatrick            }
79046035553Spatrick        }
79146035553Spatrick    }
79246035553Spatrick    else
79346035553Spatrick        __c = traits_type::to_int_type(*this->gptr());
79446035553Spatrick    if (this->eback() == &__1buf)
79576d0caaeSpatrick        this->setg(nullptr, nullptr, nullptr);
79646035553Spatrick    return __c;
79746035553Spatrick}
79846035553Spatrick
79946035553Spatricktemplate <class _CharT, class _Traits>
80046035553Spatricktypename basic_filebuf<_CharT, _Traits>::int_type
80146035553Spatrickbasic_filebuf<_CharT, _Traits>::pbackfail(int_type __c)
80246035553Spatrick{
80346035553Spatrick    if (__file_ && this->eback() < this->gptr())
80446035553Spatrick    {
80546035553Spatrick        if (traits_type::eq_int_type(__c, traits_type::eof()))
80646035553Spatrick        {
80746035553Spatrick            this->gbump(-1);
80846035553Spatrick            return traits_type::not_eof(__c);
80946035553Spatrick        }
81046035553Spatrick        if ((__om_ & ios_base::out) ||
81146035553Spatrick            traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1]))
81246035553Spatrick        {
81346035553Spatrick            this->gbump(-1);
81446035553Spatrick            *this->gptr() = traits_type::to_char_type(__c);
81546035553Spatrick            return __c;
81646035553Spatrick        }
81746035553Spatrick    }
81846035553Spatrick    return traits_type::eof();
81946035553Spatrick}
82046035553Spatrick
82146035553Spatricktemplate <class _CharT, class _Traits>
82246035553Spatricktypename basic_filebuf<_CharT, _Traits>::int_type
82346035553Spatrickbasic_filebuf<_CharT, _Traits>::overflow(int_type __c)
82446035553Spatrick{
82576d0caaeSpatrick    if (__file_ == nullptr)
82646035553Spatrick        return traits_type::eof();
82746035553Spatrick    __write_mode();
82846035553Spatrick    char_type __1buf;
82946035553Spatrick    char_type* __pb_save = this->pbase();
83046035553Spatrick    char_type* __epb_save = this->epptr();
83146035553Spatrick    if (!traits_type::eq_int_type(__c, traits_type::eof()))
83246035553Spatrick    {
83376d0caaeSpatrick        if (this->pptr() == nullptr)
83446035553Spatrick            this->setp(&__1buf, &__1buf+1);
83546035553Spatrick        *this->pptr() = traits_type::to_char_type(__c);
83646035553Spatrick        this->pbump(1);
83746035553Spatrick    }
83846035553Spatrick    if (this->pptr() != this->pbase())
83946035553Spatrick    {
84046035553Spatrick        if (__always_noconv_)
84146035553Spatrick        {
84246035553Spatrick            size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase());
843*4bdff4beSrobert            if (std::fwrite(this->pbase(), sizeof(char_type), __nmemb, __file_) != __nmemb)
84446035553Spatrick                return traits_type::eof();
84546035553Spatrick        }
84646035553Spatrick        else
84746035553Spatrick        {
84846035553Spatrick            char* __extbe = __extbuf_;
84946035553Spatrick            codecvt_base::result __r;
85046035553Spatrick            do
85146035553Spatrick            {
85246035553Spatrick                if (!__cv_)
85346035553Spatrick                    __throw_bad_cast();
85446035553Spatrick
85546035553Spatrick                const char_type* __e;
85646035553Spatrick                __r = __cv_->out(__st_, this->pbase(), this->pptr(), __e,
85746035553Spatrick                                        __extbuf_, __extbuf_ + __ebs_, __extbe);
85846035553Spatrick                if (__e == this->pbase())
85946035553Spatrick                    return traits_type::eof();
86046035553Spatrick                if (__r == codecvt_base::noconv)
86146035553Spatrick                {
86246035553Spatrick                    size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase());
863*4bdff4beSrobert                    if (std::fwrite(this->pbase(), 1, __nmemb, __file_) != __nmemb)
86446035553Spatrick                        return traits_type::eof();
86546035553Spatrick                }
86646035553Spatrick                else if (__r == codecvt_base::ok || __r == codecvt_base::partial)
86746035553Spatrick                {
86846035553Spatrick                    size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_);
86946035553Spatrick                    if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb)
87046035553Spatrick                        return traits_type::eof();
87146035553Spatrick                    if (__r == codecvt_base::partial)
87246035553Spatrick                    {
87346035553Spatrick                        this->setp(const_cast<char_type*>(__e), this->pptr());
87446035553Spatrick                        this->__pbump(this->epptr() - this->pbase());
87546035553Spatrick                    }
87646035553Spatrick                }
87746035553Spatrick                else
87846035553Spatrick                    return traits_type::eof();
87946035553Spatrick            } while (__r == codecvt_base::partial);
88046035553Spatrick        }
88146035553Spatrick        this->setp(__pb_save, __epb_save);
88246035553Spatrick    }
88346035553Spatrick    return traits_type::not_eof(__c);
88446035553Spatrick}
88546035553Spatrick
88646035553Spatricktemplate <class _CharT, class _Traits>
88746035553Spatrickbasic_streambuf<_CharT, _Traits>*
88846035553Spatrickbasic_filebuf<_CharT, _Traits>::setbuf(char_type* __s, streamsize __n)
88946035553Spatrick{
89076d0caaeSpatrick    this->setg(nullptr, nullptr, nullptr);
89176d0caaeSpatrick    this->setp(nullptr, nullptr);
89246035553Spatrick    if (__owns_eb_)
89346035553Spatrick        delete [] __extbuf_;
89446035553Spatrick    if (__owns_ib_)
89546035553Spatrick        delete [] __intbuf_;
89646035553Spatrick    __ebs_ = __n;
89746035553Spatrick    if (__ebs_ > sizeof(__extbuf_min_))
89846035553Spatrick    {
89946035553Spatrick        if (__always_noconv_ && __s)
90046035553Spatrick        {
90146035553Spatrick            __extbuf_ = (char*)__s;
90246035553Spatrick            __owns_eb_ = false;
90346035553Spatrick        }
90446035553Spatrick        else
90546035553Spatrick        {
90646035553Spatrick            __extbuf_ = new char[__ebs_];
90746035553Spatrick            __owns_eb_ = true;
90846035553Spatrick        }
90946035553Spatrick    }
91046035553Spatrick    else
91146035553Spatrick    {
91246035553Spatrick        __extbuf_ = __extbuf_min_;
91346035553Spatrick        __ebs_ = sizeof(__extbuf_min_);
91446035553Spatrick        __owns_eb_ = false;
91546035553Spatrick    }
91646035553Spatrick    if (!__always_noconv_)
91746035553Spatrick    {
91846035553Spatrick        __ibs_ = max<streamsize>(__n, sizeof(__extbuf_min_));
91946035553Spatrick        if (__s && __ibs_ >= sizeof(__extbuf_min_))
92046035553Spatrick        {
92146035553Spatrick            __intbuf_ = __s;
92246035553Spatrick            __owns_ib_ = false;
92346035553Spatrick        }
92446035553Spatrick        else
92546035553Spatrick        {
92646035553Spatrick            __intbuf_ = new char_type[__ibs_];
92746035553Spatrick            __owns_ib_ = true;
92846035553Spatrick        }
92946035553Spatrick    }
93046035553Spatrick    else
93146035553Spatrick    {
93246035553Spatrick        __ibs_ = 0;
93376d0caaeSpatrick        __intbuf_ = nullptr;
93446035553Spatrick        __owns_ib_ = false;
93546035553Spatrick    }
93646035553Spatrick    return this;
93746035553Spatrick}
93846035553Spatrick
93946035553Spatricktemplate <class _CharT, class _Traits>
94046035553Spatricktypename basic_filebuf<_CharT, _Traits>::pos_type
94146035553Spatrickbasic_filebuf<_CharT, _Traits>::seekoff(off_type __off, ios_base::seekdir __way,
94246035553Spatrick                                        ios_base::openmode)
94346035553Spatrick{
94446035553Spatrick    if (!__cv_)
94546035553Spatrick        __throw_bad_cast();
94646035553Spatrick
94746035553Spatrick    int __width = __cv_->encoding();
94876d0caaeSpatrick    if (__file_ == nullptr || (__width <= 0 && __off != 0) || sync())
94946035553Spatrick        return pos_type(off_type(-1));
95046035553Spatrick    // __width > 0 || __off == 0
95146035553Spatrick    int __whence;
95246035553Spatrick    switch (__way)
95346035553Spatrick    {
95446035553Spatrick    case ios_base::beg:
95546035553Spatrick        __whence = SEEK_SET;
95646035553Spatrick        break;
95746035553Spatrick    case ios_base::cur:
95846035553Spatrick        __whence = SEEK_CUR;
95946035553Spatrick        break;
96046035553Spatrick    case ios_base::end:
96146035553Spatrick        __whence = SEEK_END;
96246035553Spatrick        break;
96346035553Spatrick    default:
96446035553Spatrick        return pos_type(off_type(-1));
96546035553Spatrick    }
96646035553Spatrick#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
96746035553Spatrick    if (fseek(__file_, __width > 0 ? __width * __off : 0, __whence))
96846035553Spatrick        return pos_type(off_type(-1));
96946035553Spatrick    pos_type __r = ftell(__file_);
97046035553Spatrick#else
971*4bdff4beSrobert    if (::fseeko(__file_, __width > 0 ? __width * __off : 0, __whence))
97246035553Spatrick        return pos_type(off_type(-1));
97346035553Spatrick    pos_type __r = ftello(__file_);
97446035553Spatrick#endif
97546035553Spatrick    __r.state(__st_);
97646035553Spatrick    return __r;
97746035553Spatrick}
97846035553Spatrick
97946035553Spatricktemplate <class _CharT, class _Traits>
98046035553Spatricktypename basic_filebuf<_CharT, _Traits>::pos_type
98146035553Spatrickbasic_filebuf<_CharT, _Traits>::seekpos(pos_type __sp, ios_base::openmode)
98246035553Spatrick{
98376d0caaeSpatrick    if (__file_ == nullptr || sync())
98446035553Spatrick        return pos_type(off_type(-1));
98546035553Spatrick#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
98646035553Spatrick    if (fseek(__file_, __sp, SEEK_SET))
98746035553Spatrick        return pos_type(off_type(-1));
98846035553Spatrick#else
989*4bdff4beSrobert    if (::fseeko(__file_, __sp, SEEK_SET))
99046035553Spatrick        return pos_type(off_type(-1));
99146035553Spatrick#endif
99246035553Spatrick    __st_ = __sp.state();
99346035553Spatrick    return __sp;
99446035553Spatrick}
99546035553Spatrick
99646035553Spatricktemplate <class _CharT, class _Traits>
99746035553Spatrickint
99846035553Spatrickbasic_filebuf<_CharT, _Traits>::sync()
99946035553Spatrick{
100076d0caaeSpatrick    if (__file_ == nullptr)
100146035553Spatrick        return 0;
100246035553Spatrick    if (!__cv_)
100346035553Spatrick        __throw_bad_cast();
100446035553Spatrick
100546035553Spatrick    if (__cm_ & ios_base::out)
100646035553Spatrick    {
100746035553Spatrick        if (this->pptr() != this->pbase())
100846035553Spatrick            if (overflow() == traits_type::eof())
100946035553Spatrick                return -1;
101046035553Spatrick        codecvt_base::result __r;
101146035553Spatrick        do
101246035553Spatrick        {
101346035553Spatrick            char* __extbe;
101446035553Spatrick            __r = __cv_->unshift(__st_, __extbuf_, __extbuf_ + __ebs_, __extbe);
101546035553Spatrick            size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_);
101646035553Spatrick            if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb)
101746035553Spatrick                return -1;
101846035553Spatrick        } while (__r == codecvt_base::partial);
101946035553Spatrick        if (__r == codecvt_base::error)
102046035553Spatrick            return -1;
102146035553Spatrick        if (fflush(__file_))
102246035553Spatrick            return -1;
102346035553Spatrick    }
102446035553Spatrick    else if (__cm_ & ios_base::in)
102546035553Spatrick    {
102646035553Spatrick        off_type __c;
102746035553Spatrick        state_type __state = __st_last_;
102846035553Spatrick        bool __update_st = false;
102946035553Spatrick        if (__always_noconv_)
103046035553Spatrick            __c = this->egptr() - this->gptr();
103146035553Spatrick        else
103246035553Spatrick        {
103346035553Spatrick            int __width = __cv_->encoding();
103446035553Spatrick            __c = __extbufend_ - __extbufnext_;
103546035553Spatrick            if (__width > 0)
103646035553Spatrick                __c += __width * (this->egptr() - this->gptr());
103746035553Spatrick            else
103846035553Spatrick            {
103946035553Spatrick                if (this->gptr() != this->egptr())
104046035553Spatrick                {
104146035553Spatrick                    const int __off =  __cv_->length(__state, __extbuf_,
104246035553Spatrick                                                     __extbufnext_,
104346035553Spatrick                                                     this->gptr() - this->eback());
104446035553Spatrick                    __c += __extbufnext_ - __extbuf_ - __off;
104546035553Spatrick                    __update_st = true;
104646035553Spatrick                }
104746035553Spatrick            }
104846035553Spatrick        }
104946035553Spatrick#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
105046035553Spatrick        if (fseek(__file_, -__c, SEEK_CUR))
105146035553Spatrick            return -1;
105246035553Spatrick#else
1053*4bdff4beSrobert        if (::fseeko(__file_, -__c, SEEK_CUR))
105446035553Spatrick            return -1;
105546035553Spatrick#endif
105646035553Spatrick        if (__update_st)
105746035553Spatrick            __st_ = __state;
105846035553Spatrick        __extbufnext_ = __extbufend_ = __extbuf_;
105976d0caaeSpatrick        this->setg(nullptr, nullptr, nullptr);
106046035553Spatrick        __cm_ = 0;
106146035553Spatrick    }
106246035553Spatrick    return 0;
106346035553Spatrick}
106446035553Spatrick
106546035553Spatricktemplate <class _CharT, class _Traits>
106646035553Spatrickvoid
106746035553Spatrickbasic_filebuf<_CharT, _Traits>::imbue(const locale& __loc)
106846035553Spatrick{
106946035553Spatrick    sync();
1070*4bdff4beSrobert    __cv_ = &std::use_facet<codecvt<char_type, char, state_type> >(__loc);
107146035553Spatrick    bool __old_anc = __always_noconv_;
107246035553Spatrick    __always_noconv_ = __cv_->always_noconv();
107346035553Spatrick    if (__old_anc != __always_noconv_)
107446035553Spatrick    {
107576d0caaeSpatrick        this->setg(nullptr, nullptr, nullptr);
107676d0caaeSpatrick        this->setp(nullptr, nullptr);
107746035553Spatrick        // invariant, char_type is char, else we couldn't get here
107846035553Spatrick        if (__always_noconv_)  // need to dump __intbuf_
107946035553Spatrick        {
108046035553Spatrick            if (__owns_eb_)
108146035553Spatrick                delete [] __extbuf_;
108246035553Spatrick            __owns_eb_ = __owns_ib_;
108346035553Spatrick            __ebs_ = __ibs_;
108446035553Spatrick            __extbuf_ = (char*)__intbuf_;
108546035553Spatrick            __ibs_ = 0;
108676d0caaeSpatrick            __intbuf_ = nullptr;
108746035553Spatrick            __owns_ib_ = false;
108846035553Spatrick        }
108946035553Spatrick        else  // need to obtain an __intbuf_.
109046035553Spatrick        {     // If __extbuf_ is user-supplied, use it, else new __intbuf_
109146035553Spatrick            if (!__owns_eb_ && __extbuf_ != __extbuf_min_)
109246035553Spatrick            {
109346035553Spatrick                __ibs_ = __ebs_;
109446035553Spatrick                __intbuf_ = (char_type*)__extbuf_;
109546035553Spatrick                __owns_ib_ = false;
109646035553Spatrick                __extbuf_ = new char[__ebs_];
109746035553Spatrick                __owns_eb_ = true;
109846035553Spatrick            }
109946035553Spatrick            else
110046035553Spatrick            {
110146035553Spatrick                __ibs_ = __ebs_;
110246035553Spatrick                __intbuf_ = new char_type[__ibs_];
110346035553Spatrick                __owns_ib_ = true;
110446035553Spatrick            }
110546035553Spatrick        }
110646035553Spatrick    }
110746035553Spatrick}
110846035553Spatrick
110946035553Spatricktemplate <class _CharT, class _Traits>
111046035553Spatrickbool
111146035553Spatrickbasic_filebuf<_CharT, _Traits>::__read_mode()
111246035553Spatrick{
111346035553Spatrick    if (!(__cm_ & ios_base::in))
111446035553Spatrick    {
111576d0caaeSpatrick        this->setp(nullptr, nullptr);
111646035553Spatrick        if (__always_noconv_)
111746035553Spatrick            this->setg((char_type*)__extbuf_,
111846035553Spatrick                       (char_type*)__extbuf_ + __ebs_,
111946035553Spatrick                       (char_type*)__extbuf_ + __ebs_);
112046035553Spatrick        else
112146035553Spatrick            this->setg(__intbuf_, __intbuf_ + __ibs_, __intbuf_ + __ibs_);
112246035553Spatrick        __cm_ = ios_base::in;
112346035553Spatrick        return true;
112446035553Spatrick    }
112546035553Spatrick    return false;
112646035553Spatrick}
112746035553Spatrick
112846035553Spatricktemplate <class _CharT, class _Traits>
112946035553Spatrickvoid
113046035553Spatrickbasic_filebuf<_CharT, _Traits>::__write_mode()
113146035553Spatrick{
113246035553Spatrick    if (!(__cm_ & ios_base::out))
113346035553Spatrick    {
113476d0caaeSpatrick        this->setg(nullptr, nullptr, nullptr);
113546035553Spatrick        if (__ebs_ > sizeof(__extbuf_min_))
113646035553Spatrick        {
113746035553Spatrick            if (__always_noconv_)
113846035553Spatrick                this->setp((char_type*)__extbuf_,
113946035553Spatrick                           (char_type*)__extbuf_ + (__ebs_ - 1));
114046035553Spatrick            else
114146035553Spatrick                this->setp(__intbuf_, __intbuf_ + (__ibs_ - 1));
114246035553Spatrick        }
114346035553Spatrick        else
114476d0caaeSpatrick            this->setp(nullptr, nullptr);
114546035553Spatrick        __cm_ = ios_base::out;
114646035553Spatrick    }
114746035553Spatrick}
114846035553Spatrick
114946035553Spatrick// basic_ifstream
115046035553Spatrick
115146035553Spatricktemplate <class _CharT, class _Traits>
115246035553Spatrickclass _LIBCPP_TEMPLATE_VIS basic_ifstream
115346035553Spatrick    : public basic_istream<_CharT, _Traits>
115446035553Spatrick{
115546035553Spatrickpublic:
115646035553Spatrick    typedef _CharT                         char_type;
115746035553Spatrick    typedef _Traits                        traits_type;
115846035553Spatrick    typedef typename traits_type::int_type int_type;
115946035553Spatrick    typedef typename traits_type::pos_type pos_type;
116046035553Spatrick    typedef typename traits_type::off_type off_type;
116146035553Spatrick
116246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
116346035553Spatrick    basic_ifstream();
116446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
116546035553Spatrick    explicit basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in);
116646035553Spatrick#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
116746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
116846035553Spatrick    explicit basic_ifstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::in);
116946035553Spatrick#endif
117046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
117146035553Spatrick    explicit basic_ifstream(const string& __s, ios_base::openmode __mode = ios_base::in);
117276d0caaeSpatrick#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
117346035553Spatrick    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
117446035553Spatrick    explicit basic_ifstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in)
117546035553Spatrick      : basic_ifstream(__p.c_str(), __mode) {}
117646035553Spatrick#endif // _LIBCPP_STD_VER >= 17
117746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
117846035553Spatrick    basic_ifstream(basic_ifstream&& __rhs);
117946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
118046035553Spatrick    basic_ifstream& operator=(basic_ifstream&& __rhs);
118146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
118246035553Spatrick    void swap(basic_ifstream& __rhs);
118346035553Spatrick
118446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
118546035553Spatrick    basic_filebuf<char_type, traits_type>* rdbuf() const;
118646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
118746035553Spatrick    bool is_open() const;
118846035553Spatrick    void open(const char* __s, ios_base::openmode __mode = ios_base::in);
118946035553Spatrick#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
119046035553Spatrick    void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::in);
119146035553Spatrick#endif
119246035553Spatrick    void open(const string& __s, ios_base::openmode __mode = ios_base::in);
119376d0caaeSpatrick#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
119446035553Spatrick    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
119546035553Spatrick    void open(const filesystem::path& __p,
119646035553Spatrick              ios_base::openmode __mode = ios_base::in) {
119746035553Spatrick      return open(__p.c_str(), __mode);
119846035553Spatrick    }
119946035553Spatrick#endif // _LIBCPP_STD_VER >= 17
120046035553Spatrick
120146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
120246035553Spatrick    void __open(int __fd, ios_base::openmode __mode);
120346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
120446035553Spatrick    void close();
120546035553Spatrick
120646035553Spatrickprivate:
120746035553Spatrick    basic_filebuf<char_type, traits_type> __sb_;
120846035553Spatrick};
120946035553Spatrick
121046035553Spatricktemplate <class _CharT, class _Traits>
121146035553Spatrickinline
121246035553Spatrickbasic_ifstream<_CharT, _Traits>::basic_ifstream()
121346035553Spatrick    : basic_istream<char_type, traits_type>(&__sb_)
121446035553Spatrick{
121546035553Spatrick}
121646035553Spatrick
121746035553Spatricktemplate <class _CharT, class _Traits>
121846035553Spatrickinline
121946035553Spatrickbasic_ifstream<_CharT, _Traits>::basic_ifstream(const char* __s, ios_base::openmode __mode)
122046035553Spatrick    : basic_istream<char_type, traits_type>(&__sb_)
122146035553Spatrick{
122276d0caaeSpatrick    if (__sb_.open(__s, __mode | ios_base::in) == nullptr)
122346035553Spatrick        this->setstate(ios_base::failbit);
122446035553Spatrick}
122546035553Spatrick
122646035553Spatrick#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
122746035553Spatricktemplate <class _CharT, class _Traits>
122846035553Spatrickinline
122946035553Spatrickbasic_ifstream<_CharT, _Traits>::basic_ifstream(const wchar_t* __s, ios_base::openmode __mode)
123046035553Spatrick    : basic_istream<char_type, traits_type>(&__sb_)
123146035553Spatrick{
123276d0caaeSpatrick    if (__sb_.open(__s, __mode | ios_base::in) == nullptr)
123346035553Spatrick        this->setstate(ios_base::failbit);
123446035553Spatrick}
123546035553Spatrick#endif
123646035553Spatrick
123746035553Spatricktemplate <class _CharT, class _Traits>
123846035553Spatrickinline
123946035553Spatrickbasic_ifstream<_CharT, _Traits>::basic_ifstream(const string& __s, ios_base::openmode __mode)
124046035553Spatrick    : basic_istream<char_type, traits_type>(&__sb_)
124146035553Spatrick{
124276d0caaeSpatrick    if (__sb_.open(__s, __mode | ios_base::in) == nullptr)
124346035553Spatrick        this->setstate(ios_base::failbit);
124446035553Spatrick}
124546035553Spatrick
124646035553Spatricktemplate <class _CharT, class _Traits>
124746035553Spatrickinline
124846035553Spatrickbasic_ifstream<_CharT, _Traits>::basic_ifstream(basic_ifstream&& __rhs)
124946035553Spatrick    : basic_istream<char_type, traits_type>(_VSTD::move(__rhs)),
125046035553Spatrick      __sb_(_VSTD::move(__rhs.__sb_))
125146035553Spatrick{
125246035553Spatrick    this->set_rdbuf(&__sb_);
125346035553Spatrick}
125446035553Spatrick
125546035553Spatricktemplate <class _CharT, class _Traits>
125646035553Spatrickinline
125746035553Spatrickbasic_ifstream<_CharT, _Traits>&
125846035553Spatrickbasic_ifstream<_CharT, _Traits>::operator=(basic_ifstream&& __rhs)
125946035553Spatrick{
126046035553Spatrick    basic_istream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
126146035553Spatrick    __sb_ = _VSTD::move(__rhs.__sb_);
126246035553Spatrick    return *this;
126346035553Spatrick}
126446035553Spatrick
126546035553Spatricktemplate <class _CharT, class _Traits>
126646035553Spatrickinline
126746035553Spatrickvoid
126846035553Spatrickbasic_ifstream<_CharT, _Traits>::swap(basic_ifstream& __rhs)
126946035553Spatrick{
127046035553Spatrick    basic_istream<char_type, traits_type>::swap(__rhs);
127146035553Spatrick    __sb_.swap(__rhs.__sb_);
127246035553Spatrick}
127346035553Spatrick
127446035553Spatricktemplate <class _CharT, class _Traits>
127546035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
127646035553Spatrickvoid
127746035553Spatrickswap(basic_ifstream<_CharT, _Traits>& __x, basic_ifstream<_CharT, _Traits>& __y)
127846035553Spatrick{
127946035553Spatrick    __x.swap(__y);
128046035553Spatrick}
128146035553Spatrick
128246035553Spatricktemplate <class _CharT, class _Traits>
128346035553Spatrickinline
128446035553Spatrickbasic_filebuf<_CharT, _Traits>*
128546035553Spatrickbasic_ifstream<_CharT, _Traits>::rdbuf() const
128646035553Spatrick{
128746035553Spatrick    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
128846035553Spatrick}
128946035553Spatrick
129046035553Spatricktemplate <class _CharT, class _Traits>
129146035553Spatrickinline
129246035553Spatrickbool
129346035553Spatrickbasic_ifstream<_CharT, _Traits>::is_open() const
129446035553Spatrick{
129546035553Spatrick    return __sb_.is_open();
129646035553Spatrick}
129746035553Spatrick
129846035553Spatricktemplate <class _CharT, class _Traits>
129946035553Spatrickvoid
130046035553Spatrickbasic_ifstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
130146035553Spatrick{
130246035553Spatrick    if (__sb_.open(__s, __mode | ios_base::in))
130346035553Spatrick        this->clear();
130446035553Spatrick    else
130546035553Spatrick        this->setstate(ios_base::failbit);
130646035553Spatrick}
130746035553Spatrick
130846035553Spatrick#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
130946035553Spatricktemplate <class _CharT, class _Traits>
131046035553Spatrickvoid
131146035553Spatrickbasic_ifstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
131246035553Spatrick{
131346035553Spatrick    if (__sb_.open(__s, __mode | ios_base::in))
131446035553Spatrick        this->clear();
131546035553Spatrick    else
131646035553Spatrick        this->setstate(ios_base::failbit);
131746035553Spatrick}
131846035553Spatrick#endif
131946035553Spatrick
132046035553Spatricktemplate <class _CharT, class _Traits>
132146035553Spatrickvoid
132246035553Spatrickbasic_ifstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
132346035553Spatrick{
132446035553Spatrick    if (__sb_.open(__s, __mode | ios_base::in))
132546035553Spatrick        this->clear();
132646035553Spatrick    else
132746035553Spatrick        this->setstate(ios_base::failbit);
132846035553Spatrick}
132946035553Spatrick
133046035553Spatricktemplate <class _CharT, class _Traits>
133176d0caaeSpatrickinline
133246035553Spatrickvoid basic_ifstream<_CharT, _Traits>::__open(int __fd,
133346035553Spatrick                                             ios_base::openmode __mode) {
133446035553Spatrick  if (__sb_.__open(__fd, __mode | ios_base::in))
133546035553Spatrick    this->clear();
133646035553Spatrick  else
133746035553Spatrick    this->setstate(ios_base::failbit);
133846035553Spatrick}
133946035553Spatrick
134046035553Spatricktemplate <class _CharT, class _Traits>
134146035553Spatrickinline
134246035553Spatrickvoid
134346035553Spatrickbasic_ifstream<_CharT, _Traits>::close()
134446035553Spatrick{
134546035553Spatrick    if (__sb_.close() == 0)
134646035553Spatrick        this->setstate(ios_base::failbit);
134746035553Spatrick}
134846035553Spatrick
134946035553Spatrick// basic_ofstream
135046035553Spatrick
135146035553Spatricktemplate <class _CharT, class _Traits>
135246035553Spatrickclass _LIBCPP_TEMPLATE_VIS basic_ofstream
135346035553Spatrick    : public basic_ostream<_CharT, _Traits>
135446035553Spatrick{
135546035553Spatrickpublic:
135646035553Spatrick    typedef _CharT                         char_type;
135746035553Spatrick    typedef _Traits                        traits_type;
135846035553Spatrick    typedef typename traits_type::int_type int_type;
135946035553Spatrick    typedef typename traits_type::pos_type pos_type;
136046035553Spatrick    typedef typename traits_type::off_type off_type;
136146035553Spatrick
136246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
136346035553Spatrick    basic_ofstream();
136446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
136546035553Spatrick    explicit basic_ofstream(const char* __s, ios_base::openmode __mode = ios_base::out);
136646035553Spatrick#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
136746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
136846035553Spatrick    explicit basic_ofstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::out);
136946035553Spatrick#endif
137046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
137146035553Spatrick    explicit basic_ofstream(const string& __s, ios_base::openmode __mode = ios_base::out);
137246035553Spatrick
137376d0caaeSpatrick#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
137446035553Spatrick    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
137546035553Spatrick    explicit basic_ofstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::out)
137646035553Spatrick      : basic_ofstream(__p.c_str(), __mode) {}
137746035553Spatrick#endif // _LIBCPP_STD_VER >= 17
137846035553Spatrick
137946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
138046035553Spatrick    basic_ofstream(basic_ofstream&& __rhs);
138146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
138246035553Spatrick    basic_ofstream& operator=(basic_ofstream&& __rhs);
138346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
138446035553Spatrick    void swap(basic_ofstream& __rhs);
138546035553Spatrick
138646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
138746035553Spatrick    basic_filebuf<char_type, traits_type>* rdbuf() const;
138846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
138946035553Spatrick    bool is_open() const;
139046035553Spatrick    void open(const char* __s, ios_base::openmode __mode = ios_base::out);
139146035553Spatrick#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
139246035553Spatrick    void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::out);
139346035553Spatrick#endif
139446035553Spatrick    void open(const string& __s, ios_base::openmode __mode = ios_base::out);
139546035553Spatrick
139676d0caaeSpatrick#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
139746035553Spatrick    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
139846035553Spatrick    void open(const filesystem::path& __p, ios_base::openmode __mode = ios_base::out)
139946035553Spatrick    { return open(__p.c_str(), __mode); }
140046035553Spatrick#endif // _LIBCPP_STD_VER >= 17
140146035553Spatrick
140246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
140346035553Spatrick    void __open(int __fd, ios_base::openmode __mode);
140446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
140546035553Spatrick    void close();
140646035553Spatrick
140746035553Spatrickprivate:
140846035553Spatrick    basic_filebuf<char_type, traits_type> __sb_;
140946035553Spatrick};
141046035553Spatrick
141146035553Spatricktemplate <class _CharT, class _Traits>
141246035553Spatrickinline
141346035553Spatrickbasic_ofstream<_CharT, _Traits>::basic_ofstream()
141446035553Spatrick    : basic_ostream<char_type, traits_type>(&__sb_)
141546035553Spatrick{
141646035553Spatrick}
141746035553Spatrick
141846035553Spatricktemplate <class _CharT, class _Traits>
141946035553Spatrickinline
142046035553Spatrickbasic_ofstream<_CharT, _Traits>::basic_ofstream(const char* __s, ios_base::openmode __mode)
142146035553Spatrick    : basic_ostream<char_type, traits_type>(&__sb_)
142246035553Spatrick{
142376d0caaeSpatrick    if (__sb_.open(__s, __mode | ios_base::out) == nullptr)
142446035553Spatrick        this->setstate(ios_base::failbit);
142546035553Spatrick}
142646035553Spatrick
142746035553Spatrick#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
142846035553Spatricktemplate <class _CharT, class _Traits>
142946035553Spatrickinline
143046035553Spatrickbasic_ofstream<_CharT, _Traits>::basic_ofstream(const wchar_t* __s, ios_base::openmode __mode)
143146035553Spatrick    : basic_ostream<char_type, traits_type>(&__sb_)
143246035553Spatrick{
143376d0caaeSpatrick    if (__sb_.open(__s, __mode | ios_base::out) == nullptr)
143446035553Spatrick        this->setstate(ios_base::failbit);
143546035553Spatrick}
143646035553Spatrick#endif
143746035553Spatrick
143846035553Spatricktemplate <class _CharT, class _Traits>
143946035553Spatrickinline
144046035553Spatrickbasic_ofstream<_CharT, _Traits>::basic_ofstream(const string& __s, ios_base::openmode __mode)
144146035553Spatrick    : basic_ostream<char_type, traits_type>(&__sb_)
144246035553Spatrick{
144376d0caaeSpatrick    if (__sb_.open(__s, __mode | ios_base::out) == nullptr)
144446035553Spatrick        this->setstate(ios_base::failbit);
144546035553Spatrick}
144646035553Spatrick
144746035553Spatricktemplate <class _CharT, class _Traits>
144846035553Spatrickinline
144946035553Spatrickbasic_ofstream<_CharT, _Traits>::basic_ofstream(basic_ofstream&& __rhs)
145046035553Spatrick    : basic_ostream<char_type, traits_type>(_VSTD::move(__rhs)),
145146035553Spatrick      __sb_(_VSTD::move(__rhs.__sb_))
145246035553Spatrick{
145346035553Spatrick    this->set_rdbuf(&__sb_);
145446035553Spatrick}
145546035553Spatrick
145646035553Spatricktemplate <class _CharT, class _Traits>
145746035553Spatrickinline
145846035553Spatrickbasic_ofstream<_CharT, _Traits>&
145946035553Spatrickbasic_ofstream<_CharT, _Traits>::operator=(basic_ofstream&& __rhs)
146046035553Spatrick{
146146035553Spatrick    basic_ostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
146246035553Spatrick    __sb_ = _VSTD::move(__rhs.__sb_);
146346035553Spatrick    return *this;
146446035553Spatrick}
146546035553Spatrick
146646035553Spatricktemplate <class _CharT, class _Traits>
146746035553Spatrickinline
146846035553Spatrickvoid
146946035553Spatrickbasic_ofstream<_CharT, _Traits>::swap(basic_ofstream& __rhs)
147046035553Spatrick{
147146035553Spatrick    basic_ostream<char_type, traits_type>::swap(__rhs);
147246035553Spatrick    __sb_.swap(__rhs.__sb_);
147346035553Spatrick}
147446035553Spatrick
147546035553Spatricktemplate <class _CharT, class _Traits>
147646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
147746035553Spatrickvoid
147846035553Spatrickswap(basic_ofstream<_CharT, _Traits>& __x, basic_ofstream<_CharT, _Traits>& __y)
147946035553Spatrick{
148046035553Spatrick    __x.swap(__y);
148146035553Spatrick}
148246035553Spatrick
148346035553Spatricktemplate <class _CharT, class _Traits>
148446035553Spatrickinline
148546035553Spatrickbasic_filebuf<_CharT, _Traits>*
148646035553Spatrickbasic_ofstream<_CharT, _Traits>::rdbuf() const
148746035553Spatrick{
148846035553Spatrick    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
148946035553Spatrick}
149046035553Spatrick
149146035553Spatricktemplate <class _CharT, class _Traits>
149246035553Spatrickinline
149346035553Spatrickbool
149446035553Spatrickbasic_ofstream<_CharT, _Traits>::is_open() const
149546035553Spatrick{
149646035553Spatrick    return __sb_.is_open();
149746035553Spatrick}
149846035553Spatrick
149946035553Spatricktemplate <class _CharT, class _Traits>
150046035553Spatrickvoid
150146035553Spatrickbasic_ofstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
150246035553Spatrick{
150346035553Spatrick    if (__sb_.open(__s, __mode | ios_base::out))
150446035553Spatrick        this->clear();
150546035553Spatrick    else
150646035553Spatrick        this->setstate(ios_base::failbit);
150746035553Spatrick}
150846035553Spatrick
150946035553Spatrick#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
151046035553Spatricktemplate <class _CharT, class _Traits>
151146035553Spatrickvoid
151246035553Spatrickbasic_ofstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
151346035553Spatrick{
151446035553Spatrick    if (__sb_.open(__s, __mode | ios_base::out))
151546035553Spatrick        this->clear();
151646035553Spatrick    else
151746035553Spatrick        this->setstate(ios_base::failbit);
151846035553Spatrick}
151946035553Spatrick#endif
152046035553Spatrick
152146035553Spatricktemplate <class _CharT, class _Traits>
152246035553Spatrickvoid
152346035553Spatrickbasic_ofstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
152446035553Spatrick{
152546035553Spatrick    if (__sb_.open(__s, __mode | ios_base::out))
152646035553Spatrick        this->clear();
152746035553Spatrick    else
152846035553Spatrick        this->setstate(ios_base::failbit);
152946035553Spatrick}
153046035553Spatrick
153146035553Spatricktemplate <class _CharT, class _Traits>
153276d0caaeSpatrickinline
153346035553Spatrickvoid basic_ofstream<_CharT, _Traits>::__open(int __fd,
153446035553Spatrick                                             ios_base::openmode __mode) {
153546035553Spatrick  if (__sb_.__open(__fd, __mode | ios_base::out))
153646035553Spatrick    this->clear();
153746035553Spatrick  else
153846035553Spatrick    this->setstate(ios_base::failbit);
153946035553Spatrick}
154046035553Spatrick
154146035553Spatricktemplate <class _CharT, class _Traits>
154246035553Spatrickinline
154346035553Spatrickvoid
154446035553Spatrickbasic_ofstream<_CharT, _Traits>::close()
154546035553Spatrick{
154676d0caaeSpatrick    if (__sb_.close() == nullptr)
154746035553Spatrick        this->setstate(ios_base::failbit);
154846035553Spatrick}
154946035553Spatrick
155046035553Spatrick// basic_fstream
155146035553Spatrick
155246035553Spatricktemplate <class _CharT, class _Traits>
155346035553Spatrickclass _LIBCPP_TEMPLATE_VIS basic_fstream
155446035553Spatrick    : public basic_iostream<_CharT, _Traits>
155546035553Spatrick{
155646035553Spatrickpublic:
155746035553Spatrick    typedef _CharT                         char_type;
155846035553Spatrick    typedef _Traits                        traits_type;
155946035553Spatrick    typedef typename traits_type::int_type int_type;
156046035553Spatrick    typedef typename traits_type::pos_type pos_type;
156146035553Spatrick    typedef typename traits_type::off_type off_type;
156246035553Spatrick
156346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
156446035553Spatrick    basic_fstream();
156546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
156646035553Spatrick    explicit basic_fstream(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
156746035553Spatrick#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
156846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
156946035553Spatrick    explicit basic_fstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
157046035553Spatrick#endif
157146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
157246035553Spatrick    explicit basic_fstream(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
157346035553Spatrick
157476d0caaeSpatrick#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
157546035553Spatrick    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
157646035553Spatrick    explicit basic_fstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in | ios_base::out)
157746035553Spatrick      : basic_fstream(__p.c_str(), __mode) {}
157846035553Spatrick#endif // _LIBCPP_STD_VER >= 17
157946035553Spatrick
158046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
158146035553Spatrick    basic_fstream(basic_fstream&& __rhs);
158246035553Spatrick
158346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
158446035553Spatrick    basic_fstream& operator=(basic_fstream&& __rhs);
158576d0caaeSpatrick
158646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
158746035553Spatrick    void swap(basic_fstream& __rhs);
158846035553Spatrick
158946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
159046035553Spatrick    basic_filebuf<char_type, traits_type>* rdbuf() const;
159146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
159246035553Spatrick    bool is_open() const;
159346035553Spatrick    void open(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
159446035553Spatrick#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
159546035553Spatrick    void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
159646035553Spatrick#endif
159746035553Spatrick    void open(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
159846035553Spatrick
159976d0caaeSpatrick#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
160046035553Spatrick    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
160146035553Spatrick    void open(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in|ios_base::out)
160246035553Spatrick    { return open(__p.c_str(), __mode); }
160346035553Spatrick#endif // _LIBCPP_STD_VER >= 17
160446035553Spatrick
160546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
160646035553Spatrick    void close();
160746035553Spatrick
160846035553Spatrickprivate:
160946035553Spatrick    basic_filebuf<char_type, traits_type> __sb_;
161046035553Spatrick};
161146035553Spatrick
161246035553Spatricktemplate <class _CharT, class _Traits>
161346035553Spatrickinline
161446035553Spatrickbasic_fstream<_CharT, _Traits>::basic_fstream()
161546035553Spatrick    : basic_iostream<char_type, traits_type>(&__sb_)
161646035553Spatrick{
161746035553Spatrick}
161846035553Spatrick
161946035553Spatricktemplate <class _CharT, class _Traits>
162046035553Spatrickinline
162146035553Spatrickbasic_fstream<_CharT, _Traits>::basic_fstream(const char* __s, ios_base::openmode __mode)
162246035553Spatrick    : basic_iostream<char_type, traits_type>(&__sb_)
162346035553Spatrick{
162476d0caaeSpatrick    if (__sb_.open(__s, __mode) == nullptr)
162546035553Spatrick        this->setstate(ios_base::failbit);
162646035553Spatrick}
162746035553Spatrick
162846035553Spatrick#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
162946035553Spatricktemplate <class _CharT, class _Traits>
163046035553Spatrickinline
163146035553Spatrickbasic_fstream<_CharT, _Traits>::basic_fstream(const wchar_t* __s, ios_base::openmode __mode)
163246035553Spatrick    : basic_iostream<char_type, traits_type>(&__sb_)
163346035553Spatrick{
163476d0caaeSpatrick    if (__sb_.open(__s, __mode) == nullptr)
163546035553Spatrick        this->setstate(ios_base::failbit);
163646035553Spatrick}
163746035553Spatrick#endif
163846035553Spatrick
163946035553Spatricktemplate <class _CharT, class _Traits>
164046035553Spatrickinline
164146035553Spatrickbasic_fstream<_CharT, _Traits>::basic_fstream(const string& __s, ios_base::openmode __mode)
164246035553Spatrick    : basic_iostream<char_type, traits_type>(&__sb_)
164346035553Spatrick{
164476d0caaeSpatrick    if (__sb_.open(__s, __mode) == nullptr)
164546035553Spatrick        this->setstate(ios_base::failbit);
164646035553Spatrick}
164746035553Spatrick
164846035553Spatricktemplate <class _CharT, class _Traits>
164946035553Spatrickinline
165046035553Spatrickbasic_fstream<_CharT, _Traits>::basic_fstream(basic_fstream&& __rhs)
165146035553Spatrick    : basic_iostream<char_type, traits_type>(_VSTD::move(__rhs)),
165246035553Spatrick      __sb_(_VSTD::move(__rhs.__sb_))
165346035553Spatrick{
165446035553Spatrick    this->set_rdbuf(&__sb_);
165546035553Spatrick}
165646035553Spatrick
165746035553Spatricktemplate <class _CharT, class _Traits>
165846035553Spatrickinline
165946035553Spatrickbasic_fstream<_CharT, _Traits>&
166046035553Spatrickbasic_fstream<_CharT, _Traits>::operator=(basic_fstream&& __rhs)
166146035553Spatrick{
166246035553Spatrick    basic_iostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
166346035553Spatrick    __sb_ = _VSTD::move(__rhs.__sb_);
166446035553Spatrick    return *this;
166546035553Spatrick}
166646035553Spatrick
166746035553Spatricktemplate <class _CharT, class _Traits>
166846035553Spatrickinline
166946035553Spatrickvoid
167046035553Spatrickbasic_fstream<_CharT, _Traits>::swap(basic_fstream& __rhs)
167146035553Spatrick{
167246035553Spatrick    basic_iostream<char_type, traits_type>::swap(__rhs);
167346035553Spatrick    __sb_.swap(__rhs.__sb_);
167446035553Spatrick}
167546035553Spatrick
167646035553Spatricktemplate <class _CharT, class _Traits>
167746035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
167846035553Spatrickvoid
167946035553Spatrickswap(basic_fstream<_CharT, _Traits>& __x, basic_fstream<_CharT, _Traits>& __y)
168046035553Spatrick{
168146035553Spatrick    __x.swap(__y);
168246035553Spatrick}
168346035553Spatrick
168446035553Spatricktemplate <class _CharT, class _Traits>
168546035553Spatrickinline
168646035553Spatrickbasic_filebuf<_CharT, _Traits>*
168746035553Spatrickbasic_fstream<_CharT, _Traits>::rdbuf() const
168846035553Spatrick{
168946035553Spatrick    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
169046035553Spatrick}
169146035553Spatrick
169246035553Spatricktemplate <class _CharT, class _Traits>
169346035553Spatrickinline
169446035553Spatrickbool
169546035553Spatrickbasic_fstream<_CharT, _Traits>::is_open() const
169646035553Spatrick{
169746035553Spatrick    return __sb_.is_open();
169846035553Spatrick}
169946035553Spatrick
170046035553Spatricktemplate <class _CharT, class _Traits>
170146035553Spatrickvoid
170246035553Spatrickbasic_fstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
170346035553Spatrick{
170446035553Spatrick    if (__sb_.open(__s, __mode))
170546035553Spatrick        this->clear();
170646035553Spatrick    else
170746035553Spatrick        this->setstate(ios_base::failbit);
170846035553Spatrick}
170946035553Spatrick
171046035553Spatrick#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
171146035553Spatricktemplate <class _CharT, class _Traits>
171246035553Spatrickvoid
171346035553Spatrickbasic_fstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
171446035553Spatrick{
171546035553Spatrick    if (__sb_.open(__s, __mode))
171646035553Spatrick        this->clear();
171746035553Spatrick    else
171846035553Spatrick        this->setstate(ios_base::failbit);
171946035553Spatrick}
172046035553Spatrick#endif
172146035553Spatrick
172246035553Spatricktemplate <class _CharT, class _Traits>
172346035553Spatrickvoid
172446035553Spatrickbasic_fstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
172546035553Spatrick{
172646035553Spatrick    if (__sb_.open(__s, __mode))
172746035553Spatrick        this->clear();
172846035553Spatrick    else
172946035553Spatrick        this->setstate(ios_base::failbit);
173046035553Spatrick}
173146035553Spatrick
173246035553Spatricktemplate <class _CharT, class _Traits>
173346035553Spatrickinline
173446035553Spatrickvoid
173546035553Spatrickbasic_fstream<_CharT, _Traits>::close()
173646035553Spatrick{
173776d0caaeSpatrick    if (__sb_.close() == nullptr)
173846035553Spatrick        this->setstate(ios_base::failbit);
173946035553Spatrick}
174046035553Spatrick
174176d0caaeSpatrick#if defined(_LIBCPP_ABI_ENABLE_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1)
1742*4bdff4beSrobertextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ifstream<char>;
1743*4bdff4beSrobertextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ofstream<char>;
1744*4bdff4beSrobertextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_filebuf<char>;
174576d0caaeSpatrick#endif
174676d0caaeSpatrick
174746035553Spatrick_LIBCPP_END_NAMESPACE_STD
174846035553Spatrick
1749*4bdff4beSrobert#endif // _LIBCPP_HAS_NO_FSTREAM
1750*4bdff4beSrobert
175146035553Spatrick_LIBCPP_POP_MACROS
175246035553Spatrick
1753*4bdff4beSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
1754*4bdff4beSrobert#  include <atomic>
1755*4bdff4beSrobert#  include <concepts>
1756*4bdff4beSrobert#  include <iosfwd>
1757*4bdff4beSrobert#  include <limits>
1758*4bdff4beSrobert#  include <new>
1759*4bdff4beSrobert#  include <stdexcept>
1760*4bdff4beSrobert#  include <type_traits>
1761*4bdff4beSrobert#endif
1762*4bdff4beSrobert
176346035553Spatrick#endif // _LIBCPP_FSTREAM
1764