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