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
00035 #ifndef _CPP_BITS_SSTREAM_TCC
00036 #define _CPP_BITS_SSTREAM_TCC 1
00037
00038 #pragma GCC system_header
00039
00040 #include <sstream>
00041
00042 namespace std
00043 {
00044 template <class _CharT, class _Traits, class _Alloc>
00045 typename basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
00046 basic_stringbuf<_CharT, _Traits, _Alloc>::
00047 pbackfail(int_type __c)
00048 {
00049 int_type __ret = traits_type::eof();
00050 bool __testeof = traits_type::eq_int_type(__c, traits_type::eof());
00051 bool __testpos = _M_in_cur && _M_in_beg < _M_in_cur;
00052
00053
00054
00055 if (__testpos)
00056 {
00057 if (traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1])
00058 && !__testeof)
00059 {
00060 --_M_in_cur;
00061 __ret = __c;
00062 }
00063 else if (!__testeof)
00064 {
00065 --_M_in_cur;
00066 *_M_in_cur = traits_type::to_char_type(__c);
00067 __ret = __c;
00068 }
00069 else if (__testeof)
00070 {
00071 --_M_in_cur;
00072 __ret = traits_type::not_eof(__c);
00073 }
00074 }
00075 return __ret;
00076 }
00077
00078 template <class _CharT, class _Traits, class _Alloc>
00079 typename basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
00080 basic_stringbuf<_CharT, _Traits, _Alloc>::
00081 overflow(int_type __c)
00082 {
00083 int_type __ret = traits_type::eof();
00084 bool __testeof = traits_type::eq_int_type(__c, __ret);
00085 bool __testwrite = _M_out_cur < _M_buf + _M_buf_size;
00086 bool __testout = _M_mode & ios_base::out;
00087
00088
00089
00090 if (__testout)
00091 {
00092 if (!__testeof)
00093 {
00094 __size_type __len = max(_M_buf_size, _M_buf_size_opt);
00095 __len *= 2;
00096
00097 if (__testwrite)
00098 __ret = this->sputc(traits_type::to_char_type(__c));
00099 else if (__len <= _M_string.max_size())
00100 {
00101
00102 _M_string = this->str();
00103 _M_string.reserve(__len);
00104 _M_buf_size = __len;
00105 _M_really_sync(_M_in_cur - _M_in_beg,
00106 _M_out_cur - _M_out_beg);
00107 *_M_out_cur = traits_type::to_char_type(__c);
00108 _M_out_cur_move(1);
00109 __ret = __c;
00110 }
00111 }
00112 else
00113 __ret = traits_type::not_eof(__c);
00114 }
00115 return __ret;
00116 }
00117
00118 template <class _CharT, class _Traits, class _Alloc>
00119 typename basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type
00120 basic_stringbuf<_CharT, _Traits, _Alloc>::
00121 seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode)
00122 {
00123 pos_type __ret = pos_type(off_type(-1));
00124 bool __testin = (ios_base::in & _M_mode & __mode) != 0;
00125 bool __testout = (ios_base::out & _M_mode & __mode) != 0;
00126 bool __testboth = __testin && __testout && __way != ios_base::cur;
00127 __testin &= !(__mode & ios_base::out);
00128 __testout &= !(__mode & ios_base::in);
00129
00130 if (_M_buf_size && (__testin || __testout || __testboth))
00131 {
00132 char_type* __beg = _M_buf;
00133 char_type* __curi = NULL;
00134 char_type* __curo = NULL;
00135 char_type* __endi = NULL;
00136 char_type* __endo = NULL;
00137
00138 if (__testin || __testboth)
00139 {
00140 __curi = this->gptr();
00141 __endi = this->egptr();
00142 }
00143 if (__testout || __testboth)
00144 {
00145 __curo = this->pptr();
00146 __endo = this->epptr();
00147 }
00148
00149 off_type __newoffi = 0;
00150 off_type __newoffo = 0;
00151 if (__way == ios_base::cur)
00152 {
00153 __newoffi = __curi - __beg;
00154 __newoffo = __curo - __beg;
00155 }
00156 else if (__way == ios_base::end)
00157 {
00158 __newoffi = __endi - __beg;
00159 __newoffo = __endo - __beg;
00160 }
00161
00162 if ((__testin || __testboth)
00163 && __newoffi + __off >= 0 && __endi - __beg >= __newoffi + __off)
00164 {
00165 _M_in_cur = __beg + __newoffi + __off;
00166 __ret = pos_type(__newoffi);
00167 }
00168 if ((__testout || __testboth)
00169 && __newoffo + __off >= 0 && __endo - __beg >= __newoffo + __off)
00170 {
00171 _M_out_cur_move(__newoffo + __off - (_M_out_cur - __beg));
00172 __ret = pos_type(__newoffo);
00173 }
00174 }
00175 return __ret;
00176 }
00177
00178 template <class _CharT, class _Traits, class _Alloc>
00179 typename basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type
00180 basic_stringbuf<_CharT, _Traits, _Alloc>::
00181 seekpos(pos_type __sp, ios_base::openmode __mode)
00182 {
00183 pos_type __ret = pos_type(off_type(-1));
00184
00185 if (_M_buf_size)
00186 {
00187 off_type __pos = __sp;
00188 char_type* __beg = NULL;
00189 char_type* __end = NULL;
00190 bool __testin = (ios_base::in & _M_mode & __mode) != 0;
00191 bool __testout = (ios_base::out & _M_mode & __mode) != 0;
00192 bool __testboth = __testin && __testout;
00193 __testin &= !(__mode & ios_base::out);
00194 __testout &= !(__mode & ios_base::in);
00195
00196
00197 bool __testposi = false;
00198 bool __testposo = false;
00199 if (__testin || __testboth)
00200 {
00201 __beg = this->eback();
00202 __end = this->egptr();
00203 if (0 <= __pos && __pos <= __end - __beg)
00204 __testposi = true;
00205 }
00206 if (__testout || __testboth)
00207 {
00208 __beg = this->pbase();
00209 __end = _M_buf + _M_buf_size;
00210 if (0 <= __pos && __pos <= __end - __beg)
00211 __testposo = true;
00212 }
00213 if (__testposi || __testposo)
00214 {
00215 if (__testposi)
00216 _M_in_cur = _M_in_beg + __pos;
00217 if (__testposo)
00218 _M_out_cur_move((__pos) - (_M_out_cur - __beg));
00219 __ret = pos_type(off_type(__pos));
00220 }
00221 }
00222 return __ret;
00223 }
00224
00225
00226
00227
00228 #if _GLIBCXX_EXTERN_TEMPLATE
00229 extern template class basic_stringbuf<char>;
00230 extern template class basic_istringstream<char>;
00231 extern template class basic_ostringstream<char>;
00232 extern template class basic_stringstream<char>;
00233
00234 #ifdef _GLIBCPP_USE_WCHAR_T
00235 extern template class basic_stringbuf<wchar_t>;
00236 extern template class basic_istringstream<wchar_t>;
00237 extern template class basic_ostringstream<wchar_t>;
00238 extern template class basic_stringstream<wchar_t>;
00239 #endif
00240 #endif
00241 }
00242
00243 #endif