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
00040
#ifndef _CPP_BITS_LOCFACETS_H
00041
#define _CPP_BITS_LOCFACETS_H 1
00042
00043
#pragma GCC system_header
00044
00045
#include <ctime>
00046
#include <cwctype>
00047
#include <iosfwd>
00048
#include <bits/ios_base.h>
00049
#include <streambuf>
00050
00051
namespace std
00052 {
00053
00054
#ifdef _GLIBCPP_USE_WCHAR_T
00055
# define _GLIBCPP_NUM_FACETS 28
00056
#else
00057
# define _GLIBCPP_NUM_FACETS 14
00058
#endif
00059
00060
00061
00062
00063
template<
typename _Tv>
00064
void
00065 __convert_to_v(
const char* __in, _Tv& __out, ios_base::iostate& __err,
00066
const __c_locale& __cloc,
int __base = 10);
00067
00068
00069
template<>
00070
void
00071 __convert_to_v(
const char*,
long&, ios_base::iostate&,
00072
const __c_locale&,
int);
00073
00074
template<>
00075
void
00076 __convert_to_v(
const char*,
unsigned long&, ios_base::iostate&,
00077
const __c_locale&,
int);
00078
00079
#ifdef _GLIBCPP_USE_LONG_LONG
00080
template<>
00081
void
00082 __convert_to_v(
const char*,
long long&, ios_base::iostate&,
00083
const __c_locale&,
int);
00084
00085
template<>
00086
void
00087 __convert_to_v(
const char*,
unsigned long long&, ios_base::iostate&,
00088
const __c_locale&,
int);
00089
#endif
00090
00091
template<>
00092
void
00093 __convert_to_v(
const char*,
float&, ios_base::iostate&,
00094
const __c_locale&,
int);
00095
00096
template<>
00097
void
00098 __convert_to_v(
const char*,
double&, ios_base::iostate&,
00099
const __c_locale&,
int);
00100
00101
template<>
00102
void
00103 __convert_to_v(
const char*,
long double&, ios_base::iostate&,
00104
const __c_locale&,
int);
00105
00106
00107
00108
template<
typename _CharT,
typename _Traits>
00109
struct __pad
00110 {
00111
static void
00112 _S_pad(ios_base& __io, _CharT __fill, _CharT* __news,
00113
const _CharT* __olds,
const streamsize __newlen,
00114
const streamsize __oldlen,
const bool __num);
00115 };
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
template<
typename _CharT>
00126
bool
00127 __verify_grouping(
const basic_string<_CharT>& __grouping,
00128 basic_string<_CharT>& __grouping_tmp);
00129
00130
00131
00132
00133
00134
00135
template<
typename _CharT>
00136 _CharT*
00137 __add_grouping(_CharT* __s, _CharT __sep,
00138
const char* __gbeg,
const char* __gend,
00139
const _CharT* __first,
const _CharT* __last);
00140
00141
00142
00143
00144
template<
typename _CharT>
00145
inline
00146 ostreambuf_iterator<_CharT>
00147 __write(ostreambuf_iterator<_CharT> __s,
const _CharT* __ws,
int __len)
00148 {
00149 __s._M_put(__ws, __len);
00150
return __s;
00151 }
00152
00153
00154
template<
typename _CharT,
typename _OutIter>
00155
inline
00156 _OutIter
00157 __write(_OutIter __s,
const _CharT* __ws,
int __len)
00158 {
00159
for (
int __j = 0; __j < __len; __j++, ++__s)
00160 *__s = __ws[__j];
00161
return __s;
00162 }
00163
00164
00165
00166
#include <bits/ctype_base.h>
00167
00168
00169
template<
typename _CharT>
00170
class __ctype_abstract_base :
public locale::facet,
public ctype_base
00171 {
00172
public:
00173
00174
typedef _CharT char_type;
00175
00176
bool
00177 is(mask __m, char_type __c)
const
00178
{
return this->do_is(__m, __c); }
00179
00180
const char_type*
00181 is(
const char_type *__lo,
const char_type *__hi, mask *__vec)
const
00182
{
return this->do_is(__lo, __hi, __vec); }
00183
00184
const char_type*
00185 scan_is(mask __m,
const char_type* __lo,
const char_type* __hi)
const
00186
{
return this->do_scan_is(__m, __lo, __hi); }
00187
00188
const char_type*
00189 scan_not(mask __m,
const char_type* __lo,
const char_type* __hi)
const
00190
{
return this->do_scan_not(__m, __lo, __hi); }
00191
00192 char_type
00193 toupper(char_type __c)
const
00194
{
return this->do_toupper(__c); }
00195
00196
const char_type*
00197 toupper(char_type *__lo,
const char_type* __hi)
const
00198
{
return this->do_toupper(__lo, __hi); }
00199
00200 char_type
00201 tolower(char_type __c)
const
00202
{
return this->do_tolower(__c); }
00203
00204
const char_type*
00205 tolower(char_type* __lo,
const char_type* __hi)
const
00206
{
return this->do_tolower(__lo, __hi); }
00207
00208 char_type
00209 widen(
char __c)
const
00210
{
return this->do_widen(__c); }
00211
00212
const char*
00213 widen(
const char* __lo,
const char* __hi, char_type* __to)
const
00214
{
return this->do_widen(__lo, __hi, __to); }
00215
00216
char
00217 narrow(char_type __c,
char __dfault)
const
00218
{
return this->do_narrow(__c, __dfault); }
00219
00220
const char_type*
00221 narrow(
const char_type* __lo,
const char_type* __hi,
00222
char __dfault,
char *__to)
const
00223
{
return this->do_narrow(__lo, __hi, __dfault, __to); }
00224
00225
protected:
00226
explicit
00227 __ctype_abstract_base(size_t __refs = 0): locale::facet(__refs) { }
00228
00229
virtual
00230 ~__ctype_abstract_base() { }
00231
00232
virtual bool
00233 do_is(mask __m, char_type __c)
const = 0;
00234
00235
virtual const char_type*
00236 do_is(
const char_type* __lo,
const char_type* __hi,
00237 mask* __vec)
const = 0;
00238
00239
virtual const char_type*
00240 do_scan_is(mask __m,
const char_type* __lo,
00241
const char_type* __hi)
const = 0;
00242
00243
virtual const char_type*
00244 do_scan_not(mask __m,
const char_type* __lo,
00245
const char_type* __hi)
const = 0;
00246
00247
virtual char_type
00248 do_toupper(char_type) const = 0;
00249
00250 virtual const char_type*
00251 do_toupper(char_type* __lo, const char_type* __hi) const = 0;
00252
00253 virtual char_type
00254 do_tolower(char_type) const = 0;
00255
00256 virtual const char_type*
00257 do_tolower(char_type* __lo, const char_type* __hi) const = 0;
00258
00259 virtual char_type
00260 do_widen(
char) const = 0;
00261
00262 virtual const
char*
00263 do_widen(const
char* __lo, const
char* __hi,
00264 char_type* __dest) const = 0;
00265
00266 virtual
char
00267 do_narrow(char_type,
char __dfault) const = 0;
00268
00269 virtual const char_type*
00270 do_narrow(const char_type* __lo, const char_type* __hi,
00271
char __dfault,
char* __dest) const = 0;
00272 };
00273
00274
00275 template<typename _CharT>
00276 class ctype : public __ctype_abstract_base<_CharT>
00277 {
00278
public:
00279
00280
typedef _CharT char_type;
00281
typedef typename ctype::mask mask;
00282
00283
static locale::id
id;
00284
00285
explicit
00286 ctype(size_t __refs = 0) : __ctype_abstract_base<_CharT>(__refs) { }
00287
00288
protected:
00289
virtual
00290 ~ctype();
00291
00292
virtual bool
00293 do_is(mask __m, char_type __c)
const;
00294
00295
virtual const char_type*
00296 do_is(
const char_type* __lo,
const char_type* __hi, mask* __vec)
const;
00297
00298
virtual const char_type*
00299 do_scan_is(mask __m,
const char_type* __lo,
const char_type* __hi)
const;
00300
00301
virtual const char_type*
00302 do_scan_not(mask __m,
const char_type* __lo,
00303
const char_type* __hi)
const;
00304
00305
virtual char_type
00306 do_toupper(char_type __c)
const;
00307
00308
virtual const char_type*
00309 do_toupper(char_type* __lo,
const char_type* __hi)
const;
00310
00311
virtual char_type
00312 do_tolower(char_type __c)
const;
00313
00314
virtual const char_type*
00315 do_tolower(char_type* __lo,
const char_type* __hi)
const;
00316
00317
virtual char_type
00318 do_widen(
char __c)
const;
00319
00320
virtual const char*
00321 do_widen(
const char* __lo,
const char* __hi, char_type* __dest)
const;
00322
00323
virtual char
00324 do_narrow(char_type,
char __dfault)
const;
00325
00326
virtual const char_type*
00327 do_narrow(
const char_type* __lo,
const char_type* __hi,
00328
char __dfault,
char* __dest)
const;
00329 };
00330
00331
template<
typename _CharT>
00332 locale::id ctype<_CharT>::id;
00333
00334
00335
template<>
00336
class ctype<char> :
public __ctype_abstract_base<char>
00337 {
00338
public:
00339
00340
typedef char char_type;
00341
00342
protected:
00343
00344 __c_locale _M_c_locale_ctype;
00345
bool _M_del;
00346 __to_type _M_toupper;
00347 __to_type _M_tolower;
00348
const mask* _M_table;
00349
00350
public:
00351
static locale::id
id;
00352
static const size_t table_size = 1 + static_cast<unsigned char>(-1);
00353
00354
explicit
00355 ctype(
const mask* __table = 0,
bool __del =
false, size_t __refs = 0);
00356
00357
explicit
00358 ctype(__c_locale __cloc,
const mask* __table = 0,
bool __del =
false,
00359 size_t __refs = 0);
00360
00361
inline bool
00362 is(mask __m,
char __c)
const;
00363
00364
inline const char*
00365 is(
const char* __lo,
const char* __hi, mask* __vec)
const;
00366
00367
inline const char*
00368 scan_is(mask __m,
const char* __lo,
const char* __hi)
const;
00369
00370
inline const char*
00371 scan_not(mask __m,
const char* __lo,
const char* __hi)
const;
00372
00373
protected:
00374
const mask*
00375 table() const throw()
00376 {
return _M_table; }
00377
00378
static const mask*
00379 classic_table() throw();
00380
00381 virtual
00382 ~ctype();
00383
00384 virtual
bool
00385 do_is(mask __m, char_type __c) const;
00386
00387 virtual const char_type*
00388 do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
00389
00390 virtual const char_type*
00391 do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
00392
00393 virtual const char_type*
00394 do_scan_not(mask __m, const char_type* __lo,
00395 const char_type* __hi) const;
00396
00397 virtual char_type
00398 do_toupper(char_type) const;
00399
00400 virtual const char_type*
00401 do_toupper(char_type* __lo, const char_type* __hi) const;
00402
00403 virtual char_type
00404 do_tolower(char_type) const;
00405
00406 virtual const char_type*
00407 do_tolower(char_type* __lo, const char_type* __hi) const;
00408
00409 virtual char_type
00410 do_widen(
char) const;
00411
00412 virtual const
char*
00413 do_widen(const
char* __lo, const
char* __hi, char_type* __dest) const;
00414
00415 virtual
char
00416 do_narrow(char_type,
char __dfault) const;
00417
00418 virtual const char_type*
00419 do_narrow(const char_type* __lo, const char_type* __hi,
00420
char __dfault,
char* __dest) const;
00421 };
00422
00423 template<>
00424 const ctype<
char>&
00425 use_facet<ctype<
char> >(const locale& __loc);
00426
00427 #ifdef _GLIBCPP_USE_WCHAR_T
00428
00429 template<>
00430 class ctype<
wchar_t> : public __ctype_abstract_base<
wchar_t>
00431 {
00432
public:
00433
00434
typedef wchar_t char_type;
00435
typedef wctype_t __wmask_type;
00436
00437
protected:
00438 __c_locale _M_c_locale_ctype;
00439
00440
public:
00441
00442
static locale::id
id;
00443
00444
explicit
00445 ctype(size_t __refs = 0);
00446
00447
explicit
00448 ctype(__c_locale __cloc, size_t __refs = 0);
00449
00450
protected:
00451 __wmask_type
00452 _M_convert_to_wmask(
const mask __m)
const;
00453
00454
virtual
00455 ~ctype();
00456
00457
virtual bool
00458 do_is(mask __m, char_type __c)
const;
00459
00460
virtual const char_type*
00461 do_is(
const char_type* __lo,
const char_type* __hi, mask* __vec)
const;
00462
00463
virtual const char_type*
00464 do_scan_is(mask __m,
const char_type* __lo,
const char_type* __hi)
const;
00465
00466
virtual const char_type*
00467 do_scan_not(mask __m,
const char_type* __lo,
00468
const char_type* __hi)
const;
00469
00470
virtual char_type
00471 do_toupper(char_type) const;
00472
00473 virtual const char_type*
00474 do_toupper(char_type* __lo, const char_type* __hi) const;
00475
00476 virtual char_type
00477 do_tolower(char_type) const;
00478
00479 virtual const char_type*
00480 do_tolower(char_type* __lo, const char_type* __hi) const;
00481
00482 virtual char_type
00483 do_widen(
char) const;
00484
00485 virtual const
char*
00486 do_widen(const
char* __lo, const
char* __hi, char_type* __dest) const;
00487
00488 virtual
char
00489 do_narrow(char_type,
char __dfault) const;
00490
00491 virtual const char_type*
00492 do_narrow(const char_type* __lo, const char_type* __hi,
00493
char __dfault,
char* __dest) const;
00494
00495 };
00496
00497 template<>
00498 const ctype<
wchar_t>&
00499 use_facet<ctype<
wchar_t> >(const locale& __loc);
00500 #endif
00501
00502
00503 #include <bits/ctype_inline.h>
00504
00505
00506 template<typename _CharT>
00507 class ctype_byname : public ctype<_CharT>
00508 {
00509
public:
00510
typedef _CharT char_type;
00511
00512
explicit
00513 ctype_byname(
const char* __s, size_t __refs = 0);
00514
00515
protected:
00516
virtual
00517 ~ctype_byname() { };
00518 };
00519
00520
00521
template<>
00522 ctype_byname<char>::ctype_byname(
const char*, size_t refs);
00523
00524
template<>
00525 ctype_byname<wchar_t>::ctype_byname(
const char*, size_t refs);
00526
00527
00528
#include <bits/codecvt.h>
00529
00530
00531
class __num_base
00532 {
00533
public:
00534
00535
00536
enum
00537 {
00538 _S_minus,
00539 _S_plus,
00540 _S_x,
00541 _S_X,
00542 _S_digits,
00543 _S_digits_end = _S_digits + 16,
00544 _S_udigits = _S_digits_end,
00545 _S_udigits_end = _S_udigits + 16,
00546 _S_e = _S_digits + 14,
00547 _S_E = _S_udigits + 14,
00548 _S_end = _S_udigits_end
00549 };
00550
00551
00552
00553
00554
00555
00556
static const char* _S_atoms_out;
00557
00558
protected:
00559
00560
00561
static const char* _S_atoms_in;
00562
00563
enum
00564 {
00565 _M_zero,
00566 _M_e = _M_zero + 10,
00567 _M_E = _M_zero + 11,
00568 _M_size = 21 + 1
00569 };
00570
00571
00572
00573
static void
00574 _S_format_float(
const ios_base& __io,
char* __fptr,
char __mod,
00575 streamsize __prec);
00576
00577
00578
static void
00579 _S_format_int(
const ios_base& __io,
char* __fptr,
char __mod,
char __modl);
00580 };
00581
00582
00583
template<
typename _CharT>
00584
class __locale_cache;
00585
00586
template<
typename _CharT>
00587
class numpunct :
public locale::facet
00588 {
00589
public:
00590
00591
typedef _CharT char_type;
00592
typedef basic_string<_CharT> string_type;
00593
00594
friend class __locale_cache<numpunct<_CharT> >;
00595
00596
static locale::id
id;
00597
00598
private:
00599 char_type _M_decimal_point;
00600 char_type _M_thousands_sep;
00601
const char* _M_grouping;
00602
const char_type* _M_truename;
00603
const char_type* _M_falsename;
00604
00605
public:
00606
explicit
00607 numpunct(size_t __refs = 0) : locale::facet(__refs)
00608 { _M_initialize_numpunct(); }
00609
00610
explicit
00611 numpunct(__c_locale __cloc, size_t __refs = 0) : locale::facet(__refs)
00612 { _M_initialize_numpunct(__cloc); }
00613
00614 char_type
00615 decimal_point()
const
00616
{
return this->do_decimal_point(); }
00617
00618 char_type
00619 thousands_sep()
const
00620
{
return this->do_thousands_sep(); }
00621
00622 string
00623 grouping()
const
00624
{
return this->do_grouping(); }
00625
00626 string_type
00627 truename()
const
00628
{
return this->do_truename(); }
00629
00630 string_type
00631 falsename()
const
00632
{
return this->do_falsename(); }
00633
00634
protected:
00635
virtual
00636 ~numpunct();
00637
00638
virtual char_type
00639 do_decimal_point()
const
00640
{
return _M_decimal_point; }
00641
00642
virtual char_type
00643 do_thousands_sep()
const
00644
{
return _M_thousands_sep; }
00645
00646
virtual string
00647 do_grouping()
const
00648
{
return _M_grouping; }
00649
00650
virtual string_type
00651 do_truename()
const
00652
{
return _M_truename; }
00653
00654
virtual string_type
00655 do_falsename()
const
00656
{
return _M_falsename; }
00657
00658
00659
void
00660 _M_initialize_numpunct(__c_locale __cloc = NULL);
00661 };
00662
00663
template<
typename _CharT>
00664 locale::id numpunct<_CharT>::id;
00665
00666
template<>
00667 numpunct<char>::~numpunct();
00668
00669
template<>
00670
void
00671 numpunct<char>::_M_initialize_numpunct(__c_locale __cloc);
00672
00673
#ifdef _GLIBCPP_USE_WCHAR_T
00674
template<>
00675 numpunct<wchar_t>::~numpunct();
00676
00677
template<>
00678
void
00679 numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc);
00680
#endif
00681
00682
template<
typename _CharT>
00683
class numpunct_byname :
public numpunct<_CharT>
00684 {
00685
00686 __c_locale _M_c_locale_numpunct;
00687
00688
public:
00689
typedef _CharT char_type;
00690
typedef basic_string<_CharT> string_type;
00691
00692
explicit
00693 numpunct_byname(
const char* __s, size_t __refs = 0)
00694 : numpunct<_CharT>(__refs)
00695 {
00696 _S_create_c_locale(_M_c_locale_numpunct, __s);
00697 _M_initialize_numpunct(_M_c_locale_numpunct);
00698 }
00699
00700
protected:
00701
virtual
00702 ~numpunct_byname()
00703 { _S_destroy_c_locale(_M_c_locale_numpunct); }
00704 };
00705
00706
template<
typename _CharT,
typename _InIter>
00707
class num_get :
public locale::facet,
public __num_base
00708 {
00709
public:
00710
00711
typedef _CharT char_type;
00712
typedef _InIter iter_type;
00713
00714
static locale::id
id;
00715
00716
explicit
00717 num_get(size_t __refs = 0) : locale::facet(__refs) { }
00718
00719 iter_type
00720 get(iter_type __in, iter_type __end, ios_base& __io,
00721 ios_base::iostate& __err,
bool& __v)
const
00722
{
return this->do_get(__in, __end, __io, __err, __v); }
00723
00724 iter_type
00725 get(iter_type __in, iter_type __end, ios_base& __io,
00726 ios_base::iostate& __err,
long& __v)
const
00727
{
return this->do_get(__in, __end, __io, __err, __v); }
00728
00729 iter_type
00730 get(iter_type __in, iter_type __end, ios_base& __io,
00731 ios_base::iostate& __err,
unsigned short& __v)
const
00732
{
return this->do_get(__in, __end, __io, __err, __v); }
00733
00734 iter_type
00735 get(iter_type __in, iter_type __end, ios_base& __io,
00736 ios_base::iostate& __err,
unsigned int& __v)
const
00737 {
return this->do_get(__in, __end, __io, __err, __v); }
00738
00739 iter_type
00740 get(iter_type __in, iter_type __end, ios_base& __io,
00741 ios_base::iostate& __err,
unsigned long& __v)
const
00742 {
return this->do_get(__in, __end, __io, __err, __v); }
00743
00744
#ifdef _GLIBCPP_USE_LONG_LONG
00745
iter_type
00746 get(iter_type __in, iter_type __end, ios_base& __io,
00747 ios_base::iostate& __err,
long long& __v)
const
00748
{
return this->do_get(__in, __end, __io, __err, __v); }
00749
00750 iter_type
00751 get(iter_type __in, iter_type __end, ios_base& __io,
00752 ios_base::iostate& __err,
unsigned long long& __v)
const
00753 {
return this->do_get(__in, __end, __io, __err, __v); }
00754
#endif
00755
00756 iter_type
00757 get(iter_type __in, iter_type __end, ios_base& __io,
00758 ios_base::iostate& __err,
float& __v)
const
00759
{
return this->do_get(__in, __end, __io, __err, __v); }
00760
00761 iter_type
00762 get(iter_type __in, iter_type __end, ios_base& __io,
00763 ios_base::iostate& __err,
double& __v)
const
00764
{
return this->do_get(__in, __end, __io, __err, __v); }
00765
00766 iter_type
00767 get(iter_type __in, iter_type __end, ios_base& __io,
00768 ios_base::iostate& __err,
long double& __v)
const
00769
{
return this->do_get(__in, __end, __io, __err, __v); }
00770
00771 iter_type
00772 get(iter_type __in, iter_type __end, ios_base& __io,
00773 ios_base::iostate& __err,
void*& __v)
const
00774
{
return this->do_get(__in, __end, __io, __err, __v); }
00775
00776
protected:
00777
virtual ~num_get() { }
00778
00779 iter_type
00780 _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
00781 string& __xtrc)
const;
00782
00783 iter_type
00784 _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
00785 string& __xtrc,
int& __base)
const;
00786
00787
virtual iter_type
00788 do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
bool&) const;
00789
00790
00791 virtual iter_type
00792 do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
long&) const;
00793
00794 virtual iter_type
00795 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
00796
unsigned short&) const;
00797
00798 virtual iter_type
00799 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
00800
unsigned int&) const;
00801
00802 virtual iter_type
00803 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
00804
unsigned long&) const;
00805
00806 #ifdef _GLIBCPP_USE_LONG_LONG
00807 virtual iter_type
00808 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
00809
long long&) const;
00810
00811 virtual iter_type
00812 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
00813
unsigned long long&) const;
00814 #endif
00815
00816 virtual iter_type
00817 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
00818
float&) const;
00819
00820 virtual iter_type
00821 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
00822
double&) const;
00823
00824 virtual iter_type
00825 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
00826
long double&) const;
00827
00828 virtual iter_type
00829 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
00830
void*&) const;
00831 };
00832
00833 template<typename _CharT, typename _InIter>
00834 locale::
id num_get<_CharT, _InIter>::
id;
00835
00836 #if 0
00837
00838 template<typename _CharT>
00839 class num_get<_CharT, istreambuf_iterator<_CharT> >;
00840
00841 iter_type
00842 _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
00843 string& __xtrc) const;
00844
00845 iter_type
00846 _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
00847 string& __xtrc,
int& __base) const;
00848
00849 virtual iter_type
00850 do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
bool&) const;
00851 #endif
00852
00853 template<typename _CharT, typename _OutIter>
00854 class num_put : public locale::facet, public __num_base
00855 {
00856
public:
00857
00858
typedef _CharT char_type;
00859
typedef _OutIter iter_type;
00860
static locale::id
id;
00861
00862
explicit
00863 num_put(size_t __refs = 0) : locale::facet(__refs) { }
00864
00865 iter_type
00866 put(iter_type __s, ios_base& __f, char_type __fill,
bool __v)
const
00867
{
return this->do_put(__s, __f, __fill, __v); }
00868
00869 iter_type
00870 put(iter_type __s, ios_base& __f, char_type __fill,
long __v)
const
00871
{
return this->do_put(__s, __f, __fill, __v); }
00872
00873 iter_type
00874 put(iter_type __s, ios_base& __f, char_type __fill,
00875
unsigned long __v)
const
00876
{
return this->do_put(__s, __f, __fill, __v); }
00877
00878
#ifdef _GLIBCPP_USE_LONG_LONG
00879
iter_type
00880 put(iter_type __s, ios_base& __f, char_type __fill,
long long __v)
const
00881
{
return this->do_put(__s, __f, __fill, __v); }
00882
00883 iter_type
00884 put(iter_type __s, ios_base& __f, char_type __fill,
00885
unsigned long long __v)
const
00886
{
return this->do_put(__s, __f, __fill, __v); }
00887
#endif
00888
00889 iter_type
00890 put(iter_type __s, ios_base& __f, char_type __fill,
double __v)
const
00891
{
return this->do_put(__s, __f, __fill, __v); }
00892
00893 iter_type
00894 put(iter_type __s, ios_base& __f, char_type __fill,
00895
long double __v)
const
00896
{
return this->do_put(__s, __f, __fill, __v); }
00897
00898 iter_type
00899 put(iter_type __s, ios_base& __f, char_type __fill,
00900
const void* __v)
const
00901
{
return this->do_put(__s, __f, __fill, __v); }
00902
00903
protected:
00904
template<
typename _ValueT>
00905 iter_type
00906 _M_convert_float(iter_type, ios_base& __io, char_type __fill,
00907
char __mod, _ValueT __v)
const;
00908
00909
void
00910 _M_group_float(
const string& __grouping, char_type __sep,
00911
const char_type* __p, char_type* __new, char_type* __cs,
00912
int& __len)
const;
00913
00914
template<
typename _ValueT>
00915 iter_type
00916 _M_convert_int(iter_type, ios_base& __io, char_type __fill,
00917 _ValueT __v)
const;
00918
00919
void
00920 _M_group_int(
const string& __grouping, char_type __sep,
00921 ios_base& __io, char_type* __new, char_type* __cs,
00922
int& __len)
const;
00923
00924
void
00925 _M_pad(char_type __fill, streamsize __w, ios_base& __io,
00926 char_type* __new,
const char_type* __cs,
int& __len)
const;
00927
00928
#if 1
00929
00930
template<
typename _ValueT>
00931 iter_type
00932 _M_convert_int(iter_type, ios_base& __io, char_type __fill,
00933
char __mod,
char __modl, _ValueT __v)
const;
00934
00935 iter_type
00936 _M_widen_float(iter_type, ios_base& __io, char_type __fill,
char* __cs,
00937
int __len)
const;
00938
00939 iter_type
00940 _M_widen_int(iter_type, ios_base& __io, char_type __fill,
char* __cs,
00941
int __len)
const;
00942
00943 iter_type
00944 _M_insert(iter_type, ios_base& __io, char_type __fill,
00945
const char_type* __ws,
int __len)
const;
00946
#endif
00947
00948
virtual
00949 ~num_put() { };
00950
00951
virtual iter_type
00952 do_put(iter_type, ios_base&, char_type __fill,
bool __v)
const;
00953
00954
virtual iter_type
00955 do_put(iter_type, ios_base&, char_type __fill,
long __v)
const;
00956
00957
virtual iter_type
00958 do_put(iter_type, ios_base&, char_type __fill,
unsigned long)
const;
00959
00960
#ifdef _GLIBCPP_USE_LONG_LONG
00961
virtual iter_type
00962 do_put(iter_type, ios_base&, char_type __fill,
long long __v)
const;
00963
00964
virtual iter_type
00965 do_put(iter_type, ios_base&, char_type __fill,
unsigned long long)
const;
00966
#endif
00967
00968
virtual iter_type
00969 do_put(iter_type, ios_base&, char_type __fill,
double __v)
const;
00970
00971
virtual iter_type
00972 do_put(iter_type, ios_base&, char_type __fill,
long double __v)
const;
00973
00974
virtual iter_type
00975 do_put(iter_type, ios_base&, char_type __fill,
const void* __v)
const;
00976 };
00977
00978
template <
typename _CharT,
typename _OutIter>
00979 locale::id num_put<_CharT, _OutIter>::id;
00980
00981
00982
template<
typename _CharT>
00983
class collate :
public locale::facet
00984 {
00985
public:
00986
00987
typedef _CharT char_type;
00988
typedef basic_string<_CharT> string_type;
00989
00990
protected:
00991
00992
00993 __c_locale _M_c_locale_collate;
00994
00995
public:
00996
static locale::id
id;
00997
00998
explicit
00999 collate(size_t __refs = 0)
01000 : locale::facet(__refs)
01001 { _M_c_locale_collate = _S_c_locale; }
01002
01003
explicit
01004 collate(__c_locale __cloc, size_t __refs = 0)
01005 : locale::facet(__refs)
01006 { _M_c_locale_collate = _S_clone_c_locale(__cloc); }
01007
01008
int
01009 compare(
const _CharT* __lo1,
const _CharT* __hi1,
01010
const _CharT* __lo2,
const _CharT* __hi2)
const
01011
{
return this->do_compare(__lo1, __hi1, __lo2, __hi2); }
01012
01013 string_type
01014
transform(
const _CharT* __lo,
const _CharT* __hi)
const
01015
{
return this->do_transform(__lo, __hi); }
01016
01017
long
01018 hash(
const _CharT* __lo,
const _CharT* __hi)
const
01019
{
return this->do_hash(__lo, __hi); }
01020
01021
01022
int
01023 _M_compare(
const _CharT*,
const _CharT*) const;
01024
01025 size_t
01026 _M_transform(_CharT*, const _CharT*, size_t) const;
01027
01028 protected:
01029 virtual
01030 ~collate()
01031 { _S_destroy_c_locale(_M_c_locale_collate); }
01032
01033
virtual int
01034 do_compare(
const _CharT* __lo1,
const _CharT* __hi1,
01035
const _CharT* __lo2,
const _CharT* __hi2)
const;
01036
01037
virtual string_type
01038 do_transform(
const _CharT* __lo,
const _CharT* __hi)
const;
01039
01040
virtual long
01041 do_hash(
const _CharT* __lo,
const _CharT* __hi)
const;
01042 };
01043
01044
template<
typename _CharT>
01045 locale::id collate<_CharT>::id;
01046
01047
01048
template<>
01049
int
01050 collate<char>::_M_compare(
const char*,
const char*) const;
01051
01052 template<>
01053 size_t
01054 collate<
char>::_M_transform(
char*, const
char*, size_t) const;
01055
01056 #ifdef _GLIBCPP_USE_WCHAR_T
01057 template<>
01058
int
01059 collate<
wchar_t>::_M_compare(const
wchar_t*, const
wchar_t*) const;
01060
01061 template<>
01062 size_t
01063 collate<
wchar_t>::_M_transform(
wchar_t*, const
wchar_t*, size_t) const;
01064 #endif
01065
01066 template<typename _CharT>
01067 class collate_byname : public collate<_CharT>
01068 {
01069
public:
01070
typedef _CharT char_type;
01071
typedef basic_string<_CharT> string_type;
01072
01073
explicit
01074 collate_byname(
const char* __s, size_t __refs = 0)
01075 : collate<_CharT>(__refs)
01076 {
01077 _S_destroy_c_locale(_M_c_locale_collate);
01078 _S_create_c_locale(_M_c_locale_collate, __s);
01079 }
01080
01081
protected:
01082
virtual
01083 ~collate_byname() { }
01084 };
01085
01086
01087
class time_base
01088 {
01089
public:
01090
enum dateorder { no_order, dmy, mdy, ymd, ydm };
01091 };
01092
01093
template<
typename _CharT>
01094
class __timepunct :
public locale::facet
01095 {
01096
public:
01097
01098
typedef _CharT __char_type;
01099
typedef basic_string<_CharT> __string_type;
01100
01101
static locale::id
id;
01102
01103
01104
static const _CharT* _S_timezones[14];
01105
01106
protected:
01107 __c_locale _M_c_locale_timepunct;
01108
char* _M_name_timepunct;
01109
const _CharT* _M_date_format;
01110
const _CharT* _M_date_era_format;
01111
const _CharT* _M_time_format;
01112
const _CharT* _M_time_era_format;
01113
const _CharT* _M_date_time_format;
01114
const _CharT* _M_date_time_era_format;
01115
const _CharT* _M_am;
01116
const _CharT* _M_pm;
01117
const _CharT* _M_am_pm_format;
01118
01119
01120
const _CharT* _M_day1;
01121
const _CharT* _M_day2;
01122
const _CharT* _M_day3;
01123
const _CharT* _M_day4;
01124
const _CharT* _M_day5;
01125
const _CharT* _M_day6;
01126
const _CharT* _M_day7;
01127
01128
01129
const _CharT* _M_day_a1;
01130
const _CharT* _M_day_a2;
01131
const _CharT* _M_day_a3;
01132
const _CharT* _M_day_a4;
01133
const _CharT* _M_day_a5;
01134
const _CharT* _M_day_a6;
01135
const _CharT* _M_day_a7;
01136
01137
01138
const _CharT* _M_month01;
01139
const _CharT* _M_month02;
01140
const _CharT* _M_month03;
01141
const _CharT* _M_month04;
01142
const _CharT* _M_month05;
01143
const _CharT* _M_month06;
01144
const _CharT* _M_month07;
01145
const _CharT* _M_month08;
01146
const _CharT* _M_month09;
01147
const _CharT* _M_month10;
01148
const _CharT* _M_month11;
01149
const _CharT* _M_month12;
01150
01151
01152
const _CharT* _M_month_a01;
01153
const _CharT* _M_month_a02;
01154
const _CharT* _M_month_a03;
01155
const _CharT* _M_month_a04;
01156
const _CharT* _M_month_a05;
01157
const _CharT* _M_month_a06;
01158
const _CharT* _M_month_a07;
01159
const _CharT* _M_month_a08;
01160
const _CharT* _M_month_a09;
01161
const _CharT* _M_month_a10;
01162
const _CharT* _M_month_a11;
01163
const _CharT* _M_month_a12;
01164
01165
public:
01166
explicit
01167 __timepunct(size_t __refs = 0);
01168
01169
explicit
01170 __timepunct(__c_locale __cloc,
const char* __s, size_t __refs = 0);
01171
01172
void
01173 _M_put(_CharT* __s, size_t __maxlen,
const _CharT* __format,
01174
const tm* __tm)
const;
01175
01176
void
01177 _M_date_formats(
const _CharT** __date)
const
01178
{
01179
01180 __date[0] = _M_date_format;
01181 __date[1] = _M_date_era_format;
01182 }
01183
01184
void
01185 _M_time_formats(
const _CharT** __time)
const
01186
{
01187
01188 __time[0] = _M_time_format;
01189 __time[1] = _M_time_era_format;
01190 }
01191
01192
void
01193 _M_ampm(
const _CharT** __ampm)
const
01194
{
01195 __ampm[0] = _M_am;
01196 __ampm[1] = _M_pm;
01197 }
01198
01199
void
01200 _M_date_time_formats(
const _CharT** __dt)
const
01201
{
01202
01203 __dt[0] = _M_date_time_format;
01204 __dt[1] = _M_date_time_era_format;
01205 }
01206
01207
void
01208 _M_days(
const _CharT** __days)
const
01209
{
01210 __days[0] = _M_day1;
01211 __days[1] = _M_day2;
01212 __days[2] = _M_day3;
01213 __days[3] = _M_day4;
01214 __days[4] = _M_day5;
01215 __days[5] = _M_day6;
01216 __days[6] = _M_day7;
01217 }
01218
01219
void
01220 _M_days_abbreviated(
const _CharT** __days)
const
01221
{
01222 __days[0] = _M_day_a1;
01223 __days[1] = _M_day_a2;
01224 __days[2] = _M_day_a3;
01225 __days[3] = _M_day_a4;
01226 __days[4] = _M_day_a5;
01227 __days[5] = _M_day_a6;
01228 __days[6] = _M_day_a7;
01229 }
01230
01231
void
01232 _M_months(
const _CharT** __months)
const
01233
{
01234 __months[0] = _M_month01;
01235 __months[1] = _M_month02;
01236 __months[2] = _M_month03;
01237 __months[3] = _M_month04;
01238 __months[4] = _M_month05;
01239 __months[5] = _M_month06;
01240 __months[6] = _M_month07;
01241 __months[7] = _M_month08;
01242 __months[8] = _M_month09;
01243 __months[9] = _M_month10;
01244 __months[10] = _M_month11;
01245 __months[11] = _M_month12;
01246 }
01247
01248
void
01249 _M_months_abbreviated(
const _CharT** __months)
const
01250
{
01251 __months[0] = _M_month_a01;
01252 __months[1] = _M_month_a02;
01253 __months[2] = _M_month_a03;
01254 __months[3] = _M_month_a04;
01255 __months[4] = _M_month_a05;
01256 __months[5] = _M_month_a06;
01257 __months[6] = _M_month_a07;
01258 __months[7] = _M_month_a08;
01259 __months[8] = _M_month_a09;
01260 __months[9] = _M_month_a10;
01261 __months[10] = _M_month_a11;
01262 __months[11] = _M_month_a12;
01263 }
01264
01265
protected:
01266
virtual
01267 ~__timepunct();
01268
01269
01270
void
01271 _M_initialize_timepunct(__c_locale __cloc = NULL);
01272 };
01273
01274
template<
typename _CharT>
01275 locale::id __timepunct<_CharT>::id;
01276
01277
01278
template<>
01279
const char*
01280 __timepunct<char>::_S_timezones[14];
01281
01282
template<>
01283
void
01284 __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc);
01285
01286
template<>
01287
void
01288 __timepunct<char>::_M_put(
char*, size_t,
const char*,
const tm*) const;
01289
01290 #ifdef _GLIBCPP_USE_WCHAR_T
01291 template<>
01292 const
wchar_t*
01293 __timepunct<
wchar_t>::_S_timezones[14];
01294
01295 template<>
01296
void
01297 __timepunct<
wchar_t>::_M_initialize_timepunct(__c_locale __cloc);
01298
01299 template<>
01300
void
01301 __timepunct<
wchar_t>::_M_put(
wchar_t*, size_t, const
wchar_t*,
01302 const tm*) const;
01303 #endif
01304
01305
01306 template<typename _CharT>
01307 const _CharT* __timepunct<_CharT>::_S_timezones[14];
01308
01309
01310 #include <bits/time_members.h>
01311
01312 template<typename _CharT, typename _InIter>
01313 class time_get : public locale::facet, public time_base
01314 {
01315
public:
01316
01317
typedef _CharT char_type;
01318
typedef _InIter iter_type;
01319
typedef basic_string<_CharT> __string_type;
01320
01321
static locale::id
id;
01322
01323
explicit
01324 time_get(size_t __refs = 0)
01325 : locale::facet (__refs) { }
01326
01327 dateorder
01328 date_order() const
01329 {
return this->do_date_order(); }
01330
01331 iter_type
01332 get_time(iter_type __beg, iter_type __end, ios_base& __io,
01333 ios_base::iostate& __err, tm* __tm)
const
01334 {
return this->do_get_time(__beg, __end, __io, __err, __tm); }
01335
01336 iter_type
01337 get_date(iter_type __beg, iter_type __end, ios_base& __io,
01338 ios_base::iostate& __err, tm* __tm)
const
01339 {
return this->do_get_date(__beg, __end, __io, __err, __tm); }
01340
01341 iter_type
01342 get_weekday(iter_type __beg, iter_type __end, ios_base& __io,
01343 ios_base::iostate& __err, tm* __tm)
const
01344
{
return this->do_get_weekday(__beg, __end, __io, __err, __tm); }
01345
01346 iter_type
01347 get_monthname(iter_type __beg, iter_type __end, ios_base& __io,
01348 ios_base::iostate& __err, tm* __tm)
const
01349
{
return this->do_get_monthname(__beg, __end, __io, __err, __tm); }
01350
01351 iter_type
01352 get_year(iter_type __beg, iter_type __end, ios_base& __io,
01353 ios_base::iostate& __err, tm* __tm)
const
01354
{
return this->do_get_year(__beg, __end, __io, __err, __tm); }
01355
01356
protected:
01357
virtual
01358 ~time_get() { }
01359
01360
virtual dateorder
01361 do_date_order() const;
01362
01363 virtual iter_type
01364 do_get_time(iter_type __beg, iter_type __end, ios_base& __io,
01365 ios_base::iostate& __err, tm* __tm) const;
01366
01367 virtual iter_type
01368 do_get_date(iter_type __beg, iter_type __end, ios_base& __io,
01369 ios_base::iostate& __err, tm* __tm) const;
01370
01371 virtual iter_type
01372 do_get_weekday(iter_type __beg, iter_type __end, ios_base&,
01373 ios_base::iostate& __err, tm* __tm) const;
01374
01375 virtual iter_type
01376 do_get_monthname(iter_type __beg, iter_type __end, ios_base&,
01377 ios_base::iostate& __err, tm* __tm) const;
01378
01379 virtual iter_type
01380 do_get_year(iter_type __beg, iter_type __end, ios_base& __io,
01381 ios_base::iostate& __err, tm* __tm) const;
01382
01383
01384
void
01385 _M_extract_num(iter_type& __beg, iter_type& __end,
int& __member,
01386
int __min,
int __max, size_t __len,
01387 const ctype<_CharT>& __ctype,
01388 ios_base::iostate& __err) const;
01389
01390
01391
01392
void
01393 _M_extract_name(iter_type& __beg, iter_type& __end,
int& __member,
01394 const _CharT** __names, size_t __indexlen,
01395 ios_base::iostate& __err) const;
01396
01397
01398
void
01399 _M_extract_via_format(iter_type& __beg, iter_type& __end, ios_base& __io,
01400 ios_base::iostate& __err, tm* __tm,
01401 const _CharT* __format) const;
01402 };
01403
01404 template<typename _CharT, typename _InIter>
01405 locale::
id time_get<_CharT, _InIter>::
id;
01406
01407 template<typename _CharT, typename _InIter>
01408 class time_get_byname : public time_get<_CharT, _InIter>
01409 {
01410
public:
01411
01412
typedef _CharT char_type;
01413
typedef _InIter iter_type;
01414
01415
explicit
01416 time_get_byname(
const char*, size_t __refs = 0)
01417 : time_get<_CharT, _InIter>(__refs) { }
01418
01419
protected:
01420
virtual
01421 ~time_get_byname() { }
01422 };
01423
01424
template<
typename _CharT,
typename _OutIter>
01425
class time_put :
public locale::facet,
public time_base
01426 {
01427
public:
01428
01429
typedef _CharT char_type;
01430
typedef _OutIter iter_type;
01431
01432
static locale::id
id;
01433
01434
explicit
01435 time_put(size_t __refs = 0)
01436 : locale::facet(__refs) { }
01437
01438 iter_type
01439 put(iter_type __s, ios_base& __io, char_type __fill,
const tm* __tm,
01440
const _CharT* __beg,
const _CharT* __end)
const;
01441
01442 iter_type
01443 put(iter_type __s, ios_base& __io, char_type __fill,
01444
const tm* __tm,
char __format,
char __mod = 0)
const
01445
{
return this->do_put(__s, __io, __fill, __tm, __format, __mod); }
01446
01447
protected:
01448
virtual
01449 ~time_put()
01450 { }
01451
01452
virtual iter_type
01453 do_put(iter_type __s, ios_base& __io, char_type __fill,
const tm* __tm,
01454
char __format,
char __mod)
const;
01455 };
01456
01457
template<
typename _CharT,
typename _OutIter>
01458 locale::id time_put<_CharT, _OutIter>::id;
01459
01460
template<
typename _CharT,
typename _OutIter>
01461
class time_put_byname :
public time_put<_CharT, _OutIter>
01462 {
01463
public:
01464
01465
typedef _CharT char_type;
01466
typedef _OutIter iter_type;
01467
01468
explicit
01469 time_put_byname(
const char* , size_t __refs = 0)
01470 : time_put<_CharT, _OutIter>(__refs)
01471 { };
01472
01473
protected:
01474
virtual
01475 ~time_put_byname() { }
01476 };
01477
01478
01479
class money_base
01480 {
01481
public:
01482
enum part { none, space, symbol, sign, value };
01483
struct pattern {
char field[4]; };
01484
01485
static const pattern _S_default_pattern;
01486
01487
01488
01489
static pattern
01490 _S_construct_pattern(
char __precedes,
char __space,
char __posn);
01491 };
01492
01493
template<
typename _CharT,
bool _Intl>
01494
class moneypunct :
public locale::facet,
public money_base
01495 {
01496
public:
01497
01498
typedef _CharT char_type;
01499
typedef basic_string<_CharT> string_type;
01500
01501
static const bool intl = _Intl;
01502
static locale::id
id;
01503
01504
private:
01505
const char* _M_grouping;
01506 char_type _M_decimal_point;
01507 char_type _M_thousands_sep;
01508
const char_type* _M_curr_symbol;
01509
const char_type* _M_positive_sign;
01510
const char_type* _M_negative_sign;
01511
int _M_frac_digits;
01512 pattern _M_pos_format;
01513 pattern _M_neg_format;
01514
01515
public:
01516
explicit
01517 moneypunct(size_t __refs = 0) : locale::facet(__refs)
01518 { _M_initialize_moneypunct(); }
01519
01520
explicit
01521 moneypunct(__c_locale __cloc,
const char* __s, size_t __refs = 0)
01522 : locale::facet(__refs)
01523 { _M_initialize_moneypunct(__cloc, __s); }
01524
01525 char_type
01526 decimal_point()
const
01527
{
return this->do_decimal_point(); }
01528
01529 char_type
01530 thousands_sep()
const
01531
{
return this->do_thousands_sep(); }
01532
01533 string
01534 grouping()
const
01535
{
return this->do_grouping(); }
01536
01537 string_type
01538 curr_symbol()
const
01539
{
return this->do_curr_symbol(); }
01540
01541 string_type
01542 positive_sign()
const
01543
{
return this->do_positive_sign(); }
01544
01545 string_type
01546 negative_sign()
const
01547
{
return this->do_negative_sign(); }
01548
01549
int
01550 frac_digits()
const
01551
{
return this->do_frac_digits(); }
01552
01553 pattern
01554 pos_format()
const
01555
{
return this->do_pos_format(); }
01556
01557 pattern
01558 neg_format()
const
01559
{
return this->do_neg_format(); }
01560
01561
protected:
01562
virtual
01563 ~moneypunct();
01564
01565
virtual char_type
01566 do_decimal_point()
const
01567
{
return _M_decimal_point; }
01568
01569
virtual char_type
01570 do_thousands_sep()
const
01571
{
return _M_thousands_sep; }
01572
01573
virtual string
01574 do_grouping()
const
01575
{
return _M_grouping; }
01576
01577
virtual string_type
01578 do_curr_symbol() const
01579 {
return _M_curr_symbol; }
01580
01581
virtual string_type
01582 do_positive_sign()
const
01583
{
return _M_positive_sign; }
01584
01585
virtual string_type
01586 do_negative_sign()
const
01587
{
return _M_negative_sign; }
01588
01589
virtual int
01590 do_frac_digits()
const
01591
{
return _M_frac_digits; }
01592
01593
virtual pattern
01594 do_pos_format()
const
01595
{
return _M_pos_format; }
01596
01597
virtual pattern
01598 do_neg_format()
const
01599
{
return _M_neg_format; }
01600
01601
01602
void
01603 _M_initialize_moneypunct(__c_locale __cloc = NULL,
01604
const char* __name = NULL);
01605 };
01606
01607
template<
typename _CharT,
bool _Intl>
01608 locale::id moneypunct<_CharT, _Intl>::id;
01609
01610
template<
typename _CharT,
bool _Intl>
01611
const bool moneypunct<_CharT, _Intl>::intl;
01612
01613
template<>
01614 moneypunct<char, true>::~moneypunct();
01615
01616
template<>
01617 moneypunct<char, false>::~moneypunct();
01618
01619
template<>
01620
void
01621 moneypunct<char, true>::_M_initialize_moneypunct(__c_locale,
const char*);
01622
01623
template<>
01624
void
01625 moneypunct<char, false>::_M_initialize_moneypunct(__c_locale,
const char*);
01626
01627
#ifdef _GLIBCPP_USE_WCHAR_T
01628
template<>
01629 moneypunct<wchar_t, true>::~moneypunct();
01630
01631
template<>
01632 moneypunct<wchar_t, false>::~moneypunct();
01633
01634
template<>
01635
void
01636 moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale,
01637
const char*);
01638
01639
template<>
01640
void
01641 moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale,
01642
const char*);
01643
#endif
01644
01645
template<
typename _CharT,
bool _Intl>
01646
class moneypunct_byname :
public moneypunct<_CharT, _Intl>
01647 {
01648 __c_locale _M_c_locale_moneypunct;
01649
01650
public:
01651
typedef _CharT char_type;
01652
typedef basic_string<_CharT> string_type;
01653
01654
static const bool intl = _Intl;
01655
01656
explicit
01657 moneypunct_byname(
const char* __s, size_t __refs = 0)
01658 : moneypunct<_CharT, _Intl>(__refs)
01659 {
01660 _S_create_c_locale(_M_c_locale_moneypunct, __s);
01661 _M_initialize_moneypunct(_M_c_locale_moneypunct);
01662 }
01663
01664
protected:
01665
virtual
01666 ~moneypunct_byname()
01667 { _S_destroy_c_locale(_M_c_locale_moneypunct); }
01668 };
01669
01670
template<
typename _CharT,
bool _Intl>
01671
const bool moneypunct_byname<_CharT, _Intl>::intl;
01672
01673
template<
typename _CharT,
typename _InIter>
01674
class money_get :
public locale::facet
01675 {
01676
public:
01677
01678
typedef _CharT char_type;
01679
typedef _InIter iter_type;
01680
typedef basic_string<_CharT> string_type;
01681
01682
static locale::id
id;
01683
01684
explicit
01685 money_get(size_t __refs = 0) : locale::facet(__refs) { }
01686
01687 iter_type
01688 get(iter_type __s, iter_type __end,
bool __intl, ios_base& __io,
01689 ios_base::iostate& __err,
long double& __units)
const
01690
{
return this->do_get(__s, __end, __intl, __io, __err, __units); }
01691
01692 iter_type
01693 get(iter_type __s, iter_type __end,
bool __intl, ios_base& __io,
01694 ios_base::iostate& __err, string_type& __digits)
const
01695
{
return this->do_get(__s, __end, __intl, __io, __err, __digits); }
01696
01697
protected:
01698
virtual
01699 ~money_get() { }
01700
01701
virtual iter_type
01702 do_get(iter_type __s, iter_type __end,
bool __intl, ios_base& __io,
01703 ios_base::iostate& __err,
long double& __units)
const;
01704
01705
virtual iter_type
01706 do_get(iter_type __s, iter_type __end,
bool __intl, ios_base& __io,
01707 ios_base::iostate& __err, string_type& __digits)
const;
01708 };
01709
01710
template<
typename _CharT,
typename _InIter>
01711 locale::id money_get<_CharT, _InIter>::id;
01712
01713
template<
typename _CharT,
typename _OutIter>
01714
class money_put :
public locale::facet
01715 {
01716
public:
01717
typedef _CharT char_type;
01718
typedef _OutIter iter_type;
01719
typedef basic_string<_CharT> string_type;
01720
01721
static locale::id
id;
01722
01723
explicit
01724 money_put(size_t __refs = 0) : locale::facet(__refs) { }
01725
01726 iter_type
01727 put(iter_type __s,
bool __intl, ios_base& __io,
01728 char_type __fill,
long double __units)
const
01729
{
return this->do_put(__s, __intl, __io, __fill, __units); }
01730
01731 iter_type
01732 put(iter_type __s,
bool __intl, ios_base& __io,
01733 char_type __fill,
const string_type& __digits)
const
01734
{
return this->do_put(__s, __intl, __io, __fill, __digits); }
01735
01736
protected:
01737
virtual
01738 ~money_put() { }
01739
01740
virtual iter_type
01741 do_put(iter_type __s,
bool __intl, ios_base& __io, char_type __fill,
01742
long double __units)
const;
01743
01744
virtual iter_type
01745 do_put(iter_type __s,
bool __intl, ios_base& __io, char_type __fill,
01746
const string_type& __digits)
const;
01747 };
01748
01749
template<
typename _CharT,
typename _OutIter>
01750 locale::id money_put<_CharT, _OutIter>::id;
01751
01752
01753
struct messages_base
01754 {
01755
typedef int catalog;
01756 };
01757
01758
template<
typename _CharT>
01759
class messages :
public locale::facet,
public messages_base
01760 {
01761
public:
01762
01763
typedef _CharT char_type;
01764
typedef basic_string<_CharT> string_type;
01765
01766
protected:
01767
01768
01769 __c_locale _M_c_locale_messages;
01770
char* _M_name_messages;
01771
01772
public:
01773
static locale::id
id;
01774
01775
explicit
01776 messages(size_t __refs = 0);
01777
01778
01779
explicit
01780 messages(__c_locale __cloc,
const char* __s, size_t __refs = 0);
01781
01782 catalog
01783 open(
const basic_string<char>& __s,
const locale& __loc)
const
01784
{
return this->do_open(__s, __loc); }
01785
01786
01787 catalog
01788 open(
const basic_string<char>&,
const locale&,
const char*) const;
01789
01790 string_type
01791 get(catalog __c,
int __set,
int __msgid, const string_type& __s)
const
01792
{
return this->do_get(__c, __set, __msgid, __s); }
01793
01794
void
01795 close(catalog __c)
const
01796
{
return this->do_close(__c); }
01797
01798
protected:
01799
virtual
01800 ~messages();
01801
01802
virtual catalog
01803 do_open(
const basic_string<char>&,
const locale&) const;
01804
01805 virtual string_type
01806 do_get(catalog,
int,
int, const string_type& __dfault) const;
01807
01808 virtual
void
01809 do_close(catalog) const;
01810
01811
01812
char*
01813 _M_convert_to_char(const string_type& __msg)
const
01814
{
01815
01816
return reinterpret_cast<char*>(const_cast<_CharT*>(__msg.c_str()));
01817 }
01818
01819
01820 string_type
01821 _M_convert_from_char(
char* __msg)
const
01822
{
01823
01824 size_t __len = char_traits<char>::length(__msg) - 1;
01825
01826
01827
01828
#if 0
01829
01830
01831
01832
typedef typename codecvt<char, _CharT, mbstate_t> __codecvt_type;
01833
01834 __codecvt_type::state_type __state;
01835
01836
01837
01838
char* __from_next;
01839
01840 _CharT* __to = static_cast<_CharT*>(__builtin_alloca(__len + 1));
01841
const __codecvt_type& __cvt = use_facet<__codecvt_type>(_M_locale_conv);
01842 __cvt.out(__state, __msg, __msg + __len, __from_next,
01843 __to, __to + __len + 1, __to_next);
01844
return string_type(__to);
01845
#endif
01846
#if 0
01847
typedef ctype<_CharT> __ctype_type;
01848
01849
const __ctype_type& __cvt = use_facet<__ctype_type>(locale());
01850
01851
01852 _CharT* __dest = static_cast<_CharT*>(__builtin_alloca(__len + 1));
01853 __cvt.widen(__msg, __msg + __len, __dest);
01854
return basic_string<_CharT>(__dest);
01855
#endif
01856
return string_type();
01857 }
01858 };
01859
01860
template<
typename _CharT>
01861 locale::id messages<_CharT>::id;
01862
01863
01864
template<>
01865 string
01866 messages<char>::do_get(catalog,
int,
int,
const string&) const;
01867
01868 #ifdef _GLIBCPP_USE_WCHAR_T
01869 template<>
01870 wstring
01871 messages<
wchar_t>::do_get(catalog,
int,
int, const wstring&) const;
01872 #endif
01873
01874 template<typename _CharT>
01875 class messages_byname : public messages<_CharT>
01876 {
01877
public:
01878
typedef _CharT char_type;
01879
typedef basic_string<_CharT> string_type;
01880
01881
explicit
01882 messages_byname(
const char* __s, size_t __refs = 0);
01883
01884
protected:
01885
virtual
01886 ~messages_byname()
01887 { }
01888 };
01889
01890
01891
#include <bits/messages_members.h>
01892
01893
01894
01895
01896
01897
01898
template<
typename _CharT>
01899
inline bool
01900 isspace(_CharT __c,
const locale& __loc)
01901 {
return use_facet<ctype<_CharT> >(__loc).is(ctype_base::space, __c); }
01902
01903
template<
typename _CharT>
01904
inline bool
01905 isprint(_CharT __c,
const locale& __loc)
01906 {
return use_facet<ctype<_CharT> >(__loc).is(ctype_base::print, __c); }
01907
01908
template<
typename _CharT>
01909
inline bool
01910 iscntrl(_CharT __c,
const locale& __loc)
01911 {
return use_facet<ctype<_CharT> >(__loc).is(ctype_base::cntrl, __c); }
01912
01913
template<
typename _CharT>
01914
inline bool
01915 isupper(_CharT __c,
const locale& __loc)
01916 {
return use_facet<ctype<_CharT> >(__loc).is(ctype_base::upper, __c); }
01917
01918
template<
typename _CharT>
01919
inline bool islower(_CharT __c,
const locale& __loc)
01920 {
return use_facet<ctype<_CharT> >(__loc).is(ctype_base::lower, __c); }
01921
01922
template<
typename _CharT>
01923
inline bool
01924 isalpha(_CharT __c,
const locale& __loc)
01925 {
return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alpha, __c); }
01926
01927
template<
typename _CharT>
01928
inline bool
01929 isdigit(_CharT __c,
const locale& __loc)
01930 {
return use_facet<ctype<_CharT> >(__loc).is(ctype_base::digit, __c); }
01931
01932
template<
typename _CharT>
01933
inline bool
01934 ispunct(_CharT __c,
const locale& __loc)
01935 {
return use_facet<ctype<_CharT> >(__loc).is(ctype_base::punct, __c); }
01936
01937
template<
typename _CharT>
01938
inline bool
01939 isxdigit(_CharT __c,
const locale& __loc)
01940 {
return use_facet<ctype<_CharT> >(__loc).is(ctype_base::xdigit, __c); }
01941
01942
template<
typename _CharT>
01943
inline bool
01944 isalnum(_CharT __c,
const locale& __loc)
01945 {
return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alnum, __c); }
01946
01947
template<
typename _CharT>
01948
inline bool
01949 isgraph(_CharT __c,
const locale& __loc)
01950 {
return use_facet<ctype<_CharT> >(__loc).is(ctype_base::graph, __c); }
01951
01952
template<
typename _CharT>
01953
inline _CharT
01954 toupper(_CharT __c,
const locale& __loc)
01955 {
return use_facet<ctype<_CharT> >(__loc).toupper(__c); }
01956
01957
template<
typename _CharT>
01958
inline _CharT
01959 tolower(_CharT __c,
const locale& __loc)
01960 {
return use_facet<ctype<_CharT> >(__loc).tolower(__c); }
01961
01962
01963
01964
01965
01966
01967
01968
01969
01970
01971
01972
01973
class __locale_cache_base
01974 {
01975
friend class std::locale::_Impl;
01976
friend class locale;
01977
01978
public:
01979
virtual
01980 ~__locale_cache_base() { }
01981
01982 };
01983
01984
01985
01986
template<
typename _Facet>
01987
class __locale_cache :
public __locale_cache_base
01988 {
01989
01990 __locale_cache(
const locale&) {}
01991 };
01992
01993
template<
typename _CharT>
01994
class __locale_cache<numpunct<_CharT> > :
public __locale_cache_base
01995 {
01996
01997
typedef _CharT char_type;
01998
typedef char_traits<_CharT> traits_type;
01999
typedef basic_string<_CharT> string_type;
02000
02001
public:
02002
02003
02004
02005
02006
02007 _CharT _M_decimal_point;
02008
02009
02010
02011
02012
02013 _CharT _M_thousands_sep;
02014
02015
02016
02017
const _CharT* _M_truename;
02018
const _CharT* _M_falsename;
02019
02020
02021
02022
bool _M_use_grouping;
02023
02024
02025
02026
const char* _M_grouping;
02027
02028
02029
02030
02031
02032
02033
02034
02035 _CharT _M_atoms_out[__num_base::_S_end];
02036
02037
02038 __locale_cache(
const locale& __loc);
02039 __locale_cache(
const locale& __loc,
bool);
02040
02041 ~__locale_cache()
02042 {
02043
delete [] _M_truename;
02044
delete [] _M_falsename;
02045
delete [] _M_grouping;
02046 }
02047 };
02048 }
02049
02050
#endif