localefwd.h (class locale): Add static member _S_num_extra_categories...
[gcc.git] / libstdc++-v3 / include / bits / locale_facets.h
1 // Locale support -*- C++ -*-
2
3 // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
4 // Free Software Foundation, Inc.
5 //
6 // This file is part of the GNU ISO C++ Library. This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 2, or (at your option)
10 // any later version.
11
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16
17 // You should have received a copy of the GNU General Public License along
18 // with this library; see the file COPYING. If not, write to the Free
19 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
20 // USA.
21
22 // As a special exception, you may use this file as part of a free software
23 // library without restriction. Specifically, if other files instantiate
24 // templates or use macros or inline functions from this file, or you compile
25 // this file and link it with other files to produce an executable, this
26 // file does not by itself cause the resulting executable to be covered by
27 // the GNU General Public License. This exception does not however
28 // invalidate any other reasons why the executable file might be covered by
29 // the GNU General Public License.
30
31 //
32 // ISO C++ 14882: 22.1 Locales
33 //
34
35 /** @file locale_facets.h
36 * This is an internal header file, included by other library headers.
37 * You should not attempt to use it directly.
38 */
39
40 #ifndef _CPP_BITS_LOCFACETS_H
41 #define _CPP_BITS_LOCFACETS_H 1
42
43 #pragma GCC system_header
44
45 #include <ctime> // For struct tm
46 #include <cwctype> // For wctype_t
47 #include <ios> // For ios_base
48
49 namespace std
50 {
51 // NB: Don't instantiate required wchar_t facets if no wchar_t support.
52 #ifdef _GLIBCPP_USE_WCHAR_T
53 # define _GLIBCPP_NUM_FACETS 28
54 #else
55 # define _GLIBCPP_NUM_FACETS 14
56 #endif
57
58 template<typename _CharT, typename _Traits>
59 struct __pad;
60
61 // 22.2.1.1 Template class ctype
62 // Include host and configuration specific ctype enums for ctype_base.
63 #include <bits/ctype_base.h>
64
65 // Common base for ctype<_CharT>.
66 template<typename _CharT>
67 class __ctype_abstract_base : public locale::facet, public ctype_base
68 {
69 public:
70 // Types:
71 typedef _CharT char_type;
72
73 bool
74 is(mask __m, char_type __c) const
75 { return this->do_is(__m, __c); }
76
77 const char_type*
78 is(const char_type *__lo, const char_type *__hi, mask *__vec) const
79 { return this->do_is(__lo, __hi, __vec); }
80
81 const char_type*
82 scan_is(mask __m, const char_type* __lo, const char_type* __hi) const
83 { return this->do_scan_is(__m, __lo, __hi); }
84
85 const char_type*
86 scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
87 { return this->do_scan_not(__m, __lo, __hi); }
88
89 char_type
90 toupper(char_type __c) const
91 { return this->do_toupper(__c); }
92
93 const char_type*
94 toupper(char_type *__lo, const char_type* __hi) const
95 { return this->do_toupper(__lo, __hi); }
96
97 char_type
98 tolower(char_type __c) const
99 { return this->do_tolower(__c); }
100
101 const char_type*
102 tolower(char_type* __lo, const char_type* __hi) const
103 { return this->do_tolower(__lo, __hi); }
104
105 char_type
106 widen(char __c) const
107 { return this->do_widen(__c); }
108
109 const char*
110 widen(const char* __lo, const char* __hi, char_type* __to) const
111 { return this->do_widen(__lo, __hi, __to); }
112
113 char
114 narrow(char_type __c, char __dfault) const
115 { return this->do_narrow(__c, __dfault); }
116
117 const char_type*
118 narrow(const char_type* __lo, const char_type* __hi,
119 char __dfault, char *__to) const
120 { return this->do_narrow(__lo, __hi, __dfault, __to); }
121
122 protected:
123 explicit
124 __ctype_abstract_base(size_t __refs = 0): locale::facet(__refs) { }
125
126 virtual
127 ~__ctype_abstract_base() { }
128
129 virtual bool
130 do_is(mask __m, char_type __c) const = 0;
131
132 virtual const char_type*
133 do_is(const char_type* __lo, const char_type* __hi,
134 mask* __vec) const = 0;
135
136 virtual const char_type*
137 do_scan_is(mask __m, const char_type* __lo,
138 const char_type* __hi) const = 0;
139
140 virtual const char_type*
141 do_scan_not(mask __m, const char_type* __lo,
142 const char_type* __hi) const = 0;
143
144 virtual char_type
145 do_toupper(char_type) const = 0;
146
147 virtual const char_type*
148 do_toupper(char_type* __lo, const char_type* __hi) const = 0;
149
150 virtual char_type
151 do_tolower(char_type) const = 0;
152
153 virtual const char_type*
154 do_tolower(char_type* __lo, const char_type* __hi) const = 0;
155
156 virtual char_type
157 do_widen(char) const = 0;
158
159 virtual const char*
160 do_widen(const char* __lo, const char* __hi,
161 char_type* __dest) const = 0;
162
163 virtual char
164 do_narrow(char_type, char __dfault) const = 0;
165
166 virtual const char_type*
167 do_narrow(const char_type* __lo, const char_type* __hi,
168 char __dfault, char* __dest) const = 0;
169 };
170
171 // NB: Generic, mostly useless implementation.
172 template<typename _CharT>
173 class ctype : public __ctype_abstract_base<_CharT>
174 {
175 public:
176 // Types:
177 typedef _CharT char_type;
178 typedef typename ctype::mask mask;
179
180 static locale::id id;
181
182 explicit
183 ctype(size_t __refs = 0) : __ctype_abstract_base<_CharT>(__refs) { }
184
185 protected:
186 virtual
187 ~ctype();
188
189 virtual bool
190 do_is(mask __m, char_type __c) const;
191
192 virtual const char_type*
193 do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
194
195 virtual const char_type*
196 do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
197
198 virtual const char_type*
199 do_scan_not(mask __m, const char_type* __lo,
200 const char_type* __hi) const;
201
202 virtual char_type
203 do_toupper(char_type __c) const;
204
205 virtual const char_type*
206 do_toupper(char_type* __lo, const char_type* __hi) const;
207
208 virtual char_type
209 do_tolower(char_type __c) const;
210
211 virtual const char_type*
212 do_tolower(char_type* __lo, const char_type* __hi) const;
213
214 virtual char_type
215 do_widen(char __c) const;
216
217 virtual const char*
218 do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
219
220 virtual char
221 do_narrow(char_type, char __dfault) const;
222
223 virtual const char_type*
224 do_narrow(const char_type* __lo, const char_type* __hi,
225 char __dfault, char* __dest) const;
226 };
227
228 template<typename _CharT>
229 locale::id ctype<_CharT>::id;
230
231 // 22.2.1.3 ctype<char> specialization.
232 template<>
233 class ctype<char> : public __ctype_abstract_base<char>
234 {
235 public:
236 // Types:
237 typedef char char_type;
238
239 protected:
240 // Data Members:
241 __c_locale _M_c_locale_ctype;
242 bool _M_del;
243 __to_type _M_toupper;
244 __to_type _M_tolower;
245 const mask* _M_table;
246
247 public:
248 static locale::id id;
249 static const size_t table_size = 1 + static_cast<unsigned char>(-1);
250
251 explicit
252 ctype(const mask* __table = 0, bool __del = false, size_t __refs = 0);
253
254 explicit
255 ctype(__c_locale __cloc, const mask* __table = 0, bool __del = false,
256 size_t __refs = 0);
257
258 inline bool
259 is(mask __m, char __c) const;
260
261 inline const char*
262 is(const char* __lo, const char* __hi, mask* __vec) const;
263
264 inline const char*
265 scan_is(mask __m, const char* __lo, const char* __hi) const;
266
267 inline const char*
268 scan_not(mask __m, const char* __lo, const char* __hi) const;
269
270 protected:
271 const mask*
272 table() const throw()
273 { return _M_table; }
274
275 static const mask*
276 classic_table() throw();
277
278 virtual
279 ~ctype();
280
281 virtual bool
282 do_is(mask __m, char_type __c) const;
283
284 virtual const char_type*
285 do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
286
287 virtual const char_type*
288 do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
289
290 virtual const char_type*
291 do_scan_not(mask __m, const char_type* __lo,
292 const char_type* __hi) const;
293
294 virtual char_type
295 do_toupper(char_type) const;
296
297 virtual const char_type*
298 do_toupper(char_type* __lo, const char_type* __hi) const;
299
300 virtual char_type
301 do_tolower(char_type) const;
302
303 virtual const char_type*
304 do_tolower(char_type* __lo, const char_type* __hi) const;
305
306 virtual char_type
307 do_widen(char) const;
308
309 virtual const char*
310 do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
311
312 virtual char
313 do_narrow(char_type, char __dfault) const;
314
315 virtual const char_type*
316 do_narrow(const char_type* __lo, const char_type* __hi,
317 char __dfault, char* __dest) const;
318 };
319
320 template<>
321 const ctype<char>&
322 use_facet<ctype<char> >(const locale& __loc);
323
324 #ifdef _GLIBCPP_USE_WCHAR_T
325 // 22.2.1.3 ctype<wchar_t> specialization
326 template<>
327 class ctype<wchar_t> : public __ctype_abstract_base<wchar_t>
328 {
329 public:
330 // Types:
331 typedef wchar_t char_type;
332 typedef wctype_t __wmask_type;
333
334 protected:
335 __c_locale _M_c_locale_ctype;
336
337 public:
338 // Data Members:
339 static locale::id id;
340
341 explicit
342 ctype(size_t __refs = 0);
343
344 explicit
345 ctype(__c_locale __cloc, size_t __refs = 0);
346
347 protected:
348 __wmask_type
349 _M_convert_to_wmask(const mask __m) const;
350
351 virtual
352 ~ctype();
353
354 virtual bool
355 do_is(mask __m, char_type __c) const;
356
357 virtual const char_type*
358 do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
359
360 virtual const char_type*
361 do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
362
363 virtual const char_type*
364 do_scan_not(mask __m, const char_type* __lo,
365 const char_type* __hi) const;
366
367 virtual char_type
368 do_toupper(char_type) const;
369
370 virtual const char_type*
371 do_toupper(char_type* __lo, const char_type* __hi) const;
372
373 virtual char_type
374 do_tolower(char_type) const;
375
376 virtual const char_type*
377 do_tolower(char_type* __lo, const char_type* __hi) const;
378
379 virtual char_type
380 do_widen(char) const;
381
382 virtual const char*
383 do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
384
385 virtual char
386 do_narrow(char_type, char __dfault) const;
387
388 virtual const char_type*
389 do_narrow(const char_type* __lo, const char_type* __hi,
390 char __dfault, char* __dest) const;
391
392 };
393
394 template<>
395 const ctype<wchar_t>&
396 use_facet<ctype<wchar_t> >(const locale& __loc);
397 #endif //_GLIBCPP_USE_WCHAR_T
398
399 // Include host and configuration specific ctype inlines.
400 #include <bits/ctype_inline.h>
401
402 // 22.2.1.2 Template class ctype_byname
403 template<typename _CharT>
404 class ctype_byname : public ctype<_CharT>
405 {
406 public:
407 typedef _CharT char_type;
408
409 explicit
410 ctype_byname(const char* __s, size_t __refs = 0);
411
412 protected:
413 virtual
414 ~ctype_byname() { };
415 };
416
417 // 22.2.1.4 Class ctype_byname specializations.
418 template<>
419 ctype_byname<char>::ctype_byname(const char*, size_t refs);
420
421 template<>
422 ctype_byname<wchar_t>::ctype_byname(const char*, size_t refs);
423
424 // 22.2.1.5 Template class codecvt
425 #include <bits/codecvt.h>
426
427
428 // 22.2.2 The numeric category.
429 class __num_base
430 {
431 protected:
432 // String literal of acceptable (narrow) input, for num_get.
433 // "0123456789eEabcdfABCDF"
434 static const char _S_atoms[];
435
436 enum
437 {
438 _M_zero,
439 _M_e = _M_zero + 10,
440 _M_E = _M_zero + 11,
441 _M_size = 21 + 1
442 };
443
444 // num_put
445 // Construct and return valid scanf format for floating point types.
446 static bool
447 _S_format_float(const ios_base& __io, char* __fptr, char __mod,
448 streamsize __prec);
449
450 // Construct and return valid scanf format for integer types.
451 static void
452 _S_format_int(const ios_base& __io, char* __fptr, char __mod, char __modl);
453 };
454
455
456 template<typename _CharT>
457 class numpunct : public locale::facet
458 {
459 public:
460 // Types:
461 typedef _CharT char_type;
462 typedef basic_string<_CharT> string_type;
463
464 static locale::id id;
465
466 private:
467 char_type _M_decimal_point;
468 char_type _M_thousands_sep;
469 const char* _M_grouping;
470 const char_type* _M_truename;
471 const char_type* _M_falsename;
472
473 public:
474 explicit
475 numpunct(size_t __refs = 0) : locale::facet(__refs)
476 { _M_initialize_numpunct(); }
477
478 explicit
479 numpunct(__c_locale __cloc, size_t __refs = 0) : locale::facet(__refs)
480 { _M_initialize_numpunct(__cloc); }
481
482 char_type
483 decimal_point() const
484 { return this->do_decimal_point(); }
485
486 char_type
487 thousands_sep() const
488 { return this->do_thousands_sep(); }
489
490 string
491 grouping() const
492 { return this->do_grouping(); }
493
494 string_type
495 truename() const
496 { return this->do_truename(); }
497
498 string_type
499 falsename() const
500 { return this->do_falsename(); }
501
502 protected:
503 virtual
504 ~numpunct();
505
506 virtual char_type
507 do_decimal_point() const
508 { return _M_decimal_point; }
509
510 virtual char_type
511 do_thousands_sep() const
512 { return _M_thousands_sep; }
513
514 virtual string
515 do_grouping() const
516 { return _M_grouping; }
517
518 virtual string_type
519 do_truename() const
520 { return _M_truename; }
521
522 virtual string_type
523 do_falsename() const
524 { return _M_falsename; }
525
526 // For use at construction time only.
527 void
528 _M_initialize_numpunct(__c_locale __cloc = NULL);
529 };
530
531 template<typename _CharT>
532 locale::id numpunct<_CharT>::id;
533
534 template<>
535 numpunct<char>::~numpunct();
536
537 template<>
538 void
539 numpunct<char>::_M_initialize_numpunct(__c_locale __cloc);
540
541 #ifdef _GLIBCPP_USE_WCHAR_T
542 template<>
543 numpunct<wchar_t>::~numpunct();
544
545 template<>
546 void
547 numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc);
548 #endif
549
550 template<typename _CharT>
551 class numpunct_byname : public numpunct<_CharT>
552 {
553 // Data Member.
554 __c_locale _M_c_locale_numpunct;
555
556 public:
557 typedef _CharT char_type;
558 typedef basic_string<_CharT> string_type;
559
560 explicit
561 numpunct_byname(const char* __s, size_t __refs = 0)
562 : numpunct<_CharT>(__refs)
563 {
564 _S_create_c_locale(_M_c_locale_numpunct, __s);
565 _M_initialize_numpunct(_M_c_locale_numpunct);
566 }
567
568 protected:
569 virtual
570 ~numpunct_byname()
571 { _S_destroy_c_locale(_M_c_locale_numpunct); }
572 };
573
574 template<typename _CharT, typename _InIter>
575 class num_get : public locale::facet, public __num_base
576 {
577 public:
578 // Types:
579 typedef _CharT char_type;
580 typedef _InIter iter_type;
581
582 static locale::id id;
583
584 explicit
585 num_get(size_t __refs = 0) : locale::facet(__refs) { }
586
587 iter_type
588 get(iter_type __in, iter_type __end, ios_base& __io,
589 ios_base::iostate& __err, bool& __v) const
590 { return this->do_get(__in, __end, __io, __err, __v); }
591
592 iter_type
593 get(iter_type __in, iter_type __end, ios_base& __io,
594 ios_base::iostate& __err, long& __v) const
595 { return this->do_get(__in, __end, __io, __err, __v); }
596
597 iter_type
598 get(iter_type __in, iter_type __end, ios_base& __io,
599 ios_base::iostate& __err, unsigned short& __v) const
600 { return this->do_get(__in, __end, __io, __err, __v); }
601
602 iter_type
603 get(iter_type __in, iter_type __end, ios_base& __io,
604 ios_base::iostate& __err, unsigned int& __v) const
605 { return this->do_get(__in, __end, __io, __err, __v); }
606
607 iter_type
608 get(iter_type __in, iter_type __end, ios_base& __io,
609 ios_base::iostate& __err, unsigned long& __v) const
610 { return this->do_get(__in, __end, __io, __err, __v); }
611
612 #ifdef _GLIBCPP_USE_LONG_LONG
613 iter_type
614 get(iter_type __in, iter_type __end, ios_base& __io,
615 ios_base::iostate& __err, long long& __v) const
616 { return this->do_get(__in, __end, __io, __err, __v); }
617
618 iter_type
619 get(iter_type __in, iter_type __end, ios_base& __io,
620 ios_base::iostate& __err, unsigned long long& __v) const
621 { return this->do_get(__in, __end, __io, __err, __v); }
622 #endif
623
624 iter_type
625 get(iter_type __in, iter_type __end, ios_base& __io,
626 ios_base::iostate& __err, float& __v) const
627 { return this->do_get(__in, __end, __io, __err, __v); }
628
629 iter_type
630 get(iter_type __in, iter_type __end, ios_base& __io,
631 ios_base::iostate& __err, double& __v) const
632 { return this->do_get(__in, __end, __io, __err, __v); }
633
634 iter_type
635 get(iter_type __in, iter_type __end, ios_base& __io,
636 ios_base::iostate& __err, long double& __v) const
637 { return this->do_get(__in, __end, __io, __err, __v); }
638
639 iter_type
640 get(iter_type __in, iter_type __end, ios_base& __io,
641 ios_base::iostate& __err, void*& __v) const
642 { return this->do_get(__in, __end, __io, __err, __v); }
643
644 protected:
645 virtual ~num_get() { }
646
647 iter_type
648 _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
649 string& __xtrc) const;
650
651 iter_type
652 _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
653 string& __xtrc, int& __base) const;
654
655 virtual iter_type
656 do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
657
658
659 virtual iter_type
660 do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, long&) const;
661
662 virtual iter_type
663 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
664 unsigned short&) const;
665
666 virtual iter_type
667 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
668 unsigned int&) const;
669
670 virtual iter_type
671 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
672 unsigned long&) const;
673
674 #ifdef _GLIBCPP_USE_LONG_LONG
675 virtual iter_type
676 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
677 long long&) const;
678
679 virtual iter_type
680 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
681 unsigned long long&) const;
682 #endif
683
684 virtual iter_type
685 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
686 float&) const;
687
688 virtual iter_type
689 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
690 double&) const;
691
692 virtual iter_type
693 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
694 long double&) const;
695
696 virtual iter_type
697 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
698 void*&) const;
699 };
700
701 template<typename _CharT, typename _InIter>
702 locale::id num_get<_CharT, _InIter>::id;
703
704 #if 0
705 // Partial specialization for istreambuf_iterator, so can use traits_type.
706 template<typename _CharT>
707 class num_get<_CharT, istreambuf_iterator<_CharT> >;
708
709 iter_type
710 _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
711 string& __xtrc) const;
712
713 iter_type
714 _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
715 string& __xtrc, int& __base) const;
716
717 virtual iter_type
718 do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
719 #endif
720
721 template<typename _CharT, typename _OutIter>
722 class num_put : public locale::facet, public __num_base
723 {
724 public:
725 // Types:
726 typedef _CharT char_type;
727 typedef _OutIter iter_type;
728
729 static locale::id id;
730
731 explicit
732 num_put(size_t __refs = 0) : locale::facet(__refs) { }
733
734 iter_type
735 put(iter_type __s, ios_base& __f, char_type __fill, bool __v) const
736 { return this->do_put(__s, __f, __fill, __v); }
737
738 iter_type
739 put(iter_type __s, ios_base& __f, char_type __fill, long __v) const
740 { return this->do_put(__s, __f, __fill, __v); }
741
742 iter_type
743 put(iter_type __s, ios_base& __f, char_type __fill,
744 unsigned long __v) const
745 { return this->do_put(__s, __f, __fill, __v); }
746
747 #ifdef _GLIBCPP_USE_LONG_LONG
748 iter_type
749 put(iter_type __s, ios_base& __f, char_type __fill, long long __v) const
750 { return this->do_put(__s, __f, __fill, __v); }
751
752 iter_type
753 put(iter_type __s, ios_base& __f, char_type __fill,
754 unsigned long long __v) const
755 { return this->do_put(__s, __f, __fill, __v); }
756 #endif
757
758 iter_type
759 put(iter_type __s, ios_base& __f, char_type __fill, double __v) const
760 { return this->do_put(__s, __f, __fill, __v); }
761
762 iter_type
763 put(iter_type __s, ios_base& __f, char_type __fill,
764 long double __v) const
765 { return this->do_put(__s, __f, __fill, __v); }
766
767 iter_type
768 put(iter_type __s, ios_base& __f, char_type __fill,
769 const void* __v) const
770 { return this->do_put(__s, __f, __fill, __v); }
771
772 protected:
773 template<typename _ValueT>
774 iter_type
775 _M_convert_float(iter_type, ios_base& __io, char_type __fill,
776 char __mod, _ValueT __v) const;
777
778 template<typename _ValueT>
779 iter_type
780 _M_convert_int(iter_type, ios_base& __io, char_type __fill,
781 char __mod, char __modl, _ValueT __v) const;
782
783 iter_type
784 _M_widen_float(iter_type, ios_base& __io, char_type __fill, char* __cs,
785 int __len) const;
786
787 iter_type
788 _M_widen_int(iter_type, ios_base& __io, char_type __fill, char* __cs,
789 int __len) const;
790
791 iter_type
792 _M_insert(iter_type, ios_base& __io, char_type __fill,
793 const char_type* __ws, int __len) const;
794
795 virtual
796 ~num_put() { };
797
798 virtual iter_type
799 do_put(iter_type, ios_base&, char_type __fill, bool __v) const;
800
801 virtual iter_type
802 do_put(iter_type, ios_base&, char_type __fill, long __v) const;
803
804 virtual iter_type
805 do_put(iter_type, ios_base&, char_type __fill, unsigned long) const;
806
807 #ifdef _GLIBCPP_USE_LONG_LONG
808 virtual iter_type
809 do_put(iter_type, ios_base&, char_type __fill, long long __v) const;
810
811 virtual iter_type
812 do_put(iter_type, ios_base&, char_type __fill, unsigned long long) const;
813 #endif
814
815 virtual iter_type
816 do_put(iter_type, ios_base&, char_type __fill, double __v) const;
817
818 virtual iter_type
819 do_put(iter_type, ios_base&, char_type __fill, long double __v) const;
820
821 virtual iter_type
822 do_put(iter_type, ios_base&, char_type __fill, const void* __v) const;
823 };
824
825 template <typename _CharT, typename _OutIter>
826 locale::id num_put<_CharT, _OutIter>::id;
827
828
829 template<typename _CharT>
830 class collate : public locale::facet
831 {
832 public:
833 // Types:
834 typedef _CharT char_type;
835 typedef basic_string<_CharT> string_type;
836
837 protected:
838 // Underlying "C" library locale information saved from
839 // initialization, needed by collate_byname as well.
840 __c_locale _M_c_locale_collate;
841
842 public:
843 static locale::id id;
844
845 explicit
846 collate(size_t __refs = 0)
847 : locale::facet(__refs)
848 { _M_c_locale_collate = _S_c_locale; }
849
850 explicit
851 collate(__c_locale __cloc, size_t __refs = 0)
852 : locale::facet(__refs)
853 { _M_c_locale_collate = _S_clone_c_locale(__cloc); }
854
855 int
856 compare(const _CharT* __lo1, const _CharT* __hi1,
857 const _CharT* __lo2, const _CharT* __hi2) const
858 { return this->do_compare(__lo1, __hi1, __lo2, __hi2); }
859
860 string_type
861 transform(const _CharT* __lo, const _CharT* __hi) const
862 { return this->do_transform(__lo, __hi); }
863
864 long
865 hash(const _CharT* __lo, const _CharT* __hi) const
866 { return this->do_hash(__lo, __hi); }
867
868 // Used to abstract out _CharT bits in virtual member functions, below.
869 int
870 _M_compare(const _CharT*, const _CharT*) const;
871
872 size_t
873 _M_transform(_CharT*, const _CharT*, size_t) const;
874
875 protected:
876 virtual
877 ~collate()
878 { _S_destroy_c_locale(_M_c_locale_collate); }
879
880 virtual int
881 do_compare(const _CharT* __lo1, const _CharT* __hi1,
882 const _CharT* __lo2, const _CharT* __hi2) const;
883
884 virtual string_type
885 do_transform(const _CharT* __lo, const _CharT* __hi) const;
886
887 virtual long
888 do_hash(const _CharT* __lo, const _CharT* __hi) const;
889 };
890
891 template<typename _CharT>
892 locale::id collate<_CharT>::id;
893
894 // Specializations.
895 template<>
896 int
897 collate<char>::_M_compare(const char*, const char*) const;
898
899 template<>
900 size_t
901 collate<char>::_M_transform(char*, const char*, size_t) const;
902
903 #ifdef _GLIBCPP_USE_WCHAR_T
904 template<>
905 int
906 collate<wchar_t>::_M_compare(const wchar_t*, const wchar_t*) const;
907
908 template<>
909 size_t
910 collate<wchar_t>::_M_transform(wchar_t*, const wchar_t*, size_t) const;
911 #endif
912
913 template<typename _CharT>
914 class collate_byname : public collate<_CharT>
915 {
916 public:
917 typedef _CharT char_type;
918 typedef basic_string<_CharT> string_type;
919
920 explicit
921 collate_byname(const char* __s, size_t __refs = 0)
922 : collate<_CharT>(__refs)
923 {
924 _S_destroy_c_locale(_M_c_locale_collate);
925 _S_create_c_locale(_M_c_locale_collate, __s);
926 }
927
928 protected:
929 virtual
930 ~collate_byname() { }
931 };
932
933
934 class time_base
935 {
936 public:
937 enum dateorder { no_order, dmy, mdy, ymd, ydm };
938 };
939
940 template<typename _CharT>
941 class __timepunct : public locale::facet
942 {
943 public:
944 // Types:
945 typedef _CharT __char_type;
946 typedef basic_string<_CharT> __string_type;
947
948 static locale::id id;
949
950 // List of all known timezones, with GMT first.
951 static const _CharT* _S_timezones[14];
952
953 protected:
954 __c_locale _M_c_locale_timepunct;
955 const char* _M_name_timepunct;
956 const _CharT* _M_date_format;
957 const _CharT* _M_date_era_format;
958 const _CharT* _M_time_format;
959 const _CharT* _M_time_era_format;
960 const _CharT* _M_date_time_format;
961 const _CharT* _M_date_time_era_format;
962 const _CharT* _M_am;
963 const _CharT* _M_pm;
964 const _CharT* _M_am_pm_format;
965
966 // Day names, starting with "C"'s Sunday.
967 const _CharT* _M_day1;
968 const _CharT* _M_day2;
969 const _CharT* _M_day3;
970 const _CharT* _M_day4;
971 const _CharT* _M_day5;
972 const _CharT* _M_day6;
973 const _CharT* _M_day7;
974
975 // Abbreviated day names, starting with "C"'s Sun.
976 const _CharT* _M_day_a1;
977 const _CharT* _M_day_a2;
978 const _CharT* _M_day_a3;
979 const _CharT* _M_day_a4;
980 const _CharT* _M_day_a5;
981 const _CharT* _M_day_a6;
982 const _CharT* _M_day_a7;
983
984 // Month names, starting with "C"'s January.
985 const _CharT* _M_month01;
986 const _CharT* _M_month02;
987 const _CharT* _M_month03;
988 const _CharT* _M_month04;
989 const _CharT* _M_month05;
990 const _CharT* _M_month06;
991 const _CharT* _M_month07;
992 const _CharT* _M_month08;
993 const _CharT* _M_month09;
994 const _CharT* _M_month10;
995 const _CharT* _M_month11;
996 const _CharT* _M_month12;
997
998 // Abbreviated month names, starting with "C"'s Jan.
999 const _CharT* _M_month_a01;
1000 const _CharT* _M_month_a02;
1001 const _CharT* _M_month_a03;
1002 const _CharT* _M_month_a04;
1003 const _CharT* _M_month_a05;
1004 const _CharT* _M_month_a06;
1005 const _CharT* _M_month_a07;
1006 const _CharT* _M_month_a08;
1007 const _CharT* _M_month_a09;
1008 const _CharT* _M_month_a10;
1009 const _CharT* _M_month_a11;
1010 const _CharT* _M_month_a12;
1011
1012 public:
1013 explicit
1014 __timepunct(size_t __refs = 0)
1015 : locale::facet(__refs), _M_name_timepunct("C")
1016 { _M_initialize_timepunct(); }
1017
1018 explicit
1019 __timepunct(__c_locale __cloc, const char* __s, size_t __refs = 0)
1020 : locale::facet(__refs), _M_name_timepunct(__s)
1021 { _M_initialize_timepunct(__cloc); }
1022
1023 void
1024 _M_put(_CharT* __s, size_t __maxlen, const _CharT* __format,
1025 const tm* __tm) const;
1026
1027 void
1028 _M_date_formats(const _CharT** __date) const
1029 {
1030 // Always have default first.
1031 __date[0] = _M_date_format;
1032 __date[1] = _M_date_era_format;
1033 }
1034
1035 void
1036 _M_time_formats(const _CharT** __time) const
1037 {
1038 // Always have default first.
1039 __time[0] = _M_time_format;
1040 __time[1] = _M_time_era_format;
1041 }
1042
1043 void
1044 _M_ampm(const _CharT** __ampm) const
1045 {
1046 __ampm[0] = _M_am;
1047 __ampm[1] = _M_pm;
1048 }
1049
1050 void
1051 _M_date_time_formats(const _CharT** __dt) const
1052 {
1053 // Always have default first.
1054 __dt[0] = _M_date_time_format;
1055 __dt[1] = _M_date_time_era_format;
1056 }
1057
1058 void
1059 _M_days(const _CharT** __days) const
1060 {
1061 __days[0] = _M_day1;
1062 __days[1] = _M_day2;
1063 __days[2] = _M_day3;
1064 __days[3] = _M_day4;
1065 __days[4] = _M_day5;
1066 __days[5] = _M_day6;
1067 __days[6] = _M_day7;
1068 }
1069
1070 void
1071 _M_days_abbreviated(const _CharT** __days) const
1072 {
1073 __days[0] = _M_day_a1;
1074 __days[1] = _M_day_a2;
1075 __days[2] = _M_day_a3;
1076 __days[3] = _M_day_a4;
1077 __days[4] = _M_day_a5;
1078 __days[5] = _M_day_a6;
1079 __days[6] = _M_day_a7;
1080 }
1081
1082 void
1083 _M_months(const _CharT** __months) const
1084 {
1085 __months[0] = _M_month01;
1086 __months[1] = _M_month02;
1087 __months[2] = _M_month03;
1088 __months[3] = _M_month04;
1089 __months[4] = _M_month05;
1090 __months[5] = _M_month06;
1091 __months[6] = _M_month07;
1092 __months[7] = _M_month08;
1093 __months[8] = _M_month09;
1094 __months[9] = _M_month10;
1095 __months[10] = _M_month11;
1096 __months[11] = _M_month12;
1097 }
1098
1099 void
1100 _M_months_abbreviated(const _CharT** __months) const
1101 {
1102 __months[0] = _M_month_a01;
1103 __months[1] = _M_month_a02;
1104 __months[2] = _M_month_a03;
1105 __months[3] = _M_month_a04;
1106 __months[4] = _M_month_a05;
1107 __months[5] = _M_month_a06;
1108 __months[6] = _M_month_a07;
1109 __months[7] = _M_month_a08;
1110 __months[8] = _M_month_a09;
1111 __months[9] = _M_month_a10;
1112 __months[10] = _M_month_a11;
1113 __months[11] = _M_month_a12;
1114 }
1115
1116 protected:
1117 virtual
1118 ~__timepunct();
1119
1120 // For use at construction time only.
1121 void
1122 _M_initialize_timepunct(__c_locale __cloc = NULL);
1123 };
1124
1125 template<typename _CharT>
1126 locale::id __timepunct<_CharT>::id;
1127
1128 // Specializations.
1129 template<>
1130 __timepunct<char>::~__timepunct();
1131
1132 template<>
1133 const char*
1134 __timepunct<char>::_S_timezones[14];
1135
1136 template<>
1137 void
1138 __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc);
1139
1140 template<>
1141 void
1142 __timepunct<char>::_M_put(char*, size_t, const char*, const tm*) const;
1143
1144 #ifdef _GLIBCPP_USE_WCHAR_T
1145 template<>
1146 __timepunct<wchar_t>::~__timepunct();
1147
1148 template<>
1149 const wchar_t*
1150 __timepunct<wchar_t>::_S_timezones[14];
1151
1152 template<>
1153 void
1154 __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc);
1155
1156 template<>
1157 void
1158 __timepunct<wchar_t>::_M_put(wchar_t*, size_t, const wchar_t*,
1159 const tm*) const;
1160 #endif
1161
1162 // Generic.
1163 template<typename _CharT>
1164 const _CharT* __timepunct<_CharT>::_S_timezones[14];
1165
1166
1167 template<typename _CharT, typename _InIter>
1168 class time_get : public locale::facet, public time_base
1169 {
1170 public:
1171 // Types:
1172 typedef _CharT char_type;
1173 typedef _InIter iter_type;
1174 typedef basic_string<_CharT> __string_type;
1175
1176 static locale::id id;
1177
1178 explicit
1179 time_get(size_t __refs = 0)
1180 : locale::facet (__refs) { }
1181
1182 dateorder
1183 date_order() const
1184 { return this->do_date_order(); }
1185
1186 iter_type
1187 get_time(iter_type __beg, iter_type __end, ios_base& __io,
1188 ios_base::iostate& __err, tm* __tm) const
1189 { return this->do_get_time(__beg, __end, __io, __err, __tm); }
1190
1191 iter_type
1192 get_date(iter_type __beg, iter_type __end, ios_base& __io,
1193 ios_base::iostate& __err, tm* __tm) const
1194 { return this->do_get_date(__beg, __end, __io, __err, __tm); }
1195
1196 iter_type
1197 get_weekday(iter_type __beg, iter_type __end, ios_base& __io,
1198 ios_base::iostate& __err, tm* __tm) const
1199 { return this->do_get_weekday(__beg, __end, __io, __err, __tm); }
1200
1201 iter_type
1202 get_monthname(iter_type __beg, iter_type __end, ios_base& __io,
1203 ios_base::iostate& __err, tm* __tm) const
1204 { return this->do_get_monthname(__beg, __end, __io, __err, __tm); }
1205
1206 iter_type
1207 get_year(iter_type __beg, iter_type __end, ios_base& __io,
1208 ios_base::iostate& __err, tm* __tm) const
1209 { return this->do_get_year(__beg, __end, __io, __err, __tm); }
1210
1211 protected:
1212 virtual
1213 ~time_get() { }
1214
1215 virtual dateorder
1216 do_date_order() const;
1217
1218 virtual iter_type
1219 do_get_time(iter_type __beg, iter_type __end, ios_base& __io,
1220 ios_base::iostate& __err, tm* __tm) const;
1221
1222 virtual iter_type
1223 do_get_date(iter_type __beg, iter_type __end, ios_base& __io,
1224 ios_base::iostate& __err, tm* __tm) const;
1225
1226 virtual iter_type
1227 do_get_weekday(iter_type __beg, iter_type __end, ios_base&,
1228 ios_base::iostate& __err, tm* __tm) const;
1229
1230 virtual iter_type
1231 do_get_monthname(iter_type __beg, iter_type __end, ios_base&,
1232 ios_base::iostate& __err, tm* __tm) const;
1233
1234 virtual iter_type
1235 do_get_year(iter_type __beg, iter_type __end, ios_base& __io,
1236 ios_base::iostate& __err, tm* __tm) const;
1237
1238 // Extract numeric component of length __len.
1239 void
1240 _M_extract_num(iter_type& __beg, iter_type& __end, int& __member,
1241 int __min, int __max, size_t __len,
1242 const ctype<_CharT>& __ctype,
1243 ios_base::iostate& __err) const;
1244
1245 // Extract day or month name, or any unique array of string
1246 // literals in a const _CharT* array.
1247 void
1248 _M_extract_name(iter_type& __beg, iter_type& __end, int& __member,
1249 const _CharT** __names, size_t __indexlen,
1250 ios_base::iostate& __err) const;
1251
1252 // Extract on a component-by-component basis, via __format argument.
1253 void
1254 _M_extract_via_format(iter_type& __beg, iter_type& __end, ios_base& __io,
1255 ios_base::iostate& __err, tm* __tm,
1256 const _CharT* __format) const;
1257 };
1258
1259 template<typename _CharT, typename _InIter>
1260 locale::id time_get<_CharT, _InIter>::id;
1261
1262 template<typename _CharT, typename _InIter>
1263 class time_get_byname : public time_get<_CharT, _InIter>
1264 {
1265 public:
1266 // Types:
1267 typedef _CharT char_type;
1268 typedef _InIter iter_type;
1269
1270 explicit
1271 time_get_byname(const char*, size_t __refs = 0)
1272 : time_get<_CharT, _InIter>(__refs) { }
1273
1274 protected:
1275 virtual
1276 ~time_get_byname() { }
1277 };
1278
1279 template<typename _CharT, typename _OutIter>
1280 class time_put : public locale::facet, public time_base
1281 {
1282 public:
1283 // Types:
1284 typedef _CharT char_type;
1285 typedef _OutIter iter_type;
1286
1287 static locale::id id;
1288
1289 explicit
1290 time_put(size_t __refs = 0)
1291 : locale::facet(__refs) { }
1292
1293 iter_type
1294 put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
1295 const _CharT* __beg, const _CharT* __end) const;
1296
1297 iter_type
1298 put(iter_type __s, ios_base& __io, char_type __fill,
1299 const tm* __tm, char __format, char __mod = 0) const
1300 { return this->do_put(__s, __io, __fill, __tm, __format, __mod); }
1301
1302 protected:
1303 virtual
1304 ~time_put()
1305 { }
1306
1307 virtual iter_type
1308 do_put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
1309 char __format, char __mod) const;
1310 };
1311
1312 template<typename _CharT, typename _OutIter>
1313 locale::id time_put<_CharT, _OutIter>::id;
1314
1315 template<typename _CharT, typename _OutIter>
1316 class time_put_byname : public time_put<_CharT, _OutIter>
1317 {
1318 public:
1319 // Types:
1320 typedef _CharT char_type;
1321 typedef _OutIter iter_type;
1322
1323 explicit
1324 time_put_byname(const char* /*__s*/, size_t __refs = 0)
1325 : time_put<_CharT, _OutIter>(__refs)
1326 { };
1327
1328 protected:
1329 virtual
1330 ~time_put_byname() { }
1331 };
1332
1333
1334 class money_base
1335 {
1336 public:
1337 enum part { none, space, symbol, sign, value };
1338 struct pattern { char field[4]; };
1339
1340 static const pattern _S_default_pattern;
1341
1342 // Construct and return valid pattern consisting of some combination of:
1343 // space none symbol sign value
1344 static pattern
1345 _S_construct_pattern(char __precedes, char __space, char __posn);
1346 };
1347
1348 template<typename _CharT, bool _Intl>
1349 class moneypunct : public locale::facet, public money_base
1350 {
1351 public:
1352 // Types:
1353 typedef _CharT char_type;
1354 typedef basic_string<_CharT> string_type;
1355
1356 static const bool intl = _Intl;
1357 static locale::id id;
1358
1359 private:
1360 const char* _M_grouping;
1361 char_type _M_decimal_point;
1362 char_type _M_thousands_sep;
1363 const char_type* _M_curr_symbol;
1364 const char_type* _M_positive_sign;
1365 const char_type* _M_negative_sign;
1366 int _M_frac_digits;
1367 pattern _M_pos_format;
1368 pattern _M_neg_format;
1369
1370 public:
1371 explicit
1372 moneypunct(size_t __refs = 0) : locale::facet(__refs)
1373 { _M_initialize_moneypunct(); }
1374
1375 explicit
1376 moneypunct(__c_locale __cloc, const char* __s, size_t __refs = 0)
1377 : locale::facet(__refs)
1378 { _M_initialize_moneypunct(__cloc, __s); }
1379
1380 char_type
1381 decimal_point() const
1382 { return this->do_decimal_point(); }
1383
1384 char_type
1385 thousands_sep() const
1386 { return this->do_thousands_sep(); }
1387
1388 string
1389 grouping() const
1390 { return this->do_grouping(); }
1391
1392 string_type
1393 curr_symbol() const
1394 { return this->do_curr_symbol(); }
1395
1396 string_type
1397 positive_sign() const
1398 { return this->do_positive_sign(); }
1399
1400 string_type
1401 negative_sign() const
1402 { return this->do_negative_sign(); }
1403
1404 int
1405 frac_digits() const
1406 { return this->do_frac_digits(); }
1407
1408 pattern
1409 pos_format() const
1410 { return this->do_pos_format(); }
1411
1412 pattern
1413 neg_format() const
1414 { return this->do_neg_format(); }
1415
1416 protected:
1417 virtual
1418 ~moneypunct();
1419
1420 virtual char_type
1421 do_decimal_point() const
1422 { return _M_decimal_point; }
1423
1424 virtual char_type
1425 do_thousands_sep() const
1426 { return _M_thousands_sep; }
1427
1428 virtual string
1429 do_grouping() const
1430 { return _M_grouping; }
1431
1432 virtual string_type
1433 do_curr_symbol() const
1434 { return _M_curr_symbol; }
1435
1436 virtual string_type
1437 do_positive_sign() const
1438 { return _M_positive_sign; }
1439
1440 virtual string_type
1441 do_negative_sign() const
1442 { return _M_negative_sign; }
1443
1444 virtual int
1445 do_frac_digits() const
1446 { return _M_frac_digits; }
1447
1448 virtual pattern
1449 do_pos_format() const
1450 { return _M_pos_format; }
1451
1452 virtual pattern
1453 do_neg_format() const
1454 { return _M_neg_format; }
1455
1456 // For use at construction time only.
1457 void
1458 _M_initialize_moneypunct(__c_locale __cloc = NULL,
1459 const char* __name = NULL);
1460 };
1461
1462 template<typename _CharT, bool _Intl>
1463 locale::id moneypunct<_CharT, _Intl>::id;
1464
1465 template<typename _CharT, bool _Intl>
1466 const bool moneypunct<_CharT, _Intl>::intl;
1467
1468 template<>
1469 moneypunct<char, true>::~moneypunct();
1470
1471 template<>
1472 moneypunct<char, false>::~moneypunct();
1473
1474 template<>
1475 void
1476 moneypunct<char, true>::_M_initialize_moneypunct(__c_locale, const char*);
1477
1478 template<>
1479 void
1480 moneypunct<char, false>::_M_initialize_moneypunct(__c_locale, const char*);
1481
1482 #ifdef _GLIBCPP_USE_WCHAR_T
1483 template<>
1484 moneypunct<wchar_t, true>::~moneypunct();
1485
1486 template<>
1487 moneypunct<wchar_t, false>::~moneypunct();
1488
1489 template<>
1490 void
1491 moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale,
1492 const char*);
1493
1494 template<>
1495 void
1496 moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale,
1497 const char*);
1498 #endif
1499
1500 template<typename _CharT, bool _Intl>
1501 class moneypunct_byname : public moneypunct<_CharT, _Intl>
1502 {
1503 __c_locale _M_c_locale_moneypunct;
1504
1505 public:
1506 typedef _CharT char_type;
1507 typedef basic_string<_CharT> string_type;
1508
1509 static const bool intl = _Intl;
1510
1511 explicit
1512 moneypunct_byname(const char* __s, size_t __refs = 0)
1513 : moneypunct<_CharT, _Intl>(__refs)
1514 {
1515 _S_create_c_locale(_M_c_locale_moneypunct, __s);
1516 _M_initialize_moneypunct(_M_c_locale_moneypunct);
1517 }
1518
1519 protected:
1520 virtual
1521 ~moneypunct_byname()
1522 { _S_destroy_c_locale(_M_c_locale_moneypunct); }
1523 };
1524
1525 template<typename _CharT, bool _Intl>
1526 const bool moneypunct_byname<_CharT, _Intl>::intl;
1527
1528 template<typename _CharT, typename _InIter>
1529 class money_get : public locale::facet
1530 {
1531 public:
1532 // Types:
1533 typedef _CharT char_type;
1534 typedef _InIter iter_type;
1535 typedef basic_string<_CharT> string_type;
1536
1537 static locale::id id;
1538
1539 explicit
1540 money_get(size_t __refs = 0) : locale::facet(__refs) { }
1541
1542 iter_type
1543 get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1544 ios_base::iostate& __err, long double& __units) const
1545 { return this->do_get(__s, __end, __intl, __io, __err, __units); }
1546
1547 iter_type
1548 get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1549 ios_base::iostate& __err, string_type& __digits) const
1550 { return this->do_get(__s, __end, __intl, __io, __err, __digits); }
1551
1552 protected:
1553 virtual
1554 ~money_get() { }
1555
1556 virtual iter_type
1557 do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1558 ios_base::iostate& __err, long double& __units) const;
1559
1560 virtual iter_type
1561 do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1562 ios_base::iostate& __err, string_type& __digits) const;
1563 };
1564
1565 template<typename _CharT, typename _InIter>
1566 locale::id money_get<_CharT, _InIter>::id;
1567
1568 template<typename _CharT, typename _OutIter>
1569 class money_put : public locale::facet
1570 {
1571 public:
1572 typedef _CharT char_type;
1573 typedef _OutIter iter_type;
1574 typedef basic_string<_CharT> string_type;
1575
1576 static locale::id id;
1577
1578 explicit
1579 money_put(size_t __refs = 0) : locale::facet(__refs) { }
1580
1581 iter_type
1582 put(iter_type __s, bool __intl, ios_base& __io,
1583 char_type __fill, long double __units) const
1584 { return this->do_put(__s, __intl, __io, __fill, __units); }
1585
1586 iter_type
1587 put(iter_type __s, bool __intl, ios_base& __io,
1588 char_type __fill, const string_type& __digits) const
1589 { return this->do_put(__s, __intl, __io, __fill, __digits); }
1590
1591 protected:
1592 virtual
1593 ~money_put() { }
1594
1595 virtual iter_type
1596 do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
1597 long double __units) const;
1598
1599 virtual iter_type
1600 do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
1601 const string_type& __digits) const;
1602 };
1603
1604 template<typename _CharT, typename _OutIter>
1605 locale::id money_put<_CharT, _OutIter>::id;
1606
1607
1608 struct messages_base
1609 {
1610 typedef int catalog;
1611 };
1612
1613 template<typename _CharT>
1614 class messages : public locale::facet, public messages_base
1615 {
1616 public:
1617 // Types:
1618 typedef _CharT char_type;
1619 typedef basic_string<_CharT> string_type;
1620
1621 protected:
1622 // Underlying "C" library locale information saved from
1623 // initialization, needed by messages_byname as well.
1624 __c_locale _M_c_locale_messages;
1625 #if 1
1626 // Only needed if glibc < 2.3
1627 const char* _M_name_messages;
1628 #endif
1629
1630 public:
1631 static locale::id id;
1632
1633 explicit
1634 messages(size_t __refs = 0)
1635 : locale::facet(__refs), _M_name_messages("C")
1636 { _M_c_locale_messages = _S_c_locale; }
1637
1638 // Non-standard.
1639 explicit
1640 messages(__c_locale __cloc, const char* __name, size_t __refs = 0)
1641 : locale::facet(__refs)
1642 {
1643 _M_name_messages = __name;
1644 _M_c_locale_messages = _S_clone_c_locale(__cloc);
1645 }
1646
1647 catalog
1648 open(const basic_string<char>& __s, const locale& __loc) const
1649 { return this->do_open(__s, __loc); }
1650
1651 // Non-standard and unorthodox, yet effective.
1652 catalog
1653 open(const basic_string<char>&, const locale&, const char*) const;
1654
1655 string_type
1656 get(catalog __c, int __set, int __msgid, const string_type& __s) const
1657 { return this->do_get(__c, __set, __msgid, __s); }
1658
1659 void
1660 close(catalog __c) const
1661 { return this->do_close(__c); }
1662
1663 protected:
1664 virtual
1665 ~messages()
1666 { _S_destroy_c_locale(_M_c_locale_messages); }
1667
1668 virtual catalog
1669 do_open(const basic_string<char>&, const locale&) const;
1670
1671 virtual string_type
1672 do_get(catalog, int, int, const string_type& __dfault) const;
1673
1674 virtual void
1675 do_close(catalog) const;
1676
1677 // Returns a locale and codeset-converted string, given a char* message.
1678 char*
1679 _M_convert_to_char(const string_type& __msg) const
1680 {
1681 // XXX
1682 return reinterpret_cast<char*>(const_cast<_CharT*>(__msg.c_str()));
1683 }
1684
1685 // Returns a locale and codeset-converted string, given a char* message.
1686 string_type
1687 _M_convert_from_char(char* __msg) const
1688 {
1689 // Length of message string without terminating null.
1690 size_t __len = char_traits<char>::length(__msg) - 1;
1691
1692 // "everybody can easily convert the string using
1693 // mbsrtowcs/wcsrtombs or with iconv()"
1694 #if 0
1695 // Convert char* to _CharT in locale used to open catalog.
1696 // XXX need additional template parameter on messages class for this..
1697 // typedef typename codecvt<char, _CharT, _StateT> __codecvt_type;
1698 typedef typename codecvt<char, _CharT, mbstate_t> __codecvt_type;
1699
1700 __codecvt_type::state_type __state;
1701 // XXX may need to initialize state.
1702 //initialize_state(__state._M_init());
1703
1704 char* __from_next;
1705 // XXX what size for this string?
1706 _CharT* __to = static_cast<_CharT*>(__builtin_alloca(__len + 1));
1707 const __codecvt_type& __cvt = use_facet<__codecvt_type>(_M_locale_conv);
1708 __cvt.out(__state, __msg, __msg + __len, __from_next,
1709 __to, __to + __len + 1, __to_next);
1710 return string_type(__to);
1711 #endif
1712 #if 0
1713 typedef ctype<_CharT> __ctype_type;
1714 // const __ctype_type& __cvt = use_facet<__ctype_type>(_M_locale_msg);
1715 const __ctype_type& __cvt = use_facet<__ctype_type>(locale());
1716 // XXX Again, proper length of converted string an issue here.
1717 // For now, assume the converted length is not larger.
1718 _CharT* __dest = static_cast<_CharT*>(__builtin_alloca(__len + 1));
1719 __cvt.widen(__msg, __msg + __len, __dest);
1720 return basic_string<_CharT>(__dest);
1721 #endif
1722 return string_type();
1723 }
1724 };
1725
1726 template<typename _CharT>
1727 locale::id messages<_CharT>::id;
1728
1729 // Specializations for required instantiations.
1730 template<>
1731 string
1732 messages<char>::do_get(catalog, int, int, const string&) const;
1733
1734 #ifdef _GLIBCPP_USE_WCHAR_T
1735 template<>
1736 wstring
1737 messages<wchar_t>::do_get(catalog, int, int, const wstring&) const;
1738 #endif
1739
1740 // Include host and configuration specific messages virtual functions.
1741 #include <bits/messages_members.h>
1742
1743 template<typename _CharT>
1744 class messages_byname : public messages<_CharT>
1745 {
1746 public:
1747 typedef _CharT char_type;
1748 typedef basic_string<_CharT> string_type;
1749
1750 explicit
1751 messages_byname(const char* __s, size_t __refs = 0)
1752 : messages<_CharT>(__refs)
1753 {
1754 _M_name_messages = __s;
1755 _S_destroy_c_locale(_M_c_locale_messages);
1756 _S_create_c_locale(_M_c_locale_messages, __s);
1757 }
1758
1759 protected:
1760 virtual
1761 ~messages_byname()
1762 { }
1763 };
1764
1765
1766 // Subclause convenience interfaces, inlines.
1767 // NB: These are inline because, when used in a loop, some compilers
1768 // can hoist the body out of the loop; then it's just as fast as the
1769 // C is*() function.
1770 template<typename _CharT>
1771 inline bool
1772 isspace(_CharT __c, const locale& __loc)
1773 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::space, __c); }
1774
1775 template<typename _CharT>
1776 inline bool
1777 isprint(_CharT __c, const locale& __loc)
1778 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::print, __c); }
1779
1780 template<typename _CharT>
1781 inline bool
1782 iscntrl(_CharT __c, const locale& __loc)
1783 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::cntrl, __c); }
1784
1785 template<typename _CharT>
1786 inline bool
1787 isupper(_CharT __c, const locale& __loc)
1788 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::upper, __c); }
1789
1790 template<typename _CharT>
1791 inline bool islower(_CharT __c, const locale& __loc)
1792 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::lower, __c); }
1793
1794 template<typename _CharT>
1795 inline bool
1796 isalpha(_CharT __c, const locale& __loc)
1797 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alpha, __c); }
1798
1799 template<typename _CharT>
1800 inline bool
1801 isdigit(_CharT __c, const locale& __loc)
1802 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::digit, __c); }
1803
1804 template<typename _CharT>
1805 inline bool
1806 ispunct(_CharT __c, const locale& __loc)
1807 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::punct, __c); }
1808
1809 template<typename _CharT>
1810 inline bool
1811 isxdigit(_CharT __c, const locale& __loc)
1812 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::xdigit, __c); }
1813
1814 template<typename _CharT>
1815 inline bool
1816 isalnum(_CharT __c, const locale& __loc)
1817 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alnum, __c); }
1818
1819 template<typename _CharT>
1820 inline bool
1821 isgraph(_CharT __c, const locale& __loc)
1822 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::graph, __c); }
1823
1824 template<typename _CharT>
1825 inline _CharT
1826 toupper(_CharT __c, const locale& __loc)
1827 { return use_facet<ctype<_CharT> >(__loc).toupper(__c); }
1828
1829 template<typename _CharT>
1830 inline _CharT
1831 tolower(_CharT __c, const locale& __loc)
1832 { return use_facet<ctype<_CharT> >(__loc).tolower(__c); }
1833 } // namespace std
1834
1835 #endif