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