1*4d6fc14bSjoerg// -*- C++ -*- 2*4d6fc14bSjoerg//===------------------------- fstream ------------------------------------===// 3*4d6fc14bSjoerg// 4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information. 6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4d6fc14bSjoerg// 8*4d6fc14bSjoerg//===----------------------------------------------------------------------===// 9*4d6fc14bSjoerg 10*4d6fc14bSjoerg#ifndef _LIBCPP_FSTREAM 11*4d6fc14bSjoerg#define _LIBCPP_FSTREAM 12*4d6fc14bSjoerg 13*4d6fc14bSjoerg/* 14*4d6fc14bSjoerg fstream synopsis 15*4d6fc14bSjoerg 16*4d6fc14bSjoergtemplate <class charT, class traits = char_traits<charT> > 17*4d6fc14bSjoergclass basic_filebuf 18*4d6fc14bSjoerg : public basic_streambuf<charT, traits> 19*4d6fc14bSjoerg{ 20*4d6fc14bSjoergpublic: 21*4d6fc14bSjoerg typedef charT char_type; 22*4d6fc14bSjoerg typedef traits traits_type; 23*4d6fc14bSjoerg typedef typename traits_type::int_type int_type; 24*4d6fc14bSjoerg typedef typename traits_type::pos_type pos_type; 25*4d6fc14bSjoerg typedef typename traits_type::off_type off_type; 26*4d6fc14bSjoerg 27*4d6fc14bSjoerg // 27.9.1.2 Constructors/destructor: 28*4d6fc14bSjoerg basic_filebuf(); 29*4d6fc14bSjoerg basic_filebuf(basic_filebuf&& rhs); 30*4d6fc14bSjoerg virtual ~basic_filebuf(); 31*4d6fc14bSjoerg 32*4d6fc14bSjoerg // 27.9.1.3 Assign/swap: 33*4d6fc14bSjoerg basic_filebuf& operator=(basic_filebuf&& rhs); 34*4d6fc14bSjoerg void swap(basic_filebuf& rhs); 35*4d6fc14bSjoerg 36*4d6fc14bSjoerg // 27.9.1.4 Members: 37*4d6fc14bSjoerg bool is_open() const; 38*4d6fc14bSjoerg basic_filebuf* open(const char* s, ios_base::openmode mode); 39*4d6fc14bSjoerg basic_filebuf* open(const string& s, ios_base::openmode mode); 40*4d6fc14bSjoerg basic_filebuf* open(const filesystem::path& p, ios_base::openmode mode); // C++17 41*4d6fc14bSjoerg basic_filebuf* close(); 42*4d6fc14bSjoerg 43*4d6fc14bSjoergprotected: 44*4d6fc14bSjoerg // 27.9.1.5 Overridden virtual functions: 45*4d6fc14bSjoerg virtual streamsize showmanyc(); 46*4d6fc14bSjoerg virtual int_type underflow(); 47*4d6fc14bSjoerg virtual int_type uflow(); 48*4d6fc14bSjoerg virtual int_type pbackfail(int_type c = traits_type::eof()); 49*4d6fc14bSjoerg virtual int_type overflow (int_type c = traits_type::eof()); 50*4d6fc14bSjoerg virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* s, streamsize n); 51*4d6fc14bSjoerg virtual pos_type seekoff(off_type off, ios_base::seekdir way, 52*4d6fc14bSjoerg ios_base::openmode which = ios_base::in | ios_base::out); 53*4d6fc14bSjoerg virtual pos_type seekpos(pos_type sp, 54*4d6fc14bSjoerg ios_base::openmode which = ios_base::in | ios_base::out); 55*4d6fc14bSjoerg virtual int sync(); 56*4d6fc14bSjoerg virtual void imbue(const locale& loc); 57*4d6fc14bSjoerg}; 58*4d6fc14bSjoerg 59*4d6fc14bSjoergtemplate <class charT, class traits> 60*4d6fc14bSjoerg void 61*4d6fc14bSjoerg swap(basic_filebuf<charT, traits>& x, basic_filebuf<charT, traits>& y); 62*4d6fc14bSjoerg 63*4d6fc14bSjoergtypedef basic_filebuf<char> filebuf; 64*4d6fc14bSjoergtypedef basic_filebuf<wchar_t> wfilebuf; 65*4d6fc14bSjoerg 66*4d6fc14bSjoergtemplate <class charT, class traits = char_traits<charT> > 67*4d6fc14bSjoergclass basic_ifstream 68*4d6fc14bSjoerg : public basic_istream<charT,traits> 69*4d6fc14bSjoerg{ 70*4d6fc14bSjoergpublic: 71*4d6fc14bSjoerg typedef charT char_type; 72*4d6fc14bSjoerg typedef traits traits_type; 73*4d6fc14bSjoerg typedef typename traits_type::int_type int_type; 74*4d6fc14bSjoerg typedef typename traits_type::pos_type pos_type; 75*4d6fc14bSjoerg typedef typename traits_type::off_type off_type; 76*4d6fc14bSjoerg 77*4d6fc14bSjoerg basic_ifstream(); 78*4d6fc14bSjoerg explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in); 79*4d6fc14bSjoerg explicit basic_ifstream(const string& s, ios_base::openmode mode = ios_base::in); 80*4d6fc14bSjoerg explicit basic_ifstream(const filesystem::path& p, 81*4d6fc14bSjoerg ios_base::openmode mode = ios_base::in); // C++17 82*4d6fc14bSjoerg basic_ifstream(basic_ifstream&& rhs); 83*4d6fc14bSjoerg 84*4d6fc14bSjoerg basic_ifstream& operator=(basic_ifstream&& rhs); 85*4d6fc14bSjoerg void swap(basic_ifstream& rhs); 86*4d6fc14bSjoerg 87*4d6fc14bSjoerg basic_filebuf<char_type, traits_type>* rdbuf() const; 88*4d6fc14bSjoerg bool is_open() const; 89*4d6fc14bSjoerg void open(const char* s, ios_base::openmode mode = ios_base::in); 90*4d6fc14bSjoerg void open(const string& s, ios_base::openmode mode = ios_base::in); 91*4d6fc14bSjoerg void open(const filesystem::path& s, ios_base::openmode mode = ios_base::in); // C++17 92*4d6fc14bSjoerg 93*4d6fc14bSjoerg void close(); 94*4d6fc14bSjoerg}; 95*4d6fc14bSjoerg 96*4d6fc14bSjoergtemplate <class charT, class traits> 97*4d6fc14bSjoerg void 98*4d6fc14bSjoerg swap(basic_ifstream<charT, traits>& x, basic_ifstream<charT, traits>& y); 99*4d6fc14bSjoerg 100*4d6fc14bSjoergtypedef basic_ifstream<char> ifstream; 101*4d6fc14bSjoergtypedef basic_ifstream<wchar_t> wifstream; 102*4d6fc14bSjoerg 103*4d6fc14bSjoergtemplate <class charT, class traits = char_traits<charT> > 104*4d6fc14bSjoergclass basic_ofstream 105*4d6fc14bSjoerg : public basic_ostream<charT,traits> 106*4d6fc14bSjoerg{ 107*4d6fc14bSjoergpublic: 108*4d6fc14bSjoerg typedef charT char_type; 109*4d6fc14bSjoerg typedef traits traits_type; 110*4d6fc14bSjoerg typedef typename traits_type::int_type int_type; 111*4d6fc14bSjoerg typedef typename traits_type::pos_type pos_type; 112*4d6fc14bSjoerg typedef typename traits_type::off_type off_type; 113*4d6fc14bSjoerg 114*4d6fc14bSjoerg basic_ofstream(); 115*4d6fc14bSjoerg explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out); 116*4d6fc14bSjoerg explicit basic_ofstream(const string& s, ios_base::openmode mode = ios_base::out); 117*4d6fc14bSjoerg explicit basic_ofstream(const filesystem::path& p, 118*4d6fc14bSjoerg ios_base::openmode mode = ios_base::out); // C++17 119*4d6fc14bSjoerg basic_ofstream(basic_ofstream&& rhs); 120*4d6fc14bSjoerg 121*4d6fc14bSjoerg basic_ofstream& operator=(basic_ofstream&& rhs); 122*4d6fc14bSjoerg void swap(basic_ofstream& rhs); 123*4d6fc14bSjoerg 124*4d6fc14bSjoerg basic_filebuf<char_type, traits_type>* rdbuf() const; 125*4d6fc14bSjoerg bool is_open() const; 126*4d6fc14bSjoerg void open(const char* s, ios_base::openmode mode = ios_base::out); 127*4d6fc14bSjoerg void open(const string& s, ios_base::openmode mode = ios_base::out); 128*4d6fc14bSjoerg void open(const filesystem::path& p, 129*4d6fc14bSjoerg ios_base::openmode mode = ios_base::out); // C++17 130*4d6fc14bSjoerg 131*4d6fc14bSjoerg void close(); 132*4d6fc14bSjoerg}; 133*4d6fc14bSjoerg 134*4d6fc14bSjoergtemplate <class charT, class traits> 135*4d6fc14bSjoerg void 136*4d6fc14bSjoerg swap(basic_ofstream<charT, traits>& x, basic_ofstream<charT, traits>& y); 137*4d6fc14bSjoerg 138*4d6fc14bSjoergtypedef basic_ofstream<char> ofstream; 139*4d6fc14bSjoergtypedef basic_ofstream<wchar_t> wofstream; 140*4d6fc14bSjoerg 141*4d6fc14bSjoergtemplate <class charT, class traits=char_traits<charT> > 142*4d6fc14bSjoergclass basic_fstream 143*4d6fc14bSjoerg : public basic_iostream<charT,traits> 144*4d6fc14bSjoerg{ 145*4d6fc14bSjoergpublic: 146*4d6fc14bSjoerg typedef charT char_type; 147*4d6fc14bSjoerg typedef traits traits_type; 148*4d6fc14bSjoerg typedef typename traits_type::int_type int_type; 149*4d6fc14bSjoerg typedef typename traits_type::pos_type pos_type; 150*4d6fc14bSjoerg typedef typename traits_type::off_type off_type; 151*4d6fc14bSjoerg 152*4d6fc14bSjoerg basic_fstream(); 153*4d6fc14bSjoerg explicit basic_fstream(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out); 154*4d6fc14bSjoerg explicit basic_fstream(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out); 155*4d6fc14bSjoerg explicit basic_fstream(const filesystem::path& p, 156*4d6fc14bSjoerg ios_base::openmode mode = ios_base::in|ios_base::out); C++17 157*4d6fc14bSjoerg basic_fstream(basic_fstream&& rhs); 158*4d6fc14bSjoerg 159*4d6fc14bSjoerg basic_fstream& operator=(basic_fstream&& rhs); 160*4d6fc14bSjoerg void swap(basic_fstream& rhs); 161*4d6fc14bSjoerg 162*4d6fc14bSjoerg basic_filebuf<char_type, traits_type>* rdbuf() const; 163*4d6fc14bSjoerg bool is_open() const; 164*4d6fc14bSjoerg void open(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out); 165*4d6fc14bSjoerg void open(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out); 166*4d6fc14bSjoerg void open(const filesystem::path& s, 167*4d6fc14bSjoerg ios_base::openmode mode = ios_base::in|ios_base::out); // C++17 168*4d6fc14bSjoerg 169*4d6fc14bSjoerg void close(); 170*4d6fc14bSjoerg}; 171*4d6fc14bSjoerg 172*4d6fc14bSjoergtemplate <class charT, class traits> 173*4d6fc14bSjoerg void swap(basic_fstream<charT, traits>& x, basic_fstream<charT, traits>& y); 174*4d6fc14bSjoerg 175*4d6fc14bSjoergtypedef basic_fstream<char> fstream; 176*4d6fc14bSjoergtypedef basic_fstream<wchar_t> wfstream; 177*4d6fc14bSjoerg 178*4d6fc14bSjoerg} // std 179*4d6fc14bSjoerg 180*4d6fc14bSjoerg*/ 181*4d6fc14bSjoerg 182*4d6fc14bSjoerg#include <__config> 183*4d6fc14bSjoerg#include <__availability> 184*4d6fc14bSjoerg#include <__debug> 185*4d6fc14bSjoerg#include <__locale> 186*4d6fc14bSjoerg#include <cstdio> 187*4d6fc14bSjoerg#include <cstdlib> 188*4d6fc14bSjoerg#include <istream> 189*4d6fc14bSjoerg#include <ostream> 190*4d6fc14bSjoerg 191*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY) 192*4d6fc14bSjoerg# include <filesystem> 193*4d6fc14bSjoerg#endif 194*4d6fc14bSjoerg 195*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 196*4d6fc14bSjoerg#pragma GCC system_header 197*4d6fc14bSjoerg#endif 198*4d6fc14bSjoerg 199*4d6fc14bSjoerg_LIBCPP_PUSH_MACROS 200*4d6fc14bSjoerg#include <__undef_macros> 201*4d6fc14bSjoerg 202*4d6fc14bSjoerg#if defined(_LIBCPP_MSVCRT) || defined(_NEWLIB_VERSION) 203*4d6fc14bSjoerg# define _LIBCPP_HAS_NO_OFF_T_FUNCTIONS 204*4d6fc14bSjoerg#endif 205*4d6fc14bSjoerg 206*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD 207*4d6fc14bSjoerg 208*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 209*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS basic_filebuf 210*4d6fc14bSjoerg : public basic_streambuf<_CharT, _Traits> 211*4d6fc14bSjoerg{ 212*4d6fc14bSjoergpublic: 213*4d6fc14bSjoerg typedef _CharT char_type; 214*4d6fc14bSjoerg typedef _Traits traits_type; 215*4d6fc14bSjoerg typedef typename traits_type::int_type int_type; 216*4d6fc14bSjoerg typedef typename traits_type::pos_type pos_type; 217*4d6fc14bSjoerg typedef typename traits_type::off_type off_type; 218*4d6fc14bSjoerg typedef typename traits_type::state_type state_type; 219*4d6fc14bSjoerg 220*4d6fc14bSjoerg // 27.9.1.2 Constructors/destructor: 221*4d6fc14bSjoerg basic_filebuf(); 222*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 223*4d6fc14bSjoerg basic_filebuf(basic_filebuf&& __rhs); 224*4d6fc14bSjoerg#endif 225*4d6fc14bSjoerg virtual ~basic_filebuf(); 226*4d6fc14bSjoerg 227*4d6fc14bSjoerg // 27.9.1.3 Assign/swap: 228*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 229*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 230*4d6fc14bSjoerg basic_filebuf& operator=(basic_filebuf&& __rhs); 231*4d6fc14bSjoerg#endif 232*4d6fc14bSjoerg void swap(basic_filebuf& __rhs); 233*4d6fc14bSjoerg 234*4d6fc14bSjoerg // 27.9.1.4 Members: 235*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 236*4d6fc14bSjoerg bool is_open() const; 237*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE 238*4d6fc14bSjoerg basic_filebuf* open(const char* __s, ios_base::openmode __mode); 239*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR 240*4d6fc14bSjoerg basic_filebuf* open(const wchar_t* __s, ios_base::openmode __mode); 241*4d6fc14bSjoerg#endif 242*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 243*4d6fc14bSjoerg basic_filebuf* open(const string& __s, ios_base::openmode __mode); 244*4d6fc14bSjoerg 245*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY) 246*4d6fc14bSjoerg _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY 247*4d6fc14bSjoerg basic_filebuf* open(const _VSTD_FS::path& __p, ios_base::openmode __mode) { 248*4d6fc14bSjoerg return open(__p.c_str(), __mode); 249*4d6fc14bSjoerg } 250*4d6fc14bSjoerg#endif 251*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 252*4d6fc14bSjoerg basic_filebuf* __open(int __fd, ios_base::openmode __mode); 253*4d6fc14bSjoerg#endif 254*4d6fc14bSjoerg basic_filebuf* close(); 255*4d6fc14bSjoerg 256*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 257*4d6fc14bSjoerg inline static const char* 258*4d6fc14bSjoerg __make_mdstring(ios_base::openmode __mode) _NOEXCEPT; 259*4d6fc14bSjoerg 260*4d6fc14bSjoerg protected: 261*4d6fc14bSjoerg // 27.9.1.5 Overridden virtual functions: 262*4d6fc14bSjoerg virtual int_type underflow(); 263*4d6fc14bSjoerg virtual int_type pbackfail(int_type __c = traits_type::eof()); 264*4d6fc14bSjoerg virtual int_type overflow (int_type __c = traits_type::eof()); 265*4d6fc14bSjoerg virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* __s, streamsize __n); 266*4d6fc14bSjoerg virtual pos_type seekoff(off_type __off, ios_base::seekdir __way, 267*4d6fc14bSjoerg ios_base::openmode __wch = ios_base::in | ios_base::out); 268*4d6fc14bSjoerg virtual pos_type seekpos(pos_type __sp, 269*4d6fc14bSjoerg ios_base::openmode __wch = ios_base::in | ios_base::out); 270*4d6fc14bSjoerg virtual int sync(); 271*4d6fc14bSjoerg virtual void imbue(const locale& __loc); 272*4d6fc14bSjoerg 273*4d6fc14bSjoergprivate: 274*4d6fc14bSjoerg char* __extbuf_; 275*4d6fc14bSjoerg const char* __extbufnext_; 276*4d6fc14bSjoerg const char* __extbufend_; 277*4d6fc14bSjoerg char __extbuf_min_[8]; 278*4d6fc14bSjoerg size_t __ebs_; 279*4d6fc14bSjoerg char_type* __intbuf_; 280*4d6fc14bSjoerg size_t __ibs_; 281*4d6fc14bSjoerg FILE* __file_; 282*4d6fc14bSjoerg const codecvt<char_type, char, state_type>* __cv_; 283*4d6fc14bSjoerg state_type __st_; 284*4d6fc14bSjoerg state_type __st_last_; 285*4d6fc14bSjoerg ios_base::openmode __om_; 286*4d6fc14bSjoerg ios_base::openmode __cm_; 287*4d6fc14bSjoerg bool __owns_eb_; 288*4d6fc14bSjoerg bool __owns_ib_; 289*4d6fc14bSjoerg bool __always_noconv_; 290*4d6fc14bSjoerg 291*4d6fc14bSjoerg bool __read_mode(); 292*4d6fc14bSjoerg void __write_mode(); 293*4d6fc14bSjoerg}; 294*4d6fc14bSjoerg 295*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 296*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::basic_filebuf() 297*4d6fc14bSjoerg : __extbuf_(nullptr), 298*4d6fc14bSjoerg __extbufnext_(nullptr), 299*4d6fc14bSjoerg __extbufend_(nullptr), 300*4d6fc14bSjoerg __ebs_(0), 301*4d6fc14bSjoerg __intbuf_(nullptr), 302*4d6fc14bSjoerg __ibs_(0), 303*4d6fc14bSjoerg __file_(nullptr), 304*4d6fc14bSjoerg __cv_(nullptr), 305*4d6fc14bSjoerg __st_(), 306*4d6fc14bSjoerg __st_last_(), 307*4d6fc14bSjoerg __om_(0), 308*4d6fc14bSjoerg __cm_(0), 309*4d6fc14bSjoerg __owns_eb_(false), 310*4d6fc14bSjoerg __owns_ib_(false), 311*4d6fc14bSjoerg __always_noconv_(false) 312*4d6fc14bSjoerg{ 313*4d6fc14bSjoerg if (has_facet<codecvt<char_type, char, state_type> >(this->getloc())) 314*4d6fc14bSjoerg { 315*4d6fc14bSjoerg __cv_ = &use_facet<codecvt<char_type, char, state_type> >(this->getloc()); 316*4d6fc14bSjoerg __always_noconv_ = __cv_->always_noconv(); 317*4d6fc14bSjoerg } 318*4d6fc14bSjoerg setbuf(nullptr, 4096); 319*4d6fc14bSjoerg} 320*4d6fc14bSjoerg 321*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 322*4d6fc14bSjoerg 323*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 324*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::basic_filebuf(basic_filebuf&& __rhs) 325*4d6fc14bSjoerg : basic_streambuf<_CharT, _Traits>(__rhs) 326*4d6fc14bSjoerg{ 327*4d6fc14bSjoerg if (__rhs.__extbuf_ == __rhs.__extbuf_min_) 328*4d6fc14bSjoerg { 329*4d6fc14bSjoerg __extbuf_ = __extbuf_min_; 330*4d6fc14bSjoerg __extbufnext_ = __extbuf_ + (__rhs.__extbufnext_ - __rhs.__extbuf_); 331*4d6fc14bSjoerg __extbufend_ = __extbuf_ + (__rhs.__extbufend_ - __rhs.__extbuf_); 332*4d6fc14bSjoerg } 333*4d6fc14bSjoerg else 334*4d6fc14bSjoerg { 335*4d6fc14bSjoerg __extbuf_ = __rhs.__extbuf_; 336*4d6fc14bSjoerg __extbufnext_ = __rhs.__extbufnext_; 337*4d6fc14bSjoerg __extbufend_ = __rhs.__extbufend_; 338*4d6fc14bSjoerg } 339*4d6fc14bSjoerg __ebs_ = __rhs.__ebs_; 340*4d6fc14bSjoerg __intbuf_ = __rhs.__intbuf_; 341*4d6fc14bSjoerg __ibs_ = __rhs.__ibs_; 342*4d6fc14bSjoerg __file_ = __rhs.__file_; 343*4d6fc14bSjoerg __cv_ = __rhs.__cv_; 344*4d6fc14bSjoerg __st_ = __rhs.__st_; 345*4d6fc14bSjoerg __st_last_ = __rhs.__st_last_; 346*4d6fc14bSjoerg __om_ = __rhs.__om_; 347*4d6fc14bSjoerg __cm_ = __rhs.__cm_; 348*4d6fc14bSjoerg __owns_eb_ = __rhs.__owns_eb_; 349*4d6fc14bSjoerg __owns_ib_ = __rhs.__owns_ib_; 350*4d6fc14bSjoerg __always_noconv_ = __rhs.__always_noconv_; 351*4d6fc14bSjoerg if (__rhs.pbase()) 352*4d6fc14bSjoerg { 353*4d6fc14bSjoerg if (__rhs.pbase() == __rhs.__intbuf_) 354*4d6fc14bSjoerg this->setp(__intbuf_, __intbuf_ + (__rhs. epptr() - __rhs.pbase())); 355*4d6fc14bSjoerg else 356*4d6fc14bSjoerg this->setp((char_type*)__extbuf_, 357*4d6fc14bSjoerg (char_type*)__extbuf_ + (__rhs. epptr() - __rhs.pbase())); 358*4d6fc14bSjoerg this->__pbump(__rhs. pptr() - __rhs.pbase()); 359*4d6fc14bSjoerg } 360*4d6fc14bSjoerg else if (__rhs.eback()) 361*4d6fc14bSjoerg { 362*4d6fc14bSjoerg if (__rhs.eback() == __rhs.__intbuf_) 363*4d6fc14bSjoerg this->setg(__intbuf_, __intbuf_ + (__rhs.gptr() - __rhs.eback()), 364*4d6fc14bSjoerg __intbuf_ + (__rhs.egptr() - __rhs.eback())); 365*4d6fc14bSjoerg else 366*4d6fc14bSjoerg this->setg((char_type*)__extbuf_, 367*4d6fc14bSjoerg (char_type*)__extbuf_ + (__rhs.gptr() - __rhs.eback()), 368*4d6fc14bSjoerg (char_type*)__extbuf_ + (__rhs.egptr() - __rhs.eback())); 369*4d6fc14bSjoerg } 370*4d6fc14bSjoerg __rhs.__extbuf_ = nullptr; 371*4d6fc14bSjoerg __rhs.__extbufnext_ = nullptr; 372*4d6fc14bSjoerg __rhs.__extbufend_ = nullptr; 373*4d6fc14bSjoerg __rhs.__ebs_ = 0; 374*4d6fc14bSjoerg __rhs.__intbuf_ = 0; 375*4d6fc14bSjoerg __rhs.__ibs_ = 0; 376*4d6fc14bSjoerg __rhs.__file_ = nullptr; 377*4d6fc14bSjoerg __rhs.__st_ = state_type(); 378*4d6fc14bSjoerg __rhs.__st_last_ = state_type(); 379*4d6fc14bSjoerg __rhs.__om_ = 0; 380*4d6fc14bSjoerg __rhs.__cm_ = 0; 381*4d6fc14bSjoerg __rhs.__owns_eb_ = false; 382*4d6fc14bSjoerg __rhs.__owns_ib_ = false; 383*4d6fc14bSjoerg __rhs.setg(0, 0, 0); 384*4d6fc14bSjoerg __rhs.setp(0, 0); 385*4d6fc14bSjoerg} 386*4d6fc14bSjoerg 387*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 388*4d6fc14bSjoerginline 389*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>& 390*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::operator=(basic_filebuf&& __rhs) 391*4d6fc14bSjoerg{ 392*4d6fc14bSjoerg close(); 393*4d6fc14bSjoerg swap(__rhs); 394*4d6fc14bSjoerg return *this; 395*4d6fc14bSjoerg} 396*4d6fc14bSjoerg 397*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 398*4d6fc14bSjoerg 399*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 400*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::~basic_filebuf() 401*4d6fc14bSjoerg{ 402*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 403*4d6fc14bSjoerg try 404*4d6fc14bSjoerg { 405*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 406*4d6fc14bSjoerg close(); 407*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 408*4d6fc14bSjoerg } 409*4d6fc14bSjoerg catch (...) 410*4d6fc14bSjoerg { 411*4d6fc14bSjoerg } 412*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 413*4d6fc14bSjoerg if (__owns_eb_) 414*4d6fc14bSjoerg delete [] __extbuf_; 415*4d6fc14bSjoerg if (__owns_ib_) 416*4d6fc14bSjoerg delete [] __intbuf_; 417*4d6fc14bSjoerg} 418*4d6fc14bSjoerg 419*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 420*4d6fc14bSjoergvoid 421*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::swap(basic_filebuf& __rhs) 422*4d6fc14bSjoerg{ 423*4d6fc14bSjoerg basic_streambuf<char_type, traits_type>::swap(__rhs); 424*4d6fc14bSjoerg if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_) 425*4d6fc14bSjoerg { 426*4d6fc14bSjoerg _VSTD::swap(__extbuf_, __rhs.__extbuf_); 427*4d6fc14bSjoerg _VSTD::swap(__extbufnext_, __rhs.__extbufnext_); 428*4d6fc14bSjoerg _VSTD::swap(__extbufend_, __rhs.__extbufend_); 429*4d6fc14bSjoerg } 430*4d6fc14bSjoerg else 431*4d6fc14bSjoerg { 432*4d6fc14bSjoerg ptrdiff_t __ln = __extbufnext_ - __extbuf_; 433*4d6fc14bSjoerg ptrdiff_t __le = __extbufend_ - __extbuf_; 434*4d6fc14bSjoerg ptrdiff_t __rn = __rhs.__extbufnext_ - __rhs.__extbuf_; 435*4d6fc14bSjoerg ptrdiff_t __re = __rhs.__extbufend_ - __rhs.__extbuf_; 436*4d6fc14bSjoerg if (__extbuf_ == __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_) 437*4d6fc14bSjoerg { 438*4d6fc14bSjoerg __extbuf_ = __rhs.__extbuf_; 439*4d6fc14bSjoerg __rhs.__extbuf_ = __rhs.__extbuf_min_; 440*4d6fc14bSjoerg } 441*4d6fc14bSjoerg else if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ == __rhs.__extbuf_min_) 442*4d6fc14bSjoerg { 443*4d6fc14bSjoerg __rhs.__extbuf_ = __extbuf_; 444*4d6fc14bSjoerg __extbuf_ = __extbuf_min_; 445*4d6fc14bSjoerg } 446*4d6fc14bSjoerg __extbufnext_ = __extbuf_ + __rn; 447*4d6fc14bSjoerg __extbufend_ = __extbuf_ + __re; 448*4d6fc14bSjoerg __rhs.__extbufnext_ = __rhs.__extbuf_ + __ln; 449*4d6fc14bSjoerg __rhs.__extbufend_ = __rhs.__extbuf_ + __le; 450*4d6fc14bSjoerg } 451*4d6fc14bSjoerg _VSTD::swap(__ebs_, __rhs.__ebs_); 452*4d6fc14bSjoerg _VSTD::swap(__intbuf_, __rhs.__intbuf_); 453*4d6fc14bSjoerg _VSTD::swap(__ibs_, __rhs.__ibs_); 454*4d6fc14bSjoerg _VSTD::swap(__file_, __rhs.__file_); 455*4d6fc14bSjoerg _VSTD::swap(__cv_, __rhs.__cv_); 456*4d6fc14bSjoerg _VSTD::swap(__st_, __rhs.__st_); 457*4d6fc14bSjoerg _VSTD::swap(__st_last_, __rhs.__st_last_); 458*4d6fc14bSjoerg _VSTD::swap(__om_, __rhs.__om_); 459*4d6fc14bSjoerg _VSTD::swap(__cm_, __rhs.__cm_); 460*4d6fc14bSjoerg _VSTD::swap(__owns_eb_, __rhs.__owns_eb_); 461*4d6fc14bSjoerg _VSTD::swap(__owns_ib_, __rhs.__owns_ib_); 462*4d6fc14bSjoerg _VSTD::swap(__always_noconv_, __rhs.__always_noconv_); 463*4d6fc14bSjoerg if (this->eback() == (char_type*)__rhs.__extbuf_min_) 464*4d6fc14bSjoerg { 465*4d6fc14bSjoerg ptrdiff_t __n = this->gptr() - this->eback(); 466*4d6fc14bSjoerg ptrdiff_t __e = this->egptr() - this->eback(); 467*4d6fc14bSjoerg this->setg((char_type*)__extbuf_min_, 468*4d6fc14bSjoerg (char_type*)__extbuf_min_ + __n, 469*4d6fc14bSjoerg (char_type*)__extbuf_min_ + __e); 470*4d6fc14bSjoerg } 471*4d6fc14bSjoerg else if (this->pbase() == (char_type*)__rhs.__extbuf_min_) 472*4d6fc14bSjoerg { 473*4d6fc14bSjoerg ptrdiff_t __n = this->pptr() - this->pbase(); 474*4d6fc14bSjoerg ptrdiff_t __e = this->epptr() - this->pbase(); 475*4d6fc14bSjoerg this->setp((char_type*)__extbuf_min_, 476*4d6fc14bSjoerg (char_type*)__extbuf_min_ + __e); 477*4d6fc14bSjoerg this->__pbump(__n); 478*4d6fc14bSjoerg } 479*4d6fc14bSjoerg if (__rhs.eback() == (char_type*)__extbuf_min_) 480*4d6fc14bSjoerg { 481*4d6fc14bSjoerg ptrdiff_t __n = __rhs.gptr() - __rhs.eback(); 482*4d6fc14bSjoerg ptrdiff_t __e = __rhs.egptr() - __rhs.eback(); 483*4d6fc14bSjoerg __rhs.setg((char_type*)__rhs.__extbuf_min_, 484*4d6fc14bSjoerg (char_type*)__rhs.__extbuf_min_ + __n, 485*4d6fc14bSjoerg (char_type*)__rhs.__extbuf_min_ + __e); 486*4d6fc14bSjoerg } 487*4d6fc14bSjoerg else if (__rhs.pbase() == (char_type*)__extbuf_min_) 488*4d6fc14bSjoerg { 489*4d6fc14bSjoerg ptrdiff_t __n = __rhs.pptr() - __rhs.pbase(); 490*4d6fc14bSjoerg ptrdiff_t __e = __rhs.epptr() - __rhs.pbase(); 491*4d6fc14bSjoerg __rhs.setp((char_type*)__rhs.__extbuf_min_, 492*4d6fc14bSjoerg (char_type*)__rhs.__extbuf_min_ + __e); 493*4d6fc14bSjoerg __rhs.__pbump(__n); 494*4d6fc14bSjoerg } 495*4d6fc14bSjoerg} 496*4d6fc14bSjoerg 497*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 498*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 499*4d6fc14bSjoergvoid 500*4d6fc14bSjoergswap(basic_filebuf<_CharT, _Traits>& __x, basic_filebuf<_CharT, _Traits>& __y) 501*4d6fc14bSjoerg{ 502*4d6fc14bSjoerg __x.swap(__y); 503*4d6fc14bSjoerg} 504*4d6fc14bSjoerg 505*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 506*4d6fc14bSjoerginline 507*4d6fc14bSjoergbool 508*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::is_open() const 509*4d6fc14bSjoerg{ 510*4d6fc14bSjoerg return __file_ != nullptr; 511*4d6fc14bSjoerg} 512*4d6fc14bSjoerg 513*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 514*4d6fc14bSjoergconst char* basic_filebuf<_CharT, _Traits>::__make_mdstring( 515*4d6fc14bSjoerg ios_base::openmode __mode) _NOEXCEPT { 516*4d6fc14bSjoerg switch (__mode & ~ios_base::ate) { 517*4d6fc14bSjoerg case ios_base::out: 518*4d6fc14bSjoerg case ios_base::out | ios_base::trunc: 519*4d6fc14bSjoerg return "w" _LIBCPP_FOPEN_CLOEXEC_MODE; 520*4d6fc14bSjoerg case ios_base::out | ios_base::app: 521*4d6fc14bSjoerg case ios_base::app: 522*4d6fc14bSjoerg return "a" _LIBCPP_FOPEN_CLOEXEC_MODE; 523*4d6fc14bSjoerg case ios_base::in: 524*4d6fc14bSjoerg return "r" _LIBCPP_FOPEN_CLOEXEC_MODE; 525*4d6fc14bSjoerg case ios_base::in | ios_base::out: 526*4d6fc14bSjoerg return "r+" _LIBCPP_FOPEN_CLOEXEC_MODE; 527*4d6fc14bSjoerg case ios_base::in | ios_base::out | ios_base::trunc: 528*4d6fc14bSjoerg return "w+" _LIBCPP_FOPEN_CLOEXEC_MODE; 529*4d6fc14bSjoerg case ios_base::in | ios_base::out | ios_base::app: 530*4d6fc14bSjoerg case ios_base::in | ios_base::app: 531*4d6fc14bSjoerg return "a+" _LIBCPP_FOPEN_CLOEXEC_MODE; 532*4d6fc14bSjoerg case ios_base::out | ios_base::binary: 533*4d6fc14bSjoerg case ios_base::out | ios_base::trunc | ios_base::binary: 534*4d6fc14bSjoerg return "wb" _LIBCPP_FOPEN_CLOEXEC_MODE; 535*4d6fc14bSjoerg case ios_base::out | ios_base::app | ios_base::binary: 536*4d6fc14bSjoerg case ios_base::app | ios_base::binary: 537*4d6fc14bSjoerg return "ab" _LIBCPP_FOPEN_CLOEXEC_MODE; 538*4d6fc14bSjoerg case ios_base::in | ios_base::binary: 539*4d6fc14bSjoerg return "rb" _LIBCPP_FOPEN_CLOEXEC_MODE; 540*4d6fc14bSjoerg case ios_base::in | ios_base::out | ios_base::binary: 541*4d6fc14bSjoerg return "r+b" _LIBCPP_FOPEN_CLOEXEC_MODE; 542*4d6fc14bSjoerg case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary: 543*4d6fc14bSjoerg return "w+b" _LIBCPP_FOPEN_CLOEXEC_MODE; 544*4d6fc14bSjoerg case ios_base::in | ios_base::out | ios_base::app | ios_base::binary: 545*4d6fc14bSjoerg case ios_base::in | ios_base::app | ios_base::binary: 546*4d6fc14bSjoerg return "a+b" _LIBCPP_FOPEN_CLOEXEC_MODE; 547*4d6fc14bSjoerg default: 548*4d6fc14bSjoerg return nullptr; 549*4d6fc14bSjoerg } 550*4d6fc14bSjoerg _LIBCPP_UNREACHABLE(); 551*4d6fc14bSjoerg} 552*4d6fc14bSjoerg 553*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE 554*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 555*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>* 556*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode) 557*4d6fc14bSjoerg{ 558*4d6fc14bSjoerg basic_filebuf<_CharT, _Traits>* __rt = nullptr; 559*4d6fc14bSjoerg if (__file_ == nullptr) 560*4d6fc14bSjoerg { 561*4d6fc14bSjoerg if (const char* __mdstr = __make_mdstring(__mode)) { 562*4d6fc14bSjoerg __rt = this; 563*4d6fc14bSjoerg __file_ = fopen(__s, __mdstr); 564*4d6fc14bSjoerg if (__file_) { 565*4d6fc14bSjoerg __om_ = __mode; 566*4d6fc14bSjoerg if (__mode & ios_base::ate) { 567*4d6fc14bSjoerg if (fseek(__file_, 0, SEEK_END)) { 568*4d6fc14bSjoerg fclose(__file_); 569*4d6fc14bSjoerg __file_ = nullptr; 570*4d6fc14bSjoerg __rt = nullptr; 571*4d6fc14bSjoerg } 572*4d6fc14bSjoerg } 573*4d6fc14bSjoerg } else 574*4d6fc14bSjoerg __rt = nullptr; 575*4d6fc14bSjoerg } 576*4d6fc14bSjoerg } 577*4d6fc14bSjoerg return __rt; 578*4d6fc14bSjoerg} 579*4d6fc14bSjoerg 580*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 581*4d6fc14bSjoerginline 582*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>* 583*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::__open(int __fd, ios_base::openmode __mode) { 584*4d6fc14bSjoerg basic_filebuf<_CharT, _Traits>* __rt = nullptr; 585*4d6fc14bSjoerg if (__file_ == nullptr) { 586*4d6fc14bSjoerg if (const char* __mdstr = __make_mdstring(__mode)) { 587*4d6fc14bSjoerg __rt = this; 588*4d6fc14bSjoerg __file_ = fdopen(__fd, __mdstr); 589*4d6fc14bSjoerg if (__file_) { 590*4d6fc14bSjoerg __om_ = __mode; 591*4d6fc14bSjoerg if (__mode & ios_base::ate) { 592*4d6fc14bSjoerg if (fseek(__file_, 0, SEEK_END)) { 593*4d6fc14bSjoerg fclose(__file_); 594*4d6fc14bSjoerg __file_ = nullptr; 595*4d6fc14bSjoerg __rt = nullptr; 596*4d6fc14bSjoerg } 597*4d6fc14bSjoerg } 598*4d6fc14bSjoerg } else 599*4d6fc14bSjoerg __rt = nullptr; 600*4d6fc14bSjoerg } 601*4d6fc14bSjoerg } 602*4d6fc14bSjoerg return __rt; 603*4d6fc14bSjoerg} 604*4d6fc14bSjoerg 605*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR 606*4d6fc14bSjoerg// This is basically the same as the char* overload except that it uses _wfopen 607*4d6fc14bSjoerg// and long mode strings. 608*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 609*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>* 610*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode) 611*4d6fc14bSjoerg{ 612*4d6fc14bSjoerg basic_filebuf<_CharT, _Traits>* __rt = nullptr; 613*4d6fc14bSjoerg if (__file_ == nullptr) 614*4d6fc14bSjoerg { 615*4d6fc14bSjoerg __rt = this; 616*4d6fc14bSjoerg const wchar_t* __mdstr; 617*4d6fc14bSjoerg switch (__mode & ~ios_base::ate) 618*4d6fc14bSjoerg { 619*4d6fc14bSjoerg case ios_base::out: 620*4d6fc14bSjoerg case ios_base::out | ios_base::trunc: 621*4d6fc14bSjoerg __mdstr = L"w"; 622*4d6fc14bSjoerg break; 623*4d6fc14bSjoerg case ios_base::out | ios_base::app: 624*4d6fc14bSjoerg case ios_base::app: 625*4d6fc14bSjoerg __mdstr = L"a"; 626*4d6fc14bSjoerg break; 627*4d6fc14bSjoerg case ios_base::in: 628*4d6fc14bSjoerg __mdstr = L"r"; 629*4d6fc14bSjoerg break; 630*4d6fc14bSjoerg case ios_base::in | ios_base::out: 631*4d6fc14bSjoerg __mdstr = L"r+"; 632*4d6fc14bSjoerg break; 633*4d6fc14bSjoerg case ios_base::in | ios_base::out | ios_base::trunc: 634*4d6fc14bSjoerg __mdstr = L"w+"; 635*4d6fc14bSjoerg break; 636*4d6fc14bSjoerg case ios_base::in | ios_base::out | ios_base::app: 637*4d6fc14bSjoerg case ios_base::in | ios_base::app: 638*4d6fc14bSjoerg __mdstr = L"a+"; 639*4d6fc14bSjoerg break; 640*4d6fc14bSjoerg case ios_base::out | ios_base::binary: 641*4d6fc14bSjoerg case ios_base::out | ios_base::trunc | ios_base::binary: 642*4d6fc14bSjoerg __mdstr = L"wb"; 643*4d6fc14bSjoerg break; 644*4d6fc14bSjoerg case ios_base::out | ios_base::app | ios_base::binary: 645*4d6fc14bSjoerg case ios_base::app | ios_base::binary: 646*4d6fc14bSjoerg __mdstr = L"ab"; 647*4d6fc14bSjoerg break; 648*4d6fc14bSjoerg case ios_base::in | ios_base::binary: 649*4d6fc14bSjoerg __mdstr = L"rb"; 650*4d6fc14bSjoerg break; 651*4d6fc14bSjoerg case ios_base::in | ios_base::out | ios_base::binary: 652*4d6fc14bSjoerg __mdstr = L"r+b"; 653*4d6fc14bSjoerg break; 654*4d6fc14bSjoerg case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary: 655*4d6fc14bSjoerg __mdstr = L"w+b"; 656*4d6fc14bSjoerg break; 657*4d6fc14bSjoerg case ios_base::in | ios_base::out | ios_base::app | ios_base::binary: 658*4d6fc14bSjoerg case ios_base::in | ios_base::app | ios_base::binary: 659*4d6fc14bSjoerg __mdstr = L"a+b"; 660*4d6fc14bSjoerg break; 661*4d6fc14bSjoerg default: 662*4d6fc14bSjoerg __rt = nullptr; 663*4d6fc14bSjoerg break; 664*4d6fc14bSjoerg } 665*4d6fc14bSjoerg if (__rt) 666*4d6fc14bSjoerg { 667*4d6fc14bSjoerg __file_ = _wfopen(__s, __mdstr); 668*4d6fc14bSjoerg if (__file_) 669*4d6fc14bSjoerg { 670*4d6fc14bSjoerg __om_ = __mode; 671*4d6fc14bSjoerg if (__mode & ios_base::ate) 672*4d6fc14bSjoerg { 673*4d6fc14bSjoerg if (fseek(__file_, 0, SEEK_END)) 674*4d6fc14bSjoerg { 675*4d6fc14bSjoerg fclose(__file_); 676*4d6fc14bSjoerg __file_ = nullptr; 677*4d6fc14bSjoerg __rt = nullptr; 678*4d6fc14bSjoerg } 679*4d6fc14bSjoerg } 680*4d6fc14bSjoerg } 681*4d6fc14bSjoerg else 682*4d6fc14bSjoerg __rt = nullptr; 683*4d6fc14bSjoerg } 684*4d6fc14bSjoerg } 685*4d6fc14bSjoerg return __rt; 686*4d6fc14bSjoerg} 687*4d6fc14bSjoerg#endif 688*4d6fc14bSjoerg 689*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 690*4d6fc14bSjoerginline 691*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>* 692*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode) 693*4d6fc14bSjoerg{ 694*4d6fc14bSjoerg return open(__s.c_str(), __mode); 695*4d6fc14bSjoerg} 696*4d6fc14bSjoerg#endif 697*4d6fc14bSjoerg 698*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 699*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>* 700*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::close() 701*4d6fc14bSjoerg{ 702*4d6fc14bSjoerg basic_filebuf<_CharT, _Traits>* __rt = nullptr; 703*4d6fc14bSjoerg if (__file_) 704*4d6fc14bSjoerg { 705*4d6fc14bSjoerg __rt = this; 706*4d6fc14bSjoerg unique_ptr<FILE, int(*)(FILE*)> __h(__file_, fclose); 707*4d6fc14bSjoerg if (sync()) 708*4d6fc14bSjoerg __rt = nullptr; 709*4d6fc14bSjoerg if (fclose(__h.release())) 710*4d6fc14bSjoerg __rt = nullptr; 711*4d6fc14bSjoerg __file_ = nullptr; 712*4d6fc14bSjoerg setbuf(0, 0); 713*4d6fc14bSjoerg } 714*4d6fc14bSjoerg return __rt; 715*4d6fc14bSjoerg} 716*4d6fc14bSjoerg 717*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 718*4d6fc14bSjoergtypename basic_filebuf<_CharT, _Traits>::int_type 719*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::underflow() 720*4d6fc14bSjoerg{ 721*4d6fc14bSjoerg if (__file_ == nullptr) 722*4d6fc14bSjoerg return traits_type::eof(); 723*4d6fc14bSjoerg bool __initial = __read_mode(); 724*4d6fc14bSjoerg char_type __1buf; 725*4d6fc14bSjoerg if (this->gptr() == nullptr) 726*4d6fc14bSjoerg this->setg(&__1buf, &__1buf+1, &__1buf+1); 727*4d6fc14bSjoerg const size_t __unget_sz = __initial ? 0 : min<size_t>((this->egptr() - this->eback()) / 2, 4); 728*4d6fc14bSjoerg int_type __c = traits_type::eof(); 729*4d6fc14bSjoerg if (this->gptr() == this->egptr()) 730*4d6fc14bSjoerg { 731*4d6fc14bSjoerg _VSTD::memmove(this->eback(), this->egptr() - __unget_sz, __unget_sz * sizeof(char_type)); 732*4d6fc14bSjoerg if (__always_noconv_) 733*4d6fc14bSjoerg { 734*4d6fc14bSjoerg size_t __nmemb = static_cast<size_t>(this->egptr() - this->eback() - __unget_sz); 735*4d6fc14bSjoerg __nmemb = fread(this->eback() + __unget_sz, 1, __nmemb, __file_); 736*4d6fc14bSjoerg if (__nmemb != 0) 737*4d6fc14bSjoerg { 738*4d6fc14bSjoerg this->setg(this->eback(), 739*4d6fc14bSjoerg this->eback() + __unget_sz, 740*4d6fc14bSjoerg this->eback() + __unget_sz + __nmemb); 741*4d6fc14bSjoerg __c = traits_type::to_int_type(*this->gptr()); 742*4d6fc14bSjoerg } 743*4d6fc14bSjoerg } 744*4d6fc14bSjoerg else 745*4d6fc14bSjoerg { 746*4d6fc14bSjoerg _LIBCPP_ASSERT ( !(__extbufnext_ == NULL && (__extbufend_ != __extbufnext_)), "underflow moving from NULL" ); 747*4d6fc14bSjoerg if (__extbufend_ != __extbufnext_) 748*4d6fc14bSjoerg _VSTD::memmove(__extbuf_, __extbufnext_, __extbufend_ - __extbufnext_); 749*4d6fc14bSjoerg __extbufnext_ = __extbuf_ + (__extbufend_ - __extbufnext_); 750*4d6fc14bSjoerg __extbufend_ = __extbuf_ + (__extbuf_ == __extbuf_min_ ? sizeof(__extbuf_min_) : __ebs_); 751*4d6fc14bSjoerg size_t __nmemb = _VSTD::min(static_cast<size_t>(__ibs_ - __unget_sz), 752*4d6fc14bSjoerg static_cast<size_t>(__extbufend_ - __extbufnext_)); 753*4d6fc14bSjoerg codecvt_base::result __r; 754*4d6fc14bSjoerg __st_last_ = __st_; 755*4d6fc14bSjoerg size_t __nr = fread((void*) const_cast<char *>(__extbufnext_), 1, __nmemb, __file_); 756*4d6fc14bSjoerg if (__nr != 0) 757*4d6fc14bSjoerg { 758*4d6fc14bSjoerg if (!__cv_) 759*4d6fc14bSjoerg __throw_bad_cast(); 760*4d6fc14bSjoerg 761*4d6fc14bSjoerg __extbufend_ = __extbufnext_ + __nr; 762*4d6fc14bSjoerg char_type* __inext; 763*4d6fc14bSjoerg __r = __cv_->in(__st_, __extbuf_, __extbufend_, __extbufnext_, 764*4d6fc14bSjoerg this->eback() + __unget_sz, 765*4d6fc14bSjoerg this->eback() + __ibs_, __inext); 766*4d6fc14bSjoerg if (__r == codecvt_base::noconv) 767*4d6fc14bSjoerg { 768*4d6fc14bSjoerg this->setg((char_type*)__extbuf_, (char_type*)__extbuf_, 769*4d6fc14bSjoerg (char_type*)const_cast<char *>(__extbufend_)); 770*4d6fc14bSjoerg __c = traits_type::to_int_type(*this->gptr()); 771*4d6fc14bSjoerg } 772*4d6fc14bSjoerg else if (__inext != this->eback() + __unget_sz) 773*4d6fc14bSjoerg { 774*4d6fc14bSjoerg this->setg(this->eback(), this->eback() + __unget_sz, __inext); 775*4d6fc14bSjoerg __c = traits_type::to_int_type(*this->gptr()); 776*4d6fc14bSjoerg } 777*4d6fc14bSjoerg } 778*4d6fc14bSjoerg } 779*4d6fc14bSjoerg } 780*4d6fc14bSjoerg else 781*4d6fc14bSjoerg __c = traits_type::to_int_type(*this->gptr()); 782*4d6fc14bSjoerg if (this->eback() == &__1buf) 783*4d6fc14bSjoerg this->setg(nullptr, nullptr, nullptr); 784*4d6fc14bSjoerg return __c; 785*4d6fc14bSjoerg} 786*4d6fc14bSjoerg 787*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 788*4d6fc14bSjoergtypename basic_filebuf<_CharT, _Traits>::int_type 789*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::pbackfail(int_type __c) 790*4d6fc14bSjoerg{ 791*4d6fc14bSjoerg if (__file_ && this->eback() < this->gptr()) 792*4d6fc14bSjoerg { 793*4d6fc14bSjoerg if (traits_type::eq_int_type(__c, traits_type::eof())) 794*4d6fc14bSjoerg { 795*4d6fc14bSjoerg this->gbump(-1); 796*4d6fc14bSjoerg return traits_type::not_eof(__c); 797*4d6fc14bSjoerg } 798*4d6fc14bSjoerg if ((__om_ & ios_base::out) || 799*4d6fc14bSjoerg traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1])) 800*4d6fc14bSjoerg { 801*4d6fc14bSjoerg this->gbump(-1); 802*4d6fc14bSjoerg *this->gptr() = traits_type::to_char_type(__c); 803*4d6fc14bSjoerg return __c; 804*4d6fc14bSjoerg } 805*4d6fc14bSjoerg } 806*4d6fc14bSjoerg return traits_type::eof(); 807*4d6fc14bSjoerg} 808*4d6fc14bSjoerg 809*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 810*4d6fc14bSjoergtypename basic_filebuf<_CharT, _Traits>::int_type 811*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::overflow(int_type __c) 812*4d6fc14bSjoerg{ 813*4d6fc14bSjoerg if (__file_ == nullptr) 814*4d6fc14bSjoerg return traits_type::eof(); 815*4d6fc14bSjoerg __write_mode(); 816*4d6fc14bSjoerg char_type __1buf; 817*4d6fc14bSjoerg char_type* __pb_save = this->pbase(); 818*4d6fc14bSjoerg char_type* __epb_save = this->epptr(); 819*4d6fc14bSjoerg if (!traits_type::eq_int_type(__c, traits_type::eof())) 820*4d6fc14bSjoerg { 821*4d6fc14bSjoerg if (this->pptr() == nullptr) 822*4d6fc14bSjoerg this->setp(&__1buf, &__1buf+1); 823*4d6fc14bSjoerg *this->pptr() = traits_type::to_char_type(__c); 824*4d6fc14bSjoerg this->pbump(1); 825*4d6fc14bSjoerg } 826*4d6fc14bSjoerg if (this->pptr() != this->pbase()) 827*4d6fc14bSjoerg { 828*4d6fc14bSjoerg if (__always_noconv_) 829*4d6fc14bSjoerg { 830*4d6fc14bSjoerg size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase()); 831*4d6fc14bSjoerg if (fwrite(this->pbase(), sizeof(char_type), __nmemb, __file_) != __nmemb) 832*4d6fc14bSjoerg return traits_type::eof(); 833*4d6fc14bSjoerg } 834*4d6fc14bSjoerg else 835*4d6fc14bSjoerg { 836*4d6fc14bSjoerg char* __extbe = __extbuf_; 837*4d6fc14bSjoerg codecvt_base::result __r; 838*4d6fc14bSjoerg do 839*4d6fc14bSjoerg { 840*4d6fc14bSjoerg if (!__cv_) 841*4d6fc14bSjoerg __throw_bad_cast(); 842*4d6fc14bSjoerg 843*4d6fc14bSjoerg const char_type* __e; 844*4d6fc14bSjoerg __r = __cv_->out(__st_, this->pbase(), this->pptr(), __e, 845*4d6fc14bSjoerg __extbuf_, __extbuf_ + __ebs_, __extbe); 846*4d6fc14bSjoerg if (__e == this->pbase()) 847*4d6fc14bSjoerg return traits_type::eof(); 848*4d6fc14bSjoerg if (__r == codecvt_base::noconv) 849*4d6fc14bSjoerg { 850*4d6fc14bSjoerg size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase()); 851*4d6fc14bSjoerg if (fwrite(this->pbase(), 1, __nmemb, __file_) != __nmemb) 852*4d6fc14bSjoerg return traits_type::eof(); 853*4d6fc14bSjoerg } 854*4d6fc14bSjoerg else if (__r == codecvt_base::ok || __r == codecvt_base::partial) 855*4d6fc14bSjoerg { 856*4d6fc14bSjoerg size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_); 857*4d6fc14bSjoerg if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb) 858*4d6fc14bSjoerg return traits_type::eof(); 859*4d6fc14bSjoerg if (__r == codecvt_base::partial) 860*4d6fc14bSjoerg { 861*4d6fc14bSjoerg this->setp(const_cast<char_type*>(__e), this->pptr()); 862*4d6fc14bSjoerg this->__pbump(this->epptr() - this->pbase()); 863*4d6fc14bSjoerg } 864*4d6fc14bSjoerg } 865*4d6fc14bSjoerg else 866*4d6fc14bSjoerg return traits_type::eof(); 867*4d6fc14bSjoerg } while (__r == codecvt_base::partial); 868*4d6fc14bSjoerg } 869*4d6fc14bSjoerg this->setp(__pb_save, __epb_save); 870*4d6fc14bSjoerg } 871*4d6fc14bSjoerg return traits_type::not_eof(__c); 872*4d6fc14bSjoerg} 873*4d6fc14bSjoerg 874*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 875*4d6fc14bSjoergbasic_streambuf<_CharT, _Traits>* 876*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::setbuf(char_type* __s, streamsize __n) 877*4d6fc14bSjoerg{ 878*4d6fc14bSjoerg this->setg(nullptr, nullptr, nullptr); 879*4d6fc14bSjoerg this->setp(nullptr, nullptr); 880*4d6fc14bSjoerg if (__owns_eb_) 881*4d6fc14bSjoerg delete [] __extbuf_; 882*4d6fc14bSjoerg if (__owns_ib_) 883*4d6fc14bSjoerg delete [] __intbuf_; 884*4d6fc14bSjoerg __ebs_ = __n; 885*4d6fc14bSjoerg if (__ebs_ > sizeof(__extbuf_min_)) 886*4d6fc14bSjoerg { 887*4d6fc14bSjoerg if (__always_noconv_ && __s) 888*4d6fc14bSjoerg { 889*4d6fc14bSjoerg __extbuf_ = (char*)__s; 890*4d6fc14bSjoerg __owns_eb_ = false; 891*4d6fc14bSjoerg } 892*4d6fc14bSjoerg else 893*4d6fc14bSjoerg { 894*4d6fc14bSjoerg __extbuf_ = new char[__ebs_]; 895*4d6fc14bSjoerg __owns_eb_ = true; 896*4d6fc14bSjoerg } 897*4d6fc14bSjoerg } 898*4d6fc14bSjoerg else 899*4d6fc14bSjoerg { 900*4d6fc14bSjoerg __extbuf_ = __extbuf_min_; 901*4d6fc14bSjoerg __ebs_ = sizeof(__extbuf_min_); 902*4d6fc14bSjoerg __owns_eb_ = false; 903*4d6fc14bSjoerg } 904*4d6fc14bSjoerg if (!__always_noconv_) 905*4d6fc14bSjoerg { 906*4d6fc14bSjoerg __ibs_ = max<streamsize>(__n, sizeof(__extbuf_min_)); 907*4d6fc14bSjoerg if (__s && __ibs_ >= sizeof(__extbuf_min_)) 908*4d6fc14bSjoerg { 909*4d6fc14bSjoerg __intbuf_ = __s; 910*4d6fc14bSjoerg __owns_ib_ = false; 911*4d6fc14bSjoerg } 912*4d6fc14bSjoerg else 913*4d6fc14bSjoerg { 914*4d6fc14bSjoerg __intbuf_ = new char_type[__ibs_]; 915*4d6fc14bSjoerg __owns_ib_ = true; 916*4d6fc14bSjoerg } 917*4d6fc14bSjoerg } 918*4d6fc14bSjoerg else 919*4d6fc14bSjoerg { 920*4d6fc14bSjoerg __ibs_ = 0; 921*4d6fc14bSjoerg __intbuf_ = nullptr; 922*4d6fc14bSjoerg __owns_ib_ = false; 923*4d6fc14bSjoerg } 924*4d6fc14bSjoerg return this; 925*4d6fc14bSjoerg} 926*4d6fc14bSjoerg 927*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 928*4d6fc14bSjoergtypename basic_filebuf<_CharT, _Traits>::pos_type 929*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::seekoff(off_type __off, ios_base::seekdir __way, 930*4d6fc14bSjoerg ios_base::openmode) 931*4d6fc14bSjoerg{ 932*4d6fc14bSjoerg if (!__cv_) 933*4d6fc14bSjoerg __throw_bad_cast(); 934*4d6fc14bSjoerg 935*4d6fc14bSjoerg int __width = __cv_->encoding(); 936*4d6fc14bSjoerg if (__file_ == nullptr || (__width <= 0 && __off != 0) || sync()) 937*4d6fc14bSjoerg return pos_type(off_type(-1)); 938*4d6fc14bSjoerg // __width > 0 || __off == 0 939*4d6fc14bSjoerg int __whence; 940*4d6fc14bSjoerg switch (__way) 941*4d6fc14bSjoerg { 942*4d6fc14bSjoerg case ios_base::beg: 943*4d6fc14bSjoerg __whence = SEEK_SET; 944*4d6fc14bSjoerg break; 945*4d6fc14bSjoerg case ios_base::cur: 946*4d6fc14bSjoerg __whence = SEEK_CUR; 947*4d6fc14bSjoerg break; 948*4d6fc14bSjoerg case ios_base::end: 949*4d6fc14bSjoerg __whence = SEEK_END; 950*4d6fc14bSjoerg break; 951*4d6fc14bSjoerg default: 952*4d6fc14bSjoerg return pos_type(off_type(-1)); 953*4d6fc14bSjoerg } 954*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS) 955*4d6fc14bSjoerg if (fseek(__file_, __width > 0 ? __width * __off : 0, __whence)) 956*4d6fc14bSjoerg return pos_type(off_type(-1)); 957*4d6fc14bSjoerg pos_type __r = ftell(__file_); 958*4d6fc14bSjoerg#else 959*4d6fc14bSjoerg if (fseeko(__file_, __width > 0 ? __width * __off : 0, __whence)) 960*4d6fc14bSjoerg return pos_type(off_type(-1)); 961*4d6fc14bSjoerg pos_type __r = ftello(__file_); 962*4d6fc14bSjoerg#endif 963*4d6fc14bSjoerg __r.state(__st_); 964*4d6fc14bSjoerg return __r; 965*4d6fc14bSjoerg} 966*4d6fc14bSjoerg 967*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 968*4d6fc14bSjoergtypename basic_filebuf<_CharT, _Traits>::pos_type 969*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::seekpos(pos_type __sp, ios_base::openmode) 970*4d6fc14bSjoerg{ 971*4d6fc14bSjoerg if (__file_ == nullptr || sync()) 972*4d6fc14bSjoerg return pos_type(off_type(-1)); 973*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS) 974*4d6fc14bSjoerg if (fseek(__file_, __sp, SEEK_SET)) 975*4d6fc14bSjoerg return pos_type(off_type(-1)); 976*4d6fc14bSjoerg#else 977*4d6fc14bSjoerg if (fseeko(__file_, __sp, SEEK_SET)) 978*4d6fc14bSjoerg return pos_type(off_type(-1)); 979*4d6fc14bSjoerg#endif 980*4d6fc14bSjoerg __st_ = __sp.state(); 981*4d6fc14bSjoerg return __sp; 982*4d6fc14bSjoerg} 983*4d6fc14bSjoerg 984*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 985*4d6fc14bSjoergint 986*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::sync() 987*4d6fc14bSjoerg{ 988*4d6fc14bSjoerg if (__file_ == nullptr) 989*4d6fc14bSjoerg return 0; 990*4d6fc14bSjoerg if (!__cv_) 991*4d6fc14bSjoerg __throw_bad_cast(); 992*4d6fc14bSjoerg 993*4d6fc14bSjoerg if (__cm_ & ios_base::out) 994*4d6fc14bSjoerg { 995*4d6fc14bSjoerg if (this->pptr() != this->pbase()) 996*4d6fc14bSjoerg if (overflow() == traits_type::eof()) 997*4d6fc14bSjoerg return -1; 998*4d6fc14bSjoerg codecvt_base::result __r; 999*4d6fc14bSjoerg do 1000*4d6fc14bSjoerg { 1001*4d6fc14bSjoerg char* __extbe; 1002*4d6fc14bSjoerg __r = __cv_->unshift(__st_, __extbuf_, __extbuf_ + __ebs_, __extbe); 1003*4d6fc14bSjoerg size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_); 1004*4d6fc14bSjoerg if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb) 1005*4d6fc14bSjoerg return -1; 1006*4d6fc14bSjoerg } while (__r == codecvt_base::partial); 1007*4d6fc14bSjoerg if (__r == codecvt_base::error) 1008*4d6fc14bSjoerg return -1; 1009*4d6fc14bSjoerg if (fflush(__file_)) 1010*4d6fc14bSjoerg return -1; 1011*4d6fc14bSjoerg } 1012*4d6fc14bSjoerg else if (__cm_ & ios_base::in) 1013*4d6fc14bSjoerg { 1014*4d6fc14bSjoerg off_type __c; 1015*4d6fc14bSjoerg state_type __state = __st_last_; 1016*4d6fc14bSjoerg bool __update_st = false; 1017*4d6fc14bSjoerg if (__always_noconv_) 1018*4d6fc14bSjoerg __c = this->egptr() - this->gptr(); 1019*4d6fc14bSjoerg else 1020*4d6fc14bSjoerg { 1021*4d6fc14bSjoerg int __width = __cv_->encoding(); 1022*4d6fc14bSjoerg __c = __extbufend_ - __extbufnext_; 1023*4d6fc14bSjoerg if (__width > 0) 1024*4d6fc14bSjoerg __c += __width * (this->egptr() - this->gptr()); 1025*4d6fc14bSjoerg else 1026*4d6fc14bSjoerg { 1027*4d6fc14bSjoerg if (this->gptr() != this->egptr()) 1028*4d6fc14bSjoerg { 1029*4d6fc14bSjoerg const int __off = __cv_->length(__state, __extbuf_, 1030*4d6fc14bSjoerg __extbufnext_, 1031*4d6fc14bSjoerg this->gptr() - this->eback()); 1032*4d6fc14bSjoerg __c += __extbufnext_ - __extbuf_ - __off; 1033*4d6fc14bSjoerg __update_st = true; 1034*4d6fc14bSjoerg } 1035*4d6fc14bSjoerg } 1036*4d6fc14bSjoerg } 1037*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS) 1038*4d6fc14bSjoerg if (fseek(__file_, -__c, SEEK_CUR)) 1039*4d6fc14bSjoerg return -1; 1040*4d6fc14bSjoerg#else 1041*4d6fc14bSjoerg if (fseeko(__file_, -__c, SEEK_CUR)) 1042*4d6fc14bSjoerg return -1; 1043*4d6fc14bSjoerg#endif 1044*4d6fc14bSjoerg if (__update_st) 1045*4d6fc14bSjoerg __st_ = __state; 1046*4d6fc14bSjoerg __extbufnext_ = __extbufend_ = __extbuf_; 1047*4d6fc14bSjoerg this->setg(nullptr, nullptr, nullptr); 1048*4d6fc14bSjoerg __cm_ = 0; 1049*4d6fc14bSjoerg } 1050*4d6fc14bSjoerg return 0; 1051*4d6fc14bSjoerg} 1052*4d6fc14bSjoerg 1053*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1054*4d6fc14bSjoergvoid 1055*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::imbue(const locale& __loc) 1056*4d6fc14bSjoerg{ 1057*4d6fc14bSjoerg sync(); 1058*4d6fc14bSjoerg __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc); 1059*4d6fc14bSjoerg bool __old_anc = __always_noconv_; 1060*4d6fc14bSjoerg __always_noconv_ = __cv_->always_noconv(); 1061*4d6fc14bSjoerg if (__old_anc != __always_noconv_) 1062*4d6fc14bSjoerg { 1063*4d6fc14bSjoerg this->setg(nullptr, nullptr, nullptr); 1064*4d6fc14bSjoerg this->setp(nullptr, nullptr); 1065*4d6fc14bSjoerg // invariant, char_type is char, else we couldn't get here 1066*4d6fc14bSjoerg if (__always_noconv_) // need to dump __intbuf_ 1067*4d6fc14bSjoerg { 1068*4d6fc14bSjoerg if (__owns_eb_) 1069*4d6fc14bSjoerg delete [] __extbuf_; 1070*4d6fc14bSjoerg __owns_eb_ = __owns_ib_; 1071*4d6fc14bSjoerg __ebs_ = __ibs_; 1072*4d6fc14bSjoerg __extbuf_ = (char*)__intbuf_; 1073*4d6fc14bSjoerg __ibs_ = 0; 1074*4d6fc14bSjoerg __intbuf_ = nullptr; 1075*4d6fc14bSjoerg __owns_ib_ = false; 1076*4d6fc14bSjoerg } 1077*4d6fc14bSjoerg else // need to obtain an __intbuf_. 1078*4d6fc14bSjoerg { // If __extbuf_ is user-supplied, use it, else new __intbuf_ 1079*4d6fc14bSjoerg if (!__owns_eb_ && __extbuf_ != __extbuf_min_) 1080*4d6fc14bSjoerg { 1081*4d6fc14bSjoerg __ibs_ = __ebs_; 1082*4d6fc14bSjoerg __intbuf_ = (char_type*)__extbuf_; 1083*4d6fc14bSjoerg __owns_ib_ = false; 1084*4d6fc14bSjoerg __extbuf_ = new char[__ebs_]; 1085*4d6fc14bSjoerg __owns_eb_ = true; 1086*4d6fc14bSjoerg } 1087*4d6fc14bSjoerg else 1088*4d6fc14bSjoerg { 1089*4d6fc14bSjoerg __ibs_ = __ebs_; 1090*4d6fc14bSjoerg __intbuf_ = new char_type[__ibs_]; 1091*4d6fc14bSjoerg __owns_ib_ = true; 1092*4d6fc14bSjoerg } 1093*4d6fc14bSjoerg } 1094*4d6fc14bSjoerg } 1095*4d6fc14bSjoerg} 1096*4d6fc14bSjoerg 1097*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1098*4d6fc14bSjoergbool 1099*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::__read_mode() 1100*4d6fc14bSjoerg{ 1101*4d6fc14bSjoerg if (!(__cm_ & ios_base::in)) 1102*4d6fc14bSjoerg { 1103*4d6fc14bSjoerg this->setp(nullptr, nullptr); 1104*4d6fc14bSjoerg if (__always_noconv_) 1105*4d6fc14bSjoerg this->setg((char_type*)__extbuf_, 1106*4d6fc14bSjoerg (char_type*)__extbuf_ + __ebs_, 1107*4d6fc14bSjoerg (char_type*)__extbuf_ + __ebs_); 1108*4d6fc14bSjoerg else 1109*4d6fc14bSjoerg this->setg(__intbuf_, __intbuf_ + __ibs_, __intbuf_ + __ibs_); 1110*4d6fc14bSjoerg __cm_ = ios_base::in; 1111*4d6fc14bSjoerg return true; 1112*4d6fc14bSjoerg } 1113*4d6fc14bSjoerg return false; 1114*4d6fc14bSjoerg} 1115*4d6fc14bSjoerg 1116*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1117*4d6fc14bSjoergvoid 1118*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>::__write_mode() 1119*4d6fc14bSjoerg{ 1120*4d6fc14bSjoerg if (!(__cm_ & ios_base::out)) 1121*4d6fc14bSjoerg { 1122*4d6fc14bSjoerg this->setg(nullptr, nullptr, nullptr); 1123*4d6fc14bSjoerg if (__ebs_ > sizeof(__extbuf_min_)) 1124*4d6fc14bSjoerg { 1125*4d6fc14bSjoerg if (__always_noconv_) 1126*4d6fc14bSjoerg this->setp((char_type*)__extbuf_, 1127*4d6fc14bSjoerg (char_type*)__extbuf_ + (__ebs_ - 1)); 1128*4d6fc14bSjoerg else 1129*4d6fc14bSjoerg this->setp(__intbuf_, __intbuf_ + (__ibs_ - 1)); 1130*4d6fc14bSjoerg } 1131*4d6fc14bSjoerg else 1132*4d6fc14bSjoerg this->setp(nullptr, nullptr); 1133*4d6fc14bSjoerg __cm_ = ios_base::out; 1134*4d6fc14bSjoerg } 1135*4d6fc14bSjoerg} 1136*4d6fc14bSjoerg 1137*4d6fc14bSjoerg// basic_ifstream 1138*4d6fc14bSjoerg 1139*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1140*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS basic_ifstream 1141*4d6fc14bSjoerg : public basic_istream<_CharT, _Traits> 1142*4d6fc14bSjoerg{ 1143*4d6fc14bSjoergpublic: 1144*4d6fc14bSjoerg typedef _CharT char_type; 1145*4d6fc14bSjoerg typedef _Traits traits_type; 1146*4d6fc14bSjoerg typedef typename traits_type::int_type int_type; 1147*4d6fc14bSjoerg typedef typename traits_type::pos_type pos_type; 1148*4d6fc14bSjoerg typedef typename traits_type::off_type off_type; 1149*4d6fc14bSjoerg 1150*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1151*4d6fc14bSjoerg basic_ifstream(); 1152*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE 1153*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1154*4d6fc14bSjoerg explicit basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in); 1155*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR 1156*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1157*4d6fc14bSjoerg explicit basic_ifstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::in); 1158*4d6fc14bSjoerg#endif 1159*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1160*4d6fc14bSjoerg explicit basic_ifstream(const string& __s, ios_base::openmode __mode = ios_base::in); 1161*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY) 1162*4d6fc14bSjoerg _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY 1163*4d6fc14bSjoerg explicit basic_ifstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in) 1164*4d6fc14bSjoerg : basic_ifstream(__p.c_str(), __mode) {} 1165*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER >= 17 1166*4d6fc14bSjoerg#endif 1167*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 1168*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1169*4d6fc14bSjoerg basic_ifstream(basic_ifstream&& __rhs); 1170*4d6fc14bSjoerg 1171*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1172*4d6fc14bSjoerg basic_ifstream& operator=(basic_ifstream&& __rhs); 1173*4d6fc14bSjoerg#endif 1174*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1175*4d6fc14bSjoerg void swap(basic_ifstream& __rhs); 1176*4d6fc14bSjoerg 1177*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1178*4d6fc14bSjoerg basic_filebuf<char_type, traits_type>* rdbuf() const; 1179*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1180*4d6fc14bSjoerg bool is_open() const; 1181*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE 1182*4d6fc14bSjoerg void open(const char* __s, ios_base::openmode __mode = ios_base::in); 1183*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR 1184*4d6fc14bSjoerg void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::in); 1185*4d6fc14bSjoerg#endif 1186*4d6fc14bSjoerg void open(const string& __s, ios_base::openmode __mode = ios_base::in); 1187*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY) 1188*4d6fc14bSjoerg _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY 1189*4d6fc14bSjoerg void open(const filesystem::path& __p, 1190*4d6fc14bSjoerg ios_base::openmode __mode = ios_base::in) { 1191*4d6fc14bSjoerg return open(__p.c_str(), __mode); 1192*4d6fc14bSjoerg } 1193*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER >= 17 1194*4d6fc14bSjoerg 1195*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1196*4d6fc14bSjoerg void __open(int __fd, ios_base::openmode __mode); 1197*4d6fc14bSjoerg#endif 1198*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1199*4d6fc14bSjoerg void close(); 1200*4d6fc14bSjoerg 1201*4d6fc14bSjoergprivate: 1202*4d6fc14bSjoerg basic_filebuf<char_type, traits_type> __sb_; 1203*4d6fc14bSjoerg}; 1204*4d6fc14bSjoerg 1205*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1206*4d6fc14bSjoerginline 1207*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::basic_ifstream() 1208*4d6fc14bSjoerg : basic_istream<char_type, traits_type>(&__sb_) 1209*4d6fc14bSjoerg{ 1210*4d6fc14bSjoerg} 1211*4d6fc14bSjoerg 1212*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE 1213*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1214*4d6fc14bSjoerginline 1215*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::basic_ifstream(const char* __s, ios_base::openmode __mode) 1216*4d6fc14bSjoerg : basic_istream<char_type, traits_type>(&__sb_) 1217*4d6fc14bSjoerg{ 1218*4d6fc14bSjoerg if (__sb_.open(__s, __mode | ios_base::in) == nullptr) 1219*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1220*4d6fc14bSjoerg} 1221*4d6fc14bSjoerg 1222*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR 1223*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1224*4d6fc14bSjoerginline 1225*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::basic_ifstream(const wchar_t* __s, ios_base::openmode __mode) 1226*4d6fc14bSjoerg : basic_istream<char_type, traits_type>(&__sb_) 1227*4d6fc14bSjoerg{ 1228*4d6fc14bSjoerg if (__sb_.open(__s, __mode | ios_base::in) == nullptr) 1229*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1230*4d6fc14bSjoerg} 1231*4d6fc14bSjoerg#endif 1232*4d6fc14bSjoerg 1233*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1234*4d6fc14bSjoerginline 1235*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::basic_ifstream(const string& __s, ios_base::openmode __mode) 1236*4d6fc14bSjoerg : basic_istream<char_type, traits_type>(&__sb_) 1237*4d6fc14bSjoerg{ 1238*4d6fc14bSjoerg if (__sb_.open(__s, __mode | ios_base::in) == nullptr) 1239*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1240*4d6fc14bSjoerg} 1241*4d6fc14bSjoerg#endif 1242*4d6fc14bSjoerg 1243*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 1244*4d6fc14bSjoerg 1245*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1246*4d6fc14bSjoerginline 1247*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::basic_ifstream(basic_ifstream&& __rhs) 1248*4d6fc14bSjoerg : basic_istream<char_type, traits_type>(_VSTD::move(__rhs)), 1249*4d6fc14bSjoerg __sb_(_VSTD::move(__rhs.__sb_)) 1250*4d6fc14bSjoerg{ 1251*4d6fc14bSjoerg this->set_rdbuf(&__sb_); 1252*4d6fc14bSjoerg} 1253*4d6fc14bSjoerg 1254*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1255*4d6fc14bSjoerginline 1256*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>& 1257*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::operator=(basic_ifstream&& __rhs) 1258*4d6fc14bSjoerg{ 1259*4d6fc14bSjoerg basic_istream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); 1260*4d6fc14bSjoerg __sb_ = _VSTD::move(__rhs.__sb_); 1261*4d6fc14bSjoerg return *this; 1262*4d6fc14bSjoerg} 1263*4d6fc14bSjoerg 1264*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 1265*4d6fc14bSjoerg 1266*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1267*4d6fc14bSjoerginline 1268*4d6fc14bSjoergvoid 1269*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::swap(basic_ifstream& __rhs) 1270*4d6fc14bSjoerg{ 1271*4d6fc14bSjoerg basic_istream<char_type, traits_type>::swap(__rhs); 1272*4d6fc14bSjoerg __sb_.swap(__rhs.__sb_); 1273*4d6fc14bSjoerg} 1274*4d6fc14bSjoerg 1275*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1276*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1277*4d6fc14bSjoergvoid 1278*4d6fc14bSjoergswap(basic_ifstream<_CharT, _Traits>& __x, basic_ifstream<_CharT, _Traits>& __y) 1279*4d6fc14bSjoerg{ 1280*4d6fc14bSjoerg __x.swap(__y); 1281*4d6fc14bSjoerg} 1282*4d6fc14bSjoerg 1283*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1284*4d6fc14bSjoerginline 1285*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>* 1286*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::rdbuf() const 1287*4d6fc14bSjoerg{ 1288*4d6fc14bSjoerg return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_); 1289*4d6fc14bSjoerg} 1290*4d6fc14bSjoerg 1291*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1292*4d6fc14bSjoerginline 1293*4d6fc14bSjoergbool 1294*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::is_open() const 1295*4d6fc14bSjoerg{ 1296*4d6fc14bSjoerg return __sb_.is_open(); 1297*4d6fc14bSjoerg} 1298*4d6fc14bSjoerg 1299*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE 1300*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1301*4d6fc14bSjoergvoid 1302*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode) 1303*4d6fc14bSjoerg{ 1304*4d6fc14bSjoerg if (__sb_.open(__s, __mode | ios_base::in)) 1305*4d6fc14bSjoerg this->clear(); 1306*4d6fc14bSjoerg else 1307*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1308*4d6fc14bSjoerg} 1309*4d6fc14bSjoerg 1310*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR 1311*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1312*4d6fc14bSjoergvoid 1313*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode) 1314*4d6fc14bSjoerg{ 1315*4d6fc14bSjoerg if (__sb_.open(__s, __mode | ios_base::in)) 1316*4d6fc14bSjoerg this->clear(); 1317*4d6fc14bSjoerg else 1318*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1319*4d6fc14bSjoerg} 1320*4d6fc14bSjoerg#endif 1321*4d6fc14bSjoerg 1322*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1323*4d6fc14bSjoergvoid 1324*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode) 1325*4d6fc14bSjoerg{ 1326*4d6fc14bSjoerg if (__sb_.open(__s, __mode | ios_base::in)) 1327*4d6fc14bSjoerg this->clear(); 1328*4d6fc14bSjoerg else 1329*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1330*4d6fc14bSjoerg} 1331*4d6fc14bSjoerg 1332*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1333*4d6fc14bSjoerginline 1334*4d6fc14bSjoergvoid basic_ifstream<_CharT, _Traits>::__open(int __fd, 1335*4d6fc14bSjoerg ios_base::openmode __mode) { 1336*4d6fc14bSjoerg if (__sb_.__open(__fd, __mode | ios_base::in)) 1337*4d6fc14bSjoerg this->clear(); 1338*4d6fc14bSjoerg else 1339*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1340*4d6fc14bSjoerg} 1341*4d6fc14bSjoerg#endif 1342*4d6fc14bSjoerg 1343*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1344*4d6fc14bSjoerginline 1345*4d6fc14bSjoergvoid 1346*4d6fc14bSjoergbasic_ifstream<_CharT, _Traits>::close() 1347*4d6fc14bSjoerg{ 1348*4d6fc14bSjoerg if (__sb_.close() == 0) 1349*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1350*4d6fc14bSjoerg} 1351*4d6fc14bSjoerg 1352*4d6fc14bSjoerg// basic_ofstream 1353*4d6fc14bSjoerg 1354*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1355*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS basic_ofstream 1356*4d6fc14bSjoerg : public basic_ostream<_CharT, _Traits> 1357*4d6fc14bSjoerg{ 1358*4d6fc14bSjoergpublic: 1359*4d6fc14bSjoerg typedef _CharT char_type; 1360*4d6fc14bSjoerg typedef _Traits traits_type; 1361*4d6fc14bSjoerg typedef typename traits_type::int_type int_type; 1362*4d6fc14bSjoerg typedef typename traits_type::pos_type pos_type; 1363*4d6fc14bSjoerg typedef typename traits_type::off_type off_type; 1364*4d6fc14bSjoerg 1365*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1366*4d6fc14bSjoerg basic_ofstream(); 1367*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1368*4d6fc14bSjoerg explicit basic_ofstream(const char* __s, ios_base::openmode __mode = ios_base::out); 1369*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR 1370*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1371*4d6fc14bSjoerg explicit basic_ofstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::out); 1372*4d6fc14bSjoerg#endif 1373*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1374*4d6fc14bSjoerg explicit basic_ofstream(const string& __s, ios_base::openmode __mode = ios_base::out); 1375*4d6fc14bSjoerg 1376*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY) 1377*4d6fc14bSjoerg _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY 1378*4d6fc14bSjoerg explicit basic_ofstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::out) 1379*4d6fc14bSjoerg : basic_ofstream(__p.c_str(), __mode) {} 1380*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER >= 17 1381*4d6fc14bSjoerg 1382*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 1383*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1384*4d6fc14bSjoerg basic_ofstream(basic_ofstream&& __rhs); 1385*4d6fc14bSjoerg 1386*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1387*4d6fc14bSjoerg basic_ofstream& operator=(basic_ofstream&& __rhs); 1388*4d6fc14bSjoerg#endif 1389*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1390*4d6fc14bSjoerg void swap(basic_ofstream& __rhs); 1391*4d6fc14bSjoerg 1392*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1393*4d6fc14bSjoerg basic_filebuf<char_type, traits_type>* rdbuf() const; 1394*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1395*4d6fc14bSjoerg bool is_open() const; 1396*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE 1397*4d6fc14bSjoerg void open(const char* __s, ios_base::openmode __mode = ios_base::out); 1398*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR 1399*4d6fc14bSjoerg void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::out); 1400*4d6fc14bSjoerg#endif 1401*4d6fc14bSjoerg void open(const string& __s, ios_base::openmode __mode = ios_base::out); 1402*4d6fc14bSjoerg 1403*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY) 1404*4d6fc14bSjoerg _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY 1405*4d6fc14bSjoerg void open(const filesystem::path& __p, ios_base::openmode __mode = ios_base::out) 1406*4d6fc14bSjoerg { return open(__p.c_str(), __mode); } 1407*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER >= 17 1408*4d6fc14bSjoerg 1409*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1410*4d6fc14bSjoerg void __open(int __fd, ios_base::openmode __mode); 1411*4d6fc14bSjoerg#endif 1412*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1413*4d6fc14bSjoerg void close(); 1414*4d6fc14bSjoerg 1415*4d6fc14bSjoergprivate: 1416*4d6fc14bSjoerg basic_filebuf<char_type, traits_type> __sb_; 1417*4d6fc14bSjoerg}; 1418*4d6fc14bSjoerg 1419*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1420*4d6fc14bSjoerginline 1421*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::basic_ofstream() 1422*4d6fc14bSjoerg : basic_ostream<char_type, traits_type>(&__sb_) 1423*4d6fc14bSjoerg{ 1424*4d6fc14bSjoerg} 1425*4d6fc14bSjoerg 1426*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE 1427*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1428*4d6fc14bSjoerginline 1429*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::basic_ofstream(const char* __s, ios_base::openmode __mode) 1430*4d6fc14bSjoerg : basic_ostream<char_type, traits_type>(&__sb_) 1431*4d6fc14bSjoerg{ 1432*4d6fc14bSjoerg if (__sb_.open(__s, __mode | ios_base::out) == nullptr) 1433*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1434*4d6fc14bSjoerg} 1435*4d6fc14bSjoerg 1436*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR 1437*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1438*4d6fc14bSjoerginline 1439*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::basic_ofstream(const wchar_t* __s, ios_base::openmode __mode) 1440*4d6fc14bSjoerg : basic_ostream<char_type, traits_type>(&__sb_) 1441*4d6fc14bSjoerg{ 1442*4d6fc14bSjoerg if (__sb_.open(__s, __mode | ios_base::out) == nullptr) 1443*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1444*4d6fc14bSjoerg} 1445*4d6fc14bSjoerg#endif 1446*4d6fc14bSjoerg 1447*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1448*4d6fc14bSjoerginline 1449*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::basic_ofstream(const string& __s, ios_base::openmode __mode) 1450*4d6fc14bSjoerg : basic_ostream<char_type, traits_type>(&__sb_) 1451*4d6fc14bSjoerg{ 1452*4d6fc14bSjoerg if (__sb_.open(__s, __mode | ios_base::out) == nullptr) 1453*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1454*4d6fc14bSjoerg} 1455*4d6fc14bSjoerg#endif 1456*4d6fc14bSjoerg 1457*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 1458*4d6fc14bSjoerg 1459*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1460*4d6fc14bSjoerginline 1461*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::basic_ofstream(basic_ofstream&& __rhs) 1462*4d6fc14bSjoerg : basic_ostream<char_type, traits_type>(_VSTD::move(__rhs)), 1463*4d6fc14bSjoerg __sb_(_VSTD::move(__rhs.__sb_)) 1464*4d6fc14bSjoerg{ 1465*4d6fc14bSjoerg this->set_rdbuf(&__sb_); 1466*4d6fc14bSjoerg} 1467*4d6fc14bSjoerg 1468*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1469*4d6fc14bSjoerginline 1470*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>& 1471*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::operator=(basic_ofstream&& __rhs) 1472*4d6fc14bSjoerg{ 1473*4d6fc14bSjoerg basic_ostream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); 1474*4d6fc14bSjoerg __sb_ = _VSTD::move(__rhs.__sb_); 1475*4d6fc14bSjoerg return *this; 1476*4d6fc14bSjoerg} 1477*4d6fc14bSjoerg 1478*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 1479*4d6fc14bSjoerg 1480*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1481*4d6fc14bSjoerginline 1482*4d6fc14bSjoergvoid 1483*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::swap(basic_ofstream& __rhs) 1484*4d6fc14bSjoerg{ 1485*4d6fc14bSjoerg basic_ostream<char_type, traits_type>::swap(__rhs); 1486*4d6fc14bSjoerg __sb_.swap(__rhs.__sb_); 1487*4d6fc14bSjoerg} 1488*4d6fc14bSjoerg 1489*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1490*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1491*4d6fc14bSjoergvoid 1492*4d6fc14bSjoergswap(basic_ofstream<_CharT, _Traits>& __x, basic_ofstream<_CharT, _Traits>& __y) 1493*4d6fc14bSjoerg{ 1494*4d6fc14bSjoerg __x.swap(__y); 1495*4d6fc14bSjoerg} 1496*4d6fc14bSjoerg 1497*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1498*4d6fc14bSjoerginline 1499*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>* 1500*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::rdbuf() const 1501*4d6fc14bSjoerg{ 1502*4d6fc14bSjoerg return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_); 1503*4d6fc14bSjoerg} 1504*4d6fc14bSjoerg 1505*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1506*4d6fc14bSjoerginline 1507*4d6fc14bSjoergbool 1508*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::is_open() const 1509*4d6fc14bSjoerg{ 1510*4d6fc14bSjoerg return __sb_.is_open(); 1511*4d6fc14bSjoerg} 1512*4d6fc14bSjoerg 1513*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE 1514*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1515*4d6fc14bSjoergvoid 1516*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode) 1517*4d6fc14bSjoerg{ 1518*4d6fc14bSjoerg if (__sb_.open(__s, __mode | ios_base::out)) 1519*4d6fc14bSjoerg this->clear(); 1520*4d6fc14bSjoerg else 1521*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1522*4d6fc14bSjoerg} 1523*4d6fc14bSjoerg 1524*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR 1525*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1526*4d6fc14bSjoergvoid 1527*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode) 1528*4d6fc14bSjoerg{ 1529*4d6fc14bSjoerg if (__sb_.open(__s, __mode | ios_base::out)) 1530*4d6fc14bSjoerg this->clear(); 1531*4d6fc14bSjoerg else 1532*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1533*4d6fc14bSjoerg} 1534*4d6fc14bSjoerg#endif 1535*4d6fc14bSjoerg 1536*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1537*4d6fc14bSjoergvoid 1538*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode) 1539*4d6fc14bSjoerg{ 1540*4d6fc14bSjoerg if (__sb_.open(__s, __mode | ios_base::out)) 1541*4d6fc14bSjoerg this->clear(); 1542*4d6fc14bSjoerg else 1543*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1544*4d6fc14bSjoerg} 1545*4d6fc14bSjoerg 1546*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1547*4d6fc14bSjoerginline 1548*4d6fc14bSjoergvoid basic_ofstream<_CharT, _Traits>::__open(int __fd, 1549*4d6fc14bSjoerg ios_base::openmode __mode) { 1550*4d6fc14bSjoerg if (__sb_.__open(__fd, __mode | ios_base::out)) 1551*4d6fc14bSjoerg this->clear(); 1552*4d6fc14bSjoerg else 1553*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1554*4d6fc14bSjoerg} 1555*4d6fc14bSjoerg#endif 1556*4d6fc14bSjoerg 1557*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1558*4d6fc14bSjoerginline 1559*4d6fc14bSjoergvoid 1560*4d6fc14bSjoergbasic_ofstream<_CharT, _Traits>::close() 1561*4d6fc14bSjoerg{ 1562*4d6fc14bSjoerg if (__sb_.close() == nullptr) 1563*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1564*4d6fc14bSjoerg} 1565*4d6fc14bSjoerg 1566*4d6fc14bSjoerg// basic_fstream 1567*4d6fc14bSjoerg 1568*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1569*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS basic_fstream 1570*4d6fc14bSjoerg : public basic_iostream<_CharT, _Traits> 1571*4d6fc14bSjoerg{ 1572*4d6fc14bSjoergpublic: 1573*4d6fc14bSjoerg typedef _CharT char_type; 1574*4d6fc14bSjoerg typedef _Traits traits_type; 1575*4d6fc14bSjoerg typedef typename traits_type::int_type int_type; 1576*4d6fc14bSjoerg typedef typename traits_type::pos_type pos_type; 1577*4d6fc14bSjoerg typedef typename traits_type::off_type off_type; 1578*4d6fc14bSjoerg 1579*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1580*4d6fc14bSjoerg basic_fstream(); 1581*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE 1582*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1583*4d6fc14bSjoerg explicit basic_fstream(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out); 1584*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR 1585*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1586*4d6fc14bSjoerg explicit basic_fstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::in | ios_base::out); 1587*4d6fc14bSjoerg#endif 1588*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1589*4d6fc14bSjoerg explicit basic_fstream(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out); 1590*4d6fc14bSjoerg 1591*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY) 1592*4d6fc14bSjoerg _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY 1593*4d6fc14bSjoerg explicit basic_fstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in | ios_base::out) 1594*4d6fc14bSjoerg : basic_fstream(__p.c_str(), __mode) {} 1595*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER >= 17 1596*4d6fc14bSjoerg 1597*4d6fc14bSjoerg#endif 1598*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 1599*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1600*4d6fc14bSjoerg basic_fstream(basic_fstream&& __rhs); 1601*4d6fc14bSjoerg 1602*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1603*4d6fc14bSjoerg basic_fstream& operator=(basic_fstream&& __rhs); 1604*4d6fc14bSjoerg#endif 1605*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1606*4d6fc14bSjoerg void swap(basic_fstream& __rhs); 1607*4d6fc14bSjoerg 1608*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1609*4d6fc14bSjoerg basic_filebuf<char_type, traits_type>* rdbuf() const; 1610*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1611*4d6fc14bSjoerg bool is_open() const; 1612*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE 1613*4d6fc14bSjoerg void open(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out); 1614*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR 1615*4d6fc14bSjoerg void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::in | ios_base::out); 1616*4d6fc14bSjoerg#endif 1617*4d6fc14bSjoerg void open(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out); 1618*4d6fc14bSjoerg 1619*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY) 1620*4d6fc14bSjoerg _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY 1621*4d6fc14bSjoerg void open(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in|ios_base::out) 1622*4d6fc14bSjoerg { return open(__p.c_str(), __mode); } 1623*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER >= 17 1624*4d6fc14bSjoerg 1625*4d6fc14bSjoerg#endif 1626*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1627*4d6fc14bSjoerg void close(); 1628*4d6fc14bSjoerg 1629*4d6fc14bSjoergprivate: 1630*4d6fc14bSjoerg basic_filebuf<char_type, traits_type> __sb_; 1631*4d6fc14bSjoerg}; 1632*4d6fc14bSjoerg 1633*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1634*4d6fc14bSjoerginline 1635*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::basic_fstream() 1636*4d6fc14bSjoerg : basic_iostream<char_type, traits_type>(&__sb_) 1637*4d6fc14bSjoerg{ 1638*4d6fc14bSjoerg} 1639*4d6fc14bSjoerg 1640*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE 1641*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1642*4d6fc14bSjoerginline 1643*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::basic_fstream(const char* __s, ios_base::openmode __mode) 1644*4d6fc14bSjoerg : basic_iostream<char_type, traits_type>(&__sb_) 1645*4d6fc14bSjoerg{ 1646*4d6fc14bSjoerg if (__sb_.open(__s, __mode) == nullptr) 1647*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1648*4d6fc14bSjoerg} 1649*4d6fc14bSjoerg 1650*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR 1651*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1652*4d6fc14bSjoerginline 1653*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::basic_fstream(const wchar_t* __s, ios_base::openmode __mode) 1654*4d6fc14bSjoerg : basic_iostream<char_type, traits_type>(&__sb_) 1655*4d6fc14bSjoerg{ 1656*4d6fc14bSjoerg if (__sb_.open(__s, __mode) == nullptr) 1657*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1658*4d6fc14bSjoerg} 1659*4d6fc14bSjoerg#endif 1660*4d6fc14bSjoerg 1661*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1662*4d6fc14bSjoerginline 1663*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::basic_fstream(const string& __s, ios_base::openmode __mode) 1664*4d6fc14bSjoerg : basic_iostream<char_type, traits_type>(&__sb_) 1665*4d6fc14bSjoerg{ 1666*4d6fc14bSjoerg if (__sb_.open(__s, __mode) == nullptr) 1667*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1668*4d6fc14bSjoerg} 1669*4d6fc14bSjoerg#endif 1670*4d6fc14bSjoerg 1671*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 1672*4d6fc14bSjoerg 1673*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1674*4d6fc14bSjoerginline 1675*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::basic_fstream(basic_fstream&& __rhs) 1676*4d6fc14bSjoerg : basic_iostream<char_type, traits_type>(_VSTD::move(__rhs)), 1677*4d6fc14bSjoerg __sb_(_VSTD::move(__rhs.__sb_)) 1678*4d6fc14bSjoerg{ 1679*4d6fc14bSjoerg this->set_rdbuf(&__sb_); 1680*4d6fc14bSjoerg} 1681*4d6fc14bSjoerg 1682*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1683*4d6fc14bSjoerginline 1684*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>& 1685*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::operator=(basic_fstream&& __rhs) 1686*4d6fc14bSjoerg{ 1687*4d6fc14bSjoerg basic_iostream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); 1688*4d6fc14bSjoerg __sb_ = _VSTD::move(__rhs.__sb_); 1689*4d6fc14bSjoerg return *this; 1690*4d6fc14bSjoerg} 1691*4d6fc14bSjoerg 1692*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 1693*4d6fc14bSjoerg 1694*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1695*4d6fc14bSjoerginline 1696*4d6fc14bSjoergvoid 1697*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::swap(basic_fstream& __rhs) 1698*4d6fc14bSjoerg{ 1699*4d6fc14bSjoerg basic_iostream<char_type, traits_type>::swap(__rhs); 1700*4d6fc14bSjoerg __sb_.swap(__rhs.__sb_); 1701*4d6fc14bSjoerg} 1702*4d6fc14bSjoerg 1703*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1704*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1705*4d6fc14bSjoergvoid 1706*4d6fc14bSjoergswap(basic_fstream<_CharT, _Traits>& __x, basic_fstream<_CharT, _Traits>& __y) 1707*4d6fc14bSjoerg{ 1708*4d6fc14bSjoerg __x.swap(__y); 1709*4d6fc14bSjoerg} 1710*4d6fc14bSjoerg 1711*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1712*4d6fc14bSjoerginline 1713*4d6fc14bSjoergbasic_filebuf<_CharT, _Traits>* 1714*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::rdbuf() const 1715*4d6fc14bSjoerg{ 1716*4d6fc14bSjoerg return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_); 1717*4d6fc14bSjoerg} 1718*4d6fc14bSjoerg 1719*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1720*4d6fc14bSjoerginline 1721*4d6fc14bSjoergbool 1722*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::is_open() const 1723*4d6fc14bSjoerg{ 1724*4d6fc14bSjoerg return __sb_.is_open(); 1725*4d6fc14bSjoerg} 1726*4d6fc14bSjoerg 1727*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE 1728*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1729*4d6fc14bSjoergvoid 1730*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode) 1731*4d6fc14bSjoerg{ 1732*4d6fc14bSjoerg if (__sb_.open(__s, __mode)) 1733*4d6fc14bSjoerg this->clear(); 1734*4d6fc14bSjoerg else 1735*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1736*4d6fc14bSjoerg} 1737*4d6fc14bSjoerg 1738*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR 1739*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1740*4d6fc14bSjoergvoid 1741*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode) 1742*4d6fc14bSjoerg{ 1743*4d6fc14bSjoerg if (__sb_.open(__s, __mode)) 1744*4d6fc14bSjoerg this->clear(); 1745*4d6fc14bSjoerg else 1746*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1747*4d6fc14bSjoerg} 1748*4d6fc14bSjoerg#endif 1749*4d6fc14bSjoerg 1750*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1751*4d6fc14bSjoergvoid 1752*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode) 1753*4d6fc14bSjoerg{ 1754*4d6fc14bSjoerg if (__sb_.open(__s, __mode)) 1755*4d6fc14bSjoerg this->clear(); 1756*4d6fc14bSjoerg else 1757*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1758*4d6fc14bSjoerg} 1759*4d6fc14bSjoerg#endif 1760*4d6fc14bSjoerg 1761*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 1762*4d6fc14bSjoerginline 1763*4d6fc14bSjoergvoid 1764*4d6fc14bSjoergbasic_fstream<_CharT, _Traits>::close() 1765*4d6fc14bSjoerg{ 1766*4d6fc14bSjoerg if (__sb_.close() == nullptr) 1767*4d6fc14bSjoerg this->setstate(ios_base::failbit); 1768*4d6fc14bSjoerg} 1769*4d6fc14bSjoerg 1770*4d6fc14bSjoerg#if defined(_LIBCPP_ABI_ENABLE_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1) 1771*4d6fc14bSjoerg_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ifstream<char>) 1772*4d6fc14bSjoerg_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ofstream<char>) 1773*4d6fc14bSjoerg_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_filebuf<char>) 1774*4d6fc14bSjoerg#endif 1775*4d6fc14bSjoerg 1776*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_STD 1777*4d6fc14bSjoerg 1778*4d6fc14bSjoerg_LIBCPP_POP_MACROS 1779*4d6fc14bSjoerg 1780*4d6fc14bSjoerg#endif // _LIBCPP_FSTREAM 1781