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
00030
00031
00032
00033
00034 #ifndef _CPP_BITS_STREAMBUF_TCC
00035 #define _CPP_BITS_STREAMBUF_TCC 1
00036
00037 namespace std {
00038
00039 template<typename _CharT, typename _Traits>
00040 typename basic_streambuf<_CharT, _Traits>::int_type
00041 basic_streambuf<_CharT, _Traits>::
00042 sbumpc()
00043 {
00044 int_type __ret;
00045 if (_M_in_cur && _M_in_cur < _M_in_end)
00046 {
00047 char_type __c = *gptr();
00048 _M_in_cur_move(1);
00049 __ret = traits_type::to_int_type(__c);
00050 }
00051 else
00052 __ret = this->uflow();
00053 return __ret;
00054 }
00055
00056 template<typename _CharT, typename _Traits>
00057 typename basic_streambuf<_CharT, _Traits>::int_type
00058 basic_streambuf<_CharT, _Traits>::
00059 sputbackc(char_type __c)
00060 {
00061 int_type __ret;
00062 bool __testpos = _M_in_cur && _M_in_beg < _M_in_cur;
00063 bool __testne = _M_in_cur && !traits_type::eq(__c, this->gptr()[-1]);
00064 if (!__testpos || __testne)
00065 __ret = pbackfail(traits_type::to_int_type(__c));
00066 else
00067 {
00068 _M_in_cur_move(-1);
00069 __ret = traits_type::to_int_type(*this->gptr());
00070 }
00071 return __ret;
00072 }
00073
00074 template<typename _CharT, typename _Traits>
00075 typename basic_streambuf<_CharT, _Traits>::int_type
00076 basic_streambuf<_CharT, _Traits>::
00077 sungetc()
00078 {
00079 int_type __ret;
00080 if (_M_in_cur && _M_in_beg < _M_in_cur)
00081 {
00082 _M_in_cur_move(-1);
00083 __ret = traits_type::to_int_type(*_M_in_cur);
00084 }
00085 else
00086 __ret = this->pbackfail();
00087 return __ret;
00088 }
00089
00090
00091
00092
00093
00094
00095 template<typename _CharT, typename _Traits>
00096 typename basic_streambuf<_CharT, _Traits>::int_type
00097 basic_streambuf<_CharT, _Traits>::
00098 sputc(char_type __c)
00099 {
00100 int_type __ret;
00101 if (_M_out_buf_size())
00102 {
00103 *_M_out_cur = __c;
00104 _M_out_cur_move(1);
00105 __ret = traits_type::to_int_type(__c);
00106 }
00107 else
00108 __ret = this->overflow(traits_type::to_int_type(__c));
00109 return __ret;
00110 }
00111
00112 template<typename _CharT, typename _Traits>
00113 streamsize
00114 basic_streambuf<_CharT, _Traits>::
00115 xsgetn(char_type* __s, streamsize __n)
00116 {
00117 streamsize __ret = 0;
00118 while (__ret < __n)
00119 {
00120 size_t __buf_len = _M_in_end - _M_in_cur;
00121 if (__buf_len > 0)
00122 {
00123 size_t __remaining = __n - __ret;
00124 size_t __len = min(__buf_len, __remaining);
00125 traits_type::copy(__s, _M_in_cur, __len);
00126 __ret += __len;
00127 __s += __len;
00128 _M_in_cur_move(__len);
00129 }
00130
00131 if (__ret < __n)
00132 {
00133 int_type __c = this->uflow();
00134 if (__c != traits_type::eof())
00135 {
00136 traits_type::assign(*__s++, traits_type::to_char_type(__c));
00137 ++__ret;
00138 }
00139 else
00140 break;
00141 }
00142 }
00143 return __ret;
00144 }
00145
00146
00147
00148
00149
00150
00151 template<typename _CharT, typename _Traits>
00152 streamsize
00153 basic_streambuf<_CharT, _Traits>::
00154 xsputn(const char_type* __s, streamsize __n)
00155 {
00156 streamsize __ret = 0;
00157 while (__ret < __n)
00158 {
00159 off_type __buf_len = _M_out_buf_size();
00160 if (__buf_len > 0)
00161 {
00162 off_type __remaining = __n - __ret;
00163 off_type __len = min(__buf_len, __remaining);
00164 traits_type::copy(_M_out_cur, __s, __len);
00165 __ret += __len;
00166 __s += __len;
00167 _M_out_cur_move(__len);
00168 }
00169
00170 if (__ret < __n)
00171 {
00172 int_type __c = this->overflow(traits_type::to_int_type(*__s));
00173 if (__c != traits_type::eof())
00174 {
00175 ++__ret;
00176 ++__s;
00177 }
00178 else
00179 break;
00180 }
00181 }
00182 return __ret;
00183 }
00184
00185
00186
00187
00188
00189 template<typename _CharT, typename _Traits>
00190 streamsize
00191 __copy_streambufs(basic_ios<_CharT, _Traits>& __ios,
00192 basic_streambuf<_CharT, _Traits>* __sbin,
00193 basic_streambuf<_CharT, _Traits>* __sbout)
00194 {
00195 typedef typename _Traits::int_type int_type;
00196
00197 streamsize __ret = 0;
00198 streamsize __bufsize = __sbin->in_avail();
00199 streamsize __xtrct;
00200 bool __testput = __sbout->_M_mode & ios_base::out;
00201 try {
00202 while (__testput && __bufsize != -1)
00203 {
00204 __xtrct = __sbout->sputn(__sbin->gptr(), __bufsize);
00205 __ret += __xtrct;
00206 __sbin->_M_in_cur_move(__xtrct);
00207 if (__xtrct == __bufsize)
00208 {
00209 if (__sbin->sgetc() == _Traits::eof())
00210 break;
00211 __bufsize = __sbin->in_avail();
00212 }
00213 else
00214 break;
00215 }
00216 }
00217 catch(exception& __fail) {
00218 if ((__ios.exceptions() & ios_base::failbit) != 0)
00219 __throw_exception_again;
00220 }
00221 return __ret;
00222 }
00223 }
00224
00225 #endif // _CPP_BITS_STREAMBUF_TCC
00226