xref: /freebsd-12.1/contrib/libc++/include/fstream (revision b5893f02)
17a984708SDavid Chisnall// -*- C++ -*-
27a984708SDavid Chisnall//===------------------------- fstream ------------------------------------===//
37a984708SDavid Chisnall//
47a984708SDavid Chisnall//                     The LLVM Compiler Infrastructure
57a984708SDavid Chisnall//
67a984708SDavid Chisnall// This file is dual licensed under the MIT and the University of Illinois Open
77a984708SDavid Chisnall// Source Licenses. See LICENSE.TXT for details.
87a984708SDavid Chisnall//
97a984708SDavid Chisnall//===----------------------------------------------------------------------===//
107a984708SDavid Chisnall
117a984708SDavid Chisnall#ifndef _LIBCPP_FSTREAM
127a984708SDavid Chisnall#define _LIBCPP_FSTREAM
137a984708SDavid Chisnall
147a984708SDavid Chisnall/*
157a984708SDavid Chisnall    fstream synopsis
167a984708SDavid Chisnall
177a984708SDavid Chisnalltemplate <class charT, class traits = char_traits<charT> >
187a984708SDavid Chisnallclass basic_filebuf
197a984708SDavid Chisnall    : public basic_streambuf<charT, traits>
207a984708SDavid Chisnall{
217a984708SDavid Chisnallpublic:
227a984708SDavid Chisnall    typedef charT                          char_type;
237a984708SDavid Chisnall    typedef traits                         traits_type;
247a984708SDavid Chisnall    typedef typename traits_type::int_type int_type;
257a984708SDavid Chisnall    typedef typename traits_type::pos_type pos_type;
267a984708SDavid Chisnall    typedef typename traits_type::off_type off_type;
277a984708SDavid Chisnall
287a984708SDavid Chisnall    // 27.9.1.2 Constructors/destructor:
297a984708SDavid Chisnall    basic_filebuf();
307a984708SDavid Chisnall    basic_filebuf(basic_filebuf&& rhs);
317a984708SDavid Chisnall    virtual ~basic_filebuf();
327a984708SDavid Chisnall
337a984708SDavid Chisnall    // 27.9.1.3 Assign/swap:
347a984708SDavid Chisnall    basic_filebuf& operator=(basic_filebuf&& rhs);
357a984708SDavid Chisnall    void swap(basic_filebuf& rhs);
367a984708SDavid Chisnall
377a984708SDavid Chisnall    // 27.9.1.4 Members:
387a984708SDavid Chisnall    bool is_open() const;
397a984708SDavid Chisnall    basic_filebuf* open(const char* s, ios_base::openmode mode);
407a984708SDavid Chisnall    basic_filebuf* open(const string& s, ios_base::openmode mode);
414ba319b5SDimitry Andric    basic_filebuf* open(const filesystem::path& p, ios_base::openmode mode); // C++17
427a984708SDavid Chisnall    basic_filebuf* close();
437a984708SDavid Chisnall
447a984708SDavid Chisnallprotected:
457a984708SDavid Chisnall    // 27.9.1.5 Overridden virtual functions:
467a984708SDavid Chisnall    virtual streamsize showmanyc();
477a984708SDavid Chisnall    virtual int_type underflow();
487a984708SDavid Chisnall    virtual int_type uflow();
497a984708SDavid Chisnall    virtual int_type pbackfail(int_type c = traits_type::eof());
507a984708SDavid Chisnall    virtual int_type overflow (int_type c = traits_type::eof());
517a984708SDavid Chisnall    virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* s, streamsize n);
527a984708SDavid Chisnall    virtual pos_type seekoff(off_type off, ios_base::seekdir way,
537a984708SDavid Chisnall                             ios_base::openmode which = ios_base::in | ios_base::out);
547a984708SDavid Chisnall    virtual pos_type seekpos(pos_type sp,
557a984708SDavid Chisnall                             ios_base::openmode which = ios_base::in | ios_base::out);
567a984708SDavid Chisnall    virtual int sync();
577a984708SDavid Chisnall    virtual void imbue(const locale& loc);
587a984708SDavid Chisnall};
597a984708SDavid Chisnall
607a984708SDavid Chisnalltemplate <class charT, class traits>
617a984708SDavid Chisnall  void
627a984708SDavid Chisnall  swap(basic_filebuf<charT, traits>& x, basic_filebuf<charT, traits>& y);
637a984708SDavid Chisnall
647a984708SDavid Chisnalltypedef basic_filebuf<char>    filebuf;
657a984708SDavid Chisnalltypedef basic_filebuf<wchar_t> wfilebuf;
667a984708SDavid Chisnall
677a984708SDavid Chisnalltemplate <class charT, class traits = char_traits<charT> >
687a984708SDavid Chisnallclass basic_ifstream
697a984708SDavid Chisnall    : public basic_istream<charT,traits>
707a984708SDavid Chisnall{
717a984708SDavid Chisnallpublic:
727a984708SDavid Chisnall    typedef charT                          char_type;
737a984708SDavid Chisnall    typedef traits                         traits_type;
747a984708SDavid Chisnall    typedef typename traits_type::int_type int_type;
757a984708SDavid Chisnall    typedef typename traits_type::pos_type pos_type;
767a984708SDavid Chisnall    typedef typename traits_type::off_type off_type;
777a984708SDavid Chisnall
787a984708SDavid Chisnall    basic_ifstream();
797a984708SDavid Chisnall    explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in);
807a984708SDavid Chisnall    explicit basic_ifstream(const string& s, ios_base::openmode mode = ios_base::in);
814ba319b5SDimitry Andric    explicit basic_ifstream(const filesystem::path& p,
824ba319b5SDimitry Andric                            ios_base::openmode mode = ios_base::in); // C++17
837a984708SDavid Chisnall    basic_ifstream(basic_ifstream&& rhs);
847a984708SDavid Chisnall
857a984708SDavid Chisnall    basic_ifstream& operator=(basic_ifstream&& rhs);
867a984708SDavid Chisnall    void swap(basic_ifstream& rhs);
877a984708SDavid Chisnall
887a984708SDavid Chisnall    basic_filebuf<char_type, traits_type>* rdbuf() const;
897a984708SDavid Chisnall    bool is_open() const;
907a984708SDavid Chisnall    void open(const char* s, ios_base::openmode mode = ios_base::in);
917a984708SDavid Chisnall    void open(const string& s, ios_base::openmode mode = ios_base::in);
924ba319b5SDimitry Andric    void open(const filesystem::path& s, ios_base::openmode mode = ios_base::in); // C++17
934ba319b5SDimitry Andric
947a984708SDavid Chisnall    void close();
957a984708SDavid Chisnall};
967a984708SDavid Chisnall
977a984708SDavid Chisnalltemplate <class charT, class traits>
987a984708SDavid Chisnall  void
997a984708SDavid Chisnall  swap(basic_ifstream<charT, traits>& x, basic_ifstream<charT, traits>& y);
1007a984708SDavid Chisnall
1017a984708SDavid Chisnalltypedef basic_ifstream<char>    ifstream;
1027a984708SDavid Chisnalltypedef basic_ifstream<wchar_t> wifstream;
1037a984708SDavid Chisnall
1047a984708SDavid Chisnalltemplate <class charT, class traits = char_traits<charT> >
1057a984708SDavid Chisnallclass basic_ofstream
1067a984708SDavid Chisnall    : public basic_ostream<charT,traits>
1077a984708SDavid Chisnall{
1087a984708SDavid Chisnallpublic:
1097a984708SDavid Chisnall    typedef charT                          char_type;
1107a984708SDavid Chisnall    typedef traits                         traits_type;
1117a984708SDavid Chisnall    typedef typename traits_type::int_type int_type;
1127a984708SDavid Chisnall    typedef typename traits_type::pos_type pos_type;
1137a984708SDavid Chisnall    typedef typename traits_type::off_type off_type;
1147a984708SDavid Chisnall
1157a984708SDavid Chisnall    basic_ofstream();
1167a984708SDavid Chisnall    explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out);
1177a984708SDavid Chisnall    explicit basic_ofstream(const string& s, ios_base::openmode mode = ios_base::out);
1184ba319b5SDimitry Andric    explicit basic_ofstream(const filesystem::path& p,
1194ba319b5SDimitry Andric                            ios_base::openmode mode = ios_base::out); // C++17
1207a984708SDavid Chisnall    basic_ofstream(basic_ofstream&& rhs);
1217a984708SDavid Chisnall
1227a984708SDavid Chisnall    basic_ofstream& operator=(basic_ofstream&& rhs);
1237a984708SDavid Chisnall    void swap(basic_ofstream& rhs);
1247a984708SDavid Chisnall
1257a984708SDavid Chisnall    basic_filebuf<char_type, traits_type>* rdbuf() const;
1267a984708SDavid Chisnall    bool is_open() const;
1277a984708SDavid Chisnall    void open(const char* s, ios_base::openmode mode = ios_base::out);
1287a984708SDavid Chisnall    void open(const string& s, ios_base::openmode mode = ios_base::out);
1294ba319b5SDimitry Andric    void open(const filesystem::path& p,
1304ba319b5SDimitry Andric              ios_base::openmode mode = ios_base::out); // C++17
1314ba319b5SDimitry Andric
1327a984708SDavid Chisnall    void close();
1337a984708SDavid Chisnall};
1347a984708SDavid Chisnall
1357a984708SDavid Chisnalltemplate <class charT, class traits>
1367a984708SDavid Chisnall  void
1377a984708SDavid Chisnall  swap(basic_ofstream<charT, traits>& x, basic_ofstream<charT, traits>& y);
1387a984708SDavid Chisnall
1397a984708SDavid Chisnalltypedef basic_ofstream<char>    ofstream;
1407a984708SDavid Chisnalltypedef basic_ofstream<wchar_t> wofstream;
1417a984708SDavid Chisnall
1427a984708SDavid Chisnalltemplate <class charT, class traits=char_traits<charT> >
1437a984708SDavid Chisnallclass basic_fstream
1447a984708SDavid Chisnall    : public basic_iostream<charT,traits>
1457a984708SDavid Chisnall{
1467a984708SDavid Chisnallpublic:
1477a984708SDavid Chisnall    typedef charT                          char_type;
1487a984708SDavid Chisnall    typedef traits                         traits_type;
1497a984708SDavid Chisnall    typedef typename traits_type::int_type int_type;
1507a984708SDavid Chisnall    typedef typename traits_type::pos_type pos_type;
1517a984708SDavid Chisnall    typedef typename traits_type::off_type off_type;
1527a984708SDavid Chisnall
1537a984708SDavid Chisnall    basic_fstream();
1547a984708SDavid Chisnall    explicit basic_fstream(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out);
1557a984708SDavid Chisnall    explicit basic_fstream(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out);
1564ba319b5SDimitry Andric    explicit basic_fstream(const filesystem::path& p,
1574ba319b5SDimitry Andric                           ios_base::openmode mode = ios_base::in|ios_base::out); C++17
1587a984708SDavid Chisnall    basic_fstream(basic_fstream&& rhs);
1597a984708SDavid Chisnall
1607a984708SDavid Chisnall    basic_fstream& operator=(basic_fstream&& rhs);
1617a984708SDavid Chisnall    void swap(basic_fstream& rhs);
1627a984708SDavid Chisnall
1637a984708SDavid Chisnall    basic_filebuf<char_type, traits_type>* rdbuf() const;
1647a984708SDavid Chisnall    bool is_open() const;
1657a984708SDavid Chisnall    void open(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out);
1667a984708SDavid Chisnall    void open(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out);
1674ba319b5SDimitry Andric    void open(const filesystem::path& s,
1684ba319b5SDimitry Andric              ios_base::openmode mode = ios_base::in|ios_base::out); // C++17
1694ba319b5SDimitry Andric
1707a984708SDavid Chisnall    void close();
1717a984708SDavid Chisnall};
1727a984708SDavid Chisnall
1737a984708SDavid Chisnalltemplate <class charT, class traits>
1747a984708SDavid Chisnall  void swap(basic_fstream<charT, traits>& x, basic_fstream<charT, traits>& y);
1757a984708SDavid Chisnall
1767a984708SDavid Chisnalltypedef basic_fstream<char>    fstream;
1777a984708SDavid Chisnalltypedef basic_fstream<wchar_t> wfstream;
1787a984708SDavid Chisnall
1797a984708SDavid Chisnall}  // std
1807a984708SDavid Chisnall
1817a984708SDavid Chisnall*/
1827a984708SDavid Chisnall
1837a984708SDavid Chisnall#include <__config>
1847a984708SDavid Chisnall#include <ostream>
1857a984708SDavid Chisnall#include <istream>
1867a984708SDavid Chisnall#include <__locale>
1877a984708SDavid Chisnall#include <cstdio>
1884ba319b5SDimitry Andric#include <cstdlib>
1894ba319b5SDimitry Andric#include <filesystem>
1907a984708SDavid Chisnall
1917a984708SDavid Chisnall#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1927a984708SDavid Chisnall#pragma GCC system_header
1937a984708SDavid Chisnall#endif
1947a984708SDavid Chisnall
195f9448bf3SDimitry Andric_LIBCPP_PUSH_MACROS
196f9448bf3SDimitry Andric#include <__undef_macros>
197f9448bf3SDimitry Andric
198f9448bf3SDimitry Andric
1997a984708SDavid Chisnall_LIBCPP_BEGIN_NAMESPACE_STD
2007a984708SDavid Chisnall
2017a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
202aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_filebuf
2037a984708SDavid Chisnall    : public basic_streambuf<_CharT, _Traits>
2047a984708SDavid Chisnall{
2057a984708SDavid Chisnallpublic:
2067a984708SDavid Chisnall    typedef _CharT                           char_type;
2077a984708SDavid Chisnall    typedef _Traits                          traits_type;
2087a984708SDavid Chisnall    typedef typename traits_type::int_type   int_type;
2097a984708SDavid Chisnall    typedef typename traits_type::pos_type   pos_type;
2107a984708SDavid Chisnall    typedef typename traits_type::off_type   off_type;
2117a984708SDavid Chisnall    typedef typename traits_type::state_type state_type;
2127a984708SDavid Chisnall
2137a984708SDavid Chisnall    // 27.9.1.2 Constructors/destructor:
2147a984708SDavid Chisnall    basic_filebuf();
215540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
2167a984708SDavid Chisnall    basic_filebuf(basic_filebuf&& __rhs);
2177a984708SDavid Chisnall#endif
2187a984708SDavid Chisnall    virtual ~basic_filebuf();
2197a984708SDavid Chisnall
2207a984708SDavid Chisnall    // 27.9.1.3 Assign/swap:
221540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
2227c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
2237a984708SDavid Chisnall    basic_filebuf& operator=(basic_filebuf&& __rhs);
2247a984708SDavid Chisnall#endif
2257a984708SDavid Chisnall    void swap(basic_filebuf& __rhs);
2267a984708SDavid Chisnall
2277a984708SDavid Chisnall    // 27.9.1.4 Members:
2287c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
2297a984708SDavid Chisnall    bool is_open() const;
230854fa44bSDimitry Andric#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
2317a984708SDavid Chisnall    basic_filebuf* open(const char* __s, ios_base::openmode __mode);
2324ba319b5SDimitry Andric#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
2334ba319b5SDimitry Andric    basic_filebuf* open(const wchar_t* __s, ios_base::openmode __mode);
2344ba319b5SDimitry Andric#endif
2357c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
2367a984708SDavid Chisnall    basic_filebuf* open(const string& __s, ios_base::openmode __mode);
2374ba319b5SDimitry Andric
2384ba319b5SDimitry Andric#if _LIBCPP_STD_VER >= 17
2394ba319b5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
2404ba319b5SDimitry Andric    basic_filebuf* open(const _VSTD_FS::path& __p, ios_base::openmode __mode) {
2414ba319b5SDimitry Andric      return open(__p.c_str(), __mode);
2424ba319b5SDimitry Andric    }
2434ba319b5SDimitry Andric#endif
2444ba319b5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
2454ba319b5SDimitry Andric    basic_filebuf* __open(int __fd, ios_base::openmode __mode);
246854fa44bSDimitry Andric#endif
2477a984708SDavid Chisnall    basic_filebuf* close();
2487a984708SDavid Chisnall
2494ba319b5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
2504ba319b5SDimitry Andric    inline static const char*
2514ba319b5SDimitry Andric    __make_mdstring(ios_base::openmode __mode) _NOEXCEPT;
2524ba319b5SDimitry Andric
2537a984708SDavid Chisnall  protected:
2547a984708SDavid Chisnall    // 27.9.1.5 Overridden virtual functions:
2557a984708SDavid Chisnall    virtual int_type underflow();
2567a984708SDavid Chisnall    virtual int_type pbackfail(int_type __c = traits_type::eof());
2577a984708SDavid Chisnall    virtual int_type overflow (int_type __c = traits_type::eof());
2587a984708SDavid Chisnall    virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* __s, streamsize __n);
2597a984708SDavid Chisnall    virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
2607a984708SDavid Chisnall                             ios_base::openmode __wch = ios_base::in | ios_base::out);
2617a984708SDavid Chisnall    virtual pos_type seekpos(pos_type __sp,
2627a984708SDavid Chisnall                             ios_base::openmode __wch = ios_base::in | ios_base::out);
2637a984708SDavid Chisnall    virtual int sync();
2647a984708SDavid Chisnall    virtual void imbue(const locale& __loc);
2657a984708SDavid Chisnall
2667a984708SDavid Chisnallprivate:
2677a984708SDavid Chisnall  char* __extbuf_;
2687a984708SDavid Chisnall  const char* __extbufnext_;
2697a984708SDavid Chisnall  const char* __extbufend_;
2707a984708SDavid Chisnall  char __extbuf_min_[8];
2717a984708SDavid Chisnall  size_t __ebs_;
2727a984708SDavid Chisnall  char_type* __intbuf_;
2737a984708SDavid Chisnall  size_t __ibs_;
2747a984708SDavid Chisnall  FILE* __file_;
2757a984708SDavid Chisnall  const codecvt<char_type, char, state_type>* __cv_;
2767a984708SDavid Chisnall  state_type __st_;
277936e9439SDimitry Andric  state_type __st_last_;
2787a984708SDavid Chisnall  ios_base::openmode __om_;
2797a984708SDavid Chisnall  ios_base::openmode __cm_;
2807a984708SDavid Chisnall  bool __owns_eb_;
2817a984708SDavid Chisnall  bool __owns_ib_;
2827a984708SDavid Chisnall  bool __always_noconv_;
2837a984708SDavid Chisnall
2847a984708SDavid Chisnall  bool __read_mode();
2857a984708SDavid Chisnall  void __write_mode();
2867a984708SDavid Chisnall};
2877a984708SDavid Chisnall
2887a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
2897a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::basic_filebuf()
2907a984708SDavid Chisnall    : __extbuf_(0),
2917a984708SDavid Chisnall      __extbufnext_(0),
2927a984708SDavid Chisnall      __extbufend_(0),
2937a984708SDavid Chisnall      __ebs_(0),
2947a984708SDavid Chisnall      __intbuf_(0),
2957a984708SDavid Chisnall      __ibs_(0),
2967a984708SDavid Chisnall      __file_(0),
297936e9439SDimitry Andric      __cv_(nullptr),
2987a984708SDavid Chisnall      __st_(),
299936e9439SDimitry Andric      __st_last_(),
3007a984708SDavid Chisnall      __om_(0),
3017a984708SDavid Chisnall      __cm_(0),
3027a984708SDavid Chisnall      __owns_eb_(false),
3037a984708SDavid Chisnall      __owns_ib_(false),
304936e9439SDimitry Andric      __always_noconv_(false)
3057a984708SDavid Chisnall{
306936e9439SDimitry Andric    if (has_facet<codecvt<char_type, char, state_type> >(this->getloc()))
307936e9439SDimitry Andric    {
308936e9439SDimitry Andric        __cv_ = &use_facet<codecvt<char_type, char, state_type> >(this->getloc());
309936e9439SDimitry Andric        __always_noconv_ = __cv_->always_noconv();
310936e9439SDimitry Andric    }
3117a984708SDavid Chisnall    setbuf(0, 4096);
3127a984708SDavid Chisnall}
3137a984708SDavid Chisnall
314540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
3157a984708SDavid Chisnall
3167a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
3177a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::basic_filebuf(basic_filebuf&& __rhs)
3187a984708SDavid Chisnall    : basic_streambuf<_CharT, _Traits>(__rhs)
3197a984708SDavid Chisnall{
3207a984708SDavid Chisnall    if (__rhs.__extbuf_ == __rhs.__extbuf_min_)
3217a984708SDavid Chisnall    {
3227a984708SDavid Chisnall        __extbuf_ = __extbuf_min_;
3237a984708SDavid Chisnall        __extbufnext_ = __extbuf_ + (__rhs.__extbufnext_ - __rhs.__extbuf_);
3247a984708SDavid Chisnall        __extbufend_ = __extbuf_ + (__rhs.__extbufend_ - __rhs.__extbuf_);
3257a984708SDavid Chisnall    }
3267a984708SDavid Chisnall    else
3277a984708SDavid Chisnall    {
3287a984708SDavid Chisnall        __extbuf_ = __rhs.__extbuf_;
3297a984708SDavid Chisnall        __extbufnext_ = __rhs.__extbufnext_;
3307a984708SDavid Chisnall        __extbufend_ = __rhs.__extbufend_;
3317a984708SDavid Chisnall    }
3327a984708SDavid Chisnall    __ebs_ = __rhs.__ebs_;
3337a984708SDavid Chisnall    __intbuf_ = __rhs.__intbuf_;
3347a984708SDavid Chisnall    __ibs_ = __rhs.__ibs_;
3357a984708SDavid Chisnall    __file_ = __rhs.__file_;
3367a984708SDavid Chisnall    __cv_ = __rhs.__cv_;
3377a984708SDavid Chisnall    __st_ = __rhs.__st_;
338936e9439SDimitry Andric    __st_last_ = __rhs.__st_last_;
3397a984708SDavid Chisnall    __om_ = __rhs.__om_;
3407a984708SDavid Chisnall    __cm_ = __rhs.__cm_;
3417a984708SDavid Chisnall    __owns_eb_ = __rhs.__owns_eb_;
3427a984708SDavid Chisnall    __owns_ib_ = __rhs.__owns_ib_;
3437a984708SDavid Chisnall    __always_noconv_ = __rhs.__always_noconv_;
3447a984708SDavid Chisnall    if (__rhs.pbase())
3457a984708SDavid Chisnall    {
3467a984708SDavid Chisnall        if (__rhs.pbase() == __rhs.__intbuf_)
3477a984708SDavid Chisnall            this->setp(__intbuf_, __intbuf_ + (__rhs. epptr() - __rhs.pbase()));
3487a984708SDavid Chisnall        else
3497a984708SDavid Chisnall            this->setp((char_type*)__extbuf_,
3507a984708SDavid Chisnall                       (char_type*)__extbuf_ + (__rhs. epptr() - __rhs.pbase()));
351b2c7081bSDimitry Andric        this->__pbump(__rhs. pptr() - __rhs.pbase());
3527a984708SDavid Chisnall    }
3537a984708SDavid Chisnall    else if (__rhs.eback())
3547a984708SDavid Chisnall    {
3557a984708SDavid Chisnall        if (__rhs.eback() == __rhs.__intbuf_)
3567a984708SDavid Chisnall            this->setg(__intbuf_, __intbuf_ + (__rhs.gptr() - __rhs.eback()),
3577a984708SDavid Chisnall                                  __intbuf_ + (__rhs.egptr() - __rhs.eback()));
3587a984708SDavid Chisnall        else
3597a984708SDavid Chisnall            this->setg((char_type*)__extbuf_,
3607a984708SDavid Chisnall                       (char_type*)__extbuf_ + (__rhs.gptr() - __rhs.eback()),
3617a984708SDavid Chisnall                       (char_type*)__extbuf_ + (__rhs.egptr() - __rhs.eback()));
3627a984708SDavid Chisnall    }
3637a984708SDavid Chisnall    __rhs.__extbuf_ = 0;
3647a984708SDavid Chisnall    __rhs.__extbufnext_ = 0;
3657a984708SDavid Chisnall    __rhs.__extbufend_ = 0;
3667a984708SDavid Chisnall    __rhs.__ebs_ = 0;
3677a984708SDavid Chisnall    __rhs.__intbuf_ = 0;
3687a984708SDavid Chisnall    __rhs.__ibs_ = 0;
3697a984708SDavid Chisnall    __rhs.__file_ = 0;
3707a984708SDavid Chisnall    __rhs.__st_ = state_type();
371936e9439SDimitry Andric    __rhs.__st_last_ = state_type();
3727a984708SDavid Chisnall    __rhs.__om_ = 0;
3737a984708SDavid Chisnall    __rhs.__cm_ = 0;
3747a984708SDavid Chisnall    __rhs.__owns_eb_ = false;
3757a984708SDavid Chisnall    __rhs.__owns_ib_ = false;
3767a984708SDavid Chisnall    __rhs.setg(0, 0, 0);
3777a984708SDavid Chisnall    __rhs.setp(0, 0);
3787a984708SDavid Chisnall}
3797a984708SDavid Chisnall
3807a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
3817c82a1ecSDimitry Andricinline
3827a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>&
3837a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::operator=(basic_filebuf&& __rhs)
3847a984708SDavid Chisnall{
3857a984708SDavid Chisnall    close();
3867a984708SDavid Chisnall    swap(__rhs);
387936e9439SDimitry Andric    return *this;
3887a984708SDavid Chisnall}
3897a984708SDavid Chisnall
390540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
3917a984708SDavid Chisnall
3927a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
3937a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::~basic_filebuf()
3947a984708SDavid Chisnall{
3957a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
3967a984708SDavid Chisnall    try
3977a984708SDavid Chisnall    {
3987a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
3997a984708SDavid Chisnall        close();
4007a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
4017a984708SDavid Chisnall    }
4027a984708SDavid Chisnall    catch (...)
4037a984708SDavid Chisnall    {
4047a984708SDavid Chisnall    }
4057a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
4067a984708SDavid Chisnall    if (__owns_eb_)
4077a984708SDavid Chisnall        delete [] __extbuf_;
4087a984708SDavid Chisnall    if (__owns_ib_)
4097a984708SDavid Chisnall        delete [] __intbuf_;
4107a984708SDavid Chisnall}
4117a984708SDavid Chisnall
4127a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
4137a984708SDavid Chisnallvoid
4147a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::swap(basic_filebuf& __rhs)
4157a984708SDavid Chisnall{
4167a984708SDavid Chisnall    basic_streambuf<char_type, traits_type>::swap(__rhs);
4177a984708SDavid Chisnall    if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_)
4187a984708SDavid Chisnall    {
4197a984708SDavid Chisnall        _VSTD::swap(__extbuf_, __rhs.__extbuf_);
4207a984708SDavid Chisnall        _VSTD::swap(__extbufnext_, __rhs.__extbufnext_);
4217a984708SDavid Chisnall        _VSTD::swap(__extbufend_, __rhs.__extbufend_);
4227a984708SDavid Chisnall    }
4237a984708SDavid Chisnall    else
4247a984708SDavid Chisnall    {
4257a984708SDavid Chisnall        ptrdiff_t __ln = __extbufnext_ - __extbuf_;
4267a984708SDavid Chisnall        ptrdiff_t __le = __extbufend_ - __extbuf_;
4277a984708SDavid Chisnall        ptrdiff_t __rn = __rhs.__extbufnext_ - __rhs.__extbuf_;
4287a984708SDavid Chisnall        ptrdiff_t __re = __rhs.__extbufend_ - __rhs.__extbuf_;
4297a984708SDavid Chisnall        if (__extbuf_ == __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_)
4307a984708SDavid Chisnall        {
4317a984708SDavid Chisnall            __extbuf_ = __rhs.__extbuf_;
4327a984708SDavid Chisnall            __rhs.__extbuf_ = __rhs.__extbuf_min_;
4337a984708SDavid Chisnall        }
4347a984708SDavid Chisnall        else if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ == __rhs.__extbuf_min_)
4357a984708SDavid Chisnall        {
4367a984708SDavid Chisnall            __rhs.__extbuf_ = __extbuf_;
4377a984708SDavid Chisnall            __extbuf_ = __extbuf_min_;
4387a984708SDavid Chisnall        }
4397a984708SDavid Chisnall        __extbufnext_ = __extbuf_ + __rn;
4407a984708SDavid Chisnall        __extbufend_ = __extbuf_ + __re;
4417a984708SDavid Chisnall        __rhs.__extbufnext_ = __rhs.__extbuf_ + __ln;
4427a984708SDavid Chisnall        __rhs.__extbufend_ = __rhs.__extbuf_ + __le;
4437a984708SDavid Chisnall    }
4447a984708SDavid Chisnall    _VSTD::swap(__ebs_, __rhs.__ebs_);
4457a984708SDavid Chisnall    _VSTD::swap(__intbuf_, __rhs.__intbuf_);
4467a984708SDavid Chisnall    _VSTD::swap(__ibs_, __rhs.__ibs_);
4477a984708SDavid Chisnall    _VSTD::swap(__file_, __rhs.__file_);
4487a984708SDavid Chisnall    _VSTD::swap(__cv_, __rhs.__cv_);
4497a984708SDavid Chisnall    _VSTD::swap(__st_, __rhs.__st_);
450936e9439SDimitry Andric    _VSTD::swap(__st_last_, __rhs.__st_last_);
4517a984708SDavid Chisnall    _VSTD::swap(__om_, __rhs.__om_);
4527a984708SDavid Chisnall    _VSTD::swap(__cm_, __rhs.__cm_);
4537a984708SDavid Chisnall    _VSTD::swap(__owns_eb_, __rhs.__owns_eb_);
4547a984708SDavid Chisnall    _VSTD::swap(__owns_ib_, __rhs.__owns_ib_);
4557a984708SDavid Chisnall    _VSTD::swap(__always_noconv_, __rhs.__always_noconv_);
4567a984708SDavid Chisnall    if (this->eback() == (char_type*)__rhs.__extbuf_min_)
4577a984708SDavid Chisnall    {
4587a984708SDavid Chisnall        ptrdiff_t __n = this->gptr() - this->eback();
4597a984708SDavid Chisnall        ptrdiff_t __e = this->egptr() - this->eback();
4607a984708SDavid Chisnall        this->setg((char_type*)__extbuf_min_,
4617a984708SDavid Chisnall                   (char_type*)__extbuf_min_ + __n,
4627a984708SDavid Chisnall                   (char_type*)__extbuf_min_ + __e);
4637a984708SDavid Chisnall    }
4647a984708SDavid Chisnall    else if (this->pbase() == (char_type*)__rhs.__extbuf_min_)
4657a984708SDavid Chisnall    {
4667a984708SDavid Chisnall        ptrdiff_t __n = this->pptr() - this->pbase();
4677a984708SDavid Chisnall        ptrdiff_t __e = this->epptr() - this->pbase();
4687a984708SDavid Chisnall        this->setp((char_type*)__extbuf_min_,
4697a984708SDavid Chisnall                   (char_type*)__extbuf_min_ + __e);
470b2c7081bSDimitry Andric        this->__pbump(__n);
4717a984708SDavid Chisnall    }
4727a984708SDavid Chisnall    if (__rhs.eback() == (char_type*)__extbuf_min_)
4737a984708SDavid Chisnall    {
4747a984708SDavid Chisnall        ptrdiff_t __n = __rhs.gptr() - __rhs.eback();
4757a984708SDavid Chisnall        ptrdiff_t __e = __rhs.egptr() - __rhs.eback();
4767a984708SDavid Chisnall        __rhs.setg((char_type*)__rhs.__extbuf_min_,
4777a984708SDavid Chisnall                   (char_type*)__rhs.__extbuf_min_ + __n,
4787a984708SDavid Chisnall                   (char_type*)__rhs.__extbuf_min_ + __e);
4797a984708SDavid Chisnall    }
4807a984708SDavid Chisnall    else if (__rhs.pbase() == (char_type*)__extbuf_min_)
4817a984708SDavid Chisnall    {
4827a984708SDavid Chisnall        ptrdiff_t __n = __rhs.pptr() - __rhs.pbase();
4837a984708SDavid Chisnall        ptrdiff_t __e = __rhs.epptr() - __rhs.pbase();
4847a984708SDavid Chisnall        __rhs.setp((char_type*)__rhs.__extbuf_min_,
4857a984708SDavid Chisnall                   (char_type*)__rhs.__extbuf_min_ + __e);
486b2c7081bSDimitry Andric        __rhs.__pbump(__n);
4877a984708SDavid Chisnall    }
4887a984708SDavid Chisnall}
4897a984708SDavid Chisnall
4907a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
4917a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
4927a984708SDavid Chisnallvoid
4937a984708SDavid Chisnallswap(basic_filebuf<_CharT, _Traits>& __x, basic_filebuf<_CharT, _Traits>& __y)
4947a984708SDavid Chisnall{
4957a984708SDavid Chisnall    __x.swap(__y);
4967a984708SDavid Chisnall}
4977a984708SDavid Chisnall
4987a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
4997c82a1ecSDimitry Andricinline
5007a984708SDavid Chisnallbool
5017a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::is_open() const
5027a984708SDavid Chisnall{
5037a984708SDavid Chisnall    return __file_ != 0;
5047a984708SDavid Chisnall}
5057a984708SDavid Chisnall
5064ba319b5SDimitry Andrictemplate <class _CharT, class _Traits>
5074ba319b5SDimitry Andricconst char* basic_filebuf<_CharT, _Traits>::__make_mdstring(
5084ba319b5SDimitry Andric    ios_base::openmode __mode) _NOEXCEPT {
5094ba319b5SDimitry Andric  switch (__mode & ~ios_base::ate) {
5104ba319b5SDimitry Andric  case ios_base::out:
5114ba319b5SDimitry Andric  case ios_base::out | ios_base::trunc:
5124ba319b5SDimitry Andric    return "w";
5134ba319b5SDimitry Andric  case ios_base::out | ios_base::app:
5144ba319b5SDimitry Andric  case ios_base::app:
5154ba319b5SDimitry Andric    return "a";
5164ba319b5SDimitry Andric  case ios_base::in:
5174ba319b5SDimitry Andric    return "r";
5184ba319b5SDimitry Andric  case ios_base::in | ios_base::out:
5194ba319b5SDimitry Andric    return "r+";
5204ba319b5SDimitry Andric  case ios_base::in | ios_base::out | ios_base::trunc:
5214ba319b5SDimitry Andric    return "w+";
5224ba319b5SDimitry Andric  case ios_base::in | ios_base::out | ios_base::app:
5234ba319b5SDimitry Andric  case ios_base::in | ios_base::app:
5244ba319b5SDimitry Andric    return "a+";
5254ba319b5SDimitry Andric  case ios_base::out | ios_base::binary:
5264ba319b5SDimitry Andric  case ios_base::out | ios_base::trunc | ios_base::binary:
5274ba319b5SDimitry Andric    return "wb";
5284ba319b5SDimitry Andric  case ios_base::out | ios_base::app | ios_base::binary:
5294ba319b5SDimitry Andric  case ios_base::app | ios_base::binary:
5304ba319b5SDimitry Andric    return "ab";
5314ba319b5SDimitry Andric  case ios_base::in | ios_base::binary:
5324ba319b5SDimitry Andric    return "rb";
5334ba319b5SDimitry Andric  case ios_base::in | ios_base::out | ios_base::binary:
5344ba319b5SDimitry Andric    return "r+b";
5354ba319b5SDimitry Andric  case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary:
5364ba319b5SDimitry Andric    return "w+b";
5374ba319b5SDimitry Andric  case ios_base::in | ios_base::out | ios_base::app | ios_base::binary:
5384ba319b5SDimitry Andric  case ios_base::in | ios_base::app | ios_base::binary:
5394ba319b5SDimitry Andric    return "a+b";
5404ba319b5SDimitry Andric  default:
5414ba319b5SDimitry Andric    return nullptr;
5424ba319b5SDimitry Andric  }
5434ba319b5SDimitry Andric  _LIBCPP_UNREACHABLE();
5444ba319b5SDimitry Andric}
5454ba319b5SDimitry Andric
546854fa44bSDimitry Andric#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
5477a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
5487a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>*
5497a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
5507a984708SDavid Chisnall{
5517a984708SDavid Chisnall    basic_filebuf<_CharT, _Traits>* __rt = 0;
5527a984708SDavid Chisnall    if (__file_ == 0)
5537a984708SDavid Chisnall    {
5544ba319b5SDimitry Andric      if (const char* __mdstr = __make_mdstring(__mode)) {
5557a984708SDavid Chisnall        __rt = this;
5564ba319b5SDimitry Andric        __file_ = fopen(__s, __mdstr);
5574ba319b5SDimitry Andric        if (__file_) {
5584ba319b5SDimitry Andric          __om_ = __mode;
5594ba319b5SDimitry Andric          if (__mode & ios_base::ate) {
5604ba319b5SDimitry Andric            if (fseek(__file_, 0, SEEK_END)) {
5614ba319b5SDimitry Andric              fclose(__file_);
5624ba319b5SDimitry Andric              __file_ = 0;
5634ba319b5SDimitry Andric              __rt = 0;
5644ba319b5SDimitry Andric            }
5654ba319b5SDimitry Andric          }
5664ba319b5SDimitry Andric        } else
5674ba319b5SDimitry Andric          __rt = 0;
5684ba319b5SDimitry Andric      }
5694ba319b5SDimitry Andric    }
5704ba319b5SDimitry Andric    return __rt;
5714ba319b5SDimitry Andric}
5724ba319b5SDimitry Andric
5734ba319b5SDimitry Andrictemplate <class _CharT, class _Traits>
5744ba319b5SDimitry Andric_LIBCPP_INLINE_VISIBILITY basic_filebuf<_CharT, _Traits>*
5754ba319b5SDimitry Andricbasic_filebuf<_CharT, _Traits>::__open(int __fd, ios_base::openmode __mode) {
5764ba319b5SDimitry Andric  basic_filebuf<_CharT, _Traits>* __rt = 0;
5774ba319b5SDimitry Andric  if (__file_ == 0) {
5784ba319b5SDimitry Andric    if (const char* __mdstr = __make_mdstring(__mode)) {
5794ba319b5SDimitry Andric      __rt = this;
5804ba319b5SDimitry Andric      __file_ = fdopen(__fd, __mdstr);
5814ba319b5SDimitry Andric      if (__file_) {
5824ba319b5SDimitry Andric        __om_ = __mode;
5834ba319b5SDimitry Andric        if (__mode & ios_base::ate) {
5844ba319b5SDimitry Andric          if (fseek(__file_, 0, SEEK_END)) {
5854ba319b5SDimitry Andric            fclose(__file_);
5864ba319b5SDimitry Andric            __file_ = 0;
5874ba319b5SDimitry Andric            __rt = 0;
5884ba319b5SDimitry Andric          }
5894ba319b5SDimitry Andric        }
5904ba319b5SDimitry Andric      } else
5914ba319b5SDimitry Andric        __rt = 0;
5924ba319b5SDimitry Andric    }
5934ba319b5SDimitry Andric  }
5944ba319b5SDimitry Andric  return __rt;
5954ba319b5SDimitry Andric}
5964ba319b5SDimitry Andric
5974ba319b5SDimitry Andric#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
5984ba319b5SDimitry Andric// This is basically the same as the char* overload except that it uses _wfopen
5994ba319b5SDimitry Andric// and long mode strings.
6004ba319b5SDimitry Andrictemplate <class _CharT, class _Traits>
6014ba319b5SDimitry Andricbasic_filebuf<_CharT, _Traits>*
6024ba319b5SDimitry Andricbasic_filebuf<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
6034ba319b5SDimitry Andric{
6044ba319b5SDimitry Andric    basic_filebuf<_CharT, _Traits>* __rt = 0;
6054ba319b5SDimitry Andric    if (__file_ == 0)
6064ba319b5SDimitry Andric    {
6074ba319b5SDimitry Andric        __rt = this;
6084ba319b5SDimitry Andric        const wchar_t* __mdstr;
6097a984708SDavid Chisnall        switch (__mode & ~ios_base::ate)
6107a984708SDavid Chisnall        {
6117a984708SDavid Chisnall        case ios_base::out:
6127a984708SDavid Chisnall        case ios_base::out | ios_base::trunc:
6134ba319b5SDimitry Andric            __mdstr = L"w";
6147a984708SDavid Chisnall            break;
6157a984708SDavid Chisnall        case ios_base::out | ios_base::app:
6167a984708SDavid Chisnall        case ios_base::app:
6174ba319b5SDimitry Andric            __mdstr = L"a";
6187a984708SDavid Chisnall            break;
6197a984708SDavid Chisnall        case ios_base::in:
6204ba319b5SDimitry Andric            __mdstr = L"r";
6217a984708SDavid Chisnall            break;
6227a984708SDavid Chisnall        case ios_base::in | ios_base::out:
6234ba319b5SDimitry Andric            __mdstr = L"r+";
6247a984708SDavid Chisnall            break;
6257a984708SDavid Chisnall        case ios_base::in | ios_base::out | ios_base::trunc:
6264ba319b5SDimitry Andric            __mdstr = L"w+";
6277a984708SDavid Chisnall            break;
6287a984708SDavid Chisnall        case ios_base::in | ios_base::out | ios_base::app:
6297a984708SDavid Chisnall        case ios_base::in | ios_base::app:
6304ba319b5SDimitry Andric            __mdstr = L"a+";
6317a984708SDavid Chisnall            break;
6327a984708SDavid Chisnall        case ios_base::out | ios_base::binary:
6337a984708SDavid Chisnall        case ios_base::out | ios_base::trunc | ios_base::binary:
6344ba319b5SDimitry Andric            __mdstr = L"wb";
6357a984708SDavid Chisnall            break;
6367a984708SDavid Chisnall        case ios_base::out | ios_base::app | ios_base::binary:
6377a984708SDavid Chisnall        case ios_base::app | ios_base::binary:
6384ba319b5SDimitry Andric            __mdstr = L"ab";
6397a984708SDavid Chisnall            break;
6407a984708SDavid Chisnall        case ios_base::in | ios_base::binary:
6414ba319b5SDimitry Andric            __mdstr = L"rb";
6427a984708SDavid Chisnall            break;
6437a984708SDavid Chisnall        case ios_base::in | ios_base::out | ios_base::binary:
6444ba319b5SDimitry Andric            __mdstr = L"r+b";
6457a984708SDavid Chisnall            break;
6467a984708SDavid Chisnall        case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary:
6474ba319b5SDimitry Andric            __mdstr = L"w+b";
6487a984708SDavid Chisnall            break;
6497a984708SDavid Chisnall        case ios_base::in | ios_base::out | ios_base::app | ios_base::binary:
6507a984708SDavid Chisnall        case ios_base::in | ios_base::app | ios_base::binary:
6514ba319b5SDimitry Andric            __mdstr = L"a+b";
6527a984708SDavid Chisnall            break;
6537a984708SDavid Chisnall        default:
6547a984708SDavid Chisnall            __rt = 0;
6557a984708SDavid Chisnall            break;
6567a984708SDavid Chisnall        }
6577a984708SDavid Chisnall        if (__rt)
6587a984708SDavid Chisnall        {
6594ba319b5SDimitry Andric            __file_ = _wfopen(__s, __mdstr);
6607a984708SDavid Chisnall            if (__file_)
6617a984708SDavid Chisnall            {
6627a984708SDavid Chisnall                __om_ = __mode;
6637a984708SDavid Chisnall                if (__mode & ios_base::ate)
6647a984708SDavid Chisnall                {
6657a984708SDavid Chisnall                    if (fseek(__file_, 0, SEEK_END))
6667a984708SDavid Chisnall                    {
6677a984708SDavid Chisnall                        fclose(__file_);
6687a984708SDavid Chisnall                        __file_ = 0;
6697a984708SDavid Chisnall                        __rt = 0;
6707a984708SDavid Chisnall                    }
6717a984708SDavid Chisnall                }
6727a984708SDavid Chisnall            }
6737a984708SDavid Chisnall            else
6747a984708SDavid Chisnall                __rt = 0;
6757a984708SDavid Chisnall        }
6767a984708SDavid Chisnall    }
6777a984708SDavid Chisnall    return __rt;
6787a984708SDavid Chisnall}
6794ba319b5SDimitry Andric#endif
6807a984708SDavid Chisnall
6817a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
6827c82a1ecSDimitry Andricinline
6837a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>*
6847a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
6857a984708SDavid Chisnall{
6867a984708SDavid Chisnall    return open(__s.c_str(), __mode);
6877a984708SDavid Chisnall}
688854fa44bSDimitry Andric#endif
6897a984708SDavid Chisnall
6907a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
6917a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>*
6927a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::close()
6937a984708SDavid Chisnall{
6947a984708SDavid Chisnall    basic_filebuf<_CharT, _Traits>* __rt = 0;
6957a984708SDavid Chisnall    if (__file_)
6967a984708SDavid Chisnall    {
6977a984708SDavid Chisnall        __rt = this;
6987a984708SDavid Chisnall        unique_ptr<FILE, int(*)(FILE*)> __h(__file_, fclose);
69994e3ee44SDavid Chisnall        if (sync())
7007a984708SDavid Chisnall            __rt = 0;
7017a984708SDavid Chisnall        if (fclose(__h.release()) == 0)
7027a984708SDavid Chisnall            __file_ = 0;
7037a984708SDavid Chisnall        else
7047a984708SDavid Chisnall            __rt = 0;
705*b5893f02SDimitry Andric        setbuf(0, 0);
7067a984708SDavid Chisnall    }
7077a984708SDavid Chisnall    return __rt;
7087a984708SDavid Chisnall}
7097a984708SDavid Chisnall
7107a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
7117a984708SDavid Chisnalltypename basic_filebuf<_CharT, _Traits>::int_type
7127a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::underflow()
7137a984708SDavid Chisnall{
7147a984708SDavid Chisnall    if (__file_ == 0)
7157a984708SDavid Chisnall        return traits_type::eof();
7167a984708SDavid Chisnall    bool __initial = __read_mode();
7177a984708SDavid Chisnall    char_type __1buf;
7187a984708SDavid Chisnall    if (this->gptr() == 0)
7197a984708SDavid Chisnall        this->setg(&__1buf, &__1buf+1, &__1buf+1);
7207a984708SDavid Chisnall    const size_t __unget_sz = __initial ? 0 : min<size_t>((this->egptr() - this->eback()) / 2, 4);
7217a984708SDavid Chisnall    int_type __c = traits_type::eof();
7227a984708SDavid Chisnall    if (this->gptr() == this->egptr())
7237a984708SDavid Chisnall    {
7247a984708SDavid Chisnall        memmove(this->eback(), this->egptr() - __unget_sz, __unget_sz * sizeof(char_type));
7257a984708SDavid Chisnall        if (__always_noconv_)
7267a984708SDavid Chisnall        {
7277a984708SDavid Chisnall            size_t __nmemb = static_cast<size_t>(this->egptr() - this->eback() - __unget_sz);
7287a984708SDavid Chisnall            __nmemb = fread(this->eback() + __unget_sz, 1, __nmemb, __file_);
7297a984708SDavid Chisnall            if (__nmemb != 0)
7307a984708SDavid Chisnall            {
7317a984708SDavid Chisnall                this->setg(this->eback(),
7327a984708SDavid Chisnall                           this->eback() + __unget_sz,
7337a984708SDavid Chisnall                           this->eback() + __unget_sz + __nmemb);
7347a984708SDavid Chisnall                __c = traits_type::to_int_type(*this->gptr());
7357a984708SDavid Chisnall            }
7367a984708SDavid Chisnall        }
7377a984708SDavid Chisnall        else
7387a984708SDavid Chisnall        {
7397c82a1ecSDimitry Andric            _LIBCPP_ASSERT ( !(__extbufnext_ == NULL && (__extbufend_ != __extbufnext_)), "underflow moving from NULL" );
7407c82a1ecSDimitry Andric            if (__extbufend_ != __extbufnext_)
7417a984708SDavid Chisnall                memmove(__extbuf_, __extbufnext_, __extbufend_ - __extbufnext_);
7427a984708SDavid Chisnall            __extbufnext_ = __extbuf_ + (__extbufend_ - __extbufnext_);
7437a984708SDavid Chisnall            __extbufend_ = __extbuf_ + (__extbuf_ == __extbuf_min_ ? sizeof(__extbuf_min_) : __ebs_);
744936e9439SDimitry Andric            size_t __nmemb = _VSTD::min(static_cast<size_t>(__ibs_ - __unget_sz),
7457a984708SDavid Chisnall                                 static_cast<size_t>(__extbufend_ - __extbufnext_));
7467a984708SDavid Chisnall            codecvt_base::result __r;
747936e9439SDimitry Andric            __st_last_ = __st_;
74824d58133SDimitry Andric            size_t __nr = fread((void*) const_cast<char *>(__extbufnext_), 1, __nmemb, __file_);
7497a984708SDavid Chisnall            if (__nr != 0)
7507a984708SDavid Chisnall            {
751936e9439SDimitry Andric                if (!__cv_)
752aed8d94eSDimitry Andric                    __throw_bad_cast();
753aed8d94eSDimitry Andric
7547a984708SDavid Chisnall                __extbufend_ = __extbufnext_ + __nr;
7557a984708SDavid Chisnall                char_type*  __inext;
7567a984708SDavid Chisnall                __r = __cv_->in(__st_, __extbuf_, __extbufend_, __extbufnext_,
7577a984708SDavid Chisnall                                       this->eback() + __unget_sz,
758936e9439SDimitry Andric                                       this->eback() + __ibs_, __inext);
7597a984708SDavid Chisnall                if (__r == codecvt_base::noconv)
7607a984708SDavid Chisnall                {
76124d58133SDimitry Andric                    this->setg((char_type*)__extbuf_, (char_type*)__extbuf_,
76224d58133SDimitry Andric                                          (char_type*)const_cast<char *>(__extbufend_));
7637a984708SDavid Chisnall                    __c = traits_type::to_int_type(*this->gptr());
7647a984708SDavid Chisnall                }
7657a984708SDavid Chisnall                else if (__inext != this->eback() + __unget_sz)
7667a984708SDavid Chisnall                {
7677a984708SDavid Chisnall                    this->setg(this->eback(), this->eback() + __unget_sz, __inext);
7687a984708SDavid Chisnall                    __c = traits_type::to_int_type(*this->gptr());
7697a984708SDavid Chisnall                }
7707a984708SDavid Chisnall            }
7717a984708SDavid Chisnall        }
7727a984708SDavid Chisnall    }
7737a984708SDavid Chisnall    else
7747a984708SDavid Chisnall        __c = traits_type::to_int_type(*this->gptr());
7757a984708SDavid Chisnall    if (this->eback() == &__1buf)
7767a984708SDavid Chisnall        this->setg(0, 0, 0);
7777a984708SDavid Chisnall    return __c;
7787a984708SDavid Chisnall}
7797a984708SDavid Chisnall
7807a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
7817a984708SDavid Chisnalltypename basic_filebuf<_CharT, _Traits>::int_type
7827a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::pbackfail(int_type __c)
7837a984708SDavid Chisnall{
7847a984708SDavid Chisnall    if (__file_ && this->eback() < this->gptr())
7857a984708SDavid Chisnall    {
7867a984708SDavid Chisnall        if (traits_type::eq_int_type(__c, traits_type::eof()))
7877a984708SDavid Chisnall        {
7887a984708SDavid Chisnall            this->gbump(-1);
7897a984708SDavid Chisnall            return traits_type::not_eof(__c);
7907a984708SDavid Chisnall        }
7917a984708SDavid Chisnall        if ((__om_ & ios_base::out) ||
7927a984708SDavid Chisnall            traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1]))
7937a984708SDavid Chisnall        {
7947a984708SDavid Chisnall            this->gbump(-1);
7957a984708SDavid Chisnall            *this->gptr() = traits_type::to_char_type(__c);
7967a984708SDavid Chisnall            return __c;
7977a984708SDavid Chisnall        }
7987a984708SDavid Chisnall    }
7997a984708SDavid Chisnall    return traits_type::eof();
8007a984708SDavid Chisnall}
8017a984708SDavid Chisnall
8027a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
8037a984708SDavid Chisnalltypename basic_filebuf<_CharT, _Traits>::int_type
8047a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::overflow(int_type __c)
8057a984708SDavid Chisnall{
8067a984708SDavid Chisnall    if (__file_ == 0)
8077a984708SDavid Chisnall        return traits_type::eof();
8087a984708SDavid Chisnall    __write_mode();
8097a984708SDavid Chisnall    char_type __1buf;
8107a984708SDavid Chisnall    char_type* __pb_save = this->pbase();
8117a984708SDavid Chisnall    char_type* __epb_save = this->epptr();
8127a984708SDavid Chisnall    if (!traits_type::eq_int_type(__c, traits_type::eof()))
8137a984708SDavid Chisnall    {
8147a984708SDavid Chisnall        if (this->pptr() == 0)
8157a984708SDavid Chisnall            this->setp(&__1buf, &__1buf+1);
8167a984708SDavid Chisnall        *this->pptr() = traits_type::to_char_type(__c);
8177a984708SDavid Chisnall        this->pbump(1);
8187a984708SDavid Chisnall    }
8197a984708SDavid Chisnall    if (this->pptr() != this->pbase())
8207a984708SDavid Chisnall    {
8217a984708SDavid Chisnall        if (__always_noconv_)
8227a984708SDavid Chisnall        {
8237a984708SDavid Chisnall            size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase());
8247a984708SDavid Chisnall            if (fwrite(this->pbase(), sizeof(char_type), __nmemb, __file_) != __nmemb)
8257a984708SDavid Chisnall                return traits_type::eof();
8267a984708SDavid Chisnall        }
8277a984708SDavid Chisnall        else
8287a984708SDavid Chisnall        {
8297a984708SDavid Chisnall            char* __extbe = __extbuf_;
8307a984708SDavid Chisnall            codecvt_base::result __r;
8317a984708SDavid Chisnall            do
8327a984708SDavid Chisnall            {
833936e9439SDimitry Andric                if (!__cv_)
834aed8d94eSDimitry Andric                    __throw_bad_cast();
835aed8d94eSDimitry Andric
8367a984708SDavid Chisnall                const char_type* __e;
8377a984708SDavid Chisnall                __r = __cv_->out(__st_, this->pbase(), this->pptr(), __e,
8387a984708SDavid Chisnall                                        __extbuf_, __extbuf_ + __ebs_, __extbe);
8397a984708SDavid Chisnall                if (__e == this->pbase())
8407a984708SDavid Chisnall                    return traits_type::eof();
8417a984708SDavid Chisnall                if (__r == codecvt_base::noconv)
8427a984708SDavid Chisnall                {
8437a984708SDavid Chisnall                    size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase());
8447a984708SDavid Chisnall                    if (fwrite(this->pbase(), 1, __nmemb, __file_) != __nmemb)
8457a984708SDavid Chisnall                        return traits_type::eof();
8467a984708SDavid Chisnall                }
8477a984708SDavid Chisnall                else if (__r == codecvt_base::ok || __r == codecvt_base::partial)
8487a984708SDavid Chisnall                {
8497a984708SDavid Chisnall                    size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_);
8507a984708SDavid Chisnall                    if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb)
8517a984708SDavid Chisnall                        return traits_type::eof();
8527a984708SDavid Chisnall                    if (__r == codecvt_base::partial)
8537a984708SDavid Chisnall                    {
85424d58133SDimitry Andric                        this->setp(const_cast<char_type*>(__e), this->pptr());
855b2c7081bSDimitry Andric                        this->__pbump(this->epptr() - this->pbase());
8567a984708SDavid Chisnall                    }
8577a984708SDavid Chisnall                }
8587a984708SDavid Chisnall                else
8597a984708SDavid Chisnall                    return traits_type::eof();
8607a984708SDavid Chisnall            } while (__r == codecvt_base::partial);
8617a984708SDavid Chisnall        }
8627a984708SDavid Chisnall        this->setp(__pb_save, __epb_save);
8637a984708SDavid Chisnall    }
8647a984708SDavid Chisnall    return traits_type::not_eof(__c);
8657a984708SDavid Chisnall}
8667a984708SDavid Chisnall
8677a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
8687a984708SDavid Chisnallbasic_streambuf<_CharT, _Traits>*
8697a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::setbuf(char_type* __s, streamsize __n)
8707a984708SDavid Chisnall{
8717a984708SDavid Chisnall    this->setg(0, 0, 0);
8727a984708SDavid Chisnall    this->setp(0, 0);
8737a984708SDavid Chisnall    if (__owns_eb_)
8747a984708SDavid Chisnall        delete [] __extbuf_;
8757a984708SDavid Chisnall    if (__owns_ib_)
8767a984708SDavid Chisnall        delete [] __intbuf_;
8777a984708SDavid Chisnall    __ebs_ = __n;
8787a984708SDavid Chisnall    if (__ebs_ > sizeof(__extbuf_min_))
8797a984708SDavid Chisnall    {
8807a984708SDavid Chisnall        if (__always_noconv_ && __s)
8817a984708SDavid Chisnall        {
8827a984708SDavid Chisnall            __extbuf_ = (char*)__s;
8837a984708SDavid Chisnall            __owns_eb_ = false;
8847a984708SDavid Chisnall        }
8857a984708SDavid Chisnall        else
8867a984708SDavid Chisnall        {
8877a984708SDavid Chisnall            __extbuf_ = new char[__ebs_];
8887a984708SDavid Chisnall            __owns_eb_ = true;
8897a984708SDavid Chisnall        }
8907a984708SDavid Chisnall    }
8917a984708SDavid Chisnall    else
8927a984708SDavid Chisnall    {
8937a984708SDavid Chisnall        __extbuf_ = __extbuf_min_;
8947a984708SDavid Chisnall        __ebs_ = sizeof(__extbuf_min_);
8957a984708SDavid Chisnall        __owns_eb_ = false;
8967a984708SDavid Chisnall    }
8977a984708SDavid Chisnall    if (!__always_noconv_)
8987a984708SDavid Chisnall    {
8997a984708SDavid Chisnall        __ibs_ = max<streamsize>(__n, sizeof(__extbuf_min_));
9007a984708SDavid Chisnall        if (__s && __ibs_ >= sizeof(__extbuf_min_))
9017a984708SDavid Chisnall        {
9027a984708SDavid Chisnall            __intbuf_ = __s;
9037a984708SDavid Chisnall            __owns_ib_ = false;
9047a984708SDavid Chisnall        }
9057a984708SDavid Chisnall        else
9067a984708SDavid Chisnall        {
9077a984708SDavid Chisnall            __intbuf_ = new char_type[__ibs_];
9087a984708SDavid Chisnall            __owns_ib_ = true;
9097a984708SDavid Chisnall        }
9107a984708SDavid Chisnall    }
9117a984708SDavid Chisnall    else
9127a984708SDavid Chisnall    {
9137a984708SDavid Chisnall        __ibs_ = 0;
9147a984708SDavid Chisnall        __intbuf_ = 0;
9157a984708SDavid Chisnall        __owns_ib_ = false;
9167a984708SDavid Chisnall    }
9177a984708SDavid Chisnall    return this;
9187a984708SDavid Chisnall}
9197a984708SDavid Chisnall
9207a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
9217a984708SDavid Chisnalltypename basic_filebuf<_CharT, _Traits>::pos_type
9227a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::seekoff(off_type __off, ios_base::seekdir __way,
9237a984708SDavid Chisnall                                        ios_base::openmode)
9247a984708SDavid Chisnall{
925936e9439SDimitry Andric    if (!__cv_)
926aed8d94eSDimitry Andric        __throw_bad_cast();
927aed8d94eSDimitry Andric
9287a984708SDavid Chisnall    int __width = __cv_->encoding();
9297a984708SDavid Chisnall    if (__file_ == 0 || (__width <= 0 && __off != 0) || sync())
9307a984708SDavid Chisnall        return pos_type(off_type(-1));
9317a984708SDavid Chisnall    // __width > 0 || __off == 0
9327a984708SDavid Chisnall    int __whence;
9337a984708SDavid Chisnall    switch (__way)
9347a984708SDavid Chisnall    {
9357a984708SDavid Chisnall    case ios_base::beg:
9367a984708SDavid Chisnall        __whence = SEEK_SET;
9377a984708SDavid Chisnall        break;
9387a984708SDavid Chisnall    case ios_base::cur:
9397a984708SDavid Chisnall        __whence = SEEK_CUR;
9407a984708SDavid Chisnall        break;
9417a984708SDavid Chisnall    case ios_base::end:
9427a984708SDavid Chisnall        __whence = SEEK_END;
9437a984708SDavid Chisnall        break;
9447a984708SDavid Chisnall    default:
9457a984708SDavid Chisnall        return pos_type(off_type(-1));
9467a984708SDavid Chisnall    }
947aed8d94eSDimitry Andric#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
9481bf9f7c1SDimitry Andric    if (fseek(__file_, __width > 0 ? __width * __off : 0, __whence))
9491bf9f7c1SDimitry Andric        return pos_type(off_type(-1));
9501bf9f7c1SDimitry Andric    pos_type __r = ftell(__file_);
9511bf9f7c1SDimitry Andric#else
9527a984708SDavid Chisnall    if (fseeko(__file_, __width > 0 ? __width * __off : 0, __whence))
9537a984708SDavid Chisnall        return pos_type(off_type(-1));
9547a984708SDavid Chisnall    pos_type __r = ftello(__file_);
9551bf9f7c1SDimitry Andric#endif
9567a984708SDavid Chisnall    __r.state(__st_);
9577a984708SDavid Chisnall    return __r;
9587a984708SDavid Chisnall}
9597a984708SDavid Chisnall
9607a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
9617a984708SDavid Chisnalltypename basic_filebuf<_CharT, _Traits>::pos_type
9627a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::seekpos(pos_type __sp, ios_base::openmode)
9637a984708SDavid Chisnall{
9647a984708SDavid Chisnall    if (__file_ == 0 || sync())
9657a984708SDavid Chisnall        return pos_type(off_type(-1));
966aed8d94eSDimitry Andric#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
9671bf9f7c1SDimitry Andric    if (fseek(__file_, __sp, SEEK_SET))
9681bf9f7c1SDimitry Andric        return pos_type(off_type(-1));
9691bf9f7c1SDimitry Andric#else
9707a984708SDavid Chisnall    if (fseeko(__file_, __sp, SEEK_SET))
9717a984708SDavid Chisnall        return pos_type(off_type(-1));
9721bf9f7c1SDimitry Andric#endif
973936e9439SDimitry Andric    __st_ = __sp.state();
9747a984708SDavid Chisnall    return __sp;
9757a984708SDavid Chisnall}
9767a984708SDavid Chisnall
9777a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
9787a984708SDavid Chisnallint
9797a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::sync()
9807a984708SDavid Chisnall{
9817a984708SDavid Chisnall    if (__file_ == 0)
9827a984708SDavid Chisnall        return 0;
983936e9439SDimitry Andric    if (!__cv_)
984aed8d94eSDimitry Andric        __throw_bad_cast();
985aed8d94eSDimitry Andric
9867a984708SDavid Chisnall    if (__cm_ & ios_base::out)
9877a984708SDavid Chisnall    {
9887a984708SDavid Chisnall        if (this->pptr() != this->pbase())
9897a984708SDavid Chisnall            if (overflow() == traits_type::eof())
9907a984708SDavid Chisnall                return -1;
9917a984708SDavid Chisnall        codecvt_base::result __r;
9927a984708SDavid Chisnall        do
9937a984708SDavid Chisnall        {
9947a984708SDavid Chisnall            char* __extbe;
9957a984708SDavid Chisnall            __r = __cv_->unshift(__st_, __extbuf_, __extbuf_ + __ebs_, __extbe);
9967a984708SDavid Chisnall            size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_);
9977a984708SDavid Chisnall            if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb)
9987a984708SDavid Chisnall                return -1;
9997a984708SDavid Chisnall        } while (__r == codecvt_base::partial);
10007a984708SDavid Chisnall        if (__r == codecvt_base::error)
10017a984708SDavid Chisnall            return -1;
10027a984708SDavid Chisnall        if (fflush(__file_))
10037a984708SDavid Chisnall            return -1;
10047a984708SDavid Chisnall    }
10057a984708SDavid Chisnall    else if (__cm_ & ios_base::in)
10067a984708SDavid Chisnall    {
10077a984708SDavid Chisnall        off_type __c;
1008936e9439SDimitry Andric        state_type __state = __st_last_;
1009936e9439SDimitry Andric        bool __update_st = false;
10107a984708SDavid Chisnall        if (__always_noconv_)
10117a984708SDavid Chisnall            __c = this->egptr() - this->gptr();
10127a984708SDavid Chisnall        else
10137a984708SDavid Chisnall        {
10147a984708SDavid Chisnall            int __width = __cv_->encoding();
10157a984708SDavid Chisnall            __c = __extbufend_ - __extbufnext_;
10167a984708SDavid Chisnall            if (__width > 0)
10177a984708SDavid Chisnall                __c += __width * (this->egptr() - this->gptr());
10187a984708SDavid Chisnall            else
10197a984708SDavid Chisnall            {
10207a984708SDavid Chisnall                if (this->gptr() != this->egptr())
10217a984708SDavid Chisnall                {
1022936e9439SDimitry Andric                    const int __off =  __cv_->length(__state, __extbuf_,
1023936e9439SDimitry Andric                                                     __extbufnext_,
1024936e9439SDimitry Andric                                                     this->gptr() - this->eback());
1025936e9439SDimitry Andric                    __c += __extbufnext_ - __extbuf_ - __off;
1026936e9439SDimitry Andric                    __update_st = true;
10277a984708SDavid Chisnall                }
10287a984708SDavid Chisnall            }
10297a984708SDavid Chisnall        }
1030aed8d94eSDimitry Andric#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
10311bf9f7c1SDimitry Andric        if (fseek(__file_, -__c, SEEK_CUR))
10321bf9f7c1SDimitry Andric            return -1;
10331bf9f7c1SDimitry Andric#else
10347a984708SDavid Chisnall        if (fseeko(__file_, -__c, SEEK_CUR))
10357a984708SDavid Chisnall            return -1;
10361bf9f7c1SDimitry Andric#endif
1037936e9439SDimitry Andric        if (__update_st)
1038936e9439SDimitry Andric            __st_ = __state;
1039936e9439SDimitry Andric        __extbufnext_ = __extbufend_ = __extbuf_;
10407a984708SDavid Chisnall        this->setg(0, 0, 0);
10417a984708SDavid Chisnall        __cm_ = 0;
10427a984708SDavid Chisnall    }
10437a984708SDavid Chisnall    return 0;
10447a984708SDavid Chisnall}
10457a984708SDavid Chisnall
10467a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
10477a984708SDavid Chisnallvoid
10487a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::imbue(const locale& __loc)
10497a984708SDavid Chisnall{
10507a984708SDavid Chisnall    sync();
10517a984708SDavid Chisnall    __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc);
10527a984708SDavid Chisnall    bool __old_anc = __always_noconv_;
10537a984708SDavid Chisnall    __always_noconv_ = __cv_->always_noconv();
10547a984708SDavid Chisnall    if (__old_anc != __always_noconv_)
10557a984708SDavid Chisnall    {
10567a984708SDavid Chisnall        this->setg(0, 0, 0);
10577a984708SDavid Chisnall        this->setp(0, 0);
10587a984708SDavid Chisnall        // invariant, char_type is char, else we couldn't get here
10597a984708SDavid Chisnall        if (__always_noconv_)  // need to dump __intbuf_
10607a984708SDavid Chisnall        {
10617a984708SDavid Chisnall            if (__owns_eb_)
10627a984708SDavid Chisnall                delete [] __extbuf_;
10637a984708SDavid Chisnall            __owns_eb_ = __owns_ib_;
10647a984708SDavid Chisnall            __ebs_ = __ibs_;
10657a984708SDavid Chisnall            __extbuf_ = (char*)__intbuf_;
10667a984708SDavid Chisnall            __ibs_ = 0;
10677a984708SDavid Chisnall            __intbuf_ = 0;
10687a984708SDavid Chisnall            __owns_ib_ = false;
10697a984708SDavid Chisnall        }
10707a984708SDavid Chisnall        else  // need to obtain an __intbuf_.
10717a984708SDavid Chisnall        {     // If __extbuf_ is user-supplied, use it, else new __intbuf_
10727a984708SDavid Chisnall            if (!__owns_eb_ && __extbuf_ != __extbuf_min_)
10737a984708SDavid Chisnall            {
10747a984708SDavid Chisnall                __ibs_ = __ebs_;
10757a984708SDavid Chisnall                __intbuf_ = (char_type*)__extbuf_;
10767a984708SDavid Chisnall                __owns_ib_ = false;
10777a984708SDavid Chisnall                __extbuf_ = new char[__ebs_];
10787a984708SDavid Chisnall                __owns_eb_ = true;
10797a984708SDavid Chisnall            }
10807a984708SDavid Chisnall            else
10817a984708SDavid Chisnall            {
10827a984708SDavid Chisnall                __ibs_ = __ebs_;
10837a984708SDavid Chisnall                __intbuf_ = new char_type[__ibs_];
10847a984708SDavid Chisnall                __owns_ib_ = true;
10857a984708SDavid Chisnall            }
10867a984708SDavid Chisnall        }
10877a984708SDavid Chisnall    }
10887a984708SDavid Chisnall}
10897a984708SDavid Chisnall
10907a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
10917a984708SDavid Chisnallbool
10927a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::__read_mode()
10937a984708SDavid Chisnall{
10947a984708SDavid Chisnall    if (!(__cm_ & ios_base::in))
10957a984708SDavid Chisnall    {
10967a984708SDavid Chisnall        this->setp(0, 0);
10977a984708SDavid Chisnall        if (__always_noconv_)
10987a984708SDavid Chisnall            this->setg((char_type*)__extbuf_,
10997a984708SDavid Chisnall                       (char_type*)__extbuf_ + __ebs_,
11007a984708SDavid Chisnall                       (char_type*)__extbuf_ + __ebs_);
11017a984708SDavid Chisnall        else
11027a984708SDavid Chisnall            this->setg(__intbuf_, __intbuf_ + __ibs_, __intbuf_ + __ibs_);
11037a984708SDavid Chisnall        __cm_ = ios_base::in;
11047a984708SDavid Chisnall        return true;
11057a984708SDavid Chisnall    }
11067a984708SDavid Chisnall    return false;
11077a984708SDavid Chisnall}
11087a984708SDavid Chisnall
11097a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
11107a984708SDavid Chisnallvoid
11117a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>::__write_mode()
11127a984708SDavid Chisnall{
11137a984708SDavid Chisnall    if (!(__cm_ & ios_base::out))
11147a984708SDavid Chisnall    {
11157a984708SDavid Chisnall        this->setg(0, 0, 0);
11167a984708SDavid Chisnall        if (__ebs_ > sizeof(__extbuf_min_))
11177a984708SDavid Chisnall        {
11187a984708SDavid Chisnall            if (__always_noconv_)
11197a984708SDavid Chisnall                this->setp((char_type*)__extbuf_,
11207a984708SDavid Chisnall                           (char_type*)__extbuf_ + (__ebs_ - 1));
11217a984708SDavid Chisnall            else
11227a984708SDavid Chisnall                this->setp(__intbuf_, __intbuf_ + (__ibs_ - 1));
11237a984708SDavid Chisnall        }
11247a984708SDavid Chisnall        else
11257a984708SDavid Chisnall            this->setp(0, 0);
11267a984708SDavid Chisnall        __cm_ = ios_base::out;
11277a984708SDavid Chisnall    }
11287a984708SDavid Chisnall}
11297a984708SDavid Chisnall
11307a984708SDavid Chisnall// basic_ifstream
11317a984708SDavid Chisnall
11327a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
1133aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_ifstream
11347a984708SDavid Chisnall    : public basic_istream<_CharT, _Traits>
11357a984708SDavid Chisnall{
11367a984708SDavid Chisnallpublic:
11377a984708SDavid Chisnall    typedef _CharT                         char_type;
11387a984708SDavid Chisnall    typedef _Traits                        traits_type;
11397a984708SDavid Chisnall    typedef typename traits_type::int_type int_type;
11407a984708SDavid Chisnall    typedef typename traits_type::pos_type pos_type;
11417a984708SDavid Chisnall    typedef typename traits_type::off_type off_type;
11427a984708SDavid Chisnall
11437c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11447a984708SDavid Chisnall    basic_ifstream();
1145854fa44bSDimitry Andric#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
11467c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11477a984708SDavid Chisnall    explicit basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in);
11484ba319b5SDimitry Andric#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
11494ba319b5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11504ba319b5SDimitry Andric    explicit basic_ifstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::in);
11514ba319b5SDimitry Andric#endif
11527c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11537a984708SDavid Chisnall    explicit basic_ifstream(const string& __s, ios_base::openmode __mode = ios_base::in);
11544ba319b5SDimitry Andric#if _LIBCPP_STD_VER >= 17
11554ba319b5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11564ba319b5SDimitry Andric    explicit basic_ifstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in)
11574ba319b5SDimitry Andric      : basic_ifstream(__p.c_str(), __mode) {}
11584ba319b5SDimitry Andric#endif // _LIBCPP_STD_VER >= 17
1159854fa44bSDimitry Andric#endif
1160540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
11617c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11627a984708SDavid Chisnall    basic_ifstream(basic_ifstream&& __rhs);
11637a984708SDavid Chisnall
11647c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11657a984708SDavid Chisnall    basic_ifstream& operator=(basic_ifstream&& __rhs);
11667a984708SDavid Chisnall#endif
11677c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11687a984708SDavid Chisnall    void swap(basic_ifstream& __rhs);
11697a984708SDavid Chisnall
11707c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11717a984708SDavid Chisnall    basic_filebuf<char_type, traits_type>* rdbuf() const;
11727c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11737a984708SDavid Chisnall    bool is_open() const;
1174854fa44bSDimitry Andric#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
11757a984708SDavid Chisnall    void open(const char* __s, ios_base::openmode __mode = ios_base::in);
11764ba319b5SDimitry Andric#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
11774ba319b5SDimitry Andric    void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::in);
11784ba319b5SDimitry Andric#endif
11797a984708SDavid Chisnall    void open(const string& __s, ios_base::openmode __mode = ios_base::in);
11804ba319b5SDimitry Andric#if _LIBCPP_STD_VER >= 17
11814ba319b5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11824ba319b5SDimitry Andric    void open(const filesystem::path& __p,
11834ba319b5SDimitry Andric              ios_base::openmode __mode = ios_base::in) {
11844ba319b5SDimitry Andric      return open(__p.c_str(), __mode);
11854ba319b5SDimitry Andric    }
11864ba319b5SDimitry Andric#endif // _LIBCPP_STD_VER >= 17
11874ba319b5SDimitry Andric
11884ba319b5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11894ba319b5SDimitry Andric    void __open(int __fd, ios_base::openmode __mode);
1190854fa44bSDimitry Andric#endif
11917c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11927a984708SDavid Chisnall    void close();
11937a984708SDavid Chisnall
11947a984708SDavid Chisnallprivate:
11957a984708SDavid Chisnall    basic_filebuf<char_type, traits_type> __sb_;
11967a984708SDavid Chisnall};
11977a984708SDavid Chisnall
11987a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
11997c82a1ecSDimitry Andricinline
12007a984708SDavid Chisnallbasic_ifstream<_CharT, _Traits>::basic_ifstream()
12017a984708SDavid Chisnall    : basic_istream<char_type, traits_type>(&__sb_)
12027a984708SDavid Chisnall{
12037a984708SDavid Chisnall}
12047a984708SDavid Chisnall
1205854fa44bSDimitry Andric#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
12067a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
12077c82a1ecSDimitry Andricinline
12087a984708SDavid Chisnallbasic_ifstream<_CharT, _Traits>::basic_ifstream(const char* __s, ios_base::openmode __mode)
12097a984708SDavid Chisnall    : basic_istream<char_type, traits_type>(&__sb_)
12107a984708SDavid Chisnall{
12117a984708SDavid Chisnall    if (__sb_.open(__s, __mode | ios_base::in) == 0)
12127a984708SDavid Chisnall        this->setstate(ios_base::failbit);
12137a984708SDavid Chisnall}
12147a984708SDavid Chisnall
12154ba319b5SDimitry Andric#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
12164ba319b5SDimitry Andrictemplate <class _CharT, class _Traits>
12174ba319b5SDimitry Andricinline
12184ba319b5SDimitry Andricbasic_ifstream<_CharT, _Traits>::basic_ifstream(const wchar_t* __s, ios_base::openmode __mode)
12194ba319b5SDimitry Andric    : basic_istream<char_type, traits_type>(&__sb_)
12204ba319b5SDimitry Andric{
12214ba319b5SDimitry Andric    if (__sb_.open(__s, __mode | ios_base::in) == 0)
12224ba319b5SDimitry Andric        this->setstate(ios_base::failbit);
12234ba319b5SDimitry Andric}
12244ba319b5SDimitry Andric#endif
12254ba319b5SDimitry Andric
12267a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
12277c82a1ecSDimitry Andricinline
12287a984708SDavid Chisnallbasic_ifstream<_CharT, _Traits>::basic_ifstream(const string& __s, ios_base::openmode __mode)
12297a984708SDavid Chisnall    : basic_istream<char_type, traits_type>(&__sb_)
12307a984708SDavid Chisnall{
12317a984708SDavid Chisnall    if (__sb_.open(__s, __mode | ios_base::in) == 0)
12327a984708SDavid Chisnall        this->setstate(ios_base::failbit);
12337a984708SDavid Chisnall}
1234854fa44bSDimitry Andric#endif
12357a984708SDavid Chisnall
1236540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
12377a984708SDavid Chisnall
12387a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
12397c82a1ecSDimitry Andricinline
12407a984708SDavid Chisnallbasic_ifstream<_CharT, _Traits>::basic_ifstream(basic_ifstream&& __rhs)
12417a984708SDavid Chisnall    : basic_istream<char_type, traits_type>(_VSTD::move(__rhs)),
12427a984708SDavid Chisnall      __sb_(_VSTD::move(__rhs.__sb_))
12437a984708SDavid Chisnall{
12447a984708SDavid Chisnall    this->set_rdbuf(&__sb_);
12457a984708SDavid Chisnall}
12467a984708SDavid Chisnall
12477a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
12487c82a1ecSDimitry Andricinline
12497a984708SDavid Chisnallbasic_ifstream<_CharT, _Traits>&
12507a984708SDavid Chisnallbasic_ifstream<_CharT, _Traits>::operator=(basic_ifstream&& __rhs)
12517a984708SDavid Chisnall{
12527a984708SDavid Chisnall    basic_istream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
12537a984708SDavid Chisnall    __sb_ = _VSTD::move(__rhs.__sb_);
12547a984708SDavid Chisnall    return *this;
12557a984708SDavid Chisnall}
12567a984708SDavid Chisnall
1257540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
12587a984708SDavid Chisnall
12597a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
12607c82a1ecSDimitry Andricinline
12617a984708SDavid Chisnallvoid
12627a984708SDavid Chisnallbasic_ifstream<_CharT, _Traits>::swap(basic_ifstream& __rhs)
12637a984708SDavid Chisnall{
12647a984708SDavid Chisnall    basic_istream<char_type, traits_type>::swap(__rhs);
12657a984708SDavid Chisnall    __sb_.swap(__rhs.__sb_);
12667a984708SDavid Chisnall}
12677a984708SDavid Chisnall
12687a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
12697a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
12707a984708SDavid Chisnallvoid
12717a984708SDavid Chisnallswap(basic_ifstream<_CharT, _Traits>& __x, basic_ifstream<_CharT, _Traits>& __y)
12727a984708SDavid Chisnall{
12737a984708SDavid Chisnall    __x.swap(__y);
12747a984708SDavid Chisnall}
12757a984708SDavid Chisnall
12767a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
12777c82a1ecSDimitry Andricinline
12787a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>*
12797a984708SDavid Chisnallbasic_ifstream<_CharT, _Traits>::rdbuf() const
12807a984708SDavid Chisnall{
12817a984708SDavid Chisnall    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
12827a984708SDavid Chisnall}
12837a984708SDavid Chisnall
12847a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
12857c82a1ecSDimitry Andricinline
12867a984708SDavid Chisnallbool
12877a984708SDavid Chisnallbasic_ifstream<_CharT, _Traits>::is_open() const
12887a984708SDavid Chisnall{
12897a984708SDavid Chisnall    return __sb_.is_open();
12907a984708SDavid Chisnall}
12917a984708SDavid Chisnall
1292854fa44bSDimitry Andric#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
12937a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
12947a984708SDavid Chisnallvoid
12957a984708SDavid Chisnallbasic_ifstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
12967a984708SDavid Chisnall{
12977a984708SDavid Chisnall    if (__sb_.open(__s, __mode | ios_base::in))
12987a984708SDavid Chisnall        this->clear();
12997a984708SDavid Chisnall    else
13007a984708SDavid Chisnall        this->setstate(ios_base::failbit);
13017a984708SDavid Chisnall}
13027a984708SDavid Chisnall
13034ba319b5SDimitry Andric#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
13044ba319b5SDimitry Andrictemplate <class _CharT, class _Traits>
13054ba319b5SDimitry Andricvoid
13064ba319b5SDimitry Andricbasic_ifstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
13074ba319b5SDimitry Andric{
13084ba319b5SDimitry Andric    if (__sb_.open(__s, __mode | ios_base::in))
13094ba319b5SDimitry Andric        this->clear();
13104ba319b5SDimitry Andric    else
13114ba319b5SDimitry Andric        this->setstate(ios_base::failbit);
13124ba319b5SDimitry Andric}
13134ba319b5SDimitry Andric#endif
13144ba319b5SDimitry Andric
13157a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
13167a984708SDavid Chisnallvoid
13177a984708SDavid Chisnallbasic_ifstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
13187a984708SDavid Chisnall{
13197a984708SDavid Chisnall    if (__sb_.open(__s, __mode | ios_base::in))
13207a984708SDavid Chisnall        this->clear();
13217a984708SDavid Chisnall    else
13227a984708SDavid Chisnall        this->setstate(ios_base::failbit);
13237a984708SDavid Chisnall}
13244ba319b5SDimitry Andric
13254ba319b5SDimitry Andrictemplate <class _CharT, class _Traits>
13264ba319b5SDimitry Andricvoid basic_ifstream<_CharT, _Traits>::__open(int __fd,
13274ba319b5SDimitry Andric                                             ios_base::openmode __mode) {
13284ba319b5SDimitry Andric  if (__sb_.__open(__fd, __mode | ios_base::in))
13294ba319b5SDimitry Andric    this->clear();
13304ba319b5SDimitry Andric  else
13314ba319b5SDimitry Andric    this->setstate(ios_base::failbit);
13324ba319b5SDimitry Andric}
1333854fa44bSDimitry Andric#endif
13347a984708SDavid Chisnall
13357a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
13367c82a1ecSDimitry Andricinline
13377a984708SDavid Chisnallvoid
13387a984708SDavid Chisnallbasic_ifstream<_CharT, _Traits>::close()
13397a984708SDavid Chisnall{
13407a984708SDavid Chisnall    if (__sb_.close() == 0)
13417a984708SDavid Chisnall        this->setstate(ios_base::failbit);
13427a984708SDavid Chisnall}
13437a984708SDavid Chisnall
13447a984708SDavid Chisnall// basic_ofstream
13457a984708SDavid Chisnall
13467a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
1347aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_ofstream
13487a984708SDavid Chisnall    : public basic_ostream<_CharT, _Traits>
13497a984708SDavid Chisnall{
13507a984708SDavid Chisnallpublic:
13517a984708SDavid Chisnall    typedef _CharT                         char_type;
13527a984708SDavid Chisnall    typedef _Traits                        traits_type;
13537a984708SDavid Chisnall    typedef typename traits_type::int_type int_type;
13547a984708SDavid Chisnall    typedef typename traits_type::pos_type pos_type;
13557a984708SDavid Chisnall    typedef typename traits_type::off_type off_type;
13567a984708SDavid Chisnall
13577c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13587a984708SDavid Chisnall    basic_ofstream();
13597c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13607a984708SDavid Chisnall    explicit basic_ofstream(const char* __s, ios_base::openmode __mode = ios_base::out);
13614ba319b5SDimitry Andric#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
13624ba319b5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13634ba319b5SDimitry Andric    explicit basic_ofstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::out);
13644ba319b5SDimitry Andric#endif
13657c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13667a984708SDavid Chisnall    explicit basic_ofstream(const string& __s, ios_base::openmode __mode = ios_base::out);
13674ba319b5SDimitry Andric
13684ba319b5SDimitry Andric#if _LIBCPP_STD_VER >= 17
13694ba319b5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13704ba319b5SDimitry Andric    explicit basic_ofstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::out)
13714ba319b5SDimitry Andric      : basic_ofstream(__p.c_str(), __mode) {}
13724ba319b5SDimitry Andric#endif // _LIBCPP_STD_VER >= 17
13734ba319b5SDimitry Andric
1374540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
13757c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13767a984708SDavid Chisnall    basic_ofstream(basic_ofstream&& __rhs);
13777a984708SDavid Chisnall
13787c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13797a984708SDavid Chisnall    basic_ofstream& operator=(basic_ofstream&& __rhs);
13807a984708SDavid Chisnall#endif
13817c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13827a984708SDavid Chisnall    void swap(basic_ofstream& __rhs);
13837a984708SDavid Chisnall
13847c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13857a984708SDavid Chisnall    basic_filebuf<char_type, traits_type>* rdbuf() const;
13867c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13877a984708SDavid Chisnall    bool is_open() const;
1388854fa44bSDimitry Andric#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
13897a984708SDavid Chisnall    void open(const char* __s, ios_base::openmode __mode = ios_base::out);
13904ba319b5SDimitry Andric#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
13914ba319b5SDimitry Andric    void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::out);
13924ba319b5SDimitry Andric#endif
13937a984708SDavid Chisnall    void open(const string& __s, ios_base::openmode __mode = ios_base::out);
13944ba319b5SDimitry Andric
13954ba319b5SDimitry Andric#if _LIBCPP_STD_VER >= 17
13964ba319b5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13974ba319b5SDimitry Andric    void open(const filesystem::path& __p, ios_base::openmode __mode = ios_base::out)
13984ba319b5SDimitry Andric    { return open(__p.c_str(), __mode); }
13994ba319b5SDimitry Andric#endif // _LIBCPP_STD_VER >= 17
14004ba319b5SDimitry Andric
14014ba319b5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
14024ba319b5SDimitry Andric    void __open(int __fd, ios_base::openmode __mode);
1403854fa44bSDimitry Andric#endif
14047c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
14057a984708SDavid Chisnall    void close();
14067a984708SDavid Chisnall
14077a984708SDavid Chisnallprivate:
14087a984708SDavid Chisnall    basic_filebuf<char_type, traits_type> __sb_;
14097a984708SDavid Chisnall};
14107a984708SDavid Chisnall
14117a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
14127c82a1ecSDimitry Andricinline
14137a984708SDavid Chisnallbasic_ofstream<_CharT, _Traits>::basic_ofstream()
14147a984708SDavid Chisnall    : basic_ostream<char_type, traits_type>(&__sb_)
14157a984708SDavid Chisnall{
14167a984708SDavid Chisnall}
14177a984708SDavid Chisnall
1418854fa44bSDimitry Andric#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
14197a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
14207c82a1ecSDimitry Andricinline
14217a984708SDavid Chisnallbasic_ofstream<_CharT, _Traits>::basic_ofstream(const char* __s, ios_base::openmode __mode)
14227a984708SDavid Chisnall    : basic_ostream<char_type, traits_type>(&__sb_)
14237a984708SDavid Chisnall{
14247a984708SDavid Chisnall    if (__sb_.open(__s, __mode | ios_base::out) == 0)
14257a984708SDavid Chisnall        this->setstate(ios_base::failbit);
14267a984708SDavid Chisnall}
14277a984708SDavid Chisnall
14284ba319b5SDimitry Andric#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
14294ba319b5SDimitry Andrictemplate <class _CharT, class _Traits>
14304ba319b5SDimitry Andricinline
14314ba319b5SDimitry Andricbasic_ofstream<_CharT, _Traits>::basic_ofstream(const wchar_t* __s, ios_base::openmode __mode)
14324ba319b5SDimitry Andric    : basic_ostream<char_type, traits_type>(&__sb_)
14334ba319b5SDimitry Andric{
14344ba319b5SDimitry Andric    if (__sb_.open(__s, __mode | ios_base::out) == 0)
14354ba319b5SDimitry Andric        this->setstate(ios_base::failbit);
14364ba319b5SDimitry Andric}
14374ba319b5SDimitry Andric#endif
14384ba319b5SDimitry Andric
14397a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
14407c82a1ecSDimitry Andricinline
14417a984708SDavid Chisnallbasic_ofstream<_CharT, _Traits>::basic_ofstream(const string& __s, ios_base::openmode __mode)
14427a984708SDavid Chisnall    : basic_ostream<char_type, traits_type>(&__sb_)
14437a984708SDavid Chisnall{
14447a984708SDavid Chisnall    if (__sb_.open(__s, __mode | ios_base::out) == 0)
14457a984708SDavid Chisnall        this->setstate(ios_base::failbit);
14467a984708SDavid Chisnall}
1447854fa44bSDimitry Andric#endif
14487a984708SDavid Chisnall
1449540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
14507a984708SDavid Chisnall
14517a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
14527c82a1ecSDimitry Andricinline
14537a984708SDavid Chisnallbasic_ofstream<_CharT, _Traits>::basic_ofstream(basic_ofstream&& __rhs)
14547a984708SDavid Chisnall    : basic_ostream<char_type, traits_type>(_VSTD::move(__rhs)),
14557a984708SDavid Chisnall      __sb_(_VSTD::move(__rhs.__sb_))
14567a984708SDavid Chisnall{
14577a984708SDavid Chisnall    this->set_rdbuf(&__sb_);
14587a984708SDavid Chisnall}
14597a984708SDavid Chisnall
14607a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
14617c82a1ecSDimitry Andricinline
14627a984708SDavid Chisnallbasic_ofstream<_CharT, _Traits>&
14637a984708SDavid Chisnallbasic_ofstream<_CharT, _Traits>::operator=(basic_ofstream&& __rhs)
14647a984708SDavid Chisnall{
14657a984708SDavid Chisnall    basic_ostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
14667a984708SDavid Chisnall    __sb_ = _VSTD::move(__rhs.__sb_);
14677a984708SDavid Chisnall    return *this;
14687a984708SDavid Chisnall}
14697a984708SDavid Chisnall
1470540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
14717a984708SDavid Chisnall
14727a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
14737c82a1ecSDimitry Andricinline
14747a984708SDavid Chisnallvoid
14757a984708SDavid Chisnallbasic_ofstream<_CharT, _Traits>::swap(basic_ofstream& __rhs)
14767a984708SDavid Chisnall{
14777a984708SDavid Chisnall    basic_ostream<char_type, traits_type>::swap(__rhs);
14787a984708SDavid Chisnall    __sb_.swap(__rhs.__sb_);
14797a984708SDavid Chisnall}
14807a984708SDavid Chisnall
14817a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
14827a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
14837a984708SDavid Chisnallvoid
14847a984708SDavid Chisnallswap(basic_ofstream<_CharT, _Traits>& __x, basic_ofstream<_CharT, _Traits>& __y)
14857a984708SDavid Chisnall{
14867a984708SDavid Chisnall    __x.swap(__y);
14877a984708SDavid Chisnall}
14887a984708SDavid Chisnall
14897a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
14907c82a1ecSDimitry Andricinline
14917a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>*
14927a984708SDavid Chisnallbasic_ofstream<_CharT, _Traits>::rdbuf() const
14937a984708SDavid Chisnall{
14947a984708SDavid Chisnall    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
14957a984708SDavid Chisnall}
14967a984708SDavid Chisnall
14977a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
14987c82a1ecSDimitry Andricinline
14997a984708SDavid Chisnallbool
15007a984708SDavid Chisnallbasic_ofstream<_CharT, _Traits>::is_open() const
15017a984708SDavid Chisnall{
15027a984708SDavid Chisnall    return __sb_.is_open();
15037a984708SDavid Chisnall}
15047a984708SDavid Chisnall
1505854fa44bSDimitry Andric#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
15067a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
15077a984708SDavid Chisnallvoid
15087a984708SDavid Chisnallbasic_ofstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
15097a984708SDavid Chisnall{
15107a984708SDavid Chisnall    if (__sb_.open(__s, __mode | ios_base::out))
15117a984708SDavid Chisnall        this->clear();
15127a984708SDavid Chisnall    else
15137a984708SDavid Chisnall        this->setstate(ios_base::failbit);
15147a984708SDavid Chisnall}
15157a984708SDavid Chisnall
15164ba319b5SDimitry Andric#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
15174ba319b5SDimitry Andrictemplate <class _CharT, class _Traits>
15184ba319b5SDimitry Andricvoid
15194ba319b5SDimitry Andricbasic_ofstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
15204ba319b5SDimitry Andric{
15214ba319b5SDimitry Andric    if (__sb_.open(__s, __mode | ios_base::out))
15224ba319b5SDimitry Andric        this->clear();
15234ba319b5SDimitry Andric    else
15244ba319b5SDimitry Andric        this->setstate(ios_base::failbit);
15254ba319b5SDimitry Andric}
15264ba319b5SDimitry Andric#endif
15274ba319b5SDimitry Andric
15287a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
15297a984708SDavid Chisnallvoid
15307a984708SDavid Chisnallbasic_ofstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
15317a984708SDavid Chisnall{
15327a984708SDavid Chisnall    if (__sb_.open(__s, __mode | ios_base::out))
15337a984708SDavid Chisnall        this->clear();
15347a984708SDavid Chisnall    else
15357a984708SDavid Chisnall        this->setstate(ios_base::failbit);
15367a984708SDavid Chisnall}
15374ba319b5SDimitry Andric
15384ba319b5SDimitry Andrictemplate <class _CharT, class _Traits>
15394ba319b5SDimitry Andricvoid basic_ofstream<_CharT, _Traits>::__open(int __fd,
15404ba319b5SDimitry Andric                                             ios_base::openmode __mode) {
15414ba319b5SDimitry Andric  if (__sb_.__open(__fd, __mode | ios_base::out))
15424ba319b5SDimitry Andric    this->clear();
15434ba319b5SDimitry Andric  else
15444ba319b5SDimitry Andric    this->setstate(ios_base::failbit);
15454ba319b5SDimitry Andric}
1546854fa44bSDimitry Andric#endif
15477a984708SDavid Chisnall
15487a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
15497c82a1ecSDimitry Andricinline
15507a984708SDavid Chisnallvoid
15517a984708SDavid Chisnallbasic_ofstream<_CharT, _Traits>::close()
15527a984708SDavid Chisnall{
15537a984708SDavid Chisnall    if (__sb_.close() == 0)
15547a984708SDavid Chisnall        this->setstate(ios_base::failbit);
15557a984708SDavid Chisnall}
15567a984708SDavid Chisnall
15577a984708SDavid Chisnall// basic_fstream
15587a984708SDavid Chisnall
15597a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
1560aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_fstream
15617a984708SDavid Chisnall    : public basic_iostream<_CharT, _Traits>
15627a984708SDavid Chisnall{
15637a984708SDavid Chisnallpublic:
15647a984708SDavid Chisnall    typedef _CharT                         char_type;
15657a984708SDavid Chisnall    typedef _Traits                        traits_type;
15667a984708SDavid Chisnall    typedef typename traits_type::int_type int_type;
15677a984708SDavid Chisnall    typedef typename traits_type::pos_type pos_type;
15687a984708SDavid Chisnall    typedef typename traits_type::off_type off_type;
15697a984708SDavid Chisnall
15707c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15717a984708SDavid Chisnall    basic_fstream();
1572854fa44bSDimitry Andric#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
15737c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15747a984708SDavid Chisnall    explicit basic_fstream(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
15754ba319b5SDimitry Andric#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
15764ba319b5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15774ba319b5SDimitry Andric    explicit basic_fstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
15784ba319b5SDimitry Andric#endif
15797c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15807a984708SDavid Chisnall    explicit basic_fstream(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
15814ba319b5SDimitry Andric
15824ba319b5SDimitry Andric#if _LIBCPP_STD_VER >= 17
15834ba319b5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15844ba319b5SDimitry Andric    explicit basic_fstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in | ios_base::out)
15854ba319b5SDimitry Andric      : basic_fstream(__p.c_str(), __mode) {}
15864ba319b5SDimitry Andric#endif // _LIBCPP_STD_VER >= 17
15874ba319b5SDimitry Andric
1588854fa44bSDimitry Andric#endif
1589540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
15907c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15917a984708SDavid Chisnall    basic_fstream(basic_fstream&& __rhs);
15927a984708SDavid Chisnall
15937c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15947a984708SDavid Chisnall    basic_fstream& operator=(basic_fstream&& __rhs);
15957a984708SDavid Chisnall#endif
15967c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15977a984708SDavid Chisnall    void swap(basic_fstream& __rhs);
15987a984708SDavid Chisnall
15997c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16007a984708SDavid Chisnall    basic_filebuf<char_type, traits_type>* rdbuf() const;
16017c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16027a984708SDavid Chisnall    bool is_open() const;
1603854fa44bSDimitry Andric#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
16047a984708SDavid Chisnall    void open(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
16054ba319b5SDimitry Andric#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
16064ba319b5SDimitry Andric    void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
16074ba319b5SDimitry Andric#endif
16087a984708SDavid Chisnall    void open(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
16094ba319b5SDimitry Andric
16104ba319b5SDimitry Andric#if _LIBCPP_STD_VER >= 17
16114ba319b5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16124ba319b5SDimitry Andric    void open(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in|ios_base::out)
16134ba319b5SDimitry Andric    { return open(__p.c_str(), __mode); }
16144ba319b5SDimitry Andric#endif // _LIBCPP_STD_VER >= 17
16154ba319b5SDimitry Andric
1616854fa44bSDimitry Andric#endif
16177c82a1ecSDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16187a984708SDavid Chisnall    void close();
16197a984708SDavid Chisnall
16207a984708SDavid Chisnallprivate:
16217a984708SDavid Chisnall    basic_filebuf<char_type, traits_type> __sb_;
16227a984708SDavid Chisnall};
16237a984708SDavid Chisnall
16247a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
16257c82a1ecSDimitry Andricinline
16267a984708SDavid Chisnallbasic_fstream<_CharT, _Traits>::basic_fstream()
16277a984708SDavid Chisnall    : basic_iostream<char_type, traits_type>(&__sb_)
16287a984708SDavid Chisnall{
16297a984708SDavid Chisnall}
16307a984708SDavid Chisnall
1631854fa44bSDimitry Andric#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
16327a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
16337c82a1ecSDimitry Andricinline
16347a984708SDavid Chisnallbasic_fstream<_CharT, _Traits>::basic_fstream(const char* __s, ios_base::openmode __mode)
16357a984708SDavid Chisnall    : basic_iostream<char_type, traits_type>(&__sb_)
16367a984708SDavid Chisnall{
16377a984708SDavid Chisnall    if (__sb_.open(__s, __mode) == 0)
16387a984708SDavid Chisnall        this->setstate(ios_base::failbit);
16397a984708SDavid Chisnall}
16407a984708SDavid Chisnall
16414ba319b5SDimitry Andric#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
16424ba319b5SDimitry Andrictemplate <class _CharT, class _Traits>
16434ba319b5SDimitry Andricinline
16444ba319b5SDimitry Andricbasic_fstream<_CharT, _Traits>::basic_fstream(const wchar_t* __s, ios_base::openmode __mode)
16454ba319b5SDimitry Andric    : basic_iostream<char_type, traits_type>(&__sb_)
16464ba319b5SDimitry Andric{
16474ba319b5SDimitry Andric    if (__sb_.open(__s, __mode) == 0)
16484ba319b5SDimitry Andric        this->setstate(ios_base::failbit);
16494ba319b5SDimitry Andric}
16504ba319b5SDimitry Andric#endif
16514ba319b5SDimitry Andric
16527a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
16537c82a1ecSDimitry Andricinline
16547a984708SDavid Chisnallbasic_fstream<_CharT, _Traits>::basic_fstream(const string& __s, ios_base::openmode __mode)
16557a984708SDavid Chisnall    : basic_iostream<char_type, traits_type>(&__sb_)
16567a984708SDavid Chisnall{
16577a984708SDavid Chisnall    if (__sb_.open(__s, __mode) == 0)
16587a984708SDavid Chisnall        this->setstate(ios_base::failbit);
16597a984708SDavid Chisnall}
1660854fa44bSDimitry Andric#endif
16617a984708SDavid Chisnall
1662540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
16637a984708SDavid Chisnall
16647a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
16657c82a1ecSDimitry Andricinline
16667a984708SDavid Chisnallbasic_fstream<_CharT, _Traits>::basic_fstream(basic_fstream&& __rhs)
16677a984708SDavid Chisnall    : basic_iostream<char_type, traits_type>(_VSTD::move(__rhs)),
16687a984708SDavid Chisnall      __sb_(_VSTD::move(__rhs.__sb_))
16697a984708SDavid Chisnall{
16707a984708SDavid Chisnall    this->set_rdbuf(&__sb_);
16717a984708SDavid Chisnall}
16727a984708SDavid Chisnall
16737a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
16747c82a1ecSDimitry Andricinline
16757a984708SDavid Chisnallbasic_fstream<_CharT, _Traits>&
16767a984708SDavid Chisnallbasic_fstream<_CharT, _Traits>::operator=(basic_fstream&& __rhs)
16777a984708SDavid Chisnall{
16787a984708SDavid Chisnall    basic_iostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
16797a984708SDavid Chisnall    __sb_ = _VSTD::move(__rhs.__sb_);
16807a984708SDavid Chisnall    return *this;
16817a984708SDavid Chisnall}
16827a984708SDavid Chisnall
1683540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
16847a984708SDavid Chisnall
16857a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
16867c82a1ecSDimitry Andricinline
16877a984708SDavid Chisnallvoid
16887a984708SDavid Chisnallbasic_fstream<_CharT, _Traits>::swap(basic_fstream& __rhs)
16897a984708SDavid Chisnall{
16907a984708SDavid Chisnall    basic_iostream<char_type, traits_type>::swap(__rhs);
16917a984708SDavid Chisnall    __sb_.swap(__rhs.__sb_);
16927a984708SDavid Chisnall}
16937a984708SDavid Chisnall
16947a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
16957a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
16967a984708SDavid Chisnallvoid
16977a984708SDavid Chisnallswap(basic_fstream<_CharT, _Traits>& __x, basic_fstream<_CharT, _Traits>& __y)
16987a984708SDavid Chisnall{
16997a984708SDavid Chisnall    __x.swap(__y);
17007a984708SDavid Chisnall}
17017a984708SDavid Chisnall
17027a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
17037c82a1ecSDimitry Andricinline
17047a984708SDavid Chisnallbasic_filebuf<_CharT, _Traits>*
17057a984708SDavid Chisnallbasic_fstream<_CharT, _Traits>::rdbuf() const
17067a984708SDavid Chisnall{
17077a984708SDavid Chisnall    return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
17087a984708SDavid Chisnall}
17097a984708SDavid Chisnall
17107a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
17117c82a1ecSDimitry Andricinline
17127a984708SDavid Chisnallbool
17137a984708SDavid Chisnallbasic_fstream<_CharT, _Traits>::is_open() const
17147a984708SDavid Chisnall{
17157a984708SDavid Chisnall    return __sb_.is_open();
17167a984708SDavid Chisnall}
17177a984708SDavid Chisnall
1718854fa44bSDimitry Andric#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
17197a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
17207a984708SDavid Chisnallvoid
17217a984708SDavid Chisnallbasic_fstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
17227a984708SDavid Chisnall{
17237a984708SDavid Chisnall    if (__sb_.open(__s, __mode))
17247a984708SDavid Chisnall        this->clear();
17257a984708SDavid Chisnall    else
17267a984708SDavid Chisnall        this->setstate(ios_base::failbit);
17277a984708SDavid Chisnall}
17287a984708SDavid Chisnall
17294ba319b5SDimitry Andric#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
17304ba319b5SDimitry Andrictemplate <class _CharT, class _Traits>
17314ba319b5SDimitry Andricvoid
17324ba319b5SDimitry Andricbasic_fstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
17334ba319b5SDimitry Andric{
17344ba319b5SDimitry Andric    if (__sb_.open(__s, __mode))
17354ba319b5SDimitry Andric        this->clear();
17364ba319b5SDimitry Andric    else
17374ba319b5SDimitry Andric        this->setstate(ios_base::failbit);
17384ba319b5SDimitry Andric}
17394ba319b5SDimitry Andric#endif
17404ba319b5SDimitry Andric
17417a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
17427a984708SDavid Chisnallvoid
17437a984708SDavid Chisnallbasic_fstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
17447a984708SDavid Chisnall{
17457a984708SDavid Chisnall    if (__sb_.open(__s, __mode))
17467a984708SDavid Chisnall        this->clear();
17477a984708SDavid Chisnall    else
17487a984708SDavid Chisnall        this->setstate(ios_base::failbit);
17497a984708SDavid Chisnall}
1750854fa44bSDimitry Andric#endif
17517a984708SDavid Chisnall
17527a984708SDavid Chisnalltemplate <class _CharT, class _Traits>
17537c82a1ecSDimitry Andricinline
17547a984708SDavid Chisnallvoid
17557a984708SDavid Chisnallbasic_fstream<_CharT, _Traits>::close()
17567a984708SDavid Chisnall{
17577a984708SDavid Chisnall    if (__sb_.close() == 0)
17587a984708SDavid Chisnall        this->setstate(ios_base::failbit);
17597a984708SDavid Chisnall}
17607a984708SDavid Chisnall
17617a984708SDavid Chisnall_LIBCPP_END_NAMESPACE_STD
17627a984708SDavid Chisnall
1763f9448bf3SDimitry Andric_LIBCPP_POP_MACROS
1764f9448bf3SDimitry Andric
17657a984708SDavid Chisnall#endif  // _LIBCPP_FSTREAM
1766