1 // Locale support -*- C++ -*-
3 // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
4 // Free Software Foundation, Inc.
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)
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.
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,
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.
32 // ISO C++ 14882: 22.1 Locales
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.
40 #ifndef _CPP_BITS_LOCFACETS_H
41 #define _CPP_BITS_LOCFACETS_H 1
43 #pragma GCC system_header
45 #include <ctime> // For struct tm
46 #include <cwctype> // For wctype_t
47 #include <ios> // For ios_base
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
55 # define _GLIBCPP_NUM_FACETS 14
58 template<typename _CharT
, typename _Traits
>
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>
65 // Common base for ctype<_CharT>.
66 template<typename _CharT
>
67 class __ctype_abstract_base
: public locale::facet
, public ctype_base
71 typedef _CharT char_type
;
74 is(mask __m
, char_type __c
) const
75 { return this->do_is(__m
, __c
); }
78 is(const char_type
*__lo
, const char_type
*__hi
, mask
*__vec
) const
79 { return this->do_is(__lo
, __hi
, __vec
); }
82 scan_is(mask __m
, const char_type
* __lo
, const char_type
* __hi
) const
83 { return this->do_scan_is(__m
, __lo
, __hi
); }
86 scan_not(mask __m
, const char_type
* __lo
, const char_type
* __hi
) const
87 { return this->do_scan_not(__m
, __lo
, __hi
); }
90 toupper(char_type __c
) const
91 { return this->do_toupper(__c
); }
94 toupper(char_type
*__lo
, const char_type
* __hi
) const
95 { return this->do_toupper(__lo
, __hi
); }
98 tolower(char_type __c
) const
99 { return this->do_tolower(__c
); }
102 tolower(char_type
* __lo
, const char_type
* __hi
) const
103 { return this->do_tolower(__lo
, __hi
); }
106 widen(char __c
) const
107 { return this->do_widen(__c
); }
110 widen(const char* __lo
, const char* __hi
, char_type
* __to
) const
111 { return this->do_widen(__lo
, __hi
, __to
); }
114 narrow(char_type __c
, char __dfault
) const
115 { return this->do_narrow(__c
, __dfault
); }
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
); }
124 __ctype_abstract_base(size_t __refs
= 0): locale::facet(__refs
) { }
127 ~__ctype_abstract_base() { }
130 do_is(mask __m
, char_type __c
) const = 0;
132 virtual const char_type
*
133 do_is(const char_type
* __lo
, const char_type
* __hi
,
134 mask
* __vec
) const = 0;
136 virtual const char_type
*
137 do_scan_is(mask __m
, const char_type
* __lo
,
138 const char_type
* __hi
) const = 0;
140 virtual const char_type
*
141 do_scan_not(mask __m
, const char_type
* __lo
,
142 const char_type
* __hi
) const = 0;
145 do_toupper(char_type
) const = 0;
147 virtual const char_type
*
148 do_toupper(char_type
* __lo
, const char_type
* __hi
) const = 0;
151 do_tolower(char_type
) const = 0;
153 virtual const char_type
*
154 do_tolower(char_type
* __lo
, const char_type
* __hi
) const = 0;
157 do_widen(char) const = 0;
160 do_widen(const char* __lo
, const char* __hi
,
161 char_type
* __dest
) const = 0;
164 do_narrow(char_type
, char __dfault
) const = 0;
166 virtual const char_type
*
167 do_narrow(const char_type
* __lo
, const char_type
* __hi
,
168 char __dfault
, char* __dest
) const = 0;
171 // NB: Generic, mostly useless implementation.
172 template<typename _CharT
>
173 class ctype
: public __ctype_abstract_base
<_CharT
>
177 typedef _CharT char_type
;
178 typedef typename
ctype::mask mask
;
180 static locale::id id
;
183 ctype(size_t __refs
= 0) : __ctype_abstract_base
<_CharT
>(__refs
) { }
190 do_is(mask __m
, char_type __c
) const;
192 virtual const char_type
*
193 do_is(const char_type
* __lo
, const char_type
* __hi
, mask
* __vec
) const;
195 virtual const char_type
*
196 do_scan_is(mask __m
, const char_type
* __lo
, const char_type
* __hi
) const;
198 virtual const char_type
*
199 do_scan_not(mask __m
, const char_type
* __lo
,
200 const char_type
* __hi
) const;
203 do_toupper(char_type __c
) const;
205 virtual const char_type
*
206 do_toupper(char_type
* __lo
, const char_type
* __hi
) const;
209 do_tolower(char_type __c
) const;
211 virtual const char_type
*
212 do_tolower(char_type
* __lo
, const char_type
* __hi
) const;
215 do_widen(char __c
) const;
218 do_widen(const char* __lo
, const char* __hi
, char_type
* __dest
) const;
221 do_narrow(char_type
, char __dfault
) const;
223 virtual const char_type
*
224 do_narrow(const char_type
* __lo
, const char_type
* __hi
,
225 char __dfault
, char* __dest
) const;
228 template<typename _CharT
>
229 locale::id ctype
<_CharT
>::id
;
231 // 22.2.1.3 ctype<char> specialization.
233 class ctype
<char> : public __ctype_abstract_base
<char>
237 typedef char char_type
;
241 __c_locale _M_c_locale_ctype
;
243 __to_type _M_toupper
;
244 __to_type _M_tolower
;
245 const mask
* _M_table
;
248 static locale::id id
;
249 static const size_t table_size
= 1 + static_cast<unsigned char>(-1);
252 ctype(const mask
* __table
= 0, bool __del
= false, size_t __refs
= 0);
255 ctype(__c_locale __cloc
, const mask
* __table
= 0, bool __del
= false,
259 is(mask __m
, char __c
) const;
262 is(const char* __lo
, const char* __hi
, mask
* __vec
) const;
265 scan_is(mask __m
, const char* __lo
, const char* __hi
) const;
268 scan_not(mask __m
, const char* __lo
, const char* __hi
) const;
272 table() const throw()
276 classic_table() throw();
282 do_is(mask __m
, char_type __c
) const;
284 virtual const char_type
*
285 do_is(const char_type
* __lo
, const char_type
* __hi
, mask
* __vec
) const;
287 virtual const char_type
*
288 do_scan_is(mask __m
, const char_type
* __lo
, const char_type
* __hi
) const;
290 virtual const char_type
*
291 do_scan_not(mask __m
, const char_type
* __lo
,
292 const char_type
* __hi
) const;
295 do_toupper(char_type
) const;
297 virtual const char_type
*
298 do_toupper(char_type
* __lo
, const char_type
* __hi
) const;
301 do_tolower(char_type
) const;
303 virtual const char_type
*
304 do_tolower(char_type
* __lo
, const char_type
* __hi
) const;
307 do_widen(char) const;
310 do_widen(const char* __lo
, const char* __hi
, char_type
* __dest
) const;
313 do_narrow(char_type
, char __dfault
) const;
315 virtual const char_type
*
316 do_narrow(const char_type
* __lo
, const char_type
* __hi
,
317 char __dfault
, char* __dest
) const;
322 use_facet
<ctype
<char> >(const locale
& __loc
);
324 #ifdef _GLIBCPP_USE_WCHAR_T
325 // 22.2.1.3 ctype<wchar_t> specialization
327 class ctype
<wchar_t> : public __ctype_abstract_base
<wchar_t>
331 typedef wchar_t char_type
;
332 typedef wctype_t __wmask_type
;
335 __c_locale _M_c_locale_ctype
;
339 static locale::id id
;
342 ctype(size_t __refs
= 0);
345 ctype(__c_locale __cloc
, size_t __refs
= 0);
349 _M_convert_to_wmask(const mask __m
) const;
355 do_is(mask __m
, char_type __c
) const;
357 virtual const char_type
*
358 do_is(const char_type
* __lo
, const char_type
* __hi
, mask
* __vec
) const;
360 virtual const char_type
*
361 do_scan_is(mask __m
, const char_type
* __lo
, const char_type
* __hi
) const;
363 virtual const char_type
*
364 do_scan_not(mask __m
, const char_type
* __lo
,
365 const char_type
* __hi
) const;
368 do_toupper(char_type
) const;
370 virtual const char_type
*
371 do_toupper(char_type
* __lo
, const char_type
* __hi
) const;
374 do_tolower(char_type
) const;
376 virtual const char_type
*
377 do_tolower(char_type
* __lo
, const char_type
* __hi
) const;
380 do_widen(char) const;
383 do_widen(const char* __lo
, const char* __hi
, char_type
* __dest
) const;
386 do_narrow(char_type
, char __dfault
) const;
388 virtual const char_type
*
389 do_narrow(const char_type
* __lo
, const char_type
* __hi
,
390 char __dfault
, char* __dest
) const;
395 const ctype
<wchar_t>&
396 use_facet
<ctype
<wchar_t> >(const locale
& __loc
);
397 #endif //_GLIBCPP_USE_WCHAR_T
399 // Include host and configuration specific ctype inlines.
400 #include <bits/ctype_inline.h>
402 // 22.2.1.2 Template class ctype_byname
403 template<typename _CharT
>
404 class ctype_byname
: public ctype
<_CharT
>
407 typedef _CharT char_type
;
410 ctype_byname(const char* __s
, size_t __refs
= 0);
417 // 22.2.1.4 Class ctype_byname specializations.
419 ctype_byname
<char>::ctype_byname(const char*, size_t refs
);
422 ctype_byname
<wchar_t>::ctype_byname(const char*, size_t refs
);
424 // 22.2.1.5 Template class codecvt
425 #include <bits/codecvt.h>
428 // 22.2.2 The numeric category.
432 // String literal of acceptable (narrow) input, for num_get.
433 // "0123456789eEabcdfABCDF"
434 static const char _S_atoms
[];
445 // Construct and return valid scanf format for floating point types.
447 _S_format_float(const ios_base
& __io
, char* __fptr
, char __mod
,
450 // Construct and return valid scanf format for integer types.
452 _S_format_int(const ios_base
& __io
, char* __fptr
, char __mod
, char __modl
);
456 template<typename _CharT
>
457 class numpunct
: public locale::facet
461 typedef _CharT char_type
;
462 typedef basic_string
<_CharT
> string_type
;
464 static locale::id id
;
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
;
475 numpunct(size_t __refs
= 0) : locale::facet(__refs
)
476 { _M_initialize_numpunct(); }
479 numpunct(__c_locale __cloc
, size_t __refs
= 0) : locale::facet(__refs
)
480 { _M_initialize_numpunct(__cloc
); }
483 decimal_point() const
484 { return this->do_decimal_point(); }
487 thousands_sep() const
488 { return this->do_thousands_sep(); }
492 { return this->do_grouping(); }
496 { return this->do_truename(); }
500 { return this->do_falsename(); }
507 do_decimal_point() const
508 { return _M_decimal_point
; }
511 do_thousands_sep() const
512 { return _M_thousands_sep
; }
516 { return _M_grouping
; }
520 { return _M_truename
; }
524 { return _M_falsename
; }
526 // For use at construction time only.
528 _M_initialize_numpunct(__c_locale __cloc
= _S_c_locale
);
531 template<typename _CharT
>
532 locale::id numpunct
<_CharT
>::id
;
535 numpunct
<char>::~numpunct();
539 numpunct
<char>::_M_initialize_numpunct(__c_locale __cloc
);
541 #ifdef _GLIBCPP_USE_WCHAR_T
543 numpunct
<wchar_t>::~numpunct();
547 numpunct
<wchar_t>::_M_initialize_numpunct(__c_locale __cloc
);
550 template<typename _CharT
>
551 class numpunct_byname
: public numpunct
<_CharT
>
554 __c_locale _M_c_locale_numpunct
;
557 typedef _CharT char_type
;
558 typedef basic_string
<_CharT
> string_type
;
561 numpunct_byname(const char* __s
, size_t __refs
= 0)
562 : numpunct
<_CharT
>(__refs
)
564 _S_create_c_locale(_M_c_locale_numpunct
, __s
);
565 _M_initialize_numpunct(_M_c_locale_numpunct
);
571 { _S_destroy_c_locale(_M_c_locale_numpunct
); }
574 template<typename _CharT
, typename _InIter
>
575 class num_get
: public locale::facet
, public __num_base
579 typedef _CharT char_type
;
580 typedef _InIter iter_type
;
582 static locale::id id
;
585 num_get(size_t __refs
= 0) : locale::facet(__refs
) { }
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
); }
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
); }
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
); }
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
); }
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
); }
612 #ifdef _GLIBCPP_USE_LONG_LONG
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
); }
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
); }
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
); }
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
); }
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
); }
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
); }
645 virtual ~num_get() { }
648 _M_extract_float(iter_type
, iter_type
, ios_base
&, ios_base::iostate
&,
649 string
& __xtrc
) const;
652 _M_extract_int(iter_type
, iter_type
, ios_base
&, ios_base::iostate
&,
653 string
& __xtrc
, int& __base
) const;
656 do_get(iter_type
, iter_type
, ios_base
&, ios_base::iostate
&, bool&) const;
660 do_get(iter_type
, iter_type
, ios_base
&, ios_base::iostate
&, long&) const;
663 do_get(iter_type
, iter_type
, ios_base
&, ios_base::iostate
& __err
,
664 unsigned short&) const;
667 do_get(iter_type
, iter_type
, ios_base
&, ios_base::iostate
& __err
,
668 unsigned int&) const;
671 do_get(iter_type
, iter_type
, ios_base
&, ios_base::iostate
& __err
,
672 unsigned long&) const;
674 #ifdef _GLIBCPP_USE_LONG_LONG
676 do_get(iter_type
, iter_type
, ios_base
&, ios_base::iostate
& __err
,
680 do_get(iter_type
, iter_type
, ios_base
&, ios_base::iostate
& __err
,
681 unsigned long long&) const;
685 do_get(iter_type
, iter_type
, ios_base
&, ios_base::iostate
& __err
,
689 do_get(iter_type
, iter_type
, ios_base
&, ios_base::iostate
& __err
,
693 do_get(iter_type
, iter_type
, ios_base
&, ios_base::iostate
& __err
,
697 do_get(iter_type
, iter_type
, ios_base
&, ios_base::iostate
& __err
,
701 template<typename _CharT
, typename _InIter
>
702 locale::id num_get
<_CharT
, _InIter
>::id
;
705 // Partial specialization for istreambuf_iterator, so can use traits_type.
706 template<typename _CharT
>
707 class num_get
<_CharT
, istreambuf_iterator
<_CharT
> >;
710 _M_extract_float(iter_type
, iter_type
, ios_base
&, ios_base::iostate
&,
711 string
& __xtrc
) const;
714 _M_extract_int(iter_type
, iter_type
, ios_base
&, ios_base::iostate
&,
715 string
& __xtrc
, int& __base
) const;
718 do_get(iter_type
, iter_type
, ios_base
&, ios_base::iostate
&, bool&) const;
721 template<typename _CharT
, typename _OutIter
>
722 class num_put
: public locale::facet
, public __num_base
726 typedef _CharT char_type
;
727 typedef _OutIter iter_type
;
729 static locale::id id
;
732 num_put(size_t __refs
= 0) : locale::facet(__refs
) { }
735 put(iter_type __s
, ios_base
& __f
, char_type __fill
, bool __v
) const
736 { return this->do_put(__s
, __f
, __fill
, __v
); }
739 put(iter_type __s
, ios_base
& __f
, char_type __fill
, long __v
) const
740 { return this->do_put(__s
, __f
, __fill
, __v
); }
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
); }
747 #ifdef _GLIBCPP_USE_LONG_LONG
749 put(iter_type __s
, ios_base
& __f
, char_type __fill
, long long __v
) const
750 { return this->do_put(__s
, __f
, __fill
, __v
); }
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
); }
759 put(iter_type __s
, ios_base
& __f
, char_type __fill
, double __v
) const
760 { return this->do_put(__s
, __f
, __fill
, __v
); }
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
); }
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
); }
773 template<typename _ValueT
>
775 _M_convert_float(iter_type
, ios_base
& __io
, char_type __fill
,
776 char __mod
, _ValueT __v
) const;
778 template<typename _ValueT
>
780 _M_convert_int(iter_type
, ios_base
& __io
, char_type __fill
,
781 char __mod
, char __modl
, _ValueT __v
) const;
784 _M_widen_float(iter_type
, ios_base
& __io
, char_type __fill
, char* __cs
,
788 _M_widen_int(iter_type
, ios_base
& __io
, char_type __fill
, char* __cs
,
792 _M_insert(iter_type
, ios_base
& __io
, char_type __fill
,
793 const char_type
* __ws
, int __len
) const;
799 do_put(iter_type
, ios_base
&, char_type __fill
, bool __v
) const;
802 do_put(iter_type
, ios_base
&, char_type __fill
, long __v
) const;
805 do_put(iter_type
, ios_base
&, char_type __fill
, unsigned long) const;
807 #ifdef _GLIBCPP_USE_LONG_LONG
809 do_put(iter_type
, ios_base
&, char_type __fill
, long long __v
) const;
812 do_put(iter_type
, ios_base
&, char_type __fill
, unsigned long long) const;
816 do_put(iter_type
, ios_base
&, char_type __fill
, double __v
) const;
819 do_put(iter_type
, ios_base
&, char_type __fill
, long double __v
) const;
822 do_put(iter_type
, ios_base
&, char_type __fill
, const void* __v
) const;
825 template <typename _CharT
, typename _OutIter
>
826 locale::id num_put
<_CharT
, _OutIter
>::id
;
829 template<typename _CharT
>
830 class collate
: public locale::facet
834 typedef _CharT char_type
;
835 typedef basic_string
<_CharT
> string_type
;
838 // Underlying "C" library locale information saved from
839 // initialization, needed by collate_byname as well.
840 __c_locale _M_c_locale_collate
;
843 static locale::id id
;
846 collate(size_t __refs
= 0)
847 : locale::facet(__refs
)
848 { _M_c_locale_collate
= _S_c_locale
; }
852 collate(__c_locale __cloc
, size_t __refs
= 0)
853 : locale::facet(__refs
)
854 { _M_c_locale_collate
= _S_clone_c_locale(__cloc
); }
857 compare(const _CharT
* __lo1
, const _CharT
* __hi1
,
858 const _CharT
* __lo2
, const _CharT
* __hi2
) const
859 { return this->do_compare(__lo1
, __hi1
, __lo2
, __hi2
); }
862 transform(const _CharT
* __lo
, const _CharT
* __hi
) const
863 { return this->do_transform(__lo
, __hi
); }
866 hash(const _CharT
* __lo
, const _CharT
* __hi
) const
867 { return this->do_hash(__lo
, __hi
); }
869 // Used to abstract out _CharT bits in virtual member functions, below.
871 _M_compare(const _CharT
*, const _CharT
*) const;
874 _M_transform(_CharT
*, const _CharT
*, size_t) const;
880 if (_M_c_locale_collate
!= _S_c_locale
)
881 _S_destroy_c_locale(_M_c_locale_collate
);
885 do_compare(const _CharT
* __lo1
, const _CharT
* __hi1
,
886 const _CharT
* __lo2
, const _CharT
* __hi2
) const;
889 do_transform(const _CharT
* __lo
, const _CharT
* __hi
) const;
892 do_hash(const _CharT
* __lo
, const _CharT
* __hi
) const;
895 template<typename _CharT
>
896 locale::id collate
<_CharT
>::id
;
901 collate
<char>::_M_compare(const char*, const char*) const;
905 collate
<char>::_M_transform(char*, const char*, size_t) const;
907 #ifdef _GLIBCPP_USE_WCHAR_T
910 collate
<wchar_t>::_M_compare(const wchar_t*, const wchar_t*) const;
914 collate
<wchar_t>::_M_transform(wchar_t*, const wchar_t*, size_t) const;
917 template<typename _CharT
>
918 class collate_byname
: public collate
<_CharT
>
921 typedef _CharT char_type
;
922 typedef basic_string
<_CharT
> string_type
;
925 collate_byname(const char* __s
, size_t __refs
= 0)
926 : collate
<_CharT
>(__refs
)
928 if (_M_c_locale_collate
!= _S_c_locale
)
929 _S_destroy_c_locale(_M_c_locale_collate
);
930 _S_create_c_locale(_M_c_locale_collate
, __s
);
935 ~collate_byname() { }
942 enum dateorder
{ no_order
, dmy
, mdy
, ymd
, ydm
};
945 template<typename _CharT
>
946 class __timepunct
: public locale::facet
950 typedef _CharT __char_type
;
951 typedef basic_string
<_CharT
> __string_type
;
953 static locale::id id
;
955 // List of all known timezones, with GMT first.
956 static const _CharT
* _S_timezones
[14];
959 __c_locale _M_c_locale_timepunct
;
960 const char* _M_name_timepunct
;
961 const _CharT
* _M_date_format
;
962 const _CharT
* _M_date_era_format
;
963 const _CharT
* _M_time_format
;
964 const _CharT
* _M_time_era_format
;
965 const _CharT
* _M_date_time_format
;
966 const _CharT
* _M_date_time_era_format
;
969 const _CharT
* _M_am_pm_format
;
971 // Day names, starting with "C"'s Sunday.
972 const _CharT
* _M_day1
;
973 const _CharT
* _M_day2
;
974 const _CharT
* _M_day3
;
975 const _CharT
* _M_day4
;
976 const _CharT
* _M_day5
;
977 const _CharT
* _M_day6
;
978 const _CharT
* _M_day7
;
980 // Abbreviated day names, starting with "C"'s Sun.
981 const _CharT
* _M_day_a1
;
982 const _CharT
* _M_day_a2
;
983 const _CharT
* _M_day_a3
;
984 const _CharT
* _M_day_a4
;
985 const _CharT
* _M_day_a5
;
986 const _CharT
* _M_day_a6
;
987 const _CharT
* _M_day_a7
;
989 // Month names, starting with "C"'s January.
990 const _CharT
* _M_month01
;
991 const _CharT
* _M_month02
;
992 const _CharT
* _M_month03
;
993 const _CharT
* _M_month04
;
994 const _CharT
* _M_month05
;
995 const _CharT
* _M_month06
;
996 const _CharT
* _M_month07
;
997 const _CharT
* _M_month08
;
998 const _CharT
* _M_month09
;
999 const _CharT
* _M_month10
;
1000 const _CharT
* _M_month11
;
1001 const _CharT
* _M_month12
;
1003 // Abbreviated month names, starting with "C"'s Jan.
1004 const _CharT
* _M_month_a01
;
1005 const _CharT
* _M_month_a02
;
1006 const _CharT
* _M_month_a03
;
1007 const _CharT
* _M_month_a04
;
1008 const _CharT
* _M_month_a05
;
1009 const _CharT
* _M_month_a06
;
1010 const _CharT
* _M_month_a07
;
1011 const _CharT
* _M_month_a08
;
1012 const _CharT
* _M_month_a09
;
1013 const _CharT
* _M_month_a10
;
1014 const _CharT
* _M_month_a11
;
1015 const _CharT
* _M_month_a12
;
1019 __timepunct(size_t __refs
= 0)
1020 : locale::facet(__refs
), _M_name_timepunct("C")
1021 { _M_initialize_timepunct(); }
1024 __timepunct(__c_locale __cloc
, const char* __s
, size_t __refs
= 0)
1025 : locale::facet(__refs
), _M_name_timepunct(__s
)
1026 { _M_initialize_timepunct(__cloc
); }
1029 _M_put(_CharT
* __s
, size_t __maxlen
, const _CharT
* __format
,
1030 const tm
* __tm
) const;
1033 _M_date_formats(const _CharT
** __date
) const
1035 // Always have default first.
1036 __date
[0] = _M_date_format
;
1037 __date
[1] = _M_date_era_format
;
1041 _M_time_formats(const _CharT
** __time
) const
1043 // Always have default first.
1044 __time
[0] = _M_time_format
;
1045 __time
[1] = _M_time_era_format
;
1049 _M_ampm(const _CharT
** __ampm
) const
1056 _M_date_time_formats(const _CharT
** __dt
) const
1058 // Always have default first.
1059 __dt
[0] = _M_date_time_format
;
1060 __dt
[1] = _M_date_time_era_format
;
1064 _M_days(const _CharT
** __days
) const
1066 __days
[0] = _M_day1
;
1067 __days
[1] = _M_day2
;
1068 __days
[2] = _M_day3
;
1069 __days
[3] = _M_day4
;
1070 __days
[4] = _M_day5
;
1071 __days
[5] = _M_day6
;
1072 __days
[6] = _M_day7
;
1076 _M_days_abbreviated(const _CharT
** __days
) const
1078 __days
[0] = _M_day_a1
;
1079 __days
[1] = _M_day_a2
;
1080 __days
[2] = _M_day_a3
;
1081 __days
[3] = _M_day_a4
;
1082 __days
[4] = _M_day_a5
;
1083 __days
[5] = _M_day_a6
;
1084 __days
[6] = _M_day_a7
;
1088 _M_months(const _CharT
** __months
) const
1090 __months
[0] = _M_month01
;
1091 __months
[1] = _M_month02
;
1092 __months
[2] = _M_month03
;
1093 __months
[3] = _M_month04
;
1094 __months
[4] = _M_month05
;
1095 __months
[5] = _M_month06
;
1096 __months
[6] = _M_month07
;
1097 __months
[7] = _M_month08
;
1098 __months
[8] = _M_month09
;
1099 __months
[9] = _M_month10
;
1100 __months
[10] = _M_month11
;
1101 __months
[11] = _M_month12
;
1105 _M_months_abbreviated(const _CharT
** __months
) const
1107 __months
[0] = _M_month_a01
;
1108 __months
[1] = _M_month_a02
;
1109 __months
[2] = _M_month_a03
;
1110 __months
[3] = _M_month_a04
;
1111 __months
[4] = _M_month_a05
;
1112 __months
[5] = _M_month_a06
;
1113 __months
[6] = _M_month_a07
;
1114 __months
[7] = _M_month_a08
;
1115 __months
[8] = _M_month_a09
;
1116 __months
[9] = _M_month_a10
;
1117 __months
[10] = _M_month_a11
;
1118 __months
[11] = _M_month_a12
;
1125 // For use at construction time only.
1127 _M_initialize_timepunct(__c_locale __cloc
= _S_c_locale
);
1130 template<typename _CharT
>
1131 locale::id __timepunct
<_CharT
>::id
;
1135 __timepunct
<char>::~__timepunct();
1139 __timepunct
<char>::_S_timezones
[14];
1143 __timepunct
<char>::_M_initialize_timepunct(__c_locale __cloc
);
1147 __timepunct
<char>::_M_put(char*, size_t, const char*, const tm
*) const;
1149 #ifdef _GLIBCPP_USE_WCHAR_T
1151 __timepunct
<wchar_t>::~__timepunct();
1155 __timepunct
<wchar_t>::_S_timezones
[14];
1159 __timepunct
<wchar_t>::_M_initialize_timepunct(__c_locale __cloc
);
1163 __timepunct
<wchar_t>::_M_put(wchar_t*, size_t, const wchar_t*,
1168 template<typename _CharT
>
1169 const _CharT
* __timepunct
<_CharT
>::_S_timezones
[14];
1172 template<typename _CharT
, typename _InIter
>
1173 class time_get
: public locale::facet
, public time_base
1177 typedef _CharT char_type
;
1178 typedef _InIter iter_type
;
1179 typedef basic_string
<_CharT
> __string_type
;
1181 static locale::id id
;
1184 time_get(size_t __refs
= 0)
1185 : locale::facet (__refs
) { }
1189 { return this->do_date_order(); }
1192 get_time(iter_type __beg
, iter_type __end
, ios_base
& __io
,
1193 ios_base::iostate
& __err
, tm
* __tm
) const
1194 { return this->do_get_time(__beg
, __end
, __io
, __err
, __tm
); }
1197 get_date(iter_type __beg
, iter_type __end
, ios_base
& __io
,
1198 ios_base::iostate
& __err
, tm
* __tm
) const
1199 { return this->do_get_date(__beg
, __end
, __io
, __err
, __tm
); }
1202 get_weekday(iter_type __beg
, iter_type __end
, ios_base
& __io
,
1203 ios_base::iostate
& __err
, tm
* __tm
) const
1204 { return this->do_get_weekday(__beg
, __end
, __io
, __err
, __tm
); }
1207 get_monthname(iter_type __beg
, iter_type __end
, ios_base
& __io
,
1208 ios_base::iostate
& __err
, tm
* __tm
) const
1209 { return this->do_get_monthname(__beg
, __end
, __io
, __err
, __tm
); }
1212 get_year(iter_type __beg
, iter_type __end
, ios_base
& __io
,
1213 ios_base::iostate
& __err
, tm
* __tm
) const
1214 { return this->do_get_year(__beg
, __end
, __io
, __err
, __tm
); }
1221 do_date_order() const;
1224 do_get_time(iter_type __beg
, iter_type __end
, ios_base
& __io
,
1225 ios_base::iostate
& __err
, tm
* __tm
) const;
1228 do_get_date(iter_type __beg
, iter_type __end
, ios_base
& __io
,
1229 ios_base::iostate
& __err
, tm
* __tm
) const;
1232 do_get_weekday(iter_type __beg
, iter_type __end
, ios_base
&,
1233 ios_base::iostate
& __err
, tm
* __tm
) const;
1236 do_get_monthname(iter_type __beg
, iter_type __end
, ios_base
&,
1237 ios_base::iostate
& __err
, tm
* __tm
) const;
1240 do_get_year(iter_type __beg
, iter_type __end
, ios_base
& __io
,
1241 ios_base::iostate
& __err
, tm
* __tm
) const;
1243 // Extract numeric component of length __len.
1245 _M_extract_num(iter_type
& __beg
, iter_type
& __end
, int& __member
,
1246 int __min
, int __max
, size_t __len
,
1247 const ctype
<_CharT
>& __ctype
,
1248 ios_base::iostate
& __err
) const;
1250 // Extract day or month name, or any unique array of string
1251 // literals in a const _CharT* array.
1253 _M_extract_name(iter_type
& __beg
, iter_type
& __end
, int& __member
,
1254 const _CharT
** __names
, size_t __indexlen
,
1255 ios_base::iostate
& __err
) const;
1257 // Extract on a component-by-component basis, via __format argument.
1259 _M_extract_via_format(iter_type
& __beg
, iter_type
& __end
, ios_base
& __io
,
1260 ios_base::iostate
& __err
, tm
* __tm
,
1261 const _CharT
* __format
) const;
1264 template<typename _CharT
, typename _InIter
>
1265 locale::id time_get
<_CharT
, _InIter
>::id
;
1267 template<typename _CharT
, typename _InIter
>
1268 class time_get_byname
: public time_get
<_CharT
, _InIter
>
1272 typedef _CharT char_type
;
1273 typedef _InIter iter_type
;
1276 time_get_byname(const char*, size_t __refs
= 0)
1277 : time_get
<_CharT
, _InIter
>(__refs
) { }
1281 ~time_get_byname() { }
1284 template<typename _CharT
, typename _OutIter
>
1285 class time_put
: public locale::facet
, public time_base
1289 typedef _CharT char_type
;
1290 typedef _OutIter iter_type
;
1292 static locale::id id
;
1295 time_put(size_t __refs
= 0)
1296 : locale::facet(__refs
) { }
1299 put(iter_type __s
, ios_base
& __io
, char_type __fill
, const tm
* __tm
,
1300 const _CharT
* __beg
, const _CharT
* __end
) const;
1303 put(iter_type __s
, ios_base
& __io
, char_type __fill
,
1304 const tm
* __tm
, char __format
, char __mod
= 0) const
1305 { return this->do_put(__s
, __io
, __fill
, __tm
, __format
, __mod
); }
1313 do_put(iter_type __s
, ios_base
& __io
, char_type __fill
, const tm
* __tm
,
1314 char __format
, char __mod
) const;
1317 template<typename _CharT
, typename _OutIter
>
1318 locale::id time_put
<_CharT
, _OutIter
>::id
;
1320 template<typename _CharT
, typename _OutIter
>
1321 class time_put_byname
: public time_put
<_CharT
, _OutIter
>
1325 typedef _CharT char_type
;
1326 typedef _OutIter iter_type
;
1329 time_put_byname(const char* /*__s*/, size_t __refs
= 0)
1330 : time_put
<_CharT
, _OutIter
>(__refs
)
1335 ~time_put_byname() { }
1342 enum part
{ none
, space
, symbol
, sign
, value
};
1343 struct pattern
{ char field
[4]; };
1345 static const pattern _S_default_pattern
;
1347 // Construct and return valid pattern consisting of some combination of:
1348 // space none symbol sign value
1350 _S_construct_pattern(char __precedes
, char __space
, char __posn
);
1353 template<typename _CharT
, bool _Intl
>
1354 class moneypunct
: public locale::facet
, public money_base
1358 typedef _CharT char_type
;
1359 typedef basic_string
<_CharT
> string_type
;
1361 static const bool intl
= _Intl
;
1362 static locale::id id
;
1365 const char* _M_grouping
;
1366 char_type _M_decimal_point
;
1367 char_type _M_thousands_sep
;
1368 const char_type
* _M_curr_symbol
;
1369 const char_type
* _M_positive_sign
;
1370 const char_type
* _M_negative_sign
;
1372 pattern _M_pos_format
;
1373 pattern _M_neg_format
;
1377 moneypunct(size_t __refs
= 0) : locale::facet(__refs
)
1378 { _M_initialize_moneypunct(); }
1381 moneypunct(__c_locale __cloc
, const char* __s
, size_t __refs
= 0)
1382 : locale::facet(__refs
)
1383 { _M_initialize_moneypunct(__cloc
, __s
); }
1386 decimal_point() const
1387 { return this->do_decimal_point(); }
1390 thousands_sep() const
1391 { return this->do_thousands_sep(); }
1395 { return this->do_grouping(); }
1399 { return this->do_curr_symbol(); }
1402 positive_sign() const
1403 { return this->do_positive_sign(); }
1406 negative_sign() const
1407 { return this->do_negative_sign(); }
1411 { return this->do_frac_digits(); }
1415 { return this->do_pos_format(); }
1419 { return this->do_neg_format(); }
1426 do_decimal_point() const
1427 { return _M_decimal_point
; }
1430 do_thousands_sep() const
1431 { return _M_thousands_sep
; }
1435 { return _M_grouping
; }
1438 do_curr_symbol() const
1439 { return _M_curr_symbol
; }
1442 do_positive_sign() const
1443 { return _M_positive_sign
; }
1446 do_negative_sign() const
1447 { return _M_negative_sign
; }
1450 do_frac_digits() const
1451 { return _M_frac_digits
; }
1454 do_pos_format() const
1455 { return _M_pos_format
; }
1458 do_neg_format() const
1459 { return _M_neg_format
; }
1461 // For use at construction time only.
1463 _M_initialize_moneypunct(__c_locale __cloc
= _S_c_locale
,
1464 const char* __name
= NULL
);
1467 template<typename _CharT
, bool _Intl
>
1468 locale::id moneypunct
<_CharT
, _Intl
>::id
;
1470 template<typename _CharT
, bool _Intl
>
1471 const bool moneypunct
<_CharT
, _Intl
>::intl
;
1474 moneypunct
<char, true>::~moneypunct();
1477 moneypunct
<char, false>::~moneypunct();
1481 moneypunct
<char, true>::_M_initialize_moneypunct(__c_locale
, const char*);
1485 moneypunct
<char, false>::_M_initialize_moneypunct(__c_locale
, const char*);
1487 #ifdef _GLIBCPP_USE_WCHAR_T
1489 moneypunct
<wchar_t, true>::~moneypunct();
1492 moneypunct
<wchar_t, false>::~moneypunct();
1496 moneypunct
<wchar_t, true>::_M_initialize_moneypunct(__c_locale
,
1501 moneypunct
<wchar_t, false>::_M_initialize_moneypunct(__c_locale
,
1505 template<typename _CharT
, bool _Intl
>
1506 class moneypunct_byname
: public moneypunct
<_CharT
, _Intl
>
1508 __c_locale _M_c_locale_moneypunct
;
1511 typedef _CharT char_type
;
1512 typedef basic_string
<_CharT
> string_type
;
1514 static const bool intl
= _Intl
;
1517 moneypunct_byname(const char* __s
, size_t __refs
= 0)
1518 : moneypunct
<_CharT
, _Intl
>(__refs
)
1520 _S_create_c_locale(_M_c_locale_moneypunct
, __s
);
1521 _M_initialize_moneypunct(_M_c_locale_moneypunct
);
1526 ~moneypunct_byname()
1527 { _S_destroy_c_locale(_M_c_locale_moneypunct
); }
1530 template<typename _CharT
, bool _Intl
>
1531 const bool moneypunct_byname
<_CharT
, _Intl
>::intl
;
1533 template<typename _CharT
, typename _InIter
>
1534 class money_get
: public locale::facet
1538 typedef _CharT char_type
;
1539 typedef _InIter iter_type
;
1540 typedef basic_string
<_CharT
> string_type
;
1542 static locale::id id
;
1545 money_get(size_t __refs
= 0) : locale::facet(__refs
) { }
1548 get(iter_type __s
, iter_type __end
, bool __intl
, ios_base
& __io
,
1549 ios_base::iostate
& __err
, long double& __units
) const
1550 { return this->do_get(__s
, __end
, __intl
, __io
, __err
, __units
); }
1553 get(iter_type __s
, iter_type __end
, bool __intl
, ios_base
& __io
,
1554 ios_base::iostate
& __err
, string_type
& __digits
) const
1555 { return this->do_get(__s
, __end
, __intl
, __io
, __err
, __digits
); }
1562 do_get(iter_type __s
, iter_type __end
, bool __intl
, ios_base
& __io
,
1563 ios_base::iostate
& __err
, long double& __units
) const;
1566 do_get(iter_type __s
, iter_type __end
, bool __intl
, ios_base
& __io
,
1567 ios_base::iostate
& __err
, string_type
& __digits
) const;
1570 template<typename _CharT
, typename _InIter
>
1571 locale::id money_get
<_CharT
, _InIter
>::id
;
1573 template<typename _CharT
, typename _OutIter
>
1574 class money_put
: public locale::facet
1577 typedef _CharT char_type
;
1578 typedef _OutIter iter_type
;
1579 typedef basic_string
<_CharT
> string_type
;
1581 static locale::id id
;
1584 money_put(size_t __refs
= 0) : locale::facet(__refs
) { }
1587 put(iter_type __s
, bool __intl
, ios_base
& __io
,
1588 char_type __fill
, long double __units
) const
1589 { return this->do_put(__s
, __intl
, __io
, __fill
, __units
); }
1592 put(iter_type __s
, bool __intl
, ios_base
& __io
,
1593 char_type __fill
, const string_type
& __digits
) const
1594 { return this->do_put(__s
, __intl
, __io
, __fill
, __digits
); }
1601 do_put(iter_type __s
, bool __intl
, ios_base
& __io
, char_type __fill
,
1602 long double __units
) const;
1605 do_put(iter_type __s
, bool __intl
, ios_base
& __io
, char_type __fill
,
1606 const string_type
& __digits
) const;
1609 template<typename _CharT
, typename _OutIter
>
1610 locale::id money_put
<_CharT
, _OutIter
>::id
;
1613 struct messages_base
1615 typedef int catalog
;
1618 template<typename _CharT
>
1619 class messages
: public locale::facet
, public messages_base
1623 typedef _CharT char_type
;
1624 typedef basic_string
<_CharT
> string_type
;
1627 // Underlying "C" library locale information saved from
1628 // initialization, needed by messages_byname as well.
1629 __c_locale _M_c_locale_messages
;
1631 // Only needed if glibc < 2.3
1632 const char* _M_name_messages
;
1636 static locale::id id
;
1639 messages(size_t __refs
= 0)
1640 : locale::facet(__refs
), _M_name_messages("C")
1641 { _M_c_locale_messages
= _S_c_locale
; }
1645 messages(__c_locale __cloc
, const char* __name
, size_t __refs
= 0)
1646 : locale::facet(__refs
)
1648 _M_name_messages
= __name
;
1649 _M_c_locale_messages
= _S_clone_c_locale(__cloc
);
1653 open(const basic_string
<char>& __s
, const locale
& __loc
) const
1654 { return this->do_open(__s
, __loc
); }
1656 // Non-standard and unorthodox, yet effective.
1658 open(const basic_string
<char>&, const locale
&, const char*) const;
1661 get(catalog __c
, int __set
, int __msgid
, const string_type
& __s
) const
1662 { return this->do_get(__c
, __set
, __msgid
, __s
); }
1665 close(catalog __c
) const
1666 { return this->do_close(__c
); }
1672 if (_M_c_locale_messages
!= _S_c_locale
)
1673 _S_destroy_c_locale(_M_c_locale_messages
);
1677 do_open(const basic_string
<char>&, const locale
&) const;
1680 do_get(catalog
, int, int, const string_type
& __dfault
) const;
1683 do_close(catalog
) const;
1685 // Returns a locale and codeset-converted string, given a char* message.
1687 _M_convert_to_char(const string_type
& __msg
) const
1690 return reinterpret_cast<char*>(const_cast<_CharT
*>(__msg
.c_str()));
1693 // Returns a locale and codeset-converted string, given a char* message.
1695 _M_convert_from_char(char* __msg
) const
1697 // Length of message string without terminating null.
1698 size_t __len
= char_traits
<char>::length(__msg
) - 1;
1700 // "everybody can easily convert the string using
1701 // mbsrtowcs/wcsrtombs or with iconv()"
1703 // Convert char* to _CharT in locale used to open catalog.
1704 // XXX need additional template parameter on messages class for this..
1705 // typedef typename codecvt<char, _CharT, _StateT> __codecvt_type;
1706 typedef typename codecvt
<char, _CharT
, mbstate_t> __codecvt_type
;
1708 __codecvt_type::state_type __state
;
1709 // XXX may need to initialize state.
1710 //initialize_state(__state._M_init());
1713 // XXX what size for this string?
1714 _CharT
* __to
= static_cast<_CharT
*>(__builtin_alloca(__len
+ 1));
1715 const __codecvt_type
& __cvt
= use_facet
<__codecvt_type
>(_M_locale_conv
);
1716 __cvt
.out(__state
, __msg
, __msg
+ __len
, __from_next
,
1717 __to
, __to
+ __len
+ 1, __to_next
);
1718 return string_type(__to
);
1721 typedef ctype
<_CharT
> __ctype_type
;
1722 // const __ctype_type& __cvt = use_facet<__ctype_type>(_M_locale_msg);
1723 const __ctype_type
& __cvt
= use_facet
<__ctype_type
>(locale());
1724 // XXX Again, proper length of converted string an issue here.
1725 // For now, assume the converted length is not larger.
1726 _CharT
* __dest
= static_cast<_CharT
*>(__builtin_alloca(__len
+ 1));
1727 __cvt
.widen(__msg
, __msg
+ __len
, __dest
);
1728 return basic_string
<_CharT
>(__dest
);
1730 return string_type();
1734 template<typename _CharT
>
1735 locale::id messages
<_CharT
>::id
;
1737 // Specializations for required instantiations.
1740 messages
<char>::do_get(catalog
, int, int, const string
&) const;
1742 // Include host and configuration specific messages virtual functions.
1743 #include <bits/messages_members.h>
1745 template<typename _CharT
>
1746 class messages_byname
: public messages
<_CharT
>
1749 typedef _CharT char_type
;
1750 typedef basic_string
<_CharT
> string_type
;
1753 messages_byname(const char* __s
, size_t __refs
= 0)
1754 : messages
<_CharT
>(__refs
)
1756 _M_name_messages
= __s
;
1757 if (_M_c_locale_messages
!= _S_c_locale
)
1758 _S_destroy_c_locale(_M_c_locale_messages
);
1759 _S_create_c_locale(_M_c_locale_messages
, __s
);
1769 // Subclause convenience interfaces, inlines.
1770 // NB: These are inline because, when used in a loop, some compilers
1771 // can hoist the body out of the loop; then it's just as fast as the
1772 // C is*() function.
1773 template<typename _CharT
>
1775 isspace(_CharT __c
, const locale
& __loc
)
1776 { return use_facet
<ctype
<_CharT
> >(__loc
).is(ctype_base::space
, __c
); }
1778 template<typename _CharT
>
1780 isprint(_CharT __c
, const locale
& __loc
)
1781 { return use_facet
<ctype
<_CharT
> >(__loc
).is(ctype_base::print
, __c
); }
1783 template<typename _CharT
>
1785 iscntrl(_CharT __c
, const locale
& __loc
)
1786 { return use_facet
<ctype
<_CharT
> >(__loc
).is(ctype_base::cntrl
, __c
); }
1788 template<typename _CharT
>
1790 isupper(_CharT __c
, const locale
& __loc
)
1791 { return use_facet
<ctype
<_CharT
> >(__loc
).is(ctype_base::upper
, __c
); }
1793 template<typename _CharT
>
1794 inline bool islower(_CharT __c
, const locale
& __loc
)
1795 { return use_facet
<ctype
<_CharT
> >(__loc
).is(ctype_base::lower
, __c
); }
1797 template<typename _CharT
>
1799 isalpha(_CharT __c
, const locale
& __loc
)
1800 { return use_facet
<ctype
<_CharT
> >(__loc
).is(ctype_base::alpha
, __c
); }
1802 template<typename _CharT
>
1804 isdigit(_CharT __c
, const locale
& __loc
)
1805 { return use_facet
<ctype
<_CharT
> >(__loc
).is(ctype_base::digit
, __c
); }
1807 template<typename _CharT
>
1809 ispunct(_CharT __c
, const locale
& __loc
)
1810 { return use_facet
<ctype
<_CharT
> >(__loc
).is(ctype_base::punct
, __c
); }
1812 template<typename _CharT
>
1814 isxdigit(_CharT __c
, const locale
& __loc
)
1815 { return use_facet
<ctype
<_CharT
> >(__loc
).is(ctype_base::xdigit
, __c
); }
1817 template<typename _CharT
>
1819 isalnum(_CharT __c
, const locale
& __loc
)
1820 { return use_facet
<ctype
<_CharT
> >(__loc
).is(ctype_base::alnum
, __c
); }
1822 template<typename _CharT
>
1824 isgraph(_CharT __c
, const locale
& __loc
)
1825 { return use_facet
<ctype
<_CharT
> >(__loc
).is(ctype_base::graph
, __c
); }
1827 template<typename _CharT
>
1829 toupper(_CharT __c
, const locale
& __loc
)
1830 { return use_facet
<ctype
<_CharT
> >(__loc
).toupper(__c
); }
1832 template<typename _CharT
>
1834 tolower(_CharT __c
, const locale
& __loc
)
1835 { return use_facet
<ctype
<_CharT
> >(__loc
).tolower(__c
); }