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