35 #define _FSTREAM_TCC 1 37 #pragma GCC system_header 42 namespace std _GLIBCXX_VISIBILITY(default)
44 _GLIBCXX_BEGIN_NAMESPACE_VERSION
46 template<
typename _CharT,
typename _Traits>
48 basic_filebuf<_CharT, _Traits>::
49 _M_allocate_internal_buffer()
53 if (!_M_buf_allocated && !_M_buf)
55 _M_buf =
new char_type[_M_buf_size];
56 _M_buf_allocated =
true;
60 template<
typename _CharT,
typename _Traits>
62 basic_filebuf<_CharT, _Traits>::
63 _M_destroy_internal_buffer() throw()
69 _M_buf_allocated =
false;
78 template<
typename _CharT,
typename _Traits>
81 _M_mode(
ios_base::openmode(0)), _M_state_beg(), _M_state_cur(),
82 _M_state_last(), _M_buf(0), _M_buf_size(BUFSIZ),
83 _M_buf_allocated(false), _M_reading(false), _M_writing(false), _M_pback(),
84 _M_pback_cur_save(0), _M_pback_end_save(0), _M_pback_init(false),
85 _M_codecvt(0), _M_ext_buf(0), _M_ext_buf_size(0), _M_ext_next(0),
92 #if __cplusplus >= 201103L 93 template<
typename _CharT,
typename _Traits>
97 _M_lock(), _M_file(std::move(__rhs._M_file), &_M_lock),
98 _M_mode(std::__exchange(__rhs._M_mode, ios_base::openmode(0))),
99 _M_state_beg(std::move(__rhs._M_state_beg)),
100 _M_state_cur(std::move(__rhs._M_state_cur)),
101 _M_state_last(std::move(__rhs._M_state_last)),
102 _M_buf(std::__exchange(__rhs._M_buf,
nullptr)),
103 _M_buf_size(std::__exchange(__rhs._M_buf_size, 1)),
104 _M_buf_allocated(std::__exchange(__rhs._M_buf_allocated,
false)),
105 _M_reading(std::__exchange(__rhs._M_reading,
false)),
106 _M_writing(std::__exchange(__rhs._M_writing,
false)),
111 _M_codecvt(__rhs._M_codecvt),
112 _M_ext_buf(std::__exchange(__rhs._M_ext_buf,
nullptr)),
114 _M_ext_next(std::__exchange(__rhs._M_ext_next,
nullptr)),
115 _M_ext_end(std::__exchange(__rhs._M_ext_end,
nullptr))
117 __rhs._M_set_buffer(-1);
118 __rhs._M_state_last = __rhs._M_state_cur = __rhs._M_state_beg;
121 template<
typename _CharT,
typename _Traits>
127 __streambuf_type::operator=(__rhs);
128 _M_file.swap(__rhs._M_file);
129 _M_mode = std::__exchange(__rhs._M_mode, ios_base::openmode(0));
130 _M_state_beg = std::move(__rhs._M_state_beg);
131 _M_state_cur = std::move(__rhs._M_state_cur);
132 _M_state_last = std::move(__rhs._M_state_last);
133 _M_buf = std::__exchange(__rhs._M_buf,
nullptr);
134 _M_buf_size = std::__exchange(__rhs._M_buf_size, 1);
135 _M_buf_allocated = std::__exchange(__rhs._M_buf_allocated,
false);
136 _M_ext_buf = std::__exchange(__rhs._M_ext_buf,
nullptr);
138 _M_ext_next = std::__exchange(__rhs._M_ext_next,
nullptr);
139 _M_ext_end = std::__exchange(__rhs._M_ext_end,
nullptr);
140 _M_reading = std::__exchange(__rhs._M_reading,
false);
141 _M_writing = std::__exchange(__rhs._M_writing,
false);
145 __rhs._M_set_buffer(-1);
146 __rhs._M_state_last = __rhs._M_state_cur = __rhs._M_state_beg;
150 template<
typename _CharT,
typename _Traits>
155 __streambuf_type::swap(__rhs);
156 _M_file.swap(__rhs._M_file);
158 std::swap(_M_state_beg, __rhs._M_state_beg);
159 std::swap(_M_state_cur, __rhs._M_state_cur);
160 std::swap(_M_state_last, __rhs._M_state_last);
163 std::swap(_M_buf_allocated, __rhs._M_buf_allocated);
167 std::swap(_M_ext_end, __rhs._M_ext_end);
169 std::swap(_M_writing, __rhs._M_writing);
176 template<
typename _CharT,
typename _Traits>
179 open(
const char* __s, ios_base::openmode __mode)
184 _M_file.open(__s, __mode);
187 _M_allocate_internal_buffer();
196 _M_state_last = _M_state_cur = _M_state_beg;
201 == pos_type(off_type(-1)))
210 template<
typename _CharT,
typename _Traits>
218 bool __testfail =
false;
221 struct __close_sentry
229 __fb->_M_destroy_internal_buffer();
231 __fb->_M_writing =
false;
233 __fb->_M_state_last = __fb->_M_state_cur = __fb->_M_state_beg;
239 if (!_M_terminate_output())
245 __throw_exception_again;
248 { __testfail =
true; }
251 if (!_M_file.close())
260 template<
typename _CharT,
typename _Traits>
267 if (__testin && this->
is_open())
273 #if _GLIBCXX_HAVE_DOS_BASED_FILESYSTEM 276 if (__check_facet(_M_codecvt).encoding() >= 0
279 if (__check_facet(_M_codecvt).encoding() >= 0)
281 __ret += _M_file.showmanyc() / _M_codecvt->max_length();
286 template<
typename _CharT,
typename _Traits>
287 typename basic_filebuf<_CharT, _Traits>::int_type
291 int_type __ret = traits_type::eof();
297 if (
overflow() == traits_type::eof())
308 return traits_type::to_int_type(*this->
gptr());
314 bool __got_eof =
false;
317 codecvt_base::result __r = codecvt_base::ok;
318 if (__check_facet(_M_codecvt).always_noconv())
320 __ilen = _M_file.xsgetn(reinterpret_cast<char*>(this->
eback()),
329 const int __enc = _M_codecvt->encoding();
333 __blen = __rlen = __buflen * __enc;
336 __blen = __buflen + _M_codecvt->max_length() - 1;
340 __rlen = __rlen > __remainder ? __rlen - __remainder : 0;
351 char* __buf =
new char[__blen];
353 __builtin_memcpy(__buf, _M_ext_next, __remainder);
359 else if (__remainder)
360 __builtin_memmove(
_M_ext_buf, _M_ext_next, __remainder);
364 _M_state_last = _M_state_cur;
375 __throw_ios_failure(__N(
"basic_filebuf::underflow " 376 "codecvt::max_length() " 379 streamsize __elen = _M_file.xsgetn(_M_ext_end, __rlen);
382 else if (__elen == -1)
384 _M_ext_end += __elen;
387 char_type* __iend = this->
eback();
388 if (_M_ext_next < _M_ext_end)
389 __r = _M_codecvt->in(_M_state_cur, _M_ext_next,
390 _M_ext_end, _M_ext_next,
392 this->
eback() + __buflen, __iend);
393 if (__r == codecvt_base::noconv)
396 __ilen =
std::min(__avail, __buflen);
397 traits_type::copy(this->
eback(),
398 reinterpret_cast<char_type*>
399 (_M_ext_buf), __ilen);
400 _M_ext_next = _M_ext_buf + __ilen;
403 __ilen = __iend - this->
eback();
408 if (__r == codecvt_base::error)
413 while (__ilen == 0 && !__got_eof);
420 __ret = traits_type::to_int_type(*this->
gptr());
431 if (__r == codecvt_base::partial)
432 __throw_ios_failure(__N(
"basic_filebuf::underflow " 433 "incomplete character in file"));
435 else if (__r == codecvt_base::error)
436 __throw_ios_failure(__N(
"basic_filebuf::underflow " 437 "invalid byte sequence in file"));
439 __throw_ios_failure(__N(
"basic_filebuf::underflow " 440 "error reading the file"));
445 template<
typename _CharT,
typename _Traits>
446 typename basic_filebuf<_CharT, _Traits>::int_type
450 int_type __ret = traits_type::eof();
456 if (
overflow() == traits_type::eof())
464 const bool __testeof = traits_type::eq_int_type(__i, __ret);
469 __tmp = traits_type::to_int_type(*this->
gptr());
474 if (traits_type::eq_int_type(__tmp, __ret))
489 if (!__testeof && traits_type::eq_int_type(__i, __tmp))
492 __ret = traits_type::not_eof(__i);
497 *this->
gptr() = traits_type::to_char_type(__i);
504 template<
typename _CharT,
typename _Traits>
505 typename basic_filebuf<_CharT, _Traits>::int_type
509 int_type __ret = traits_type::eof();
510 const bool __testeof = traits_type::eq_int_type(__c, __ret);
518 const int __gptr_off = _M_get_ext_pos(_M_state_last);
520 == pos_type(off_type(-1)))
528 *this->
pptr() = traits_type::to_char_type(__c);
534 if (_M_convert_to_external(this->
pbase(),
538 __ret = traits_type::not_eof(__c);
550 *this->
pptr() = traits_type::to_char_type(__c);
553 __ret = traits_type::not_eof(__c);
558 char_type __conv = traits_type::to_char_type(__c);
559 if (__testeof || _M_convert_to_external(&__conv, 1))
562 __ret = traits_type::not_eof(__c);
569 template<
typename _CharT,
typename _Traits>
577 if (__check_facet(_M_codecvt).always_noconv())
579 __elen = _M_file.
xsputn(reinterpret_cast<char*>(__ibuf), __ilen);
586 streamsize __blen = __ilen * _M_codecvt->max_length();
587 char* __buf =
static_cast<char*
>(__builtin_alloca(__blen));
590 const char_type* __iend;
591 codecvt_base::result __r;
592 __r = _M_codecvt->out(_M_state_cur, __ibuf, __ibuf + __ilen,
593 __iend, __buf, __buf + __blen, __bend);
595 if (__r == codecvt_base::ok || __r == codecvt_base::partial)
596 __blen = __bend - __buf;
597 else if (__r == codecvt_base::noconv)
600 __buf =
reinterpret_cast<char*
>(__ibuf);
604 __throw_ios_failure(__N(
"basic_filebuf::_M_convert_to_external " 605 "conversion error"));
607 __elen = _M_file.xsputn(__buf, __blen);
611 if (__r == codecvt_base::partial && __elen == __plen)
613 const char_type* __iresume = __iend;
615 __r = _M_codecvt->out(_M_state_cur, __iresume,
616 __iresume + __rlen, __iend, __buf,
617 __buf + __blen, __bend);
618 if (__r != codecvt_base::error)
620 __rlen = __bend - __buf;
621 __elen = _M_file.xsputn(__buf, __rlen);
625 __throw_ios_failure(__N(
"basic_filebuf::_M_convert_to_external " 626 "conversion error"));
629 return __elen == __plen;
632 template<
typename _CharT,
typename _Traits>
641 if (__n > 0 && this->
gptr() == this->
eback())
643 *__s++ = *this->
gptr();
652 if (
overflow() == traits_type::eof())
664 if (__n > __buflen && __check_facet(_M_codecvt).always_noconv()
671 traits_type::copy(__s, this->
gptr(), __avail);
684 __len = _M_file.xsgetn(reinterpret_cast<char*>(__s),
687 __throw_ios_failure(__N(
"basic_filebuf::xsgetn " 688 "error reading the file"));
720 template<
typename _CharT,
typename _Traits>
731 if (__check_facet(_M_codecvt).always_noconv()
746 const char* __buf =
reinterpret_cast<const char*
>(this->
pbase());
747 __ret = _M_file.xsputn_2(__buf, __buffill,
748 reinterpret_cast<const char*>(__s),
750 if (__ret == __buffill + __n)
755 if (__ret > __buffill)
768 template<
typename _CharT,
typename _Traits>
775 if (__s == 0 && __n == 0)
777 else if (__s && __n > 0)
797 template<
typename _CharT,
typename _Traits>
798 typename basic_filebuf<_CharT, _Traits>::pos_type
800 seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode)
804 __width = _M_codecvt->encoding();
808 pos_type __ret = pos_type(off_type(-1));
809 const bool __testfail = __off != 0 && __width <= 0;
810 if (this->
is_open() && !__testfail)
817 && (!_M_writing || _M_codecvt->always_noconv());
828 __state_type __state = _M_state_beg;
829 off_type __computed_off = __off * __width;
832 __state = _M_state_last;
833 __computed_off += _M_get_ext_pos(__state);
836 __ret = _M_seek(__computed_off, __way, __state);
840 __computed_off = this->
pptr() - this->
pbase();
843 if (__file_off != off_type(-1))
845 __ret = __file_off + __computed_off;
846 __ret.state(__state);
857 template<
typename _CharT,
typename _Traits>
858 typename basic_filebuf<_CharT, _Traits>::pos_type
862 pos_type __ret = pos_type(off_type(-1));
867 __ret = _M_seek(off_type(__pos),
ios_base::beg, __pos.state());
872 template<
typename _CharT,
typename _Traits>
873 typename basic_filebuf<_CharT, _Traits>::pos_type
875 _M_seek(off_type __off, ios_base::seekdir __way, __state_type __state)
877 pos_type __ret = pos_type(off_type(-1));
878 if (_M_terminate_output())
880 off_type __file_off = _M_file.seekoff(__off, __way);
881 if (__file_off != off_type(-1))
887 _M_state_cur = __state;
889 __ret.state(_M_state_cur);
898 template<
typename _CharT,
typename _Traits>
902 if (_M_codecvt->always_noconv())
909 const int __gptr_off =
916 template<
typename _CharT,
typename _Traits>
922 bool __testvalid =
true;
925 const int_type __tmp = this->
overflow();
926 if (traits_type::eq_int_type(__tmp, traits_type::eof()))
931 if (_M_writing && !__check_facet(_M_codecvt).always_noconv()
937 const size_t __blen = 128;
939 codecvt_base::result __r;
945 __r = _M_codecvt->unshift(_M_state_cur, __buf,
946 __buf + __blen, __next);
947 if (__r == codecvt_base::error)
949 else if (__r == codecvt_base::ok ||
950 __r == codecvt_base::partial)
952 __ilen = __next - __buf;
955 const streamsize __elen = _M_file.xsputn(__buf, __ilen);
956 if (__elen != __ilen)
961 while (__r == codecvt_base::partial && __ilen > 0 && __testvalid);
969 const int_type __tmp = this->
overflow();
970 if (traits_type::eq_int_type(__tmp, traits_type::eof()))
977 template<
typename _CharT,
typename _Traits>
987 const int_type __tmp = this->
overflow();
988 if (traits_type::eq_int_type(__tmp, traits_type::eof()))
994 template<
typename _CharT,
typename _Traits>
999 bool __testvalid =
true;
1002 if (__builtin_expect(has_facet<__codecvt_type>(__loc),
true))
1003 _M_codecvt_tmp = &use_facet<__codecvt_type>(__loc);
1009 && __check_facet(_M_codecvt).encoding() == -1)
1010 __testvalid =
false;
1015 if (__check_facet(_M_codecvt).always_noconv())
1018 && !__check_facet(_M_codecvt_tmp).always_noconv())
1020 != pos_type(off_type(-1));
1026 + _M_codecvt->length(_M_state_last,
_M_ext_buf,
1031 __builtin_memmove(
_M_ext_buf, _M_ext_next, __remainder);
1036 _M_state_last = _M_state_cur = _M_state_beg;
1039 else if (_M_writing && (__testvalid = _M_terminate_output()))
1045 _M_codecvt = _M_codecvt_tmp;
1052 #if _GLIBCXX_EXTERN_TEMPLATE 1058 #ifdef _GLIBCXX_USE_WCHAR_T 1066 _GLIBCXX_END_NAMESPACE_VERSION
virtual pos_type seekpos(pos_type __pos, ios_base::openmode __mode=ios_base::in|ios_base::out)
Alters the stream positions.
char_type * eback() const
Access to the get area.
virtual int_type underflow()
Fetches more data from the controlled sequence.
char_type * egptr() const
Access to the get area.
basic_filebuf()
Does not open any files.
static const openmode ate
Open and seek to end immediately after opening.
static const seekdir cur
Request a seek relative to the current position within the sequence.
char_type * gptr() const
Access to the get area.
Controlling input for files.
The actual work of input and output (interface).
virtual void imbue(const locale &__loc)
Changes translations.
virtual __streambuf_type * setbuf(char_type *__s, streamsize __n)
Manipulates the buffer.
char_type * epptr() const
Access to the put area.
ptrdiff_t streamsize
Integral type for I/O operation counts and buffer sizes.
__filebuf_type * close()
Closes the currently associated file.
_Ios_Openmode openmode
This is a bitmask type.
virtual streamsize showmanyc()
Investigating the data available.
ios_base::openmode _M_mode
Place to stash in || out || in | out settings for current filebuf.
char_type * _M_pback_end_save
char_type * _M_buf
Pointer to the beginning of internal buffer.
void setg(char_type *__gbeg, char_type *__gnext, char_type *__gend)
Setting the three read area pointers.
static const openmode out
Open for output. Default for ofstream and fstream.
Controlling output for files.
static const openmode binary
Perform input and output in binary mode (as opposed to text mode). This is probably not what you thin...
virtual pos_type seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode=ios_base::in|ios_base::out)
Alters the stream positions.
_GLIBCXX14_CONSTEXPR const _Tp & min(const _Tp &, const _Tp &)
This does what you think it does.
bool is_open() const
Returns true if the external file is open.
The base of the I/O class hierarchy.This class defines everything that can be defined about I/O that ...
__filebuf_type * open(const char *__s, ios_base::openmode __mode)
Opens an external file.
static const seekdir beg
Request a seek relative to the beginning of the stream.
static const openmode in
Open for input. Default for ifstream and fstream.
virtual streamsize xsputn(const char_type *__s, streamsize __n)
Multiple character insertion.
static const seekdir end
Request a seek relative to the current end of the sequence.
Controlling input and output for files.
char_type * _M_pback_cur_save
virtual int sync()
Synchronizes the buffer arrays with the controlled sequences.
streamsize _M_ext_buf_size
void pbump(int __n)
Moving the write position.
void gbump(int __n)
Moving the read position.
locale _M_buf_locale
Current locale setting.
virtual streamsize xsputn(const char_type *__s, streamsize __n)
Multiple character insertion.
char_type * pptr() const
Access to the put area.
The actual work of input and output (for files).
virtual int_type pbackfail(int_type __c=_Traits::eof())
Tries to back up the input sequence.
void _M_set_buffer(streamsize __off)
Primary class template codecvt.NB: Generic, mostly useless implementation.
Container class for localization functionality.The locale class is first a class wrapper for C librar...
ISO C++ entities toplevel namespace is std.
virtual streamsize xsgetn(char_type *__s, streamsize __n)
Multiple character extraction.
static const openmode app
Seek to end before each write.
virtual int_type overflow(int_type __c=_Traits::eof())
Consumes data from the buffer; writes to the controlled sequence.
virtual streamsize xsgetn(char_type *__s, streamsize __n)
Multiple character extraction.
Thrown as part of forced unwinding.A magic placeholder class that can be caught by reference to recog...
char_type * pbase() const
Access to the put area.