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 _GLIBCXX_SSTREAM
00035 #define _GLIBCXX_SSTREAM 1
00036
00037 #pragma GCC system_header
00038
00039 #include <istream>
00040 #include <ostream>
00041
00042 _GLIBCXX_BEGIN_NAMESPACE(std)
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 template<typename _CharT, typename _Traits, typename _Alloc>
00058 class basic_stringbuf : public basic_streambuf<_CharT, _Traits>
00059 {
00060 public:
00061
00062 typedef _CharT char_type;
00063 typedef _Traits traits_type;
00064
00065
00066 typedef _Alloc allocator_type;
00067 typedef typename traits_type::int_type int_type;
00068 typedef typename traits_type::pos_type pos_type;
00069 typedef typename traits_type::off_type off_type;
00070
00071 typedef basic_streambuf<char_type, traits_type> __streambuf_type;
00072 typedef basic_string<char_type, _Traits, _Alloc> __string_type;
00073 typedef typename __string_type::size_type __size_type;
00074
00075 protected:
00076
00077 ios_base::openmode _M_mode;
00078
00079
00080 __string_type _M_string;
00081
00082 public:
00083
00084
00085
00086
00087
00088
00089
00090
00091 explicit
00092 basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out)
00093 : __streambuf_type(), _M_mode(__mode), _M_string()
00094 { }
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 explicit
00105 basic_stringbuf(const __string_type& __str,
00106 ios_base::openmode __mode = ios_base::in | ios_base::out)
00107 : __streambuf_type(), _M_mode(), _M_string(__str.data(), __str.size())
00108 { _M_stringbuf_init(__mode); }
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 __string_type
00120 str() const
00121 {
00122 __string_type __ret;
00123 if (this->pptr())
00124 {
00125
00126 if (this->pptr() > this->egptr())
00127 __ret = __string_type(this->pbase(), this->pptr());
00128 else
00129 __ret = __string_type(this->pbase(), this->egptr());
00130 }
00131 else
00132 __ret = _M_string;
00133 return __ret;
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143 void
00144 str(const __string_type& __s)
00145 {
00146
00147 _M_string.assign(__s.data(), __s.size());
00148 _M_stringbuf_init(_M_mode);
00149 }
00150
00151 protected:
00152
00153 void
00154 _M_stringbuf_init(ios_base::openmode __mode)
00155 {
00156 _M_mode = __mode;
00157 __size_type __len = 0;
00158 if (_M_mode & (ios_base::ate | ios_base::app))
00159 __len = _M_string.size();
00160 _M_sync(const_cast<char_type*>(_M_string.data()), 0, __len);
00161 }
00162
00163 virtual streamsize
00164 showmanyc()
00165 {
00166 streamsize __ret = -1;
00167 if (_M_mode & ios_base::in)
00168 {
00169 _M_update_egptr();
00170 __ret = this->egptr() - this->gptr();
00171 }
00172 return __ret;
00173 }
00174
00175 virtual int_type
00176 underflow();
00177
00178 virtual int_type
00179 pbackfail(int_type __c = traits_type::eof());
00180
00181 virtual int_type
00182 overflow(int_type __c = traits_type::eof());
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195 virtual __streambuf_type*
00196 setbuf(char_type* __s, streamsize __n)
00197 {
00198 if (__s && __n >= 0)
00199 {
00200
00201
00202
00203
00204
00205
00206 _M_string.clear();
00207
00208
00209 _M_sync(__s, __n, 0);
00210 }
00211 return this;
00212 }
00213
00214 virtual pos_type
00215 seekoff(off_type __off, ios_base::seekdir __way,
00216 ios_base::openmode __mode = ios_base::in | ios_base::out);
00217
00218 virtual pos_type
00219 seekpos(pos_type __sp,
00220 ios_base::openmode __mode = ios_base::in | ios_base::out);
00221
00222
00223
00224
00225 void
00226 _M_sync(char_type* __base, __size_type __i, __size_type __o);
00227
00228
00229
00230 void
00231 _M_update_egptr()
00232 {
00233 const bool __testin = _M_mode & ios_base::in;
00234 if (this->pptr() && this->pptr() > this->egptr())
00235 {
00236 if (__testin)
00237 this->setg(this->eback(), this->gptr(), this->pptr());
00238 else
00239 this->setg(this->pptr(), this->pptr(), this->pptr());
00240 }
00241 }
00242 };
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255 template<typename _CharT, typename _Traits, typename _Alloc>
00256 class basic_istringstream : public basic_istream<_CharT, _Traits>
00257 {
00258 public:
00259
00260 typedef _CharT char_type;
00261 typedef _Traits traits_type;
00262
00263
00264 typedef _Alloc allocator_type;
00265 typedef typename traits_type::int_type int_type;
00266 typedef typename traits_type::pos_type pos_type;
00267 typedef typename traits_type::off_type off_type;
00268
00269
00270 typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
00271 typedef basic_stringbuf<_CharT, _Traits, _Alloc> __stringbuf_type;
00272 typedef basic_istream<char_type, traits_type> __istream_type;
00273
00274 private:
00275 __stringbuf_type _M_stringbuf;
00276
00277 public:
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291 explicit
00292 basic_istringstream(ios_base::openmode __mode = ios_base::in)
00293 : __istream_type(), _M_stringbuf(__mode | ios_base::in)
00294 { this->init(&_M_stringbuf); }
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309 explicit
00310 basic_istringstream(const __string_type& __str,
00311 ios_base::openmode __mode = ios_base::in)
00312 : __istream_type(), _M_stringbuf(__str, __mode | ios_base::in)
00313 { this->init(&_M_stringbuf); }
00314
00315
00316
00317
00318
00319
00320
00321 ~basic_istringstream()
00322 { }
00323
00324
00325
00326
00327
00328
00329
00330
00331 __stringbuf_type*
00332 rdbuf() const
00333 { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
00334
00335
00336
00337
00338
00339 __string_type
00340 str() const
00341 { return _M_stringbuf.str(); }
00342
00343
00344
00345
00346
00347
00348
00349 void
00350 str(const __string_type& __s)
00351 { _M_stringbuf.str(__s); }
00352 };
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365 template <typename _CharT, typename _Traits, typename _Alloc>
00366 class basic_ostringstream : public basic_ostream<_CharT, _Traits>
00367 {
00368 public:
00369
00370 typedef _CharT char_type;
00371 typedef _Traits traits_type;
00372
00373
00374 typedef _Alloc allocator_type;
00375 typedef typename traits_type::int_type int_type;
00376 typedef typename traits_type::pos_type pos_type;
00377 typedef typename traits_type::off_type off_type;
00378
00379
00380 typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
00381 typedef basic_stringbuf<_CharT, _Traits, _Alloc> __stringbuf_type;
00382 typedef basic_ostream<char_type, traits_type> __ostream_type;
00383
00384 private:
00385 __stringbuf_type _M_stringbuf;
00386
00387 public:
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401 explicit
00402 basic_ostringstream(ios_base::openmode __mode = ios_base::out)
00403 : __ostream_type(), _M_stringbuf(__mode | ios_base::out)
00404 { this->init(&_M_stringbuf); }
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419 explicit
00420 basic_ostringstream(const __string_type& __str,
00421 ios_base::openmode __mode = ios_base::out)
00422 : __ostream_type(), _M_stringbuf(__str, __mode | ios_base::out)
00423 { this->init(&_M_stringbuf); }
00424
00425
00426
00427
00428
00429
00430
00431 ~basic_ostringstream()
00432 { }
00433
00434
00435
00436
00437
00438
00439
00440
00441 __stringbuf_type*
00442 rdbuf() const
00443 { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
00444
00445
00446
00447
00448
00449 __string_type
00450 str() const
00451 { return _M_stringbuf.str(); }
00452
00453
00454
00455
00456
00457
00458
00459 void
00460 str(const __string_type& __s)
00461 { _M_stringbuf.str(__s); }
00462 };
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475 template <typename _CharT, typename _Traits, typename _Alloc>
00476 class basic_stringstream : public basic_iostream<_CharT, _Traits>
00477 {
00478 public:
00479
00480 typedef _CharT char_type;
00481 typedef _Traits traits_type;
00482
00483
00484 typedef _Alloc allocator_type;
00485 typedef typename traits_type::int_type int_type;
00486 typedef typename traits_type::pos_type pos_type;
00487 typedef typename traits_type::off_type off_type;
00488
00489
00490 typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
00491 typedef basic_stringbuf<_CharT, _Traits, _Alloc> __stringbuf_type;
00492 typedef basic_iostream<char_type, traits_type> __iostream_type;
00493
00494 private:
00495 __stringbuf_type _M_stringbuf;
00496
00497 public:
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509 explicit
00510 basic_stringstream(ios_base::openmode __m = ios_base::out | ios_base::in)
00511 : __iostream_type(), _M_stringbuf(__m)
00512 { this->init(&_M_stringbuf); }
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525 explicit
00526 basic_stringstream(const __string_type& __str,
00527 ios_base::openmode __m = ios_base::out | ios_base::in)
00528 : __iostream_type(), _M_stringbuf(__str, __m)
00529 { this->init(&_M_stringbuf); }
00530
00531
00532
00533
00534
00535
00536
00537 ~basic_stringstream()
00538 { }
00539
00540
00541
00542
00543
00544
00545
00546
00547 __stringbuf_type*
00548 rdbuf() const
00549 { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
00550
00551
00552
00553
00554
00555 __string_type
00556 str() const
00557 { return _M_stringbuf.str(); }
00558
00559
00560
00561
00562
00563
00564
00565 void
00566 str(const __string_type& __s)
00567 { _M_stringbuf.str(__s); }
00568 };
00569
00570 _GLIBCXX_END_NAMESPACE
00571
00572 #ifndef _GLIBCXX_EXPORT_TEMPLATE
00573 # include <bits/sstream.tcc>
00574 #endif
00575
00576 #endif