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