00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00034 #ifndef _EXT_STDIO_FILEBUF
00035 #define _EXT_STDIO_FILEBUF
00036
00037 #pragma GCC system_header
00038 #include <fstream>
00039
00040 namespace __gnu_cxx
00041 {
00051 template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
00052 class stdio_filebuf : public std::basic_filebuf<_CharT, _Traits>
00053 {
00054 public:
00055
00056 typedef _CharT char_type;
00057 typedef _Traits traits_type;
00058 typedef typename traits_type::int_type int_type;
00059 typedef typename traits_type::pos_type pos_type;
00060 typedef typename traits_type::off_type off_type;
00061 typedef std::size_t size_t;
00062
00063 protected:
00064
00065 char_type _M_unbuf[4];
00066
00067 public:
00078 stdio_filebuf(int __fd, std::ios_base::openmode __mode, bool __del,
00079 size_t __size);
00080
00091 stdio_filebuf(std::__c_file* __f, std::ios_base::openmode __mode,
00092 size_t __size = static_cast<size_t>(BUFSIZ));
00093
00098 virtual
00099 ~stdio_filebuf();
00100
00109 int
00110 fd()
00111 { return _M_file.fd(); }
00112 };
00113
00114 template<typename _CharT, typename _Traits>
00115 stdio_filebuf<_CharT, _Traits>::~stdio_filebuf()
00116 { }
00117
00118 template<typename _CharT, typename _Traits>
00119 stdio_filebuf<_CharT, _Traits>::
00120 stdio_filebuf(int __fd, std::ios_base::openmode __mode, bool __del,
00121 size_t __size)
00122 {
00123 _M_file.sys_open(__fd, __mode, __del);
00124 if (this->is_open())
00125 {
00126 _M_mode = __mode;
00127 if (__size > 0 && __size < 4)
00128 {
00129
00130 _M_buf = _M_unbuf;
00131 _M_buf_size = __size;
00132 _M_buf_size_opt = 0;
00133 }
00134 else
00135 {
00136 _M_buf_size_opt = __size;
00137 _M_allocate_internal_buffer();
00138 }
00139 _M_set_indeterminate();
00140 }
00141 }
00142
00143 template<typename _CharT, typename _Traits>
00144 stdio_filebuf<_CharT, _Traits>::
00145 stdio_filebuf(std::__c_file* __f, std::ios_base::openmode __mode,
00146 size_t __size)
00147 {
00148 _M_file.sys_open(__f, __mode);
00149 if (this->is_open())
00150 {
00151 _M_mode = __mode;
00152 if (__size > 0 && __size < 4)
00153 {
00154
00155 _M_buf = _M_unbuf;
00156 _M_buf_size = __size;
00157 _M_buf_size_opt = 0;
00158 }
00159 else
00160 {
00161 _M_buf_size_opt = __size;
00162 _M_allocate_internal_buffer();
00163 }
00164 _M_set_indeterminate();
00165 }
00166 }
00167 }
00168
00169 #endif