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
00039 #ifndef _GLIBCXX_SSTREAM
00040 #define _GLIBCXX_SSTREAM 1
00041
00042 #pragma GCC system_header
00043
00044 #include <istream>
00045 #include <ostream>
00046
00047 namespace std
00048 {
00049
00061 template<typename _CharT, typename _Traits, typename _Alloc>
00062 class basic_stringbuf : public basic_streambuf<_CharT, _Traits>
00063 {
00064 public:
00065
00066 typedef _CharT char_type;
00067 typedef _Traits traits_type;
00068
00069
00070 typedef _Alloc allocator_type;
00071 typedef typename traits_type::int_type int_type;
00072 typedef typename traits_type::pos_type pos_type;
00073 typedef typename traits_type::off_type off_type;
00074
00075 typedef basic_streambuf<char_type, traits_type> __streambuf_type;
00076 typedef basic_string<char_type, _Traits, _Alloc> __string_type;
00077 typedef typename __string_type::size_type __size_type;
00078
00079 protected:
00085 ios_base::openmode _M_mode;
00086
00087
00088 __string_type _M_string;
00089
00090 public:
00091
00099 explicit
00100 basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out)
00101 : __streambuf_type(), _M_mode(__mode), _M_string()
00102 { }
00103
00112 explicit
00113 basic_stringbuf(const __string_type& __str,
00114 ios_base::openmode __mode = ios_base::in | ios_base::out)
00115 : __streambuf_type(), _M_mode(), _M_string(__str.data(), __str.size())
00116 { _M_stringbuf_init(__mode); }
00117
00118
00127 __string_type
00128 str() const
00129 {
00130 __string_type __ret;
00131 if (this->pptr())
00132 {
00133
00134 if (this->pptr() > this->egptr())
00135 __ret = __string_type(this->pbase(), this->pptr());
00136 else
00137 __ret = __string_type(this->pbase(), this->egptr());
00138 }
00139 else
00140 __ret = _M_string;
00141 return __ret;
00142 }
00143
00151 void
00152 str(const __string_type& __s)
00153 {
00154
00155 _M_string.assign(__s.data(), __s.size());
00156 _M_stringbuf_init(_M_mode);
00157 }
00158
00159 protected:
00160
00161 void
00162 _M_stringbuf_init(ios_base::openmode __mode)
00163 {
00164 _M_mode = __mode;
00165 __size_type __len = 0;
00166 if (_M_mode & (ios_base::ate | ios_base::app))
00167 __len = _M_string.size();
00168 _M_sync(const_cast<char_type*>(_M_string.data()), 0, __len);
00169 }
00170
00171 virtual streamsize
00172 showmanyc()
00173 {
00174 streamsize __ret = -1;
00175 if (_M_mode & ios_base::in)
00176 {
00177 _M_update_egptr();
00178 __ret = this->egptr() - this->gptr();
00179 }
00180 return __ret;
00181 }
00182
00183 virtual int_type
00184 underflow();
00185
00186 virtual int_type
00187 pbackfail(int_type __c = traits_type::eof());
00188
00189 virtual int_type
00190 overflow(int_type __c = traits_type::eof());
00191
00203 virtual __streambuf_type*
00204 setbuf(char_type* __s, streamsize __n)
00205 {
00206 if (__s && __n >= 0)
00207 {
00208
00209
00210
00211
00212
00213
00214 _M_string.clear();
00215
00216
00217 _M_sync(__s, __n, 0);
00218 }
00219 return this;
00220 }
00221
00222 virtual pos_type
00223 seekoff(off_type __off, ios_base::seekdir __way,
00224 ios_base::openmode __mode = ios_base::in | ios_base::out);
00225
00226 virtual pos_type
00227 seekpos(pos_type __sp,
00228 ios_base::openmode __mode = ios_base::in | ios_base::out);
00229
00230
00231
00232
00233 void
00234 _M_sync(char_type* __base, __size_type __i, __size_type __o);
00235
00236
00237
00238 void
00239 _M_update_egptr()
00240 {
00241 const bool __testin = _M_mode & ios_base::in;
00242 if (this->pptr() && this->pptr() > this->egptr())
00243 if (__testin)
00244 this->setg(this->eback(), this->gptr(), this->pptr());
00245 else
00246 this->setg(this->pptr(), this->pptr(), this->pptr());
00247 }
00248 };
00249
00250
00251
00260 template<typename _CharT, typename _Traits, typename _Alloc>
00261 class basic_istringstream : public basic_istream<_CharT, _Traits>
00262 {
00263 public:
00264
00265 typedef _CharT char_type;
00266 typedef _Traits traits_type;
00267
00268
00269 typedef _Alloc allocator_type;
00270 typedef typename traits_type::int_type int_type;
00271 typedef typename traits_type::pos_type pos_type;
00272 typedef typename traits_type::off_type off_type;
00273
00274
00275 typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
00276 typedef basic_stringbuf<_CharT, _Traits, _Alloc> __stringbuf_type;
00277 typedef basic_istream<char_type, traits_type> __istream_type;
00278
00279 private:
00280 __stringbuf_type _M_stringbuf;
00281
00282 public:
00283
00298 explicit
00299 basic_istringstream(ios_base::openmode __mode = ios_base::in)
00300 : __istream_type(), _M_stringbuf(__mode | ios_base::in)
00301 { this->init(&_M_stringbuf); }
00302
00318 explicit
00319 basic_istringstream(const __string_type& __str,
00320 ios_base::openmode __mode = ios_base::in)
00321 : __istream_type(), _M_stringbuf(__str, __mode | ios_base::in)
00322 { this->init(&_M_stringbuf); }
00323
00330 ~basic_istringstream()
00331 { }
00332
00333
00340 __stringbuf_type*
00341 rdbuf() const
00342 { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
00343
00348 __string_type
00349 str() const
00350 { return _M_stringbuf.str(); }
00351
00358 void
00359 str(const __string_type& __s)
00360 { _M_stringbuf.str(__s); }
00361 };
00362
00363
00364
00373 template <typename _CharT, typename _Traits, typename _Alloc>
00374 class basic_ostringstream : public basic_ostream<_CharT, _Traits>
00375 {
00376 public:
00377
00378 typedef _CharT char_type;
00379 typedef _Traits traits_type;
00380
00381
00382 typedef _Alloc allocator_type;
00383 typedef typename traits_type::int_type int_type;
00384 typedef typename traits_type::pos_type pos_type;
00385 typedef typename traits_type::off_type off_type;
00386
00387
00388 typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
00389 typedef basic_stringbuf<_CharT, _Traits, _Alloc> __stringbuf_type;
00390 typedef basic_ostream<char_type, traits_type> __ostream_type;
00391
00392 private:
00393 __stringbuf_type _M_stringbuf;
00394
00395 public:
00396
00411 explicit
00412 basic_ostringstream(ios_base::openmode __mode = ios_base::out)
00413 : __ostream_type(), _M_stringbuf(__mode | ios_base::out)
00414 { this->init(&_M_stringbuf); }
00415
00431 explicit
00432 basic_ostringstream(const __string_type& __str,
00433 ios_base::openmode __mode = ios_base::out)
00434 : __ostream_type(), _M_stringbuf(__str, __mode | ios_base::out)
00435 { this->init(&_M_stringbuf); }
00436
00443 ~basic_ostringstream()
00444 { }
00445
00446
00453 __stringbuf_type*
00454 rdbuf() const
00455 { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
00456
00461 __string_type
00462 str() const
00463 { return _M_stringbuf.str(); }
00464
00471 void
00472 str(const __string_type& __s)
00473 { _M_stringbuf.str(__s); }
00474 };
00475
00476
00477
00486 template <typename _CharT, typename _Traits, typename _Alloc>
00487 class basic_stringstream : public basic_iostream<_CharT, _Traits>
00488 {
00489 public:
00490
00491 typedef _CharT char_type;
00492 typedef _Traits traits_type;
00493
00494
00495 typedef _Alloc allocator_type;
00496 typedef typename traits_type::int_type int_type;
00497 typedef typename traits_type::pos_type pos_type;
00498 typedef typename traits_type::off_type off_type;
00499
00500
00501 typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
00502 typedef basic_stringbuf<_CharT, _Traits, _Alloc> __stringbuf_type;
00503 typedef basic_iostream<char_type, traits_type> __iostream_type;
00504
00505 private:
00506 __stringbuf_type _M_stringbuf;
00507
00508 public:
00509
00522 explicit
00523 basic_stringstream(ios_base::openmode __m = ios_base::out | ios_base::in)
00524 : __iostream_type(), _M_stringbuf(__m)
00525 { this->init(&_M_stringbuf); }
00526
00540 explicit
00541 basic_stringstream(const __string_type& __str,
00542 ios_base::openmode __m = ios_base::out | ios_base::in)
00543 : __iostream_type(), _M_stringbuf(__str, __m)
00544 { this->init(&_M_stringbuf); }
00545
00552 ~basic_stringstream()
00553 { }
00554
00555
00562 __stringbuf_type*
00563 rdbuf() const
00564 { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
00565
00570 __string_type
00571 str() const
00572 { return _M_stringbuf.str(); }
00573
00580 void
00581 str(const __string_type& __s)
00582 { _M_stringbuf.str(__s); }
00583 };
00584 }
00585
00586 #ifndef _GLIBCXX_EXPORT_TEMPLATE
00587 # include <bits/sstream.tcc>
00588 #endif
00589
00590 #endif