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 _SSTREAM_TCC
00036 #define _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 const bool __testeof = traits_type::eq_int_type(__c, __ret);
00051
00052 if (this->eback() < this->gptr())
00053 {
00054 const bool __testeq = traits_type::eq(traits_type::to_char_type(__c),
00055 this->gptr()[-1]);
00056 this->gbump(-1);
00057
00058
00059
00060 if (!__testeof && __testeq)
00061 __ret = __c;
00062 else if (__testeof)
00063 __ret = traits_type::not_eof(__c);
00064 else
00065 {
00066 *this->gptr() = traits_type::to_char_type(__c);
00067 __ret = __c;
00068 }
00069 }
00070 return __ret;
00071 }
00072
00073 template <class _CharT, class _Traits, class _Alloc>
00074 typename basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
00075 basic_stringbuf<_CharT, _Traits, _Alloc>::
00076 overflow(int_type __c)
00077 {
00078 const bool __testout = this->_M_mode & ios_base::out;
00079 if (__builtin_expect(!__testout, false))
00080 return traits_type::eof();
00081
00082 const bool __testeof = traits_type::eq_int_type(__c, traits_type::eof());
00083 if (__builtin_expect(__testeof, false))
00084 return traits_type::not_eof(__c);
00085
00086 const __size_type __capacity = _M_string.capacity();
00087 const __size_type __max_size = _M_string.max_size();
00088 const bool __testput = this->pptr() < this->epptr();
00089 if (__builtin_expect(!__testput && __capacity == __max_size, false))
00090 return traits_type::eof();
00091
00092
00093
00094 if (!__testput)
00095 {
00096
00097
00098
00099
00100
00101
00102 const __size_type __opt_len = std::max(__size_type(2 * __capacity),
00103 __size_type(512));
00104 const __size_type __len = std::min(__opt_len, __max_size);
00105 __string_type __tmp;
00106 __tmp.reserve(__len);
00107 __tmp.assign(_M_string.data(), this->epptr() - this->pbase());
00108 _M_string.swap(__tmp);
00109 _M_sync(const_cast<char_type*>(_M_string.data()),
00110 this->gptr() - this->eback(), this->pptr() - this->pbase());
00111 }
00112 return this->sputc(traits_type::to_char_type(__c));
00113 }
00114
00115 template <class _CharT, class _Traits, class _Alloc>
00116 typename basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
00117 basic_stringbuf<_CharT, _Traits, _Alloc>::
00118 underflow()
00119 {
00120 int_type __ret = traits_type::eof();
00121 const bool __testin = this->_M_mode & ios_base::in;
00122 if (__testin)
00123 {
00124
00125 _M_update_egptr();
00126
00127 if (this->gptr() < this->egptr())
00128 __ret = traits_type::to_int_type(*this->gptr());
00129 }
00130 return __ret;
00131 }
00132
00133 template <class _CharT, class _Traits, class _Alloc>
00134 typename basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type
00135 basic_stringbuf<_CharT, _Traits, _Alloc>::
00136 seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode)
00137 {
00138 pos_type __ret = pos_type(off_type(-1));
00139 bool __testin = (ios_base::in & this->_M_mode & __mode) != 0;
00140 bool __testout = (ios_base::out & this->_M_mode & __mode) != 0;
00141 const bool __testboth = __testin && __testout && __way != ios_base::cur;
00142 __testin &= !(__mode & ios_base::out);
00143 __testout &= !(__mode & ios_base::in);
00144
00145
00146
00147 const char_type* __beg = __testin ? this->eback() : this->pbase();
00148 if ((__beg || !__off) && (__testin || __testout || __testboth))
00149 {
00150 _M_update_egptr();
00151
00152 off_type __newoffi = 0;
00153 off_type __newoffo = 0;
00154 if (__way == ios_base::cur)
00155 {
00156 __newoffi = this->gptr() - __beg;
00157 __newoffo = this->pptr() - __beg;
00158 }
00159 else if (__way == ios_base::end)
00160 __newoffo = __newoffi = this->egptr() - __beg;
00161
00162 if ((__testin || __testboth)
00163 && __newoffi + __off >= 0
00164 && this->egptr() - __beg >= __newoffi + __off)
00165 {
00166 this->gbump((__beg + __newoffi + __off) - this->gptr());
00167 __ret = pos_type(__newoffi);
00168 }
00169 if ((__testout || __testboth)
00170 && __newoffo + __off >= 0
00171 && this->egptr() - __beg >= __newoffo + __off)
00172 {
00173 this->pbump((__beg + __newoffo + __off) - this->pptr());
00174 __ret = pos_type(__newoffo);
00175 }
00176 }
00177 return __ret;
00178 }
00179
00180 template <class _CharT, class _Traits, class _Alloc>
00181 typename basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type
00182 basic_stringbuf<_CharT, _Traits, _Alloc>::
00183 seekpos(pos_type __sp, ios_base::openmode __mode)
00184 {
00185 pos_type __ret = pos_type(off_type(-1));
00186 const bool __testin = (ios_base::in & this->_M_mode & __mode) != 0;
00187 const bool __testout = (ios_base::out & this->_M_mode & __mode) != 0;
00188
00189 const char_type* __beg = __testin ? this->eback() : this->pbase();
00190 if (__beg)
00191 {
00192 _M_update_egptr();
00193
00194 off_type __pos(__sp);
00195 const bool __testpos = 0 <= __pos
00196 && __pos <= this->egptr() - __beg;
00197 if ((__testin || __testout) && __testpos)
00198 {
00199 if (__testin)
00200 this->gbump((__beg + __pos) - this->gptr());
00201 if (__testout)
00202 this->pbump((__beg + __pos) - this->pptr());
00203 __ret = __sp;
00204 }
00205 }
00206 return __ret;
00207 }
00208
00209
00210
00211
00212 #if _GLIBCXX_EXTERN_TEMPLATE
00213 extern template class basic_stringbuf<char>;
00214 extern template class basic_istringstream<char>;
00215 extern template class basic_ostringstream<char>;
00216 extern template class basic_stringstream<char>;
00217
00218 #ifdef _GLIBCXX_USE_WCHAR_T
00219 extern template class basic_stringbuf<wchar_t>;
00220 extern template class basic_istringstream<wchar_t>;
00221 extern template class basic_ostringstream<wchar_t>;
00222 extern template class basic_stringstream<wchar_t>;
00223 #endif
00224 #endif
00225 }
00226
00227 #endif