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
00036
00037
00038
00039 #ifndef _GLIBCXX_SSTREAM
00040 #define _GLIBCXX_SSTREAM 1
00041
00042 #pragma GCC system_header
00043
00044 #include <istream>
00045 #include <ostream>
00046
00047 _GLIBCXX_BEGIN_NAMESPACE(std)
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
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:
00080
00081 ios_base::openmode _M_mode;
00082
00083
00084 __string_type _M_string;
00085
00086 public:
00087
00088
00089
00090
00091
00092
00093
00094
00095 explicit
00096 basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out)
00097 : __streambuf_type(), _M_mode(__mode), _M_string()
00098 { }
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 explicit
00109 basic_stringbuf(const __string_type& __str,
00110 ios_base::openmode __mode = ios_base::in | ios_base::out)
00111 : __streambuf_type(), _M_mode(), _M_string(__str.data(), __str.size())
00112 { _M_stringbuf_init(__mode); }
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 __string_type
00124 str() const
00125 {
00126 __string_type __ret;
00127 if (this->pptr())
00128 {
00129
00130 if (this->pptr() > this->egptr())
00131 __ret = __string_type(this->pbase(), this->pptr());
00132 else
00133 __ret = __string_type(this->pbase(), this->egptr());
00134 }
00135 else
00136 __ret = _M_string;
00137 return __ret;
00138 }
00139
00140
00141
00142
00143
00144
00145
00146
00147 void
00148 str(const __string_type& __s)
00149 {
00150
00151 _M_string.assign(__s.data(), __s.size());
00152 _M_stringbuf_init(_M_mode);
00153 }
00154
00155 protected:
00156
00157 void
00158 _M_stringbuf_init(ios_base::openmode __mode)
00159 {
00160 _M_mode = __mode;
00161 __size_type __len = 0;
00162 if (_M_mode & (ios_base::ate | ios_base::app))
00163 __len = _M_string.size();
00164 _M_sync(const_cast<char_type*>(_M_string.data()), 0, __len);
00165 }
00166
00167 virtual streamsize
00168 showmanyc()
00169 {
00170 streamsize __ret = -1;
00171 if (_M_mode & ios_base::in)
00172 {
00173 _M_update_egptr();
00174 __ret = this->egptr() - this->gptr();
00175 }
00176 return __ret;
00177 }
00178
00179 virtual int_type
00180 underflow();
00181
00182 virtual int_type
00183 pbackfail(int_type __c = traits_type::eof());
00184
00185 virtual int_type
00186 overflow(int_type __c = traits_type::eof());
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199 virtual __streambuf_type*
00200 setbuf(char_type* __s, streamsize __n)
00201 {
00202 if (__s && __n >= 0)
00203 {
00204
00205
00206
00207
00208
00209
00210 _M_string.clear();
00211
00212
00213 _M_sync(__s, __n, 0);
00214 }
00215 return this;
00216 }
00217
00218 virtual pos_type
00219 seekoff(off_type __off, ios_base::seekdir __way,
00220 ios_base::openmode __mode = ios_base::in | ios_base::out);
00221
00222 virtual pos_type
00223 seekpos(pos_type __sp,
00224 ios_base::openmode __mode = ios_base::in | ios_base::out);
00225
00226
00227
00228
00229 void
00230 _M_sync(char_type* __base, __size_type __i, __size_type __o);
00231
00232
00233
00234 void
00235 _M_update_egptr()
00236 {
00237 const bool __testin = _M_mode & ios_base::in;
00238 if (this->pptr() && this->pptr() > this->egptr())
00239 if (__testin)
00240 this->setg(this->eback(), this->gptr(), this->pptr());
00241 else
00242 this->setg(this->pptr(), this->pptr(), this->pptr());
00243 }
00244 };
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256 template<typename _CharT, typename _Traits, typename _Alloc>
00257 class basic_istringstream : public basic_istream<_CharT, _Traits>
00258 {
00259 public:
00260
00261 typedef _CharT char_type;
00262 typedef _Traits traits_type;
00263
00264
00265 typedef _Alloc allocator_type;
00266 typedef typename traits_type::int_type int_type;
00267 typedef typename traits_type::pos_type pos_type;
00268 typedef typename traits_type::off_type off_type;
00269
00270
00271 typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
00272 typedef basic_stringbuf<_CharT, _Traits, _Alloc> __stringbuf_type;
00273 typedef basic_istream<char_type, traits_type> __istream_type;
00274
00275 private:
00276 __stringbuf_type _M_stringbuf;
00277
00278 public:
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292 explicit
00293 basic_istringstream(ios_base::openmode __mode = ios_base::in)
00294 : __istream_type(), _M_stringbuf(__mode | ios_base::in)
00295 { this->init(&_M_stringbuf); }
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310 explicit
00311 basic_istringstream(const __string_type& __str,
00312 ios_base::openmode __mode = ios_base::in)
00313 : __istream_type(), _M_stringbuf(__str, __mode | ios_base::in)
00314 { this->init(&_M_stringbuf); }
00315
00316
00317
00318
00319
00320
00321
00322 ~basic_istringstream()
00323 { }
00324
00325
00326
00327
00328
00329
00330
00331
00332 __stringbuf_type*
00333 rdbuf() const
00334 { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
00335
00336
00337
00338
00339
00340 __string_type
00341 str() const
00342 { return _M_stringbuf.str(); }
00343
00344
00345
00346
00347
00348
00349
00350 void
00351 str(const __string_type& __s)
00352 { _M_stringbuf.str(__s); }
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 template <typename _CharT, typename _Traits, typename _Alloc>
00475 class basic_stringstream : public basic_iostream<_CharT, _Traits>
00476 {
00477 public:
00478
00479 typedef _CharT char_type;
00480 typedef _Traits traits_type;
00481
00482
00483 typedef _Alloc allocator_type;
00484 typedef typename traits_type::int_type int_type;
00485 typedef typename traits_type::pos_type pos_type;
00486 typedef typename traits_type::off_type off_type;
00487
00488
00489 typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
00490 typedef basic_stringbuf<_CharT, _Traits, _Alloc> __stringbuf_type;
00491 typedef basic_iostream<char_type, traits_type> __iostream_type;
00492
00493 private:
00494 __stringbuf_type _M_stringbuf;
00495
00496 public:
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508 explicit
00509 basic_stringstream(ios_base::openmode __m = ios_base::out | ios_base::in)
00510 : __iostream_type(), _M_stringbuf(__m)
00511 { this->init(&_M_stringbuf); }
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524 explicit
00525 basic_stringstream(const __string_type& __str,
00526 ios_base::openmode __m = ios_base::out | ios_base::in)
00527 : __iostream_type(), _M_stringbuf(__str, __m)
00528 { this->init(&_M_stringbuf); }
00529
00530
00531
00532
00533
00534
00535
00536 ~basic_stringstream()
00537 { }
00538
00539
00540
00541
00542
00543
00544
00545
00546 __stringbuf_type*
00547 rdbuf() const
00548 { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
00549
00550
00551
00552
00553
00554 __string_type
00555 str() const
00556 { return _M_stringbuf.str(); }
00557
00558
00559
00560
00561
00562
00563
00564 void
00565 str(const __string_type& __s)
00566 { _M_stringbuf.str(__s); }
00567 };
00568
00569 _GLIBCXX_END_NAMESPACE
00570
00571 #ifndef _GLIBCXX_EXPORT_TEMPLATE
00572 # include <bits/sstream.tcc>
00573 #endif
00574
00575 #endif