13e519524SHoward Hinnant// -*- C++ -*-
2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===//
33e519524SHoward Hinnant//
457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73e519524SHoward Hinnant//
83e519524SHoward Hinnant//===----------------------------------------------------------------------===//
93e519524SHoward Hinnant
103e519524SHoward Hinnant#ifndef _LIBCPP_FSTREAM
113e519524SHoward Hinnant#define _LIBCPP_FSTREAM
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant    fstream synopsis
153e519524SHoward Hinnant
163e519524SHoward Hinnanttemplate <class charT, class traits = char_traits<charT> >
173e519524SHoward Hinnantclass basic_filebuf
183e519524SHoward Hinnant    : public basic_streambuf<charT, traits>
193e519524SHoward Hinnant{
203e519524SHoward Hinnantpublic:
213e519524SHoward Hinnant    typedef charT                          char_type;
223e519524SHoward Hinnant    typedef traits                         traits_type;
233e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
243e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
253e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
263e519524SHoward Hinnant
273e519524SHoward Hinnant    // 27.9.1.2 Constructors/destructor:
283e519524SHoward Hinnant    basic_filebuf();
293e519524SHoward Hinnant    basic_filebuf(basic_filebuf&& rhs);
303e519524SHoward Hinnant    virtual ~basic_filebuf();
313e519524SHoward Hinnant
323e519524SHoward Hinnant    // 27.9.1.3 Assign/swap:
333e519524SHoward Hinnant    basic_filebuf& operator=(basic_filebuf&& rhs);
343e519524SHoward Hinnant    void swap(basic_filebuf& rhs);
353e519524SHoward Hinnant
363e519524SHoward Hinnant    // 27.9.1.4 Members:
373e519524SHoward Hinnant    bool is_open() const;
383e519524SHoward Hinnant    basic_filebuf* open(const char* s, ios_base::openmode mode);
393e519524SHoward Hinnant    basic_filebuf* open(const string& s, ios_base::openmode mode);
40998a5c88SEric Fiselier    basic_filebuf* open(const filesystem::path& p, ios_base::openmode mode); // C++17
413e519524SHoward Hinnant    basic_filebuf* close();
423e519524SHoward Hinnant
433e519524SHoward Hinnantprotected:
443e519524SHoward Hinnant    // 27.9.1.5 Overridden virtual functions:
453e519524SHoward Hinnant    virtual streamsize showmanyc();
463e519524SHoward Hinnant    virtual int_type underflow();
473e519524SHoward Hinnant    virtual int_type uflow();
483e519524SHoward Hinnant    virtual int_type pbackfail(int_type c = traits_type::eof());
493e519524SHoward Hinnant    virtual int_type overflow (int_type c = traits_type::eof());
503e519524SHoward Hinnant    virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* s, streamsize n);
513e519524SHoward Hinnant    virtual pos_type seekoff(off_type off, ios_base::seekdir way,
523e519524SHoward Hinnant                             ios_base::openmode which = ios_base::in | ios_base::out);
533e519524SHoward Hinnant    virtual pos_type seekpos(pos_type sp,
543e519524SHoward Hinnant                             ios_base::openmode which = ios_base::in | ios_base::out);
553e519524SHoward Hinnant    virtual int sync();
563e519524SHoward Hinnant    virtual void imbue(const locale& loc);
573e519524SHoward Hinnant};
583e519524SHoward Hinnant
593e519524SHoward Hinnanttemplate <class charT, class traits>
603e519524SHoward Hinnant  void
613e519524SHoward Hinnant  swap(basic_filebuf<charT, traits>& x, basic_filebuf<charT, traits>& y);
623e519524SHoward Hinnant
633e519524SHoward Hinnanttypedef basic_filebuf<char>    filebuf;
643e519524SHoward Hinnanttypedef basic_filebuf<wchar_t> wfilebuf;
653e519524SHoward Hinnant
663e519524SHoward Hinnanttemplate <class charT, class traits = char_traits<charT> >
673e519524SHoward Hinnantclass basic_ifstream
683e519524SHoward Hinnant    : public basic_istream<charT,traits>
693e519524SHoward Hinnant{
703e519524SHoward Hinnantpublic:
713e519524SHoward Hinnant    typedef charT                          char_type;
723e519524SHoward Hinnant    typedef traits                         traits_type;
733e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
743e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
753e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
763e519524SHoward Hinnant
773e519524SHoward Hinnant    basic_ifstream();
783e519524SHoward Hinnant    explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in);
793e519524SHoward Hinnant    explicit basic_ifstream(const string& s, ios_base::openmode mode = ios_base::in);
80998a5c88SEric Fiselier    explicit basic_ifstream(const filesystem::path& p,
81998a5c88SEric Fiselier                            ios_base::openmode mode = ios_base::in); // C++17
823e519524SHoward Hinnant    basic_ifstream(basic_ifstream&& rhs);
833e519524SHoward Hinnant
843e519524SHoward Hinnant    basic_ifstream& operator=(basic_ifstream&& rhs);
853e519524SHoward Hinnant    void swap(basic_ifstream& rhs);
863e519524SHoward Hinnant
873e519524SHoward Hinnant    basic_filebuf<char_type, traits_type>* rdbuf() const;
883e519524SHoward Hinnant    bool is_open() const;
893e519524SHoward Hinnant    void open(const char* s, ios_base::openmode mode = ios_base::in);
903e519524SHoward Hinnant    void open(const string& s, ios_base::openmode mode = ios_base::in);
91998a5c88SEric Fiselier    void open(const filesystem::path& s, ios_base::openmode mode = ios_base::in); // C++17
92998a5c88SEric Fiselier
933e519524SHoward Hinnant    void close();
943e519524SHoward Hinnant};
953e519524SHoward Hinnant
963e519524SHoward Hinnanttemplate <class charT, class traits>
973e519524SHoward Hinnant  void
983e519524SHoward Hinnant  swap(basic_ifstream<charT, traits>& x, basic_ifstream<charT, traits>& y);
993e519524SHoward Hinnant
1003e519524SHoward Hinnanttypedef basic_ifstream<char>    ifstream;
1013e519524SHoward Hinnanttypedef basic_ifstream<wchar_t> wifstream;
1023e519524SHoward Hinnant
1033e519524SHoward Hinnanttemplate <class charT, class traits = char_traits<charT> >
1043e519524SHoward Hinnantclass basic_ofstream
1053e519524SHoward Hinnant    : public basic_ostream<charT,traits>
1063e519524SHoward Hinnant{
1073e519524SHoward Hinnantpublic:
1083e519524SHoward Hinnant    typedef charT                          char_type;
1093e519524SHoward Hinnant    typedef traits                         traits_type;
1103e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
1113e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
1123e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
1133e519524SHoward Hinnant
1143e519524SHoward Hinnant    basic_ofstream();
1153e519524SHoward Hinnant    explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out);
1163e519524SHoward Hinnant    explicit basic_ofstream(const string& s, ios_base::openmode mode = ios_base::out);
117998a5c88SEric Fiselier    explicit basic_ofstream(const filesystem::path& p,
118998a5c88SEric Fiselier                            ios_base::openmode mode = ios_base::out); // C++17
1193e519524SHoward Hinnant    basic_ofstream(basic_ofstream&& rhs);
1203e519524SHoward Hinnant
1213e519524SHoward Hinnant    basic_ofstream& operator=(basic_ofstream&& rhs);
1223e519524SHoward Hinnant    void swap(basic_ofstream& rhs);
1233e519524SHoward Hinnant
1243e519524SHoward Hinnant    basic_filebuf<char_type, traits_type>* rdbuf() const;
1253e519524SHoward Hinnant    bool is_open() const;
1263e519524SHoward Hinnant    void open(const char* s, ios_base::openmode mode = ios_base::out);
1273e519524SHoward Hinnant    void open(const string& s, ios_base::openmode mode = ios_base::out);
128998a5c88SEric Fiselier    void open(const filesystem::path& p,
129998a5c88SEric Fiselier              ios_base::openmode mode = ios_base::out); // C++17
130998a5c88SEric Fiselier
1313e519524SHoward Hinnant    void close();
1323e519524SHoward Hinnant};
1333e519524SHoward Hinnant
1343e519524SHoward Hinnanttemplate <class charT, class traits>
1353e519524SHoward Hinnant  void
1363e519524SHoward Hinnant  swap(basic_ofstream<charT, traits>& x, basic_ofstream<charT, traits>& y);
1373e519524SHoward Hinnant
1383e519524SHoward Hinnanttypedef basic_ofstream<char>    ofstream;
1393e519524SHoward Hinnanttypedef basic_ofstream<wchar_t> wofstream;
1403e519524SHoward Hinnant
1413e519524SHoward Hinnanttemplate <class charT, class traits=char_traits<charT> >
1423e519524SHoward Hinnantclass basic_fstream
1433e519524SHoward Hinnant    : public basic_iostream<charT,traits>
1443e519524SHoward Hinnant{
1453e519524SHoward Hinnantpublic:
1463e519524SHoward Hinnant    typedef charT                          char_type;
1473e519524SHoward Hinnant    typedef traits                         traits_type;
1483e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
1493e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
1503e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
1513e519524SHoward Hinnant
1523e519524SHoward Hinnant    basic_fstream();
1533e519524SHoward Hinnant    explicit basic_fstream(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out);
1543e519524SHoward Hinnant    explicit basic_fstream(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out);
155998a5c88SEric Fiselier    explicit basic_fstream(const filesystem::path& p,
156998a5c88SEric Fiselier                           ios_base::openmode mode = ios_base::in|ios_base::out); C++17
1573e519524SHoward Hinnant    basic_fstream(basic_fstream&& rhs);
1583e519524SHoward Hinnant
1593e519524SHoward Hinnant    basic_fstream& operator=(basic_fstream&& rhs);
1603e519524SHoward Hinnant    void swap(basic_fstream& rhs);
1613e519524SHoward Hinnant
1623e519524SHoward Hinnant    basic_filebuf<char_type, traits_type>* rdbuf() const;
1633e519524SHoward Hinnant    bool is_open() const;
1643e519524SHoward Hinnant    void open(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out);
1653e519524SHoward Hinnant    void open(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out);
166998a5c88SEric Fiselier    void open(const filesystem::path& s,
167998a5c88SEric Fiselier              ios_base::openmode mode = ios_base::in|ios_base::out); // C++17
168998a5c88SEric Fiselier
1693e519524SHoward Hinnant    void close();
1703e519524SHoward Hinnant};
1713e519524SHoward Hinnant
1723e519524SHoward Hinnanttemplate <class charT, class traits>
1733e519524SHoward Hinnant  void swap(basic_fstream<charT, traits>& x, basic_fstream<charT, traits>& y);
1743e519524SHoward Hinnant
1753e519524SHoward Hinnanttypedef basic_fstream<char>    fstream;
1763e519524SHoward Hinnanttypedef basic_fstream<wchar_t> wfstream;
1773e519524SHoward Hinnant
1783e519524SHoward Hinnant}  // std
1793e519524SHoward Hinnant
1803e519524SHoward Hinnant*/
1813e519524SHoward Hinnant
1822e2f3158SNikolas Klauser#include <__algorithm/max.h>
183385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler
1842eadbc86SLouis Dionne#include <__availability>
185bfbd73f8SArthur O'Dwyer#include <__config>
1863e519524SHoward Hinnant#include <__locale>
18752915d78SNikolas Klauser#include <__utility/move.h>
18852915d78SNikolas Klauser#include <__utility/swap.h>
1892a8f9a5eSNikolas Klauser#include <__utility/unreachable.h>
1903e519524SHoward Hinnant#include <cstdio>
1917c0ed44dSEric Fiselier#include <cstdlib>
19252915d78SNikolas Klauser#include <cstring>
19306b40e80SArthur O'Dwyer#include <istream>
19406b40e80SArthur O'Dwyer#include <ostream>
195bd6e6846SMark de Wever#include <version>
196933518ffSLouis Dionne
197933518ffSLouis Dionne#if !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
198998a5c88SEric Fiselier#   include <filesystem>
199933518ffSLouis Dionne#endif
2003e519524SHoward Hinnant
201073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2023e519524SHoward Hinnant#  pragma GCC system_header
203073458b1SHoward Hinnant#endif
2043e519524SHoward Hinnant
205a016efb1SEric Fiselier_LIBCPP_PUSH_MACROS
206a016efb1SEric Fiselier#include <__undef_macros>
207a016efb1SEric Fiselier
2088deaa4a1SMara Sophie Grosch#if defined(_LIBCPP_MSVCRT) || defined(_NEWLIB_VERSION)
2098deaa4a1SMara Sophie Grosch#  define _LIBCPP_HAS_NO_OFF_T_FUNCTIONS
2108deaa4a1SMara Sophie Grosch#endif
211a016efb1SEric Fiselier
2123e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
2133e519524SHoward Hinnant
2143e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
215e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_filebuf
2163e519524SHoward Hinnant    : public basic_streambuf<_CharT, _Traits>
2173e519524SHoward Hinnant{
2183e519524SHoward Hinnantpublic:
2193e519524SHoward Hinnant    typedef _CharT                           char_type;
2203e519524SHoward Hinnant    typedef _Traits                          traits_type;
2213e519524SHoward Hinnant    typedef typename traits_type::int_type   int_type;
2223e519524SHoward Hinnant    typedef typename traits_type::pos_type   pos_type;
2233e519524SHoward Hinnant    typedef typename traits_type::off_type   off_type;
2243e519524SHoward Hinnant    typedef typename traits_type::state_type state_type;
2253e519524SHoward Hinnant
2263e519524SHoward Hinnant    // 27.9.1.2 Constructors/destructor:
2273e519524SHoward Hinnant    basic_filebuf();
2283e519524SHoward Hinnant    basic_filebuf(basic_filebuf&& __rhs);
2293e519524SHoward Hinnant    virtual ~basic_filebuf();
2303e519524SHoward Hinnant
2313e519524SHoward Hinnant    // 27.9.1.3 Assign/swap:
232cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
2333e519524SHoward Hinnant    basic_filebuf& operator=(basic_filebuf&& __rhs);
2343e519524SHoward Hinnant    void swap(basic_filebuf& __rhs);
2353e519524SHoward Hinnant
2363e519524SHoward Hinnant    // 27.9.1.4 Members:
237cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
2383e519524SHoward Hinnant    bool is_open() const;
2393e519524SHoward Hinnant    basic_filebuf* open(const char* __s, ios_base::openmode __mode);
2404801624eSPeter Collingbourne#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
2414801624eSPeter Collingbourne    basic_filebuf* open(const wchar_t* __s, ios_base::openmode __mode);
2424801624eSPeter Collingbourne#endif
243cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
2443e519524SHoward Hinnant    basic_filebuf* open(const string& __s, ios_base::openmode __mode);
2457c0ed44dSEric Fiselier
246933518ffSLouis Dionne#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
247b38c08acSLouis Dionne    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
248998a5c88SEric Fiselier    basic_filebuf* open(const _VSTD_FS::path& __p, ios_base::openmode __mode) {
249998a5c88SEric Fiselier      return open(__p.c_str(), __mode);
250998a5c88SEric Fiselier    }
251998a5c88SEric Fiselier#endif
25252e9d80dSjasonliu    _LIBCPP_INLINE_VISIBILITY
2537c0ed44dSEric Fiselier    basic_filebuf* __open(int __fd, ios_base::openmode __mode);
2543e519524SHoward Hinnant    basic_filebuf* close();
2553e519524SHoward Hinnant
2567c0ed44dSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
2577c0ed44dSEric Fiselier    inline static const char*
2587c0ed44dSEric Fiselier    __make_mdstring(ios_base::openmode __mode) _NOEXCEPT;
2597c0ed44dSEric Fiselier
2603e519524SHoward Hinnant  protected:
2613e519524SHoward Hinnant    // 27.9.1.5 Overridden virtual functions:
2623e519524SHoward Hinnant    virtual int_type underflow();
2633e519524SHoward Hinnant    virtual int_type pbackfail(int_type __c = traits_type::eof());
2643e519524SHoward Hinnant    virtual int_type overflow (int_type __c = traits_type::eof());
2653e519524SHoward Hinnant    virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* __s, streamsize __n);
2663e519524SHoward Hinnant    virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
2673e519524SHoward Hinnant                             ios_base::openmode __wch = ios_base::in | ios_base::out);
2683e519524SHoward Hinnant    virtual pos_type seekpos(pos_type __sp,
2693e519524SHoward Hinnant                             ios_base::openmode __wch = ios_base::in | ios_base::out);
2703e519524SHoward Hinnant    virtual int sync();
2713e519524SHoward Hinnant    virtual void imbue(const locale& __loc);
2723e519524SHoward Hinnant
2733e519524SHoward Hinnantprivate:
2743e519524SHoward Hinnant  char* __extbuf_;
2753e519524SHoward Hinnant  const char* __extbufnext_;
2763e519524SHoward Hinnant  const char* __extbufend_;
2773e519524SHoward Hinnant  char __extbuf_min_[8];
2783e519524SHoward Hinnant  size_t __ebs_;
2793e519524SHoward Hinnant  char_type* __intbuf_;
2803e519524SHoward Hinnant  size_t __ibs_;
2813e519524SHoward Hinnant  FILE* __file_;
2823e519524SHoward Hinnant  const codecvt<char_type, char, state_type>* __cv_;
2833e519524SHoward Hinnant  state_type __st_;
284bfd96e11SHoward Hinnant  state_type __st_last_;
2853e519524SHoward Hinnant  ios_base::openmode __om_;
2863e519524SHoward Hinnant  ios_base::openmode __cm_;
2873e519524SHoward Hinnant  bool __owns_eb_;
2883e519524SHoward Hinnant  bool __owns_ib_;
2893e519524SHoward Hinnant  bool __always_noconv_;
2903e519524SHoward Hinnant
2913e519524SHoward Hinnant  bool __read_mode();
2923e519524SHoward Hinnant  void __write_mode();
2933e519524SHoward Hinnant};
2943e519524SHoward Hinnant
2953e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
2963e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::basic_filebuf()
297527a7fdfSBruce Mitchener    : __extbuf_(nullptr),
298527a7fdfSBruce Mitchener      __extbufnext_(nullptr),
299527a7fdfSBruce Mitchener      __extbufend_(nullptr),
3003e519524SHoward Hinnant      __ebs_(0),
301527a7fdfSBruce Mitchener      __intbuf_(nullptr),
3023e519524SHoward Hinnant      __ibs_(0),
303527a7fdfSBruce Mitchener      __file_(nullptr),
304cc27317aSHoward Hinnant      __cv_(nullptr),
3053e519524SHoward Hinnant      __st_(),
306bfd96e11SHoward Hinnant      __st_last_(),
3073e519524SHoward Hinnant      __om_(0),
3083e519524SHoward Hinnant      __cm_(0),
3093e519524SHoward Hinnant      __owns_eb_(false),
3103e519524SHoward Hinnant      __owns_ib_(false),
311cc27317aSHoward Hinnant      __always_noconv_(false)
3123e519524SHoward Hinnant{
313cc27317aSHoward Hinnant    if (has_facet<codecvt<char_type, char, state_type> >(this->getloc()))
314cc27317aSHoward Hinnant    {
315cc27317aSHoward Hinnant        __cv_ = &use_facet<codecvt<char_type, char, state_type> >(this->getloc());
316cc27317aSHoward Hinnant        __always_noconv_ = __cv_->always_noconv();
317cc27317aSHoward Hinnant    }
318527a7fdfSBruce Mitchener    setbuf(nullptr, 4096);
3193e519524SHoward Hinnant}
3203e519524SHoward Hinnant
3213e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3223e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::basic_filebuf(basic_filebuf&& __rhs)
3233e519524SHoward Hinnant    : basic_streambuf<_CharT, _Traits>(__rhs)
3243e519524SHoward Hinnant{
3253e519524SHoward Hinnant    if (__rhs.__extbuf_ == __rhs.__extbuf_min_)
3263e519524SHoward Hinnant    {
3273e519524SHoward Hinnant        __extbuf_ = __extbuf_min_;
3283e519524SHoward Hinnant        __extbufnext_ = __extbuf_ + (__rhs.__extbufnext_ - __rhs.__extbuf_);
3293e519524SHoward Hinnant        __extbufend_ = __extbuf_ + (__rhs.__extbufend_ - __rhs.__extbuf_);
3303e519524SHoward Hinnant    }
3313e519524SHoward Hinnant    else
3323e519524SHoward Hinnant    {
3333e519524SHoward Hinnant        __extbuf_ = __rhs.__extbuf_;
3343e519524SHoward Hinnant        __extbufnext_ = __rhs.__extbufnext_;
3353e519524SHoward Hinnant        __extbufend_ = __rhs.__extbufend_;
3363e519524SHoward Hinnant    }
3373e519524SHoward Hinnant    __ebs_ = __rhs.__ebs_;
3383e519524SHoward Hinnant    __intbuf_ = __rhs.__intbuf_;
3393e519524SHoward Hinnant    __ibs_ = __rhs.__ibs_;
3403e519524SHoward Hinnant    __file_ = __rhs.__file_;
3413e519524SHoward Hinnant    __cv_ = __rhs.__cv_;
3423e519524SHoward Hinnant    __st_ = __rhs.__st_;
343bfd96e11SHoward Hinnant    __st_last_ = __rhs.__st_last_;
3443e519524SHoward Hinnant    __om_ = __rhs.__om_;
3453e519524SHoward Hinnant    __cm_ = __rhs.__cm_;
3463e519524SHoward Hinnant    __owns_eb_ = __rhs.__owns_eb_;
3473e519524SHoward Hinnant    __owns_ib_ = __rhs.__owns_ib_;
3483e519524SHoward Hinnant    __always_noconv_ = __rhs.__always_noconv_;
3493e519524SHoward Hinnant    if (__rhs.pbase())
3503e519524SHoward Hinnant    {
3513e519524SHoward Hinnant        if (__rhs.pbase() == __rhs.__intbuf_)
3523e519524SHoward Hinnant            this->setp(__intbuf_, __intbuf_ + (__rhs. epptr() - __rhs.pbase()));
3533e519524SHoward Hinnant        else
3543e519524SHoward Hinnant            this->setp((char_type*)__extbuf_,
3553e519524SHoward Hinnant                       (char_type*)__extbuf_ + (__rhs. epptr() - __rhs.pbase()));
356d90758e2SMarshall Clow        this->__pbump(__rhs. pptr() - __rhs.pbase());
3573e519524SHoward Hinnant    }
3583e519524SHoward Hinnant    else if (__rhs.eback())
3593e519524SHoward Hinnant    {
3603e519524SHoward Hinnant        if (__rhs.eback() == __rhs.__intbuf_)
3613e519524SHoward Hinnant            this->setg(__intbuf_, __intbuf_ + (__rhs.gptr() - __rhs.eback()),
3623e519524SHoward Hinnant                                  __intbuf_ + (__rhs.egptr() - __rhs.eback()));
3633e519524SHoward Hinnant        else
3643e519524SHoward Hinnant            this->setg((char_type*)__extbuf_,
3653e519524SHoward Hinnant                       (char_type*)__extbuf_ + (__rhs.gptr() - __rhs.eback()),
3663e519524SHoward Hinnant                       (char_type*)__extbuf_ + (__rhs.egptr() - __rhs.eback()));
3673e519524SHoward Hinnant    }
368527a7fdfSBruce Mitchener    __rhs.__extbuf_ = nullptr;
369527a7fdfSBruce Mitchener    __rhs.__extbufnext_ = nullptr;
370527a7fdfSBruce Mitchener    __rhs.__extbufend_ = nullptr;
3713e519524SHoward Hinnant    __rhs.__ebs_ = 0;
3723e519524SHoward Hinnant    __rhs.__intbuf_ = 0;
3733e519524SHoward Hinnant    __rhs.__ibs_ = 0;
374527a7fdfSBruce Mitchener    __rhs.__file_ = nullptr;
3753e519524SHoward Hinnant    __rhs.__st_ = state_type();
376bfd96e11SHoward Hinnant    __rhs.__st_last_ = state_type();
3773e519524SHoward Hinnant    __rhs.__om_ = 0;
3783e519524SHoward Hinnant    __rhs.__cm_ = 0;
3793e519524SHoward Hinnant    __rhs.__owns_eb_ = false;
3803e519524SHoward Hinnant    __rhs.__owns_ib_ = false;
3813e519524SHoward Hinnant    __rhs.setg(0, 0, 0);
3823e519524SHoward Hinnant    __rhs.setp(0, 0);
3833e519524SHoward Hinnant}
3843e519524SHoward Hinnant
3853e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
386cd31b434SEvgeniy Stepanovinline
3873e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>&
3883e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::operator=(basic_filebuf&& __rhs)
3893e519524SHoward Hinnant{
3903e519524SHoward Hinnant    close();
3913e519524SHoward Hinnant    swap(__rhs);
39288db3171SArgyrios Kyrtzidis    return *this;
3933e519524SHoward Hinnant}
3943e519524SHoward Hinnant
3953e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
3963e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::~basic_filebuf()
3973e519524SHoward Hinnant{
3983e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
3993e519524SHoward Hinnant    try
4003e519524SHoward Hinnant    {
401b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
4023e519524SHoward Hinnant        close();
4033e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
4043e519524SHoward Hinnant    }
4053e519524SHoward Hinnant    catch (...)
4063e519524SHoward Hinnant    {
4073e519524SHoward Hinnant    }
408b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
4093e519524SHoward Hinnant    if (__owns_eb_)
4103e519524SHoward Hinnant        delete [] __extbuf_;
4113e519524SHoward Hinnant    if (__owns_ib_)
4123e519524SHoward Hinnant        delete [] __intbuf_;
4133e519524SHoward Hinnant}
4143e519524SHoward Hinnant
4153e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
4163e519524SHoward Hinnantvoid
4173e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::swap(basic_filebuf& __rhs)
4183e519524SHoward Hinnant{
4193e519524SHoward Hinnant    basic_streambuf<char_type, traits_type>::swap(__rhs);
4203e519524SHoward Hinnant    if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_)
4213e519524SHoward Hinnant    {
4224ff70dbaSFabian Wolff        // Neither *this nor __rhs uses the small buffer, so we can simply swap the pointers.
4234ff70dbaSFabian Wolff        std::swap(__extbuf_, __rhs.__extbuf_);
4244ff70dbaSFabian Wolff        std::swap(__extbufnext_, __rhs.__extbufnext_);
4254ff70dbaSFabian Wolff        std::swap(__extbufend_, __rhs.__extbufend_);
4263e519524SHoward Hinnant    }
4273e519524SHoward Hinnant    else
4283e519524SHoward Hinnant    {
4294ff70dbaSFabian Wolff        ptrdiff_t __ln = __extbufnext_       ? __extbufnext_ - __extbuf_             : 0;
4304ff70dbaSFabian Wolff        ptrdiff_t __le = __extbufend_        ? __extbufend_ - __extbuf_              : 0;
4314ff70dbaSFabian Wolff        ptrdiff_t __rn = __rhs.__extbufnext_ ? __rhs.__extbufnext_ - __rhs.__extbuf_ : 0;
4324ff70dbaSFabian Wolff        ptrdiff_t __re = __rhs.__extbufend_  ? __rhs.__extbufend_ - __rhs.__extbuf_  : 0;
4333e519524SHoward Hinnant        if (__extbuf_ == __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_)
4343e519524SHoward Hinnant        {
4354ff70dbaSFabian Wolff            // *this uses the small buffer, but __rhs doesn't.
4363e519524SHoward Hinnant            __extbuf_ = __rhs.__extbuf_;
4373e519524SHoward Hinnant            __rhs.__extbuf_ = __rhs.__extbuf_min_;
4384ff70dbaSFabian Wolff            std::memmove(__rhs.__extbuf_min_, __extbuf_min_, sizeof(__extbuf_min_));
4393e519524SHoward Hinnant        }
4403e519524SHoward Hinnant        else if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ == __rhs.__extbuf_min_)
4413e519524SHoward Hinnant        {
4424ff70dbaSFabian Wolff            // *this doesn't use the small buffer, but __rhs does.
4433e519524SHoward Hinnant            __rhs.__extbuf_ = __extbuf_;
4443e519524SHoward Hinnant            __extbuf_ = __extbuf_min_;
4454ff70dbaSFabian Wolff            std::memmove(__extbuf_min_, __rhs.__extbuf_min_, sizeof(__extbuf_min_));
4464ff70dbaSFabian Wolff        }
4474ff70dbaSFabian Wolff        else
4484ff70dbaSFabian Wolff        {
4494ff70dbaSFabian Wolff            // Both *this and __rhs use the small buffer.
4504ff70dbaSFabian Wolff            char __tmp[sizeof(__extbuf_min_)];
4514ff70dbaSFabian Wolff            std::memmove(__tmp, __extbuf_min_, sizeof(__extbuf_min_));
4524ff70dbaSFabian Wolff            std::memmove(__extbuf_min_, __rhs.__extbuf_min_, sizeof(__extbuf_min_));
4534ff70dbaSFabian Wolff            std::memmove(__rhs.__extbuf_min_, __tmp, sizeof(__extbuf_min_));
4543e519524SHoward Hinnant        }
4553e519524SHoward Hinnant        __extbufnext_ = __extbuf_ + __rn;
4563e519524SHoward Hinnant        __extbufend_ = __extbuf_ + __re;
4573e519524SHoward Hinnant        __rhs.__extbufnext_ = __rhs.__extbuf_ + __ln;
4583e519524SHoward Hinnant        __rhs.__extbufend_ = __rhs.__extbuf_ + __le;
4593e519524SHoward Hinnant    }
460ce48a113SHoward Hinnant    _VSTD::swap(__ebs_, __rhs.__ebs_);
461ce48a113SHoward Hinnant    _VSTD::swap(__intbuf_, __rhs.__intbuf_);
462ce48a113SHoward Hinnant    _VSTD::swap(__ibs_, __rhs.__ibs_);
463ce48a113SHoward Hinnant    _VSTD::swap(__file_, __rhs.__file_);
464ce48a113SHoward Hinnant    _VSTD::swap(__cv_, __rhs.__cv_);
465ce48a113SHoward Hinnant    _VSTD::swap(__st_, __rhs.__st_);
466bfd96e11SHoward Hinnant    _VSTD::swap(__st_last_, __rhs.__st_last_);
467ce48a113SHoward Hinnant    _VSTD::swap(__om_, __rhs.__om_);
468ce48a113SHoward Hinnant    _VSTD::swap(__cm_, __rhs.__cm_);
469ce48a113SHoward Hinnant    _VSTD::swap(__owns_eb_, __rhs.__owns_eb_);
470ce48a113SHoward Hinnant    _VSTD::swap(__owns_ib_, __rhs.__owns_ib_);
471ce48a113SHoward Hinnant    _VSTD::swap(__always_noconv_, __rhs.__always_noconv_);
4723e519524SHoward Hinnant    if (this->eback() == (char_type*)__rhs.__extbuf_min_)
4733e519524SHoward Hinnant    {
4743e519524SHoward Hinnant        ptrdiff_t __n = this->gptr() - this->eback();
4753e519524SHoward Hinnant        ptrdiff_t __e = this->egptr() - this->eback();
4763e519524SHoward Hinnant        this->setg((char_type*)__extbuf_min_,
4773e519524SHoward Hinnant                   (char_type*)__extbuf_min_ + __n,
4783e519524SHoward Hinnant                   (char_type*)__extbuf_min_ + __e);
4793e519524SHoward Hinnant    }
4803e519524SHoward Hinnant    else if (this->pbase() == (char_type*)__rhs.__extbuf_min_)
4813e519524SHoward Hinnant    {
4823e519524SHoward Hinnant        ptrdiff_t __n = this->pptr() - this->pbase();
4833e519524SHoward Hinnant        ptrdiff_t __e = this->epptr() - this->pbase();
4843e519524SHoward Hinnant        this->setp((char_type*)__extbuf_min_,
4853e519524SHoward Hinnant                   (char_type*)__extbuf_min_ + __e);
486d90758e2SMarshall Clow        this->__pbump(__n);
4873e519524SHoward Hinnant    }
4883e519524SHoward Hinnant    if (__rhs.eback() == (char_type*)__extbuf_min_)
4893e519524SHoward Hinnant    {
4903e519524SHoward Hinnant        ptrdiff_t __n = __rhs.gptr() - __rhs.eback();
4913e519524SHoward Hinnant        ptrdiff_t __e = __rhs.egptr() - __rhs.eback();
4923e519524SHoward Hinnant        __rhs.setg((char_type*)__rhs.__extbuf_min_,
4933e519524SHoward Hinnant                   (char_type*)__rhs.__extbuf_min_ + __n,
4943e519524SHoward Hinnant                   (char_type*)__rhs.__extbuf_min_ + __e);
4953e519524SHoward Hinnant    }
4963e519524SHoward Hinnant    else if (__rhs.pbase() == (char_type*)__extbuf_min_)
4973e519524SHoward Hinnant    {
4983e519524SHoward Hinnant        ptrdiff_t __n = __rhs.pptr() - __rhs.pbase();
4993e519524SHoward Hinnant        ptrdiff_t __e = __rhs.epptr() - __rhs.pbase();
5003e519524SHoward Hinnant        __rhs.setp((char_type*)__rhs.__extbuf_min_,
5013e519524SHoward Hinnant                   (char_type*)__rhs.__extbuf_min_ + __e);
502d90758e2SMarshall Clow        __rhs.__pbump(__n);
5033e519524SHoward Hinnant    }
5043e519524SHoward Hinnant}
5053e519524SHoward Hinnant
5063e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
5073e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5083e519524SHoward Hinnantvoid
5093e519524SHoward Hinnantswap(basic_filebuf<_CharT, _Traits>& __x, basic_filebuf<_CharT, _Traits>& __y)
5103e519524SHoward Hinnant{
5113e519524SHoward Hinnant    __x.swap(__y);
5123e519524SHoward Hinnant}
5133e519524SHoward Hinnant
5143e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
515cd31b434SEvgeniy Stepanovinline
5163e519524SHoward Hinnantbool
5173e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::is_open() const
5183e519524SHoward Hinnant{
519527a7fdfSBruce Mitchener    return __file_ != nullptr;
5203e519524SHoward Hinnant}
5213e519524SHoward Hinnant
5227c0ed44dSEric Fiseliertemplate <class _CharT, class _Traits>
5237c0ed44dSEric Fiselierconst char* basic_filebuf<_CharT, _Traits>::__make_mdstring(
5247c0ed44dSEric Fiselier    ios_base::openmode __mode) _NOEXCEPT {
5257c0ed44dSEric Fiselier  switch (__mode & ~ios_base::ate) {
5267c0ed44dSEric Fiselier  case ios_base::out:
5277c0ed44dSEric Fiselier  case ios_base::out | ios_base::trunc:
528a7e90599SDan Albert    return "w" _LIBCPP_FOPEN_CLOEXEC_MODE;
5297c0ed44dSEric Fiselier  case ios_base::out | ios_base::app:
5307c0ed44dSEric Fiselier  case ios_base::app:
531a7e90599SDan Albert    return "a" _LIBCPP_FOPEN_CLOEXEC_MODE;
5327c0ed44dSEric Fiselier  case ios_base::in:
533a7e90599SDan Albert    return "r" _LIBCPP_FOPEN_CLOEXEC_MODE;
5347c0ed44dSEric Fiselier  case ios_base::in | ios_base::out:
535a7e90599SDan Albert    return "r+" _LIBCPP_FOPEN_CLOEXEC_MODE;
5367c0ed44dSEric Fiselier  case ios_base::in | ios_base::out | ios_base::trunc:
537a7e90599SDan Albert    return "w+" _LIBCPP_FOPEN_CLOEXEC_MODE;
5387c0ed44dSEric Fiselier  case ios_base::in | ios_base::out | ios_base::app:
5397c0ed44dSEric Fiselier  case ios_base::in | ios_base::app:
540a7e90599SDan Albert    return "a+" _LIBCPP_FOPEN_CLOEXEC_MODE;
5417c0ed44dSEric Fiselier  case ios_base::out | ios_base::binary:
5427c0ed44dSEric Fiselier  case ios_base::out | ios_base::trunc | ios_base::binary:
543a7e90599SDan Albert    return "wb" _LIBCPP_FOPEN_CLOEXEC_MODE;
5447c0ed44dSEric Fiselier  case ios_base::out | ios_base::app | ios_base::binary:
5457c0ed44dSEric Fiselier  case ios_base::app | ios_base::binary:
546a7e90599SDan Albert    return "ab" _LIBCPP_FOPEN_CLOEXEC_MODE;
5477c0ed44dSEric Fiselier  case ios_base::in | ios_base::binary:
548a7e90599SDan Albert    return "rb" _LIBCPP_FOPEN_CLOEXEC_MODE;
5497c0ed44dSEric Fiselier  case ios_base::in | ios_base::out | ios_base::binary:
550a7e90599SDan Albert    return "r+b" _LIBCPP_FOPEN_CLOEXEC_MODE;
5517c0ed44dSEric Fiselier  case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary:
552a7e90599SDan Albert    return "w+b" _LIBCPP_FOPEN_CLOEXEC_MODE;
5537c0ed44dSEric Fiselier  case ios_base::in | ios_base::out | ios_base::app | ios_base::binary:
5547c0ed44dSEric Fiselier  case ios_base::in | ios_base::app | ios_base::binary:
555a7e90599SDan Albert    return "a+b" _LIBCPP_FOPEN_CLOEXEC_MODE;
5567c0ed44dSEric Fiselier  default:
5577c0ed44dSEric Fiselier    return nullptr;
5587c0ed44dSEric Fiselier  }
5592a8f9a5eSNikolas Klauser  __libcpp_unreachable();
5607c0ed44dSEric Fiselier}
5617c0ed44dSEric Fiselier
5623e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
5633e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>*
5643e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
5653e519524SHoward Hinnant{
566527a7fdfSBruce Mitchener    basic_filebuf<_CharT, _Traits>* __rt = nullptr;
567527a7fdfSBruce Mitchener    if (__file_ == nullptr)
5683e519524SHoward Hinnant    {
5697c0ed44dSEric Fiselier      if (const char* __mdstr = __make_mdstring(__mode)) {
5703e519524SHoward Hinnant        __rt = this;
5713e519524SHoward Hinnant        __file_ = fopen(__s, __mdstr);
5727c0ed44dSEric Fiselier        if (__file_) {
5733e519524SHoward Hinnant          __om_ = __mode;
5747c0ed44dSEric Fiselier          if (__mode & ios_base::ate) {
5757c0ed44dSEric Fiselier            if (fseek(__file_, 0, SEEK_END)) {
5763e519524SHoward Hinnant              fclose(__file_);
577527a7fdfSBruce Mitchener              __file_ = nullptr;
578527a7fdfSBruce Mitchener              __rt = nullptr;
5793e519524SHoward Hinnant            }
5803e519524SHoward Hinnant          }
5817c0ed44dSEric Fiselier        } else
582527a7fdfSBruce Mitchener          __rt = nullptr;
5833e519524SHoward Hinnant      }
5847c0ed44dSEric Fiselier    }
5857c0ed44dSEric Fiselier    return __rt;
5867c0ed44dSEric Fiselier}
5877c0ed44dSEric Fiselier
5887c0ed44dSEric Fiseliertemplate <class _CharT, class _Traits>
58952e9d80dSjasonliuinline
590997d41cdSLouis Dionnebasic_filebuf<_CharT, _Traits>*
5917c0ed44dSEric Fiselierbasic_filebuf<_CharT, _Traits>::__open(int __fd, ios_base::openmode __mode) {
592527a7fdfSBruce Mitchener  basic_filebuf<_CharT, _Traits>* __rt = nullptr;
593527a7fdfSBruce Mitchener  if (__file_ == nullptr) {
5947c0ed44dSEric Fiselier    if (const char* __mdstr = __make_mdstring(__mode)) {
5957c0ed44dSEric Fiselier      __rt = this;
5967c0ed44dSEric Fiselier      __file_ = fdopen(__fd, __mdstr);
5977c0ed44dSEric Fiselier      if (__file_) {
5987c0ed44dSEric Fiselier        __om_ = __mode;
5997c0ed44dSEric Fiselier        if (__mode & ios_base::ate) {
6007c0ed44dSEric Fiselier          if (fseek(__file_, 0, SEEK_END)) {
6017c0ed44dSEric Fiselier            fclose(__file_);
602527a7fdfSBruce Mitchener            __file_ = nullptr;
603527a7fdfSBruce Mitchener            __rt = nullptr;
6047c0ed44dSEric Fiselier          }
6057c0ed44dSEric Fiselier        }
6067c0ed44dSEric Fiselier      } else
607527a7fdfSBruce Mitchener        __rt = nullptr;
6083e519524SHoward Hinnant    }
6093e519524SHoward Hinnant  }
6103e519524SHoward Hinnant  return __rt;
6113e519524SHoward Hinnant}
6123e519524SHoward Hinnant
6134801624eSPeter Collingbourne#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
6144801624eSPeter Collingbourne// This is basically the same as the char* overload except that it uses _wfopen
6154801624eSPeter Collingbourne// and long mode strings.
6164801624eSPeter Collingbournetemplate <class _CharT, class _Traits>
6174801624eSPeter Collingbournebasic_filebuf<_CharT, _Traits>*
6184801624eSPeter Collingbournebasic_filebuf<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
6194801624eSPeter Collingbourne{
620527a7fdfSBruce Mitchener    basic_filebuf<_CharT, _Traits>* __rt = nullptr;
621527a7fdfSBruce Mitchener    if (__file_ == nullptr)
6224801624eSPeter Collingbourne    {
6234801624eSPeter Collingbourne        __rt = this;
6244801624eSPeter Collingbourne        const wchar_t* __mdstr;
6254801624eSPeter Collingbourne        switch (__mode & ~ios_base::ate)
6264801624eSPeter Collingbourne        {
6274801624eSPeter Collingbourne        case ios_base::out:
6284801624eSPeter Collingbourne        case ios_base::out | ios_base::trunc:
6294801624eSPeter Collingbourne            __mdstr = L"w";
6304801624eSPeter Collingbourne            break;
6314801624eSPeter Collingbourne        case ios_base::out | ios_base::app:
6324801624eSPeter Collingbourne        case ios_base::app:
6334801624eSPeter Collingbourne            __mdstr = L"a";
6344801624eSPeter Collingbourne            break;
6354801624eSPeter Collingbourne        case ios_base::in:
6364801624eSPeter Collingbourne            __mdstr = L"r";
6374801624eSPeter Collingbourne            break;
6384801624eSPeter Collingbourne        case ios_base::in | ios_base::out:
6394801624eSPeter Collingbourne            __mdstr = L"r+";
6404801624eSPeter Collingbourne            break;
6414801624eSPeter Collingbourne        case ios_base::in | ios_base::out | ios_base::trunc:
6424801624eSPeter Collingbourne            __mdstr = L"w+";
6434801624eSPeter Collingbourne            break;
6444801624eSPeter Collingbourne        case ios_base::in | ios_base::out | ios_base::app:
6454801624eSPeter Collingbourne        case ios_base::in | ios_base::app:
6464801624eSPeter Collingbourne            __mdstr = L"a+";
6474801624eSPeter Collingbourne            break;
6484801624eSPeter Collingbourne        case ios_base::out | ios_base::binary:
6494801624eSPeter Collingbourne        case ios_base::out | ios_base::trunc | ios_base::binary:
6504801624eSPeter Collingbourne            __mdstr = L"wb";
6514801624eSPeter Collingbourne            break;
6524801624eSPeter Collingbourne        case ios_base::out | ios_base::app | ios_base::binary:
6534801624eSPeter Collingbourne        case ios_base::app | ios_base::binary:
6544801624eSPeter Collingbourne            __mdstr = L"ab";
6554801624eSPeter Collingbourne            break;
6564801624eSPeter Collingbourne        case ios_base::in | ios_base::binary:
6574801624eSPeter Collingbourne            __mdstr = L"rb";
6584801624eSPeter Collingbourne            break;
6594801624eSPeter Collingbourne        case ios_base::in | ios_base::out | ios_base::binary:
6604801624eSPeter Collingbourne            __mdstr = L"r+b";
6614801624eSPeter Collingbourne            break;
6624801624eSPeter Collingbourne        case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary:
6634801624eSPeter Collingbourne            __mdstr = L"w+b";
6644801624eSPeter Collingbourne            break;
6654801624eSPeter Collingbourne        case ios_base::in | ios_base::out | ios_base::app | ios_base::binary:
6664801624eSPeter Collingbourne        case ios_base::in | ios_base::app | ios_base::binary:
6674801624eSPeter Collingbourne            __mdstr = L"a+b";
6684801624eSPeter Collingbourne            break;
6694801624eSPeter Collingbourne        default:
670527a7fdfSBruce Mitchener            __rt = nullptr;
6714801624eSPeter Collingbourne            break;
6724801624eSPeter Collingbourne        }
6734801624eSPeter Collingbourne        if (__rt)
6744801624eSPeter Collingbourne        {
6754801624eSPeter Collingbourne            __file_ = _wfopen(__s, __mdstr);
6764801624eSPeter Collingbourne            if (__file_)
6774801624eSPeter Collingbourne            {
6784801624eSPeter Collingbourne                __om_ = __mode;
6794801624eSPeter Collingbourne                if (__mode & ios_base::ate)
6804801624eSPeter Collingbourne                {
6814801624eSPeter Collingbourne                    if (fseek(__file_, 0, SEEK_END))
6824801624eSPeter Collingbourne                    {
6834801624eSPeter Collingbourne                        fclose(__file_);
684527a7fdfSBruce Mitchener                        __file_ = nullptr;
685527a7fdfSBruce Mitchener                        __rt = nullptr;
6864801624eSPeter Collingbourne                    }
6874801624eSPeter Collingbourne                }
6884801624eSPeter Collingbourne            }
6894801624eSPeter Collingbourne            else
690527a7fdfSBruce Mitchener                __rt = nullptr;
6914801624eSPeter Collingbourne        }
6924801624eSPeter Collingbourne    }
6934801624eSPeter Collingbourne    return __rt;
6944801624eSPeter Collingbourne}
6954801624eSPeter Collingbourne#endif
6964801624eSPeter Collingbourne
6973e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
698cd31b434SEvgeniy Stepanovinline
6993e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>*
7003e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
7013e519524SHoward Hinnant{
7023e519524SHoward Hinnant    return open(__s.c_str(), __mode);
7033e519524SHoward Hinnant}
7043e519524SHoward Hinnant
7053e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
7063e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>*
7073e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::close()
7083e519524SHoward Hinnant{
709527a7fdfSBruce Mitchener    basic_filebuf<_CharT, _Traits>* __rt = nullptr;
7103e519524SHoward Hinnant    if (__file_)
7113e519524SHoward Hinnant    {
7123e519524SHoward Hinnant        __rt = this;
7133e519524SHoward Hinnant        unique_ptr<FILE, int(*)(FILE*)> __h(__file_, fclose);
714c37917f3SHoward Hinnant        if (sync())
715527a7fdfSBruce Mitchener            __rt = nullptr;
71689385633SPetr Hosek        if (fclose(__h.release()))
717527a7fdfSBruce Mitchener            __rt = nullptr;
718527a7fdfSBruce Mitchener        __file_ = nullptr;
7198f934692SMarshall Clow        setbuf(0, 0);
7203e519524SHoward Hinnant    }
7213e519524SHoward Hinnant    return __rt;
7223e519524SHoward Hinnant}
7233e519524SHoward Hinnant
7243e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
7253e519524SHoward Hinnanttypename basic_filebuf<_CharT, _Traits>::int_type
7263e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::underflow()
7273e519524SHoward Hinnant{
728527a7fdfSBruce Mitchener    if (__file_ == nullptr)
7293e519524SHoward Hinnant        return traits_type::eof();
7303e519524SHoward Hinnant    bool __initial = __read_mode();
7313e519524SHoward Hinnant    char_type __1buf;
732527a7fdfSBruce Mitchener    if (this->gptr() == nullptr)
7333e519524SHoward Hinnant        this->setg(&__1buf, &__1buf+1, &__1buf+1);
7343e519524SHoward Hinnant    const size_t __unget_sz = __initial ? 0 : min<size_t>((this->egptr() - this->eback()) / 2, 4);
7353e519524SHoward Hinnant    int_type __c = traits_type::eof();
7363e519524SHoward Hinnant    if (this->gptr() == this->egptr())
7373e519524SHoward Hinnant    {
7383696227cSArthur O'Dwyer        _VSTD::memmove(this->eback(), this->egptr() - __unget_sz, __unget_sz * sizeof(char_type));
7393e519524SHoward Hinnant        if (__always_noconv_)
7403e519524SHoward Hinnant        {
7413e519524SHoward Hinnant            size_t __nmemb = static_cast<size_t>(this->egptr() - this->eback() - __unget_sz);
7423e519524SHoward Hinnant            __nmemb = fread(this->eback() + __unget_sz, 1, __nmemb, __file_);
7433e519524SHoward Hinnant            if (__nmemb != 0)
7443e519524SHoward Hinnant            {
7453e519524SHoward Hinnant                this->setg(this->eback(),
7463e519524SHoward Hinnant                           this->eback() + __unget_sz,
7473e519524SHoward Hinnant                           this->eback() + __unget_sz + __nmemb);
748da3b02fdSHoward Hinnant                __c = traits_type::to_int_type(*this->gptr());
7493e519524SHoward Hinnant            }
7503e519524SHoward Hinnant        }
7513e519524SHoward Hinnant        else
7523e519524SHoward Hinnant        {
753e499d086SMarshall Clow            _LIBCPP_ASSERT ( !(__extbufnext_ == NULL && (__extbufend_ != __extbufnext_)), "underflow moving from NULL" );
754e499d086SMarshall Clow            if (__extbufend_ != __extbufnext_)
7553696227cSArthur O'Dwyer                _VSTD::memmove(__extbuf_, __extbufnext_, __extbufend_ - __extbufnext_);
7563e519524SHoward Hinnant            __extbufnext_ = __extbuf_ + (__extbufend_ - __extbufnext_);
7573e519524SHoward Hinnant            __extbufend_ = __extbuf_ + (__extbuf_ == __extbuf_min_ ? sizeof(__extbuf_min_) : __ebs_);
75849a37bbbSHoward Hinnant            size_t __nmemb = _VSTD::min(static_cast<size_t>(__ibs_ - __unget_sz),
7593e519524SHoward Hinnant                                 static_cast<size_t>(__extbufend_ - __extbufnext_));
7603e519524SHoward Hinnant            codecvt_base::result __r;
761bfd96e11SHoward Hinnant            __st_last_ = __st_;
7628b086e38SMarshall Clow            size_t __nr = fread((void*) const_cast<char *>(__extbufnext_), 1, __nmemb, __file_);
7633e519524SHoward Hinnant            if (__nr != 0)
7643e519524SHoward Hinnant            {
765cc27317aSHoward Hinnant                if (!__cv_)
766d437fa5cSMarshall Clow                    __throw_bad_cast();
767d437fa5cSMarshall Clow
7683e519524SHoward Hinnant                __extbufend_ = __extbufnext_ + __nr;
7693e519524SHoward Hinnant                char_type*  __inext;
7703e519524SHoward Hinnant                __r = __cv_->in(__st_, __extbuf_, __extbufend_, __extbufnext_,
7713e519524SHoward Hinnant                                       this->eback() + __unget_sz,
77249a37bbbSHoward Hinnant                                       this->eback() + __ibs_, __inext);
7733e519524SHoward Hinnant                if (__r == codecvt_base::noconv)
7743e519524SHoward Hinnant                {
7758b086e38SMarshall Clow                    this->setg((char_type*)__extbuf_, (char_type*)__extbuf_,
7768b086e38SMarshall Clow                                          (char_type*)const_cast<char *>(__extbufend_));
777da3b02fdSHoward Hinnant                    __c = traits_type::to_int_type(*this->gptr());
7783e519524SHoward Hinnant                }
7793e519524SHoward Hinnant                else if (__inext != this->eback() + __unget_sz)
7803e519524SHoward Hinnant                {
7813e519524SHoward Hinnant                    this->setg(this->eback(), this->eback() + __unget_sz, __inext);
782da3b02fdSHoward Hinnant                    __c = traits_type::to_int_type(*this->gptr());
7833e519524SHoward Hinnant                }
7843e519524SHoward Hinnant            }
7853e519524SHoward Hinnant        }
7863e519524SHoward Hinnant    }
7873e519524SHoward Hinnant    else
788da3b02fdSHoward Hinnant        __c = traits_type::to_int_type(*this->gptr());
7893e519524SHoward Hinnant    if (this->eback() == &__1buf)
790527a7fdfSBruce Mitchener        this->setg(nullptr, nullptr, nullptr);
7913e519524SHoward Hinnant    return __c;
7923e519524SHoward Hinnant}
7933e519524SHoward Hinnant
7943e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
7953e519524SHoward Hinnanttypename basic_filebuf<_CharT, _Traits>::int_type
7963e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::pbackfail(int_type __c)
7973e519524SHoward Hinnant{
7983e519524SHoward Hinnant    if (__file_ && this->eback() < this->gptr())
7993e519524SHoward Hinnant    {
8003e519524SHoward Hinnant        if (traits_type::eq_int_type(__c, traits_type::eof()))
8013e519524SHoward Hinnant        {
8023e519524SHoward Hinnant            this->gbump(-1);
8033e519524SHoward Hinnant            return traits_type::not_eof(__c);
8043e519524SHoward Hinnant        }
8053e519524SHoward Hinnant        if ((__om_ & ios_base::out) ||
8063e519524SHoward Hinnant            traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1]))
8073e519524SHoward Hinnant        {
8083e519524SHoward Hinnant            this->gbump(-1);
8093e519524SHoward Hinnant            *this->gptr() = traits_type::to_char_type(__c);
8103e519524SHoward Hinnant            return __c;
8113e519524SHoward Hinnant        }
8123e519524SHoward Hinnant    }
8133e519524SHoward Hinnant    return traits_type::eof();
8143e519524SHoward Hinnant}
8153e519524SHoward Hinnant
8163e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
8173e519524SHoward Hinnanttypename basic_filebuf<_CharT, _Traits>::int_type
8183e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::overflow(int_type __c)
8193e519524SHoward Hinnant{
820527a7fdfSBruce Mitchener    if (__file_ == nullptr)
8213e519524SHoward Hinnant        return traits_type::eof();
8223e519524SHoward Hinnant    __write_mode();
8233e519524SHoward Hinnant    char_type __1buf;
8243e519524SHoward Hinnant    char_type* __pb_save = this->pbase();
8253e519524SHoward Hinnant    char_type* __epb_save = this->epptr();
8263e519524SHoward Hinnant    if (!traits_type::eq_int_type(__c, traits_type::eof()))
8273e519524SHoward Hinnant    {
828527a7fdfSBruce Mitchener        if (this->pptr() == nullptr)
8293e519524SHoward Hinnant            this->setp(&__1buf, &__1buf+1);
8303e519524SHoward Hinnant        *this->pptr() = traits_type::to_char_type(__c);
8313e519524SHoward Hinnant        this->pbump(1);
8323e519524SHoward Hinnant    }
8333e519524SHoward Hinnant    if (this->pptr() != this->pbase())
8343e519524SHoward Hinnant    {
8353e519524SHoward Hinnant        if (__always_noconv_)
8363e519524SHoward Hinnant        {
8373e519524SHoward Hinnant            size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase());
8383e519524SHoward Hinnant            if (fwrite(this->pbase(), sizeof(char_type), __nmemb, __file_) != __nmemb)
8393e519524SHoward Hinnant                return traits_type::eof();
8403e519524SHoward Hinnant        }
8413e519524SHoward Hinnant        else
8423e519524SHoward Hinnant        {
8433e519524SHoward Hinnant            char* __extbe = __extbuf_;
8443e519524SHoward Hinnant            codecvt_base::result __r;
8453e519524SHoward Hinnant            do
8463e519524SHoward Hinnant            {
847cc27317aSHoward Hinnant                if (!__cv_)
848d437fa5cSMarshall Clow                    __throw_bad_cast();
849d437fa5cSMarshall Clow
8503e519524SHoward Hinnant                const char_type* __e;
8513e519524SHoward Hinnant                __r = __cv_->out(__st_, this->pbase(), this->pptr(), __e,
8523e519524SHoward Hinnant                                        __extbuf_, __extbuf_ + __ebs_, __extbe);
8533e519524SHoward Hinnant                if (__e == this->pbase())
8543e519524SHoward Hinnant                    return traits_type::eof();
8553e519524SHoward Hinnant                if (__r == codecvt_base::noconv)
8563e519524SHoward Hinnant                {
8573e519524SHoward Hinnant                    size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase());
8583e519524SHoward Hinnant                    if (fwrite(this->pbase(), 1, __nmemb, __file_) != __nmemb)
8593e519524SHoward Hinnant                        return traits_type::eof();
8603e519524SHoward Hinnant                }
8613e519524SHoward Hinnant                else if (__r == codecvt_base::ok || __r == codecvt_base::partial)
8623e519524SHoward Hinnant                {
8633e519524SHoward Hinnant                    size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_);
8643e519524SHoward Hinnant                    if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb)
8653e519524SHoward Hinnant                        return traits_type::eof();
8663e519524SHoward Hinnant                    if (__r == codecvt_base::partial)
8673e519524SHoward Hinnant                    {
8688b086e38SMarshall Clow                        this->setp(const_cast<char_type*>(__e), this->pptr());
869d90758e2SMarshall Clow                        this->__pbump(this->epptr() - this->pbase());
8703e519524SHoward Hinnant                    }
8713e519524SHoward Hinnant                }
8723e519524SHoward Hinnant                else
8733e519524SHoward Hinnant                    return traits_type::eof();
8743e519524SHoward Hinnant            } while (__r == codecvt_base::partial);
8753e519524SHoward Hinnant        }
8763e519524SHoward Hinnant        this->setp(__pb_save, __epb_save);
8773e519524SHoward Hinnant    }
8783e519524SHoward Hinnant    return traits_type::not_eof(__c);
8793e519524SHoward Hinnant}
8803e519524SHoward Hinnant
8813e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
8823e519524SHoward Hinnantbasic_streambuf<_CharT, _Traits>*
8833e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::setbuf(char_type* __s, streamsize __n)
8843e519524SHoward Hinnant{
885527a7fdfSBruce Mitchener    this->setg(nullptr, nullptr, nullptr);
886527a7fdfSBruce Mitchener    this->setp(nullptr, nullptr);
8873e519524SHoward Hinnant    if (__owns_eb_)
8883e519524SHoward Hinnant        delete [] __extbuf_;
8893e519524SHoward Hinnant    if (__owns_ib_)
8903e519524SHoward Hinnant        delete [] __intbuf_;
8913e519524SHoward Hinnant    __ebs_ = __n;
8923e519524SHoward Hinnant    if (__ebs_ > sizeof(__extbuf_min_))
8933e519524SHoward Hinnant    {
8943e519524SHoward Hinnant        if (__always_noconv_ && __s)
8953e519524SHoward Hinnant        {
8963e519524SHoward Hinnant            __extbuf_ = (char*)__s;
8973e519524SHoward Hinnant            __owns_eb_ = false;
8983e519524SHoward Hinnant        }
8993e519524SHoward Hinnant        else
9003e519524SHoward Hinnant        {
9013e519524SHoward Hinnant            __extbuf_ = new char[__ebs_];
9023e519524SHoward Hinnant            __owns_eb_ = true;
9033e519524SHoward Hinnant        }
9043e519524SHoward Hinnant    }
9053e519524SHoward Hinnant    else
9063e519524SHoward Hinnant    {
9073e519524SHoward Hinnant        __extbuf_ = __extbuf_min_;
9083e519524SHoward Hinnant        __ebs_ = sizeof(__extbuf_min_);
9093e519524SHoward Hinnant        __owns_eb_ = false;
9103e519524SHoward Hinnant    }
9113e519524SHoward Hinnant    if (!__always_noconv_)
9123e519524SHoward Hinnant    {
9133e519524SHoward Hinnant        __ibs_ = max<streamsize>(__n, sizeof(__extbuf_min_));
9143e519524SHoward Hinnant        if (__s && __ibs_ >= sizeof(__extbuf_min_))
9153e519524SHoward Hinnant        {
9163e519524SHoward Hinnant            __intbuf_ = __s;
9173e519524SHoward Hinnant            __owns_ib_ = false;
9183e519524SHoward Hinnant        }
9193e519524SHoward Hinnant        else
9203e519524SHoward Hinnant        {
9213e519524SHoward Hinnant            __intbuf_ = new char_type[__ibs_];
9223e519524SHoward Hinnant            __owns_ib_ = true;
9233e519524SHoward Hinnant        }
9243e519524SHoward Hinnant    }
9253e519524SHoward Hinnant    else
9263e519524SHoward Hinnant    {
9273e519524SHoward Hinnant        __ibs_ = 0;
928527a7fdfSBruce Mitchener        __intbuf_ = nullptr;
9293e519524SHoward Hinnant        __owns_ib_ = false;
9303e519524SHoward Hinnant    }
9313e519524SHoward Hinnant    return this;
9323e519524SHoward Hinnant}
9333e519524SHoward Hinnant
9343e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
9353e519524SHoward Hinnanttypename basic_filebuf<_CharT, _Traits>::pos_type
9363e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::seekoff(off_type __off, ios_base::seekdir __way,
9373e519524SHoward Hinnant                                        ios_base::openmode)
9383e519524SHoward Hinnant{
939cc27317aSHoward Hinnant    if (!__cv_)
940d437fa5cSMarshall Clow        __throw_bad_cast();
941d437fa5cSMarshall Clow
9423e519524SHoward Hinnant    int __width = __cv_->encoding();
943527a7fdfSBruce Mitchener    if (__file_ == nullptr || (__width <= 0 && __off != 0) || sync())
9443e519524SHoward Hinnant        return pos_type(off_type(-1));
9453e519524SHoward Hinnant    // __width > 0 || __off == 0
9463e519524SHoward Hinnant    int __whence;
9473e519524SHoward Hinnant    switch (__way)
9483e519524SHoward Hinnant    {
9493e519524SHoward Hinnant    case ios_base::beg:
9503e519524SHoward Hinnant        __whence = SEEK_SET;
9513e519524SHoward Hinnant        break;
9523e519524SHoward Hinnant    case ios_base::cur:
9533e519524SHoward Hinnant        __whence = SEEK_CUR;
9543e519524SHoward Hinnant        break;
9553e519524SHoward Hinnant    case ios_base::end:
9563e519524SHoward Hinnant        __whence = SEEK_END;
9573e519524SHoward Hinnant        break;
9583e519524SHoward Hinnant    default:
9593e519524SHoward Hinnant        return pos_type(off_type(-1));
9603e519524SHoward Hinnant    }
96173aa38dfSShoaib Meenai#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
96245944824SHoward Hinnant    if (fseek(__file_, __width > 0 ? __width * __off : 0, __whence))
96345944824SHoward Hinnant        return pos_type(off_type(-1));
96445944824SHoward Hinnant    pos_type __r = ftell(__file_);
96545944824SHoward Hinnant#else
9663e519524SHoward Hinnant    if (fseeko(__file_, __width > 0 ? __width * __off : 0, __whence))
9673e519524SHoward Hinnant        return pos_type(off_type(-1));
9683e519524SHoward Hinnant    pos_type __r = ftello(__file_);
96945944824SHoward Hinnant#endif
9703e519524SHoward Hinnant    __r.state(__st_);
9713e519524SHoward Hinnant    return __r;
9723e519524SHoward Hinnant}
9733e519524SHoward Hinnant
9743e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
9753e519524SHoward Hinnanttypename basic_filebuf<_CharT, _Traits>::pos_type
9766ded0993SHoward Hinnantbasic_filebuf<_CharT, _Traits>::seekpos(pos_type __sp, ios_base::openmode)
9773e519524SHoward Hinnant{
978527a7fdfSBruce Mitchener    if (__file_ == nullptr || sync())
9793e519524SHoward Hinnant        return pos_type(off_type(-1));
98073aa38dfSShoaib Meenai#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
98145944824SHoward Hinnant    if (fseek(__file_, __sp, SEEK_SET))
98245944824SHoward Hinnant        return pos_type(off_type(-1));
98345944824SHoward Hinnant#else
9843e519524SHoward Hinnant    if (fseeko(__file_, __sp, SEEK_SET))
9853e519524SHoward Hinnant        return pos_type(off_type(-1));
98645944824SHoward Hinnant#endif
987bfd96e11SHoward Hinnant    __st_ = __sp.state();
9883e519524SHoward Hinnant    return __sp;
9893e519524SHoward Hinnant}
9903e519524SHoward Hinnant
9913e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
9923e519524SHoward Hinnantint
9933e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::sync()
9943e519524SHoward Hinnant{
995527a7fdfSBruce Mitchener    if (__file_ == nullptr)
9963e519524SHoward Hinnant        return 0;
997cc27317aSHoward Hinnant    if (!__cv_)
998d437fa5cSMarshall Clow        __throw_bad_cast();
999d437fa5cSMarshall Clow
10003e519524SHoward Hinnant    if (__cm_ & ios_base::out)
10013e519524SHoward Hinnant    {
10023e519524SHoward Hinnant        if (this->pptr() != this->pbase())
10033e519524SHoward Hinnant            if (overflow() == traits_type::eof())
10043e519524SHoward Hinnant                return -1;
10053e519524SHoward Hinnant        codecvt_base::result __r;
10063e519524SHoward Hinnant        do
10073e519524SHoward Hinnant        {
10083e519524SHoward Hinnant            char* __extbe;
10093e519524SHoward Hinnant            __r = __cv_->unshift(__st_, __extbuf_, __extbuf_ + __ebs_, __extbe);
10103e519524SHoward Hinnant            size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_);
10113e519524SHoward Hinnant            if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb)
10123e519524SHoward Hinnant                return -1;
10133e519524SHoward Hinnant        } while (__r == codecvt_base::partial);
10143e519524SHoward Hinnant        if (__r == codecvt_base::error)
10153e519524SHoward Hinnant            return -1;
10163e519524SHoward Hinnant        if (fflush(__file_))
10173e519524SHoward Hinnant            return -1;
10183e519524SHoward Hinnant    }
10193e519524SHoward Hinnant    else if (__cm_ & ios_base::in)
10203e519524SHoward Hinnant    {
10213e519524SHoward Hinnant        off_type __c;
1022bfd96e11SHoward Hinnant        state_type __state = __st_last_;
1023bfd96e11SHoward Hinnant        bool __update_st = false;
10243e519524SHoward Hinnant        if (__always_noconv_)
10253e519524SHoward Hinnant            __c = this->egptr() - this->gptr();
10263e519524SHoward Hinnant        else
10273e519524SHoward Hinnant        {
10283e519524SHoward Hinnant            int __width = __cv_->encoding();
10293e519524SHoward Hinnant            __c = __extbufend_ - __extbufnext_;
10303e519524SHoward Hinnant            if (__width > 0)
10313e519524SHoward Hinnant                __c += __width * (this->egptr() - this->gptr());
10323e519524SHoward Hinnant            else
10333e519524SHoward Hinnant            {
10343e519524SHoward Hinnant                if (this->gptr() != this->egptr())
10353e519524SHoward Hinnant                {
1036bfd96e11SHoward Hinnant                    const int __off =  __cv_->length(__state, __extbuf_,
1037bfd96e11SHoward Hinnant                                                     __extbufnext_,
1038bfd96e11SHoward Hinnant                                                     this->gptr() - this->eback());
1039bfd96e11SHoward Hinnant                    __c += __extbufnext_ - __extbuf_ - __off;
1040bfd96e11SHoward Hinnant                    __update_st = true;
10413e519524SHoward Hinnant                }
10423e519524SHoward Hinnant            }
10433e519524SHoward Hinnant        }
104473aa38dfSShoaib Meenai#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
104545944824SHoward Hinnant        if (fseek(__file_, -__c, SEEK_CUR))
104645944824SHoward Hinnant            return -1;
104745944824SHoward Hinnant#else
10483e519524SHoward Hinnant        if (fseeko(__file_, -__c, SEEK_CUR))
10493e519524SHoward Hinnant            return -1;
105045944824SHoward Hinnant#endif
1051bfd96e11SHoward Hinnant        if (__update_st)
1052bfd96e11SHoward Hinnant            __st_ = __state;
1053bfd96e11SHoward Hinnant        __extbufnext_ = __extbufend_ = __extbuf_;
1054527a7fdfSBruce Mitchener        this->setg(nullptr, nullptr, nullptr);
10553e519524SHoward Hinnant        __cm_ = 0;
10563e519524SHoward Hinnant    }
10573e519524SHoward Hinnant    return 0;
10583e519524SHoward Hinnant}
10593e519524SHoward Hinnant
10603e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
10613e519524SHoward Hinnantvoid
10623e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::imbue(const locale& __loc)
10633e519524SHoward Hinnant{
10643e519524SHoward Hinnant    sync();
10653e519524SHoward Hinnant    __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc);
10663e519524SHoward Hinnant    bool __old_anc = __always_noconv_;
10673e519524SHoward Hinnant    __always_noconv_ = __cv_->always_noconv();
10683e519524SHoward Hinnant    if (__old_anc != __always_noconv_)
10693e519524SHoward Hinnant    {
1070527a7fdfSBruce Mitchener        this->setg(nullptr, nullptr, nullptr);
1071527a7fdfSBruce Mitchener        this->setp(nullptr, nullptr);
10723e519524SHoward Hinnant        // invariant, char_type is char, else we couldn't get here
10733e519524SHoward Hinnant        if (__always_noconv_)  // need to dump __intbuf_
10743e519524SHoward Hinnant        {
10753e519524SHoward Hinnant            if (__owns_eb_)
10763e519524SHoward Hinnant                delete [] __extbuf_;
10773e519524SHoward Hinnant            __owns_eb_ = __owns_ib_;
10783e519524SHoward Hinnant            __ebs_ = __ibs_;
10793e519524SHoward Hinnant            __extbuf_ = (char*)__intbuf_;
10803e519524SHoward Hinnant            __ibs_ = 0;
1081527a7fdfSBruce Mitchener            __intbuf_ = nullptr;
10823e519524SHoward Hinnant            __owns_ib_ = false;
10833e519524SHoward Hinnant        }
10843e519524SHoward Hinnant        else  // need to obtain an __intbuf_.
10853e519524SHoward Hinnant        {     // If __extbuf_ is user-supplied, use it, else new __intbuf_
10863e519524SHoward Hinnant            if (!__owns_eb_ && __extbuf_ != __extbuf_min_)
10873e519524SHoward Hinnant            {
10883e519524SHoward Hinnant                __ibs_ = __ebs_;
10893e519524SHoward Hinnant                __intbuf_ = (char_type*)__extbuf_;
10903e519524SHoward Hinnant                __owns_ib_ = false;
10913e519524SHoward Hinnant                __extbuf_ = new char[__ebs_];
10923e519524SHoward Hinnant                __owns_eb_ = true;
10933e519524SHoward Hinnant            }
10943e519524SHoward Hinnant            else
10953e519524SHoward Hinnant            {
10963e519524SHoward Hinnant                __ibs_ = __ebs_;
10973e519524SHoward Hinnant                __intbuf_ = new char_type[__ibs_];
10983e519524SHoward Hinnant                __owns_ib_ = true;
10993e519524SHoward Hinnant            }
11003e519524SHoward Hinnant        }
11013e519524SHoward Hinnant    }
11023e519524SHoward Hinnant}
11033e519524SHoward Hinnant
11043e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
11053e519524SHoward Hinnantbool
11063e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::__read_mode()
11073e519524SHoward Hinnant{
11083e519524SHoward Hinnant    if (!(__cm_ & ios_base::in))
11093e519524SHoward Hinnant    {
1110527a7fdfSBruce Mitchener        this->setp(nullptr, nullptr);
11113e519524SHoward Hinnant        if (__always_noconv_)
11123e519524SHoward Hinnant            this->setg((char_type*)__extbuf_,
11133e519524SHoward Hinnant                       (char_type*)__extbuf_ + __ebs_,
11143e519524SHoward Hinnant                       (char_type*)__extbuf_ + __ebs_);
11153e519524SHoward Hinnant        else
11163e519524SHoward Hinnant            this->setg(__intbuf_, __intbuf_ + __ibs_, __intbuf_ + __ibs_);
11173e519524SHoward Hinnant        __cm_ = ios_base::in;
11183e519524SHoward Hinnant        return true;
11193e519524SHoward Hinnant    }
11203e519524SHoward Hinnant    return false;
11213e519524SHoward Hinnant}
11223e519524SHoward Hinnant
11233e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
11243e519524SHoward Hinnantvoid
11253e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>::__write_mode()
11263e519524SHoward Hinnant{
11273e519524SHoward Hinnant    if (!(__cm_ & ios_base::out))
11283e519524SHoward Hinnant    {
1129527a7fdfSBruce Mitchener        this->setg(nullptr, nullptr, nullptr);
11303e519524SHoward Hinnant        if (__ebs_ > sizeof(__extbuf_min_))
11313e519524SHoward Hinnant        {
11323e519524SHoward Hinnant            if (__always_noconv_)
11333e519524SHoward Hinnant                this->setp((char_type*)__extbuf_,
11343e519524SHoward Hinnant                           (char_type*)__extbuf_ + (__ebs_ - 1));
11353e519524SHoward Hinnant            else
11363e519524SHoward Hinnant                this->setp(__intbuf_, __intbuf_ + (__ibs_ - 1));
11373e519524SHoward Hinnant        }
11383e519524SHoward Hinnant        else
1139527a7fdfSBruce Mitchener            this->setp(nullptr, nullptr);
11403e519524SHoward Hinnant        __cm_ = ios_base::out;
11413e519524SHoward Hinnant    }
11423e519524SHoward Hinnant}
11433e519524SHoward Hinnant
11443e519524SHoward Hinnant// basic_ifstream
11453e519524SHoward Hinnant
11463e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1147e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_ifstream
11483e519524SHoward Hinnant    : public basic_istream<_CharT, _Traits>
11493e519524SHoward Hinnant{
11503e519524SHoward Hinnantpublic:
11513e519524SHoward Hinnant    typedef _CharT                         char_type;
11523e519524SHoward Hinnant    typedef _Traits                        traits_type;
11533e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
11543e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
11553e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
11563e519524SHoward Hinnant
1157cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
11583e519524SHoward Hinnant    basic_ifstream();
1159cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
11603e519524SHoward Hinnant    explicit basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in);
11614801624eSPeter Collingbourne#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
11624801624eSPeter Collingbourne    _LIBCPP_INLINE_VISIBILITY
11634801624eSPeter Collingbourne    explicit basic_ifstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::in);
11644801624eSPeter Collingbourne#endif
1165cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
11663e519524SHoward Hinnant    explicit basic_ifstream(const string& __s, ios_base::openmode __mode = ios_base::in);
1167933518ffSLouis Dionne#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
1168b38c08acSLouis Dionne    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
1169998a5c88SEric Fiselier    explicit basic_ifstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in)
1170998a5c88SEric Fiselier      : basic_ifstream(__p.c_str(), __mode) {}
1171998a5c88SEric Fiselier#endif // _LIBCPP_STD_VER >= 17
1172cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
11733e519524SHoward Hinnant    basic_ifstream(basic_ifstream&& __rhs);
1174cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
11753e519524SHoward Hinnant    basic_ifstream& operator=(basic_ifstream&& __rhs);
1176cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
11773e519524SHoward Hinnant    void swap(basic_ifstream& __rhs);
11783e519524SHoward Hinnant
1179cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
11803e519524SHoward Hinnant    basic_filebuf<char_type, traits_type>* rdbuf() const;
1181cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
11823e519524SHoward Hinnant    bool is_open() const;
11833e519524SHoward Hinnant    void open(const char* __s, ios_base::openmode __mode = ios_base::in);
11844801624eSPeter Collingbourne#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
11854801624eSPeter Collingbourne    void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::in);
11864801624eSPeter Collingbourne#endif
11873e519524SHoward Hinnant    void open(const string& __s, ios_base::openmode __mode = ios_base::in);
1188933518ffSLouis Dionne#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
1189b38c08acSLouis Dionne    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
1190998a5c88SEric Fiselier    void open(const filesystem::path& __p,
1191998a5c88SEric Fiselier              ios_base::openmode __mode = ios_base::in) {
1192998a5c88SEric Fiselier      return open(__p.c_str(), __mode);
1193998a5c88SEric Fiselier    }
1194998a5c88SEric Fiselier#endif // _LIBCPP_STD_VER >= 17
11957c0ed44dSEric Fiselier
11967c0ed44dSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
11977c0ed44dSEric Fiselier    void __open(int __fd, ios_base::openmode __mode);
1198cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
11993e519524SHoward Hinnant    void close();
12003e519524SHoward Hinnant
12013e519524SHoward Hinnantprivate:
12023e519524SHoward Hinnant    basic_filebuf<char_type, traits_type> __sb_;
12033e519524SHoward Hinnant};
12043e519524SHoward Hinnant
12053e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1206cd31b434SEvgeniy Stepanovinline
12073e519524SHoward Hinnantbasic_ifstream<_CharT, _Traits>::basic_ifstream()
12083e519524SHoward Hinnant    : basic_istream<char_type, traits_type>(&__sb_)
12093e519524SHoward Hinnant{
12103e519524SHoward Hinnant}
12113e519524SHoward Hinnant
12123e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1213cd31b434SEvgeniy Stepanovinline
12143e519524SHoward Hinnantbasic_ifstream<_CharT, _Traits>::basic_ifstream(const char* __s, ios_base::openmode __mode)
12153e519524SHoward Hinnant    : basic_istream<char_type, traits_type>(&__sb_)
12163e519524SHoward Hinnant{
1217527a7fdfSBruce Mitchener    if (__sb_.open(__s, __mode | ios_base::in) == nullptr)
12183e519524SHoward Hinnant        this->setstate(ios_base::failbit);
12193e519524SHoward Hinnant}
12203e519524SHoward Hinnant
12214801624eSPeter Collingbourne#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
12224801624eSPeter Collingbournetemplate <class _CharT, class _Traits>
12234801624eSPeter Collingbourneinline
12244801624eSPeter Collingbournebasic_ifstream<_CharT, _Traits>::basic_ifstream(const wchar_t* __s, ios_base::openmode __mode)
12254801624eSPeter Collingbourne    : basic_istream<char_type, traits_type>(&__sb_)
12264801624eSPeter Collingbourne{
1227527a7fdfSBruce Mitchener    if (__sb_.open(__s, __mode | ios_base::in) == nullptr)
12284801624eSPeter Collingbourne        this->setstate(ios_base::failbit);
12294801624eSPeter Collingbourne}
12304801624eSPeter Collingbourne#endif
12314801624eSPeter Collingbourne
12323e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1233cd31b434SEvgeniy Stepanovinline
12343e519524SHoward Hinnantbasic_ifstream<_CharT, _Traits>::basic_ifstream(const string& __s, ios_base::openmode __mode)
12353e519524SHoward Hinnant    : basic_istream<char_type, traits_type>(&__sb_)
12363e519524SHoward Hinnant{
1237527a7fdfSBruce Mitchener    if (__sb_.open(__s, __mode | ios_base::in) == nullptr)
12383e519524SHoward Hinnant        this->setstate(ios_base::failbit);
12393e519524SHoward Hinnant}
12403e519524SHoward Hinnant
12413e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1242cd31b434SEvgeniy Stepanovinline
12433e519524SHoward Hinnantbasic_ifstream<_CharT, _Traits>::basic_ifstream(basic_ifstream&& __rhs)
1244ce48a113SHoward Hinnant    : basic_istream<char_type, traits_type>(_VSTD::move(__rhs)),
1245ce48a113SHoward Hinnant      __sb_(_VSTD::move(__rhs.__sb_))
12463e519524SHoward Hinnant{
12473e519524SHoward Hinnant    this->set_rdbuf(&__sb_);
12483e519524SHoward Hinnant}
12493e519524SHoward Hinnant
12503e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1251cd31b434SEvgeniy Stepanovinline
12523e519524SHoward Hinnantbasic_ifstream<_CharT, _Traits>&
12533e519524SHoward Hinnantbasic_ifstream<_CharT, _Traits>::operator=(basic_ifstream&& __rhs)
12543e519524SHoward Hinnant{
1255ce48a113SHoward Hinnant    basic_istream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
1256ce48a113SHoward Hinnant    __sb_ = _VSTD::move(__rhs.__sb_);
12573e519524SHoward Hinnant    return *this;
12583e519524SHoward Hinnant}
12593e519524SHoward Hinnant
12603e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1261cd31b434SEvgeniy Stepanovinline
12623e519524SHoward Hinnantvoid
12633e519524SHoward Hinnantbasic_ifstream<_CharT, _Traits>::swap(basic_ifstream& __rhs)
12643e519524SHoward Hinnant{
12653e519524SHoward Hinnant    basic_istream<char_type, traits_type>::swap(__rhs);
12663e519524SHoward Hinnant    __sb_.swap(__rhs.__sb_);
12673e519524SHoward Hinnant}
12683e519524SHoward Hinnant
12693e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
12703e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
12713e519524SHoward Hinnantvoid
12723e519524SHoward Hinnantswap(basic_ifstream<_CharT, _Traits>& __x, basic_ifstream<_CharT, _Traits>& __y)
12733e519524SHoward Hinnant{
12743e519524SHoward Hinnant    __x.swap(__y);
12753e519524SHoward Hinnant}
12763e519524SHoward Hinnant
12773e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1278cd31b434SEvgeniy Stepanovinline
12793e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>*
12803e519524SHoward Hinnantbasic_ifstream<_CharT, _Traits>::rdbuf() const
12813e519524SHoward Hinnant{
12823e519524SHoward Hinnant    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
12833e519524SHoward Hinnant}
12843e519524SHoward Hinnant
12853e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1286cd31b434SEvgeniy Stepanovinline
12873e519524SHoward Hinnantbool
12883e519524SHoward Hinnantbasic_ifstream<_CharT, _Traits>::is_open() const
12893e519524SHoward Hinnant{
12903e519524SHoward Hinnant    return __sb_.is_open();
12913e519524SHoward Hinnant}
12923e519524SHoward Hinnant
12933e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
12943e519524SHoward Hinnantvoid
12953e519524SHoward Hinnantbasic_ifstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
12963e519524SHoward Hinnant{
12973e519524SHoward Hinnant    if (__sb_.open(__s, __mode | ios_base::in))
12983e519524SHoward Hinnant        this->clear();
12993e519524SHoward Hinnant    else
13003e519524SHoward Hinnant        this->setstate(ios_base::failbit);
13013e519524SHoward Hinnant}
13023e519524SHoward Hinnant
13034801624eSPeter Collingbourne#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
13044801624eSPeter Collingbournetemplate <class _CharT, class _Traits>
13054801624eSPeter Collingbournevoid
13064801624eSPeter Collingbournebasic_ifstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
13074801624eSPeter Collingbourne{
13084801624eSPeter Collingbourne    if (__sb_.open(__s, __mode | ios_base::in))
13094801624eSPeter Collingbourne        this->clear();
13104801624eSPeter Collingbourne    else
13114801624eSPeter Collingbourne        this->setstate(ios_base::failbit);
13124801624eSPeter Collingbourne}
13134801624eSPeter Collingbourne#endif
13144801624eSPeter Collingbourne
13153e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
13163e519524SHoward Hinnantvoid
13173e519524SHoward Hinnantbasic_ifstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
13183e519524SHoward Hinnant{
13193e519524SHoward Hinnant    if (__sb_.open(__s, __mode | ios_base::in))
13203e519524SHoward Hinnant        this->clear();
13213e519524SHoward Hinnant    else
13223e519524SHoward Hinnant        this->setstate(ios_base::failbit);
13233e519524SHoward Hinnant}
13247c0ed44dSEric Fiselier
13257c0ed44dSEric Fiseliertemplate <class _CharT, class _Traits>
132652e9d80dSjasonliuinline
13277c0ed44dSEric Fiseliervoid basic_ifstream<_CharT, _Traits>::__open(int __fd,
13287c0ed44dSEric Fiselier                                             ios_base::openmode __mode) {
13297c0ed44dSEric Fiselier  if (__sb_.__open(__fd, __mode | ios_base::in))
13307c0ed44dSEric Fiselier    this->clear();
13317c0ed44dSEric Fiselier  else
13327c0ed44dSEric Fiselier    this->setstate(ios_base::failbit);
13337c0ed44dSEric Fiselier}
13343e519524SHoward Hinnant
13353e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1336cd31b434SEvgeniy Stepanovinline
13373e519524SHoward Hinnantvoid
13383e519524SHoward Hinnantbasic_ifstream<_CharT, _Traits>::close()
13393e519524SHoward Hinnant{
13403e519524SHoward Hinnant    if (__sb_.close() == 0)
13413e519524SHoward Hinnant        this->setstate(ios_base::failbit);
13423e519524SHoward Hinnant}
13433e519524SHoward Hinnant
13443e519524SHoward Hinnant// basic_ofstream
13453e519524SHoward Hinnant
13463e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1347e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_ofstream
13483e519524SHoward Hinnant    : public basic_ostream<_CharT, _Traits>
13493e519524SHoward Hinnant{
13503e519524SHoward Hinnantpublic:
13513e519524SHoward Hinnant    typedef _CharT                         char_type;
13523e519524SHoward Hinnant    typedef _Traits                        traits_type;
13533e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
13543e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
13553e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
13563e519524SHoward Hinnant
1357cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13583e519524SHoward Hinnant    basic_ofstream();
1359cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13603e519524SHoward Hinnant    explicit basic_ofstream(const char* __s, ios_base::openmode __mode = ios_base::out);
13614801624eSPeter Collingbourne#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
13624801624eSPeter Collingbourne    _LIBCPP_INLINE_VISIBILITY
13634801624eSPeter Collingbourne    explicit basic_ofstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::out);
13644801624eSPeter Collingbourne#endif
1365cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13663e519524SHoward Hinnant    explicit basic_ofstream(const string& __s, ios_base::openmode __mode = ios_base::out);
1367998a5c88SEric Fiselier
1368933518ffSLouis Dionne#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
1369b38c08acSLouis Dionne    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
1370998a5c88SEric Fiselier    explicit basic_ofstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::out)
1371998a5c88SEric Fiselier      : basic_ofstream(__p.c_str(), __mode) {}
1372998a5c88SEric Fiselier#endif // _LIBCPP_STD_VER >= 17
1373998a5c88SEric Fiselier
1374cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13753e519524SHoward Hinnant    basic_ofstream(basic_ofstream&& __rhs);
1376cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13773e519524SHoward Hinnant    basic_ofstream& operator=(basic_ofstream&& __rhs);
1378cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13793e519524SHoward Hinnant    void swap(basic_ofstream& __rhs);
13803e519524SHoward Hinnant
1381cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13823e519524SHoward Hinnant    basic_filebuf<char_type, traits_type>* rdbuf() const;
1383cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13843e519524SHoward Hinnant    bool is_open() const;
13853e519524SHoward Hinnant    void open(const char* __s, ios_base::openmode __mode = ios_base::out);
13864801624eSPeter Collingbourne#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
13874801624eSPeter Collingbourne    void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::out);
13884801624eSPeter Collingbourne#endif
13893e519524SHoward Hinnant    void open(const string& __s, ios_base::openmode __mode = ios_base::out);
13907c0ed44dSEric Fiselier
1391933518ffSLouis Dionne#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
1392b38c08acSLouis Dionne    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
1393998a5c88SEric Fiselier    void open(const filesystem::path& __p, ios_base::openmode __mode = ios_base::out)
1394998a5c88SEric Fiselier    { return open(__p.c_str(), __mode); }
1395998a5c88SEric Fiselier#endif // _LIBCPP_STD_VER >= 17
1396998a5c88SEric Fiselier
13977c0ed44dSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
13987c0ed44dSEric Fiselier    void __open(int __fd, ios_base::openmode __mode);
1399cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
14003e519524SHoward Hinnant    void close();
14013e519524SHoward Hinnant
14023e519524SHoward Hinnantprivate:
14033e519524SHoward Hinnant    basic_filebuf<char_type, traits_type> __sb_;
14043e519524SHoward Hinnant};
14053e519524SHoward Hinnant
14063e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1407cd31b434SEvgeniy Stepanovinline
14083e519524SHoward Hinnantbasic_ofstream<_CharT, _Traits>::basic_ofstream()
14093e519524SHoward Hinnant    : basic_ostream<char_type, traits_type>(&__sb_)
14103e519524SHoward Hinnant{
14113e519524SHoward Hinnant}
14123e519524SHoward Hinnant
14133e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1414cd31b434SEvgeniy Stepanovinline
14153e519524SHoward Hinnantbasic_ofstream<_CharT, _Traits>::basic_ofstream(const char* __s, ios_base::openmode __mode)
14163e519524SHoward Hinnant    : basic_ostream<char_type, traits_type>(&__sb_)
14173e519524SHoward Hinnant{
1418527a7fdfSBruce Mitchener    if (__sb_.open(__s, __mode | ios_base::out) == nullptr)
14193e519524SHoward Hinnant        this->setstate(ios_base::failbit);
14203e519524SHoward Hinnant}
14213e519524SHoward Hinnant
14224801624eSPeter Collingbourne#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
14234801624eSPeter Collingbournetemplate <class _CharT, class _Traits>
14244801624eSPeter Collingbourneinline
14254801624eSPeter Collingbournebasic_ofstream<_CharT, _Traits>::basic_ofstream(const wchar_t* __s, ios_base::openmode __mode)
14264801624eSPeter Collingbourne    : basic_ostream<char_type, traits_type>(&__sb_)
14274801624eSPeter Collingbourne{
1428527a7fdfSBruce Mitchener    if (__sb_.open(__s, __mode | ios_base::out) == nullptr)
14294801624eSPeter Collingbourne        this->setstate(ios_base::failbit);
14304801624eSPeter Collingbourne}
14314801624eSPeter Collingbourne#endif
14324801624eSPeter Collingbourne
14333e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1434cd31b434SEvgeniy Stepanovinline
14353e519524SHoward Hinnantbasic_ofstream<_CharT, _Traits>::basic_ofstream(const string& __s, ios_base::openmode __mode)
14363e519524SHoward Hinnant    : basic_ostream<char_type, traits_type>(&__sb_)
14373e519524SHoward Hinnant{
1438527a7fdfSBruce Mitchener    if (__sb_.open(__s, __mode | ios_base::out) == nullptr)
14393e519524SHoward Hinnant        this->setstate(ios_base::failbit);
14403e519524SHoward Hinnant}
14413e519524SHoward Hinnant
14423e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1443cd31b434SEvgeniy Stepanovinline
14443e519524SHoward Hinnantbasic_ofstream<_CharT, _Traits>::basic_ofstream(basic_ofstream&& __rhs)
1445ce48a113SHoward Hinnant    : basic_ostream<char_type, traits_type>(_VSTD::move(__rhs)),
1446ce48a113SHoward Hinnant      __sb_(_VSTD::move(__rhs.__sb_))
14473e519524SHoward Hinnant{
14483e519524SHoward Hinnant    this->set_rdbuf(&__sb_);
14493e519524SHoward Hinnant}
14503e519524SHoward Hinnant
14513e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1452cd31b434SEvgeniy Stepanovinline
14533e519524SHoward Hinnantbasic_ofstream<_CharT, _Traits>&
14543e519524SHoward Hinnantbasic_ofstream<_CharT, _Traits>::operator=(basic_ofstream&& __rhs)
14553e519524SHoward Hinnant{
1456ce48a113SHoward Hinnant    basic_ostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
1457ce48a113SHoward Hinnant    __sb_ = _VSTD::move(__rhs.__sb_);
14583e519524SHoward Hinnant    return *this;
14593e519524SHoward Hinnant}
14603e519524SHoward Hinnant
14613e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1462cd31b434SEvgeniy Stepanovinline
14633e519524SHoward Hinnantvoid
14643e519524SHoward Hinnantbasic_ofstream<_CharT, _Traits>::swap(basic_ofstream& __rhs)
14653e519524SHoward Hinnant{
14663e519524SHoward Hinnant    basic_ostream<char_type, traits_type>::swap(__rhs);
14673e519524SHoward Hinnant    __sb_.swap(__rhs.__sb_);
14683e519524SHoward Hinnant}
14693e519524SHoward Hinnant
14703e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
14713e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14723e519524SHoward Hinnantvoid
14733e519524SHoward Hinnantswap(basic_ofstream<_CharT, _Traits>& __x, basic_ofstream<_CharT, _Traits>& __y)
14743e519524SHoward Hinnant{
14753e519524SHoward Hinnant    __x.swap(__y);
14763e519524SHoward Hinnant}
14773e519524SHoward Hinnant
14783e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1479cd31b434SEvgeniy Stepanovinline
14803e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>*
14813e519524SHoward Hinnantbasic_ofstream<_CharT, _Traits>::rdbuf() const
14823e519524SHoward Hinnant{
14833e519524SHoward Hinnant    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
14843e519524SHoward Hinnant}
14853e519524SHoward Hinnant
14863e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1487cd31b434SEvgeniy Stepanovinline
14883e519524SHoward Hinnantbool
14893e519524SHoward Hinnantbasic_ofstream<_CharT, _Traits>::is_open() const
14903e519524SHoward Hinnant{
14913e519524SHoward Hinnant    return __sb_.is_open();
14923e519524SHoward Hinnant}
14933e519524SHoward Hinnant
14943e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
14953e519524SHoward Hinnantvoid
14963e519524SHoward Hinnantbasic_ofstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
14973e519524SHoward Hinnant{
14983e519524SHoward Hinnant    if (__sb_.open(__s, __mode | ios_base::out))
14993e519524SHoward Hinnant        this->clear();
15003e519524SHoward Hinnant    else
15013e519524SHoward Hinnant        this->setstate(ios_base::failbit);
15023e519524SHoward Hinnant}
15033e519524SHoward Hinnant
15044801624eSPeter Collingbourne#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
15054801624eSPeter Collingbournetemplate <class _CharT, class _Traits>
15064801624eSPeter Collingbournevoid
15074801624eSPeter Collingbournebasic_ofstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
15084801624eSPeter Collingbourne{
15094801624eSPeter Collingbourne    if (__sb_.open(__s, __mode | ios_base::out))
15104801624eSPeter Collingbourne        this->clear();
15114801624eSPeter Collingbourne    else
15124801624eSPeter Collingbourne        this->setstate(ios_base::failbit);
15134801624eSPeter Collingbourne}
15144801624eSPeter Collingbourne#endif
15154801624eSPeter Collingbourne
15163e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
15173e519524SHoward Hinnantvoid
15183e519524SHoward Hinnantbasic_ofstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
15193e519524SHoward Hinnant{
15203e519524SHoward Hinnant    if (__sb_.open(__s, __mode | ios_base::out))
15213e519524SHoward Hinnant        this->clear();
15223e519524SHoward Hinnant    else
15233e519524SHoward Hinnant        this->setstate(ios_base::failbit);
15243e519524SHoward Hinnant}
15257c0ed44dSEric Fiselier
15267c0ed44dSEric Fiseliertemplate <class _CharT, class _Traits>
152752e9d80dSjasonliuinline
15287c0ed44dSEric Fiseliervoid basic_ofstream<_CharT, _Traits>::__open(int __fd,
15297c0ed44dSEric Fiselier                                             ios_base::openmode __mode) {
15307c0ed44dSEric Fiselier  if (__sb_.__open(__fd, __mode | ios_base::out))
15317c0ed44dSEric Fiselier    this->clear();
15327c0ed44dSEric Fiselier  else
15337c0ed44dSEric Fiselier    this->setstate(ios_base::failbit);
15347c0ed44dSEric Fiselier}
15353e519524SHoward Hinnant
15363e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1537cd31b434SEvgeniy Stepanovinline
15383e519524SHoward Hinnantvoid
15393e519524SHoward Hinnantbasic_ofstream<_CharT, _Traits>::close()
15403e519524SHoward Hinnant{
1541527a7fdfSBruce Mitchener    if (__sb_.close() == nullptr)
15423e519524SHoward Hinnant        this->setstate(ios_base::failbit);
15433e519524SHoward Hinnant}
15443e519524SHoward Hinnant
15453e519524SHoward Hinnant// basic_fstream
15463e519524SHoward Hinnant
15473e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1548e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS basic_fstream
15493e519524SHoward Hinnant    : public basic_iostream<_CharT, _Traits>
15503e519524SHoward Hinnant{
15513e519524SHoward Hinnantpublic:
15523e519524SHoward Hinnant    typedef _CharT                         char_type;
15533e519524SHoward Hinnant    typedef _Traits                        traits_type;
15543e519524SHoward Hinnant    typedef typename traits_type::int_type int_type;
15553e519524SHoward Hinnant    typedef typename traits_type::pos_type pos_type;
15563e519524SHoward Hinnant    typedef typename traits_type::off_type off_type;
15573e519524SHoward Hinnant
1558cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
15593e519524SHoward Hinnant    basic_fstream();
1560cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
15613e519524SHoward Hinnant    explicit basic_fstream(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
15624801624eSPeter Collingbourne#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
15634801624eSPeter Collingbourne    _LIBCPP_INLINE_VISIBILITY
15644801624eSPeter Collingbourne    explicit basic_fstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
15654801624eSPeter Collingbourne#endif
1566cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
15673e519524SHoward Hinnant    explicit basic_fstream(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
1568998a5c88SEric Fiselier
1569933518ffSLouis Dionne#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
1570b38c08acSLouis Dionne    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
1571998a5c88SEric Fiselier    explicit basic_fstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in | ios_base::out)
1572998a5c88SEric Fiselier      : basic_fstream(__p.c_str(), __mode) {}
1573998a5c88SEric Fiselier#endif // _LIBCPP_STD_VER >= 17
1574998a5c88SEric Fiselier
1575cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
15763e519524SHoward Hinnant    basic_fstream(basic_fstream&& __rhs);
15773e519524SHoward Hinnant
1578cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
15793e519524SHoward Hinnant    basic_fstream& operator=(basic_fstream&& __rhs);
1580a8d1182fSArthur O'Dwyer
1581cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
15823e519524SHoward Hinnant    void swap(basic_fstream& __rhs);
15833e519524SHoward Hinnant
1584cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
15853e519524SHoward Hinnant    basic_filebuf<char_type, traits_type>* rdbuf() const;
1586cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
15873e519524SHoward Hinnant    bool is_open() const;
15883e519524SHoward Hinnant    void open(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
15894801624eSPeter Collingbourne#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
15904801624eSPeter Collingbourne    void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
15914801624eSPeter Collingbourne#endif
15923e519524SHoward Hinnant    void open(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
1593998a5c88SEric Fiselier
1594933518ffSLouis Dionne#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
1595b38c08acSLouis Dionne    _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
1596998a5c88SEric Fiselier    void open(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in|ios_base::out)
1597998a5c88SEric Fiselier    { return open(__p.c_str(), __mode); }
1598998a5c88SEric Fiselier#endif // _LIBCPP_STD_VER >= 17
1599998a5c88SEric Fiselier
1600cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
16013e519524SHoward Hinnant    void close();
16023e519524SHoward Hinnant
16033e519524SHoward Hinnantprivate:
16043e519524SHoward Hinnant    basic_filebuf<char_type, traits_type> __sb_;
16053e519524SHoward Hinnant};
16063e519524SHoward Hinnant
16073e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1608cd31b434SEvgeniy Stepanovinline
16093e519524SHoward Hinnantbasic_fstream<_CharT, _Traits>::basic_fstream()
16103e519524SHoward Hinnant    : basic_iostream<char_type, traits_type>(&__sb_)
16113e519524SHoward Hinnant{
16123e519524SHoward Hinnant}
16133e519524SHoward Hinnant
16143e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1615cd31b434SEvgeniy Stepanovinline
16163e519524SHoward Hinnantbasic_fstream<_CharT, _Traits>::basic_fstream(const char* __s, ios_base::openmode __mode)
16173e519524SHoward Hinnant    : basic_iostream<char_type, traits_type>(&__sb_)
16183e519524SHoward Hinnant{
1619527a7fdfSBruce Mitchener    if (__sb_.open(__s, __mode) == nullptr)
16203e519524SHoward Hinnant        this->setstate(ios_base::failbit);
16213e519524SHoward Hinnant}
16223e519524SHoward Hinnant
16234801624eSPeter Collingbourne#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
16244801624eSPeter Collingbournetemplate <class _CharT, class _Traits>
16254801624eSPeter Collingbourneinline
16264801624eSPeter Collingbournebasic_fstream<_CharT, _Traits>::basic_fstream(const wchar_t* __s, ios_base::openmode __mode)
16274801624eSPeter Collingbourne    : basic_iostream<char_type, traits_type>(&__sb_)
16284801624eSPeter Collingbourne{
1629527a7fdfSBruce Mitchener    if (__sb_.open(__s, __mode) == nullptr)
16304801624eSPeter Collingbourne        this->setstate(ios_base::failbit);
16314801624eSPeter Collingbourne}
16324801624eSPeter Collingbourne#endif
16334801624eSPeter Collingbourne
16343e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1635cd31b434SEvgeniy Stepanovinline
16363e519524SHoward Hinnantbasic_fstream<_CharT, _Traits>::basic_fstream(const string& __s, ios_base::openmode __mode)
16373e519524SHoward Hinnant    : basic_iostream<char_type, traits_type>(&__sb_)
16383e519524SHoward Hinnant{
1639527a7fdfSBruce Mitchener    if (__sb_.open(__s, __mode) == nullptr)
16403e519524SHoward Hinnant        this->setstate(ios_base::failbit);
16413e519524SHoward Hinnant}
16423e519524SHoward Hinnant
16433e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1644cd31b434SEvgeniy Stepanovinline
16453e519524SHoward Hinnantbasic_fstream<_CharT, _Traits>::basic_fstream(basic_fstream&& __rhs)
1646ce48a113SHoward Hinnant    : basic_iostream<char_type, traits_type>(_VSTD::move(__rhs)),
1647ce48a113SHoward Hinnant      __sb_(_VSTD::move(__rhs.__sb_))
16483e519524SHoward Hinnant{
16493e519524SHoward Hinnant    this->set_rdbuf(&__sb_);
16503e519524SHoward Hinnant}
16513e519524SHoward Hinnant
16523e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1653cd31b434SEvgeniy Stepanovinline
16543e519524SHoward Hinnantbasic_fstream<_CharT, _Traits>&
16553e519524SHoward Hinnantbasic_fstream<_CharT, _Traits>::operator=(basic_fstream&& __rhs)
16563e519524SHoward Hinnant{
1657ce48a113SHoward Hinnant    basic_iostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
1658ce48a113SHoward Hinnant    __sb_ = _VSTD::move(__rhs.__sb_);
16593e519524SHoward Hinnant    return *this;
16603e519524SHoward Hinnant}
16613e519524SHoward Hinnant
16623e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1663cd31b434SEvgeniy Stepanovinline
16643e519524SHoward Hinnantvoid
16653e519524SHoward Hinnantbasic_fstream<_CharT, _Traits>::swap(basic_fstream& __rhs)
16663e519524SHoward Hinnant{
16673e519524SHoward Hinnant    basic_iostream<char_type, traits_type>::swap(__rhs);
16683e519524SHoward Hinnant    __sb_.swap(__rhs.__sb_);
16693e519524SHoward Hinnant}
16703e519524SHoward Hinnant
16713e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
16723e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16733e519524SHoward Hinnantvoid
16743e519524SHoward Hinnantswap(basic_fstream<_CharT, _Traits>& __x, basic_fstream<_CharT, _Traits>& __y)
16753e519524SHoward Hinnant{
16763e519524SHoward Hinnant    __x.swap(__y);
16773e519524SHoward Hinnant}
16783e519524SHoward Hinnant
16793e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1680cd31b434SEvgeniy Stepanovinline
16813e519524SHoward Hinnantbasic_filebuf<_CharT, _Traits>*
16823e519524SHoward Hinnantbasic_fstream<_CharT, _Traits>::rdbuf() const
16833e519524SHoward Hinnant{
16843e519524SHoward Hinnant    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
16853e519524SHoward Hinnant}
16863e519524SHoward Hinnant
16873e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1688cd31b434SEvgeniy Stepanovinline
16893e519524SHoward Hinnantbool
16903e519524SHoward Hinnantbasic_fstream<_CharT, _Traits>::is_open() const
16913e519524SHoward Hinnant{
16923e519524SHoward Hinnant    return __sb_.is_open();
16933e519524SHoward Hinnant}
16943e519524SHoward Hinnant
16953e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
16963e519524SHoward Hinnantvoid
16973e519524SHoward Hinnantbasic_fstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
16983e519524SHoward Hinnant{
16993e519524SHoward Hinnant    if (__sb_.open(__s, __mode))
17003e519524SHoward Hinnant        this->clear();
17013e519524SHoward Hinnant    else
17023e519524SHoward Hinnant        this->setstate(ios_base::failbit);
17033e519524SHoward Hinnant}
17043e519524SHoward Hinnant
17054801624eSPeter Collingbourne#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
17064801624eSPeter Collingbournetemplate <class _CharT, class _Traits>
17074801624eSPeter Collingbournevoid
17084801624eSPeter Collingbournebasic_fstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
17094801624eSPeter Collingbourne{
17104801624eSPeter Collingbourne    if (__sb_.open(__s, __mode))
17114801624eSPeter Collingbourne        this->clear();
17124801624eSPeter Collingbourne    else
17134801624eSPeter Collingbourne        this->setstate(ios_base::failbit);
17144801624eSPeter Collingbourne}
17154801624eSPeter Collingbourne#endif
17164801624eSPeter Collingbourne
17173e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
17183e519524SHoward Hinnantvoid
17193e519524SHoward Hinnantbasic_fstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
17203e519524SHoward Hinnant{
17213e519524SHoward Hinnant    if (__sb_.open(__s, __mode))
17223e519524SHoward Hinnant        this->clear();
17233e519524SHoward Hinnant    else
17243e519524SHoward Hinnant        this->setstate(ios_base::failbit);
17253e519524SHoward Hinnant}
17263e519524SHoward Hinnant
17273e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
1728cd31b434SEvgeniy Stepanovinline
17293e519524SHoward Hinnantvoid
17303e519524SHoward Hinnantbasic_fstream<_CharT, _Traits>::close()
17313e519524SHoward Hinnant{
1732527a7fdfSBruce Mitchener    if (__sb_.close() == nullptr)
17333e519524SHoward Hinnant        this->setstate(ios_base::failbit);
17343e519524SHoward Hinnant}
17353e519524SHoward Hinnant
1736997d41cdSLouis Dionne#if defined(_LIBCPP_ABI_ENABLE_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1)
1737*2ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ifstream<char>;
1738*2ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ofstream<char>;
1739*2ae52326SLouis Dionneextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_filebuf<char>;
1740997d41cdSLouis Dionne#endif
1741997d41cdSLouis Dionne
17423e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
17433e519524SHoward Hinnant
1744a016efb1SEric Fiselier_LIBCPP_POP_MACROS
1745a016efb1SEric Fiselier
17463e519524SHoward Hinnant#endif // _LIBCPP_FSTREAM
1747