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