123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083 |
- #ifndef _GLIBCXX_FSTREAM
- #define _GLIBCXX_FSTREAM 1
- #pragma GCC system_header
- #include <istream>
- #include <ostream>
- #include <bits/codecvt.h>
- #include <cstdio> // For BUFSIZ
- #include <bits/basic_file.h> // For __basic_file, __c_lock
- #if __cplusplus >= 201103L
- #include <string> // For std::string overloads.
- #endif
- namespace std _GLIBCXX_VISIBILITY(default)
- {
- _GLIBCXX_BEGIN_NAMESPACE_VERSION
-
-
- template<typename _CharT, typename _Traits>
- class basic_filebuf : public basic_streambuf<_CharT, _Traits>
- {
- #if __cplusplus >= 201103L
- template<typename _Tp>
- using __chk_state = __and_<is_copy_assignable<_Tp>,
- is_copy_constructible<_Tp>,
- is_default_constructible<_Tp>>;
- static_assert(__chk_state<typename _Traits::state_type>::value,
- "state_type must be CopyAssignable, CopyConstructible"
- " and DefaultConstructible");
- static_assert(is_same<typename _Traits::pos_type,
- fpos<typename _Traits::state_type>>::value,
- "pos_type must be fpos<state_type>");
- #endif
- public:
-
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
- typedef basic_streambuf<char_type, traits_type> __streambuf_type;
- typedef basic_filebuf<char_type, traits_type> __filebuf_type;
- typedef __basic_file<char> __file_type;
- typedef typename traits_type::state_type __state_type;
- typedef codecvt<char_type, char, __state_type> __codecvt_type;
- friend class ios_base;
- protected:
-
-
- __c_lock _M_lock;
-
- __file_type _M_file;
-
- ios_base::openmode _M_mode;
-
- __state_type _M_state_beg;
-
-
-
- __state_type _M_state_cur;
-
-
- __state_type _M_state_last;
-
- char_type* _M_buf;
-
- size_t _M_buf_size;
-
- bool _M_buf_allocated;
-
- bool _M_reading;
- bool _M_writing;
-
-
- char_type _M_pback;
- char_type* _M_pback_cur_save;
- char_type* _M_pback_end_save;
- bool _M_pback_init;
-
-
- const __codecvt_type* _M_codecvt;
-
- char* _M_ext_buf;
-
- streamsize _M_ext_buf_size;
-
- const char* _M_ext_next;
- char* _M_ext_end;
-
- void
- _M_create_pback()
- {
- if (!_M_pback_init)
- {
- _M_pback_cur_save = this->gptr();
- _M_pback_end_save = this->egptr();
- this->setg(&_M_pback, &_M_pback, &_M_pback + 1);
- _M_pback_init = true;
- }
- }
-
- void
- _M_destroy_pback() throw()
- {
- if (_M_pback_init)
- {
-
- _M_pback_cur_save += this->gptr() != this->eback();
- this->setg(_M_buf, _M_pback_cur_save, _M_pback_end_save);
- _M_pback_init = false;
- }
- }
- public:
-
-
- basic_filebuf();
- #if __cplusplus >= 201103L
- basic_filebuf(const basic_filebuf&) = delete;
- basic_filebuf(basic_filebuf&&);
- #endif
-
- virtual
- ~basic_filebuf()
- { this->close(); }
- #if __cplusplus >= 201103L
- basic_filebuf& operator=(const basic_filebuf&) = delete;
- basic_filebuf& operator=(basic_filebuf&&);
- void swap(basic_filebuf&);
- #endif
-
-
- bool
- is_open() const throw()
- { return _M_file.is_open(); }
-
- __filebuf_type*
- open(const char* __s, ios_base::openmode __mode);
- #if __cplusplus >= 201103L
-
- __filebuf_type*
- open(const std::string& __s, ios_base::openmode __mode)
- { return open(__s.c_str(), __mode); }
- #endif
-
- __filebuf_type*
- close();
- protected:
- void
- _M_allocate_internal_buffer();
- void
- _M_destroy_internal_buffer() throw();
-
- virtual streamsize
- showmanyc();
-
-
-
-
- virtual int_type
- underflow();
- virtual int_type
- pbackfail(int_type __c = _Traits::eof());
-
-
-
-
-
-
-
- virtual int_type
- overflow(int_type __c = _Traits::eof());
-
-
- bool
- _M_convert_to_external(char_type*, streamsize);
-
- virtual __streambuf_type*
- setbuf(char_type* __s, streamsize __n);
- virtual pos_type
- seekoff(off_type __off, ios_base::seekdir __way,
- ios_base::openmode __mode = ios_base::in | ios_base::out);
- virtual pos_type
- seekpos(pos_type __pos,
- ios_base::openmode __mode = ios_base::in | ios_base::out);
-
- pos_type
- _M_seek(off_type __off, ios_base::seekdir __way, __state_type __state);
-
- int
- _M_get_ext_pos(__state_type &__state);
- virtual int
- sync();
- virtual void
- imbue(const locale& __loc);
- virtual streamsize
- xsgetn(char_type* __s, streamsize __n);
- virtual streamsize
- xsputn(const char_type* __s, streamsize __n);
-
- bool
- _M_terminate_output();
-
- void
- _M_set_buffer(streamsize __off)
- {
- const bool __testin = _M_mode & ios_base::in;
- const bool __testout = (_M_mode & ios_base::out
- || _M_mode & ios_base::app);
- if (__testin && __off > 0)
- this->setg(_M_buf, _M_buf, _M_buf + __off);
- else
- this->setg(_M_buf, _M_buf, _M_buf);
- if (__testout && __off == 0 && _M_buf_size > 1 )
- this->setp(_M_buf, _M_buf + _M_buf_size - 1);
- else
- this->setp(0, 0);
- }
- };
-
-
- template<typename _CharT, typename _Traits>
- class basic_ifstream : public basic_istream<_CharT, _Traits>
- {
- public:
-
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- typedef basic_filebuf<char_type, traits_type> __filebuf_type;
- typedef basic_istream<char_type, traits_type> __istream_type;
- private:
- __filebuf_type _M_filebuf;
- public:
-
-
- basic_ifstream() : __istream_type(), _M_filebuf()
- { this->init(&_M_filebuf); }
-
- explicit
- basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in)
- : __istream_type(), _M_filebuf()
- {
- this->init(&_M_filebuf);
- this->open(__s, __mode);
- }
- #if __cplusplus >= 201103L
-
- explicit
- basic_ifstream(const std::string& __s,
- ios_base::openmode __mode = ios_base::in)
- : __istream_type(), _M_filebuf()
- {
- this->init(&_M_filebuf);
- this->open(__s, __mode);
- }
- basic_ifstream(const basic_ifstream&) = delete;
- basic_ifstream(basic_ifstream&& __rhs)
- : __istream_type(std::move(__rhs)),
- _M_filebuf(std::move(__rhs._M_filebuf))
- { __istream_type::set_rdbuf(&_M_filebuf); }
- #endif
-
- ~basic_ifstream()
- { }
- #if __cplusplus >= 201103L
-
- basic_ifstream&
- operator=(const basic_ifstream&) = delete;
- basic_ifstream&
- operator=(basic_ifstream&& __rhs)
- {
- __istream_type::operator=(std::move(__rhs));
- _M_filebuf = std::move(__rhs._M_filebuf);
- return *this;
- }
- void
- swap(basic_ifstream& __rhs)
- {
- __istream_type::swap(__rhs);
- _M_filebuf.swap(__rhs._M_filebuf);
- }
- #endif
-
-
- __filebuf_type*
- rdbuf() const
- { return const_cast<__filebuf_type*>(&_M_filebuf); }
-
- bool
- is_open()
- { return _M_filebuf.is_open(); }
-
-
- bool
- is_open() const
- { return _M_filebuf.is_open(); }
-
- void
- open(const char* __s, ios_base::openmode __mode = ios_base::in)
- {
- if (!_M_filebuf.open(__s, __mode | ios_base::in))
- this->setstate(ios_base::failbit);
- else
-
-
- this->clear();
- }
- #if __cplusplus >= 201103L
-
- void
- open(const std::string& __s, ios_base::openmode __mode = ios_base::in)
- {
- if (!_M_filebuf.open(__s, __mode | ios_base::in))
- this->setstate(ios_base::failbit);
- else
-
-
- this->clear();
- }
- #endif
-
- void
- close()
- {
- if (!_M_filebuf.close())
- this->setstate(ios_base::failbit);
- }
- };
-
-
- template<typename _CharT, typename _Traits>
- class basic_ofstream : public basic_ostream<_CharT,_Traits>
- {
- public:
-
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- typedef basic_filebuf<char_type, traits_type> __filebuf_type;
- typedef basic_ostream<char_type, traits_type> __ostream_type;
- private:
- __filebuf_type _M_filebuf;
- public:
-
-
- basic_ofstream(): __ostream_type(), _M_filebuf()
- { this->init(&_M_filebuf); }
-
- explicit
- basic_ofstream(const char* __s,
- ios_base::openmode __mode = ios_base::out|ios_base::trunc)
- : __ostream_type(), _M_filebuf()
- {
- this->init(&_M_filebuf);
- this->open(__s, __mode);
- }
- #if __cplusplus >= 201103L
-
- explicit
- basic_ofstream(const std::string& __s,
- ios_base::openmode __mode = ios_base::out|ios_base::trunc)
- : __ostream_type(), _M_filebuf()
- {
- this->init(&_M_filebuf);
- this->open(__s, __mode);
- }
- basic_ofstream(const basic_ofstream&) = delete;
- basic_ofstream(basic_ofstream&& __rhs)
- : __ostream_type(std::move(__rhs)),
- _M_filebuf(std::move(__rhs._M_filebuf))
- { __ostream_type::set_rdbuf(&_M_filebuf); }
- #endif
-
- ~basic_ofstream()
- { }
- #if __cplusplus >= 201103L
-
- basic_ofstream&
- operator=(const basic_ofstream&) = delete;
- basic_ofstream&
- operator=(basic_ofstream&& __rhs)
- {
- __ostream_type::operator=(std::move(__rhs));
- _M_filebuf = std::move(__rhs._M_filebuf);
- return *this;
- }
- void
- swap(basic_ofstream& __rhs)
- {
- __ostream_type::swap(__rhs);
- _M_filebuf.swap(__rhs._M_filebuf);
- }
- #endif
-
-
- __filebuf_type*
- rdbuf() const
- { return const_cast<__filebuf_type*>(&_M_filebuf); }
-
- bool
- is_open()
- { return _M_filebuf.is_open(); }
-
-
- bool
- is_open() const
- { return _M_filebuf.is_open(); }
-
- void
- open(const char* __s,
- ios_base::openmode __mode = ios_base::out | ios_base::trunc)
- {
- if (!_M_filebuf.open(__s, __mode | ios_base::out))
- this->setstate(ios_base::failbit);
- else
-
-
- this->clear();
- }
- #if __cplusplus >= 201103L
-
- void
- open(const std::string& __s,
- ios_base::openmode __mode = ios_base::out | ios_base::trunc)
- {
- if (!_M_filebuf.open(__s, __mode | ios_base::out))
- this->setstate(ios_base::failbit);
- else
-
-
- this->clear();
- }
- #endif
-
- void
- close()
- {
- if (!_M_filebuf.close())
- this->setstate(ios_base::failbit);
- }
- };
-
-
- template<typename _CharT, typename _Traits>
- class basic_fstream : public basic_iostream<_CharT, _Traits>
- {
- public:
-
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- typedef basic_filebuf<char_type, traits_type> __filebuf_type;
- typedef basic_ios<char_type, traits_type> __ios_type;
- typedef basic_iostream<char_type, traits_type> __iostream_type;
- private:
- __filebuf_type _M_filebuf;
- public:
-
-
- basic_fstream()
- : __iostream_type(), _M_filebuf()
- { this->init(&_M_filebuf); }
-
- explicit
- basic_fstream(const char* __s,
- ios_base::openmode __mode = ios_base::in | ios_base::out)
- : __iostream_type(0), _M_filebuf()
- {
- this->init(&_M_filebuf);
- this->open(__s, __mode);
- }
- #if __cplusplus >= 201103L
-
- explicit
- basic_fstream(const std::string& __s,
- ios_base::openmode __mode = ios_base::in | ios_base::out)
- : __iostream_type(0), _M_filebuf()
- {
- this->init(&_M_filebuf);
- this->open(__s, __mode);
- }
- basic_fstream(const basic_fstream&) = delete;
- basic_fstream(basic_fstream&& __rhs)
- : __iostream_type(std::move(__rhs)),
- _M_filebuf(std::move(__rhs._M_filebuf))
- { __iostream_type::set_rdbuf(&_M_filebuf); }
- #endif
-
- ~basic_fstream()
- { }
- #if __cplusplus >= 201103L
-
- basic_fstream&
- operator=(const basic_fstream&) = delete;
- basic_fstream&
- operator=(basic_fstream&& __rhs)
- {
- __iostream_type::operator=(std::move(__rhs));
- _M_filebuf = std::move(__rhs._M_filebuf);
- return *this;
- }
- void
- swap(basic_fstream& __rhs)
- {
- __iostream_type::swap(__rhs);
- _M_filebuf.swap(__rhs._M_filebuf);
- }
- #endif
-
-
- __filebuf_type*
- rdbuf() const
- { return const_cast<__filebuf_type*>(&_M_filebuf); }
-
- bool
- is_open()
- { return _M_filebuf.is_open(); }
-
-
- bool
- is_open() const
- { return _M_filebuf.is_open(); }
-
- void
- open(const char* __s,
- ios_base::openmode __mode = ios_base::in | ios_base::out)
- {
- if (!_M_filebuf.open(__s, __mode))
- this->setstate(ios_base::failbit);
- else
-
-
- this->clear();
- }
- #if __cplusplus >= 201103L
-
- void
- open(const std::string& __s,
- ios_base::openmode __mode = ios_base::in | ios_base::out)
- {
- if (!_M_filebuf.open(__s, __mode))
- this->setstate(ios_base::failbit);
- else
-
-
- this->clear();
- }
- #endif
-
- void
- close()
- {
- if (!_M_filebuf.close())
- this->setstate(ios_base::failbit);
- }
- };
- #if __cplusplus >= 201103L
-
- template <class _CharT, class _Traits>
- inline void
- swap(basic_filebuf<_CharT, _Traits>& __x,
- basic_filebuf<_CharT, _Traits>& __y)
- { __x.swap(__y); }
-
- template <class _CharT, class _Traits>
- inline void
- swap(basic_ifstream<_CharT, _Traits>& __x,
- basic_ifstream<_CharT, _Traits>& __y)
- { __x.swap(__y); }
-
- template <class _CharT, class _Traits>
- inline void
- swap(basic_ofstream<_CharT, _Traits>& __x,
- basic_ofstream<_CharT, _Traits>& __y)
- { __x.swap(__y); }
-
- template <class _CharT, class _Traits>
- inline void
- swap(basic_fstream<_CharT, _Traits>& __x,
- basic_fstream<_CharT, _Traits>& __y)
- { __x.swap(__y); }
- #endif
- _GLIBCXX_END_NAMESPACE_VERSION
- }
- #include <bits/fstream.tcc>
- #endif
|