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 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
00082
00083
00084
00085 ios_base::openmode _M_mode;
00086
00087
00088 __string_type _M_string;
00089
00090 public:
00091
00092
00093
00094
00095
00096
00097
00098
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
00104
00105
00106
00107
00108
00109
00110
00111
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
00119
00120
00121
00122
00123
00124
00125
00126
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
00144
00145
00146
00147
00148
00149
00150
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
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
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
00252
00253
00254
00255
00256
00257
00258
00259
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
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
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
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
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
00324
00325
00326
00327
00328
00329
00330 ~basic_istringstream()
00331 { }
00332
00333
00334
00335
00336
00337
00338
00339
00340 __stringbuf_type*
00341 rdbuf() const
00342 { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
00343
00344
00345
00346
00347
00348 __string_type
00349 str() const
00350 { return _M_stringbuf.str(); }
00351
00352
00353
00354
00355
00356
00357
00358 void
00359 str(const __string_type& __s)
00360 { _M_stringbuf.str(__s); }
00361 };
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
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
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
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
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
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
00437
00438
00439
00440
00441
00442
00443 ~basic_ostringstream()
00444 { }
00445
00446
00447
00448
00449
00450
00451
00452
00453 __stringbuf_type*
00454 rdbuf() const
00455 { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
00456
00457
00458
00459
00460
00461 __string_type
00462 str() const
00463 { return _M_stringbuf.str(); }
00464
00465
00466
00467
00468
00469
00470
00471 void
00472 str(const __string_type& __s)
00473 { _M_stringbuf.str(__s); }
00474 };
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
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
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
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
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
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
00546
00547
00548
00549
00550
00551
00552 ~basic_stringstream()
00553 { }
00554
00555
00556
00557
00558
00559
00560
00561
00562 __stringbuf_type*
00563 rdbuf() const
00564 { return const_cast<__stringbuf_type*>(&_M_stringbuf); }
00565
00566
00567
00568
00569
00570 __string_type
00571 str() const
00572 { return _M_stringbuf.str(); }
00573
00574
00575
00576
00577
00578
00579
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