1 // Locale support -*- C++ -*-
2 
3 // Copyright (C) 1997-2021 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15 
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19 
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 // <http://www.gnu.org/licenses/>.
24 
25 /** @file bits/locale_facets.h
26  *  This is an internal header file, included by other library headers.
27  *  Do not attempt to use it directly. @headername{locale}
28  */
29 
30 //
31 // ISO C++ 14882: 22.1  Locales
32 //
33 
34 #ifndef _LOCALE_FACETS_H
35 #define _LOCALE_FACETS_H 1
36 
37 #pragma GCC system_header
38 
39 #include <cwctype>	// For wctype_t
40 #include <cctype>
41 #include <bits/ctype_base.h>
42 #include <iosfwd>
43 #include <bits/ios_base.h>  // For ios_base, ios_base::iostate
44 #include <streambuf>
45 #include <bits/cpp_type_traits.h>
46 #include <ext/type_traits.h>
47 #include <ext/numeric_traits.h>
48 #include <bits/streambuf_iterator.h>
49 
_GLIBCXX_VISIBILITY(default)50 namespace std _GLIBCXX_VISIBILITY(default)
51 {
52 _GLIBCXX_BEGIN_NAMESPACE_VERSION
53 
54 // Number of standard facets (for narrow characters only)
55 #define  _GLIBCXX_NUM_FACETS 14
56 
57 // Number of duplicated facets for cxx11 ABI
58 #define  _GLIBCXX_NUM_CXX11_FACETS (_GLIBCXX_USE_DUAL_ABI ? 8 : 0)
59 
60 // codecvt<char16_t> and codecvt<char32_t>
61 #ifdef _GLIBCXX_USE_CHAR8_T
62 # define _GLIBCXX_NUM_UNICODE_FACETS 4
63 #else
64 # define _GLIBCXX_NUM_UNICODE_FACETS 2
65 #endif
66 
67 // Facets duplicated for alt128 long double format
68 // num_get, num_put, money_get, money_put (+ cxx11 money_get, money_put)
69 #define _GLIBCXX_NUM_LBDL_ALT128_FACETS (4 + (_GLIBCXX_USE_DUAL_ABI ? 2 : 0))
70 
71   // Convert string to numeric value of type _Tp and store results.
72   // NB: This is specialized for all required types, there is no
73   // generic definition.
74   template<typename _Tp>
75     void
76     __convert_to_v(const char*, _Tp&, ios_base::iostate&,
77 		   const __c_locale&) throw();
78 
79   // Explicit specializations for required types.
80   template<>
81     void
82     __convert_to_v(const char*, float&, ios_base::iostate&,
83 		   const __c_locale&) throw();
84 
85   template<>
86     void
87     __convert_to_v(const char*, double&, ios_base::iostate&,
88 		   const __c_locale&) throw();
89 
90   template<>
91     void
92     __convert_to_v(const char*, long double&, ios_base::iostate&,
93 		   const __c_locale&) throw();
94 
95   // NB: __pad is a struct, rather than a function, so it can be
96   // partially-specialized.
97   template<typename _CharT, typename _Traits>
98     struct __pad
99     {
100       static void
101       _S_pad(ios_base& __io, _CharT __fill, _CharT* __news,
102 	     const _CharT* __olds, streamsize __newlen, streamsize __oldlen);
103     };
104 
105   // Used by both numeric and monetary facets.
106   // Inserts "group separator" characters into an array of characters.
107   // It's recursive, one iteration per group.  It moves the characters
108   // in the buffer this way: "xxxx12345" -> "12,345xxx".  Call this
109   // only with __gsize != 0.
110   template<typename _CharT>
111     _CharT*
112     __add_grouping(_CharT* __s, _CharT __sep,
113 		   const char* __gbeg, size_t __gsize,
114 		   const _CharT* __first, const _CharT* __last);
115 
116   // This template permits specializing facet output code for
117   // ostreambuf_iterator.  For ostreambuf_iterator, sputn is
118   // significantly more efficient than incrementing iterators.
119   template<typename _CharT>
120     inline
121     ostreambuf_iterator<_CharT>
122     __write(ostreambuf_iterator<_CharT> __s, const _CharT* __ws, int __len)
123     {
124       __s._M_put(__ws, __len);
125       return __s;
126     }
127 
128   // This is the unspecialized form of the template.
129   template<typename _CharT, typename _OutIter>
130     inline
131     _OutIter
132     __write(_OutIter __s, const _CharT* __ws, int __len)
133     {
134       for (int __j = 0; __j < __len; __j++, ++__s)
135 	*__s = __ws[__j];
136       return __s;
137     }
138 
139 
140   // 22.2.1.1  Template class ctype
141   // Include host and configuration specific ctype enums for ctype_base.
142 
143   /**
144    *  @brief  Common base for ctype facet
145    *
146    *  This template class provides implementations of the public functions
147    *  that forward to the protected virtual functions.
148    *
149    *  This template also provides abstract stubs for the protected virtual
150    *  functions.
151   */
152   template<typename _CharT>
153     class __ctype_abstract_base : public locale::facet, public ctype_base
154     {
155     public:
156       // Types:
157       /// Typedef for the template parameter
158       typedef _CharT char_type;
159 
160       /**
161        *  @brief  Test char_type classification.
162        *
163        *  This function finds a mask M for @a __c and compares it to
164        *  mask @a __m.  It does so by returning the value of
165        *  ctype<char_type>::do_is().
166        *
167        *  @param __c  The char_type to compare the mask of.
168        *  @param __m  The mask to compare against.
169        *  @return  (M & __m) != 0.
170       */
171       bool
172       is(mask __m, char_type __c) const
173       { return this->do_is(__m, __c); }
174 
175       /**
176        *  @brief  Return a mask array.
177        *
178        *  This function finds the mask for each char_type in the range [lo,hi)
179        *  and successively writes it to vec.  vec must have as many elements
180        *  as the char array.  It does so by returning the value of
181        *  ctype<char_type>::do_is().
182        *
183        *  @param __lo  Pointer to start of range.
184        *  @param __hi  Pointer to end of range.
185        *  @param __vec  Pointer to an array of mask storage.
186        *  @return  @a __hi.
187       */
188       const char_type*
189       is(const char_type *__lo, const char_type *__hi, mask *__vec) const
190       { return this->do_is(__lo, __hi, __vec); }
191 
192       /**
193        *  @brief  Find char_type matching a mask
194        *
195        *  This function searches for and returns the first char_type c in
196        *  [lo,hi) for which is(m,c) is true.  It does so by returning
197        *  ctype<char_type>::do_scan_is().
198        *
199        *  @param __m  The mask to compare against.
200        *  @param __lo  Pointer to start of range.
201        *  @param __hi  Pointer to end of range.
202        *  @return  Pointer to matching char_type if found, else @a __hi.
203       */
204       const char_type*
205       scan_is(mask __m, const char_type* __lo, const char_type* __hi) const
206       { return this->do_scan_is(__m, __lo, __hi); }
207 
208       /**
209        *  @brief  Find char_type not matching a mask
210        *
211        *  This function searches for and returns the first char_type c in
212        *  [lo,hi) for which is(m,c) is false.  It does so by returning
213        *  ctype<char_type>::do_scan_not().
214        *
215        *  @param __m  The mask to compare against.
216        *  @param __lo  Pointer to first char in range.
217        *  @param __hi  Pointer to end of range.
218        *  @return  Pointer to non-matching char if found, else @a __hi.
219       */
220       const char_type*
221       scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
222       { return this->do_scan_not(__m, __lo, __hi); }
223 
224       /**
225        *  @brief  Convert to uppercase.
226        *
227        *  This function converts the argument to uppercase if possible.
228        *  If not possible (for example, '2'), returns the argument.  It does
229        *  so by returning ctype<char_type>::do_toupper().
230        *
231        *  @param __c  The char_type to convert.
232        *  @return  The uppercase char_type if convertible, else @a __c.
233       */
234       char_type
235       toupper(char_type __c) const
236       { return this->do_toupper(__c); }
237 
238       /**
239        *  @brief  Convert array to uppercase.
240        *
241        *  This function converts each char_type in the range [lo,hi) to
242        *  uppercase if possible.  Other elements remain untouched.  It does so
243        *  by returning ctype<char_type>:: do_toupper(lo, hi).
244        *
245        *  @param __lo  Pointer to start of range.
246        *  @param __hi  Pointer to end of range.
247        *  @return  @a __hi.
248       */
249       const char_type*
250       toupper(char_type *__lo, const char_type* __hi) const
251       { return this->do_toupper(__lo, __hi); }
252 
253       /**
254        *  @brief  Convert to lowercase.
255        *
256        *  This function converts the argument to lowercase if possible.  If
257        *  not possible (for example, '2'), returns the argument.  It does so
258        *  by returning ctype<char_type>::do_tolower(c).
259        *
260        *  @param __c  The char_type to convert.
261        *  @return  The lowercase char_type if convertible, else @a __c.
262       */
263       char_type
264       tolower(char_type __c) const
265       { return this->do_tolower(__c); }
266 
267       /**
268        *  @brief  Convert array to lowercase.
269        *
270        *  This function converts each char_type in the range [__lo,__hi) to
271        *  lowercase if possible.  Other elements remain untouched.  It does so
272        *  by returning ctype<char_type>:: do_tolower(__lo, __hi).
273        *
274        *  @param __lo  Pointer to start of range.
275        *  @param __hi  Pointer to end of range.
276        *  @return  @a __hi.
277       */
278       const char_type*
279       tolower(char_type* __lo, const char_type* __hi) const
280       { return this->do_tolower(__lo, __hi); }
281 
282       /**
283        *  @brief  Widen char to char_type
284        *
285        *  This function converts the char argument to char_type using the
286        *  simplest reasonable transformation.  It does so by returning
287        *  ctype<char_type>::do_widen(c).
288        *
289        *  Note: this is not what you want for codepage conversions.  See
290        *  codecvt for that.
291        *
292        *  @param __c  The char to convert.
293        *  @return  The converted char_type.
294       */
295       char_type
296       widen(char __c) const
297       { return this->do_widen(__c); }
298 
299       /**
300        *  @brief  Widen array to char_type
301        *
302        *  This function converts each char in the input to char_type using the
303        *  simplest reasonable transformation.  It does so by returning
304        *  ctype<char_type>::do_widen(c).
305        *
306        *  Note: this is not what you want for codepage conversions.  See
307        *  codecvt for that.
308        *
309        *  @param __lo  Pointer to start of range.
310        *  @param __hi  Pointer to end of range.
311        *  @param __to  Pointer to the destination array.
312        *  @return  @a __hi.
313       */
314       const char*
315       widen(const char* __lo, const char* __hi, char_type* __to) const
316       { return this->do_widen(__lo, __hi, __to); }
317 
318       /**
319        *  @brief  Narrow char_type to char
320        *
321        *  This function converts the char_type to char using the simplest
322        *  reasonable transformation.  If the conversion fails, dfault is
323        *  returned instead.  It does so by returning
324        *  ctype<char_type>::do_narrow(__c).
325        *
326        *  Note: this is not what you want for codepage conversions.  See
327        *  codecvt for that.
328        *
329        *  @param __c  The char_type to convert.
330        *  @param __dfault  Char to return if conversion fails.
331        *  @return  The converted char.
332       */
333       char
334       narrow(char_type __c, char __dfault) const
335       { return this->do_narrow(__c, __dfault); }
336 
337       /**
338        *  @brief  Narrow array to char array
339        *
340        *  This function converts each char_type in the input to char using the
341        *  simplest reasonable transformation and writes the results to the
342        *  destination array.  For any char_type in the input that cannot be
343        *  converted, @a dfault is used instead.  It does so by returning
344        *  ctype<char_type>::do_narrow(__lo, __hi, __dfault, __to).
345        *
346        *  Note: this is not what you want for codepage conversions.  See
347        *  codecvt for that.
348        *
349        *  @param __lo  Pointer to start of range.
350        *  @param __hi  Pointer to end of range.
351        *  @param __dfault  Char to use if conversion fails.
352        *  @param __to  Pointer to the destination array.
353        *  @return  @a __hi.
354       */
355       const char_type*
356       narrow(const char_type* __lo, const char_type* __hi,
357 	      char __dfault, char* __to) const
358       { return this->do_narrow(__lo, __hi, __dfault, __to); }
359 
360     protected:
361       explicit
362       __ctype_abstract_base(size_t __refs = 0): facet(__refs) { }
363 
364       virtual
365       ~__ctype_abstract_base() { }
366 
367       /**
368        *  @brief  Test char_type classification.
369        *
370        *  This function finds a mask M for @a c and compares it to mask @a m.
371        *
372        *  do_is() is a hook for a derived facet to change the behavior of
373        *  classifying.  do_is() must always return the same result for the
374        *  same input.
375        *
376        *  @param __c  The char_type to find the mask of.
377        *  @param __m  The mask to compare against.
378        *  @return  (M & __m) != 0.
379       */
380       virtual bool
381       do_is(mask __m, char_type __c) const = 0;
382 
383       /**
384        *  @brief  Return a mask array.
385        *
386        *  This function finds the mask for each char_type in the range [lo,hi)
387        *  and successively writes it to vec.  vec must have as many elements
388        *  as the input.
389        *
390        *  do_is() is a hook for a derived facet to change the behavior of
391        *  classifying.  do_is() must always return the same result for the
392        *  same input.
393        *
394        *  @param __lo  Pointer to start of range.
395        *  @param __hi  Pointer to end of range.
396        *  @param __vec  Pointer to an array of mask storage.
397        *  @return  @a __hi.
398       */
399       virtual const char_type*
400       do_is(const char_type* __lo, const char_type* __hi,
401 	    mask* __vec) const = 0;
402 
403       /**
404        *  @brief  Find char_type matching mask
405        *
406        *  This function searches for and returns the first char_type c in
407        *  [__lo,__hi) for which is(__m,c) is true.
408        *
409        *  do_scan_is() is a hook for a derived facet to change the behavior of
410        *  match searching.  do_is() must always return the same result for the
411        *  same input.
412        *
413        *  @param __m  The mask to compare against.
414        *  @param __lo  Pointer to start of range.
415        *  @param __hi  Pointer to end of range.
416        *  @return  Pointer to a matching char_type if found, else @a __hi.
417       */
418       virtual const char_type*
419       do_scan_is(mask __m, const char_type* __lo,
420 		 const char_type* __hi) const = 0;
421 
422       /**
423        *  @brief  Find char_type not matching mask
424        *
425        *  This function searches for and returns a pointer to the first
426        *  char_type c of [lo,hi) for which is(m,c) is false.
427        *
428        *  do_scan_is() is a hook for a derived facet to change the behavior of
429        *  match searching.  do_is() must always return the same result for the
430        *  same input.
431        *
432        *  @param __m  The mask to compare against.
433        *  @param __lo  Pointer to start of range.
434        *  @param __hi  Pointer to end of range.
435        *  @return  Pointer to a non-matching char_type if found, else @a __hi.
436       */
437       virtual const char_type*
438       do_scan_not(mask __m, const char_type* __lo,
439 		  const char_type* __hi) const = 0;
440 
441       /**
442        *  @brief  Convert to uppercase.
443        *
444        *  This virtual function converts the char_type argument to uppercase
445        *  if possible.  If not possible (for example, '2'), returns the
446        *  argument.
447        *
448        *  do_toupper() is a hook for a derived facet to change the behavior of
449        *  uppercasing.  do_toupper() must always return the same result for
450        *  the same input.
451        *
452        *  @param __c  The char_type to convert.
453        *  @return  The uppercase char_type if convertible, else @a __c.
454       */
455       virtual char_type
456       do_toupper(char_type __c) const = 0;
457 
458       /**
459        *  @brief  Convert array to uppercase.
460        *
461        *  This virtual function converts each char_type in the range [__lo,__hi)
462        *  to uppercase if possible.  Other elements remain untouched.
463        *
464        *  do_toupper() is a hook for a derived facet to change the behavior of
465        *  uppercasing.  do_toupper() must always return the same result for
466        *  the same input.
467        *
468        *  @param __lo  Pointer to start of range.
469        *  @param __hi  Pointer to end of range.
470        *  @return  @a __hi.
471       */
472       virtual const char_type*
473       do_toupper(char_type* __lo, const char_type* __hi) const = 0;
474 
475       /**
476        *  @brief  Convert to lowercase.
477        *
478        *  This virtual function converts the argument to lowercase if
479        *  possible.  If not possible (for example, '2'), returns the argument.
480        *
481        *  do_tolower() is a hook for a derived facet to change the behavior of
482        *  lowercasing.  do_tolower() must always return the same result for
483        *  the same input.
484        *
485        *  @param __c  The char_type to convert.
486        *  @return  The lowercase char_type if convertible, else @a __c.
487       */
488       virtual char_type
489       do_tolower(char_type __c) const = 0;
490 
491       /**
492        *  @brief  Convert array to lowercase.
493        *
494        *  This virtual function converts each char_type in the range [__lo,__hi)
495        *  to lowercase if possible.  Other elements remain untouched.
496        *
497        *  do_tolower() is a hook for a derived facet to change the behavior of
498        *  lowercasing.  do_tolower() must always return the same result for
499        *  the same input.
500        *
501        *  @param __lo  Pointer to start of range.
502        *  @param __hi  Pointer to end of range.
503        *  @return  @a __hi.
504       */
505       virtual const char_type*
506       do_tolower(char_type* __lo, const char_type* __hi) const = 0;
507 
508       /**
509        *  @brief  Widen char
510        *
511        *  This virtual function converts the char to char_type using the
512        *  simplest reasonable transformation.
513        *
514        *  do_widen() is a hook for a derived facet to change the behavior of
515        *  widening.  do_widen() must always return the same result for the
516        *  same input.
517        *
518        *  Note: this is not what you want for codepage conversions.  See
519        *  codecvt for that.
520        *
521        *  @param __c  The char to convert.
522        *  @return  The converted char_type
523       */
524       virtual char_type
525       do_widen(char __c) const = 0;
526 
527       /**
528        *  @brief  Widen char array
529        *
530        *  This function converts each char in the input to char_type using the
531        *  simplest reasonable transformation.
532        *
533        *  do_widen() is a hook for a derived facet to change the behavior of
534        *  widening.  do_widen() must always return the same result for the
535        *  same input.
536        *
537        *  Note: this is not what you want for codepage conversions.  See
538        *  codecvt for that.
539        *
540        *  @param __lo  Pointer to start range.
541        *  @param __hi  Pointer to end of range.
542        *  @param __to  Pointer to the destination array.
543        *  @return  @a __hi.
544       */
545       virtual const char*
546       do_widen(const char* __lo, const char* __hi, char_type* __to) const = 0;
547 
548       /**
549        *  @brief  Narrow char_type to char
550        *
551        *  This virtual function converts the argument to char using the
552        *  simplest reasonable transformation.  If the conversion fails, dfault
553        *  is returned instead.
554        *
555        *  do_narrow() is a hook for a derived facet to change the behavior of
556        *  narrowing.  do_narrow() must always return the same result for the
557        *  same input.
558        *
559        *  Note: this is not what you want for codepage conversions.  See
560        *  codecvt for that.
561        *
562        *  @param __c  The char_type to convert.
563        *  @param __dfault  Char to return if conversion fails.
564        *  @return  The converted char.
565       */
566       virtual char
567       do_narrow(char_type __c, char __dfault) const = 0;
568 
569       /**
570        *  @brief  Narrow char_type array to char
571        *
572        *  This virtual function converts each char_type in the range
573        *  [__lo,__hi) to char using the simplest reasonable
574        *  transformation and writes the results to the destination
575        *  array.  For any element in the input that cannot be
576        *  converted, @a __dfault is used instead.
577        *
578        *  do_narrow() is a hook for a derived facet to change the behavior of
579        *  narrowing.  do_narrow() must always return the same result for the
580        *  same input.
581        *
582        *  Note: this is not what you want for codepage conversions.  See
583        *  codecvt for that.
584        *
585        *  @param __lo  Pointer to start of range.
586        *  @param __hi  Pointer to end of range.
587        *  @param __dfault  Char to use if conversion fails.
588        *  @param __to  Pointer to the destination array.
589        *  @return  @a __hi.
590       */
591       virtual const char_type*
592       do_narrow(const char_type* __lo, const char_type* __hi,
593 		char __dfault, char* __to) const = 0;
594     };
595 
596   /**
597    *  @brief  Primary class template ctype facet.
598    *  @ingroup locales
599    *
600    *  This template class defines classification and conversion functions for
601    *  character sets.  It wraps cctype functionality.  Ctype gets used by
602    *  streams for many I/O operations.
603    *
604    *  This template provides the protected virtual functions the developer
605    *  will have to replace in a derived class or specialization to make a
606    *  working facet.  The public functions that access them are defined in
607    *  __ctype_abstract_base, to allow for implementation flexibility.  See
608    *  ctype<wchar_t> for an example.  The functions are documented in
609    *  __ctype_abstract_base.
610    *
611    *  Note: implementations are provided for all the protected virtual
612    *  functions, but will likely not be useful.
613   */
614   template<typename _CharT>
615     class ctype : public __ctype_abstract_base<_CharT>
616     {
617     public:
618       // Types:
619       typedef _CharT			char_type;
620       typedef typename __ctype_abstract_base<_CharT>::mask mask;
621 
622       /// The facet id for ctype<char_type>
623       static locale::id			id;
624 
625       explicit
626       ctype(size_t __refs = 0) : __ctype_abstract_base<_CharT>(__refs) { }
627 
628    protected:
629       virtual
630       ~ctype();
631 
632       virtual bool
633       do_is(mask __m, char_type __c) const;
634 
635       virtual const char_type*
636       do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
637 
638       virtual const char_type*
639       do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
640 
641       virtual const char_type*
642       do_scan_not(mask __m, const char_type* __lo,
643 		  const char_type* __hi) const;
644 
645       virtual char_type
646       do_toupper(char_type __c) const;
647 
648       virtual const char_type*
649       do_toupper(char_type* __lo, const char_type* __hi) const;
650 
651       virtual char_type
652       do_tolower(char_type __c) const;
653 
654       virtual const char_type*
655       do_tolower(char_type* __lo, const char_type* __hi) const;
656 
657       virtual char_type
658       do_widen(char __c) const;
659 
660       virtual const char*
661       do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
662 
663       virtual char
664       do_narrow(char_type, char __dfault) const;
665 
666       virtual const char_type*
667       do_narrow(const char_type* __lo, const char_type* __hi,
668 		char __dfault, char* __to) const;
669     };
670 
671   template<typename _CharT>
672     locale::id ctype<_CharT>::id;
673 
674   // Incomplete to provide a compile time diagnostics for common misuse
675   // of [locale.convenience] functions with basic_string as a character type.
676   template<typename _CharT, typename _Traits, typename _Alloc>
677     class ctype<basic_string<_CharT, _Traits, _Alloc> >;
678 
679   /**
680    *  @brief  The ctype<char> specialization.
681    *  @ingroup locales
682    *
683    *  This class defines classification and conversion functions for
684    *  the char type.  It gets used by char streams for many I/O
685    *  operations.  The char specialization provides a number of
686    *  optimizations as well.
687   */
688   template<>
689     class ctype<char> : public locale::facet, public ctype_base
690     {
691     public:
692       // Types:
693       /// Typedef for the template parameter char.
694       typedef char		char_type;
695 
696     protected:
697       // Data Members:
698       __c_locale		_M_c_locale_ctype;
699       bool			_M_del;
700       __to_type			_M_toupper;
701       __to_type			_M_tolower;
702       const mask*		_M_table;
703       mutable char		_M_widen_ok;
704       mutable char		_M_widen[1 + static_cast<unsigned char>(-1)];
705       mutable char		_M_narrow[1 + static_cast<unsigned char>(-1)];
706       mutable char		_M_narrow_ok;	// 0 uninitialized, 1 init,
707 						// 2 memcpy can't be used
708 
709     public:
710       /// The facet id for ctype<char>
711       static locale::id        id;
712       /// The size of the mask table.  It is SCHAR_MAX + 1.
713       static const size_t      table_size = 1 + static_cast<unsigned char>(-1);
714 
715       /**
716        *  @brief  Constructor performs initialization.
717        *
718        *  This is the constructor provided by the standard.
719        *
720        *  @param __table If non-zero, table is used as the per-char mask.
721        *               Else classic_table() is used.
722        *  @param __del   If true, passes ownership of table to this facet.
723        *  @param __refs  Passed to the base facet class.
724       */
725       explicit
726       ctype(const mask* __table = 0, bool __del = false, size_t __refs = 0);
727 
728       /**
729        *  @brief  Constructor performs static initialization.
730        *
731        *  This constructor is used to construct the initial C locale facet.
732        *
733        *  @param __cloc  Handle to C locale data.
734        *  @param __table If non-zero, table is used as the per-char mask.
735        *  @param __del   If true, passes ownership of table to this facet.
736        *  @param __refs  Passed to the base facet class.
737       */
738       explicit
739       ctype(__c_locale __cloc, const mask* __table = 0, bool __del = false,
740 	    size_t __refs = 0);
741 
742       /**
743        *  @brief  Test char classification.
744        *
745        *  This function compares the mask table[c] to @a __m.
746        *
747        *  @param __c  The char to compare the mask of.
748        *  @param __m  The mask to compare against.
749        *  @return  True if __m & table[__c] is true, false otherwise.
750       */
751       inline bool
752       is(mask __m, char __c) const;
753 
754       /**
755        *  @brief  Return a mask array.
756        *
757        *  This function finds the mask for each char in the range [lo, hi) and
758        *  successively writes it to vec.  vec must have as many elements as
759        *  the char array.
760        *
761        *  @param __lo  Pointer to start of range.
762        *  @param __hi  Pointer to end of range.
763        *  @param __vec  Pointer to an array of mask storage.
764        *  @return  @a __hi.
765       */
766       inline const char*
767       is(const char* __lo, const char* __hi, mask* __vec) const;
768 
769       /**
770        *  @brief  Find char matching a mask
771        *
772        *  This function searches for and returns the first char in [lo,hi) for
773        *  which is(m,char) is true.
774        *
775        *  @param __m  The mask to compare against.
776        *  @param __lo  Pointer to start of range.
777        *  @param __hi  Pointer to end of range.
778        *  @return  Pointer to a matching char if found, else @a __hi.
779       */
780       inline const char*
781       scan_is(mask __m, const char* __lo, const char* __hi) const;
782 
783       /**
784        *  @brief  Find char not matching a mask
785        *
786        *  This function searches for and returns a pointer to the first char
787        *  in [__lo,__hi) for which is(m,char) is false.
788        *
789        *  @param __m  The mask to compare against.
790        *  @param __lo  Pointer to start of range.
791        *  @param __hi  Pointer to end of range.
792        *  @return  Pointer to a non-matching char if found, else @a __hi.
793       */
794       inline const char*
795       scan_not(mask __m, const char* __lo, const char* __hi) const;
796 
797       /**
798        *  @brief  Convert to uppercase.
799        *
800        *  This function converts the char argument to uppercase if possible.
801        *  If not possible (for example, '2'), returns the argument.
802        *
803        *  toupper() acts as if it returns ctype<char>::do_toupper(c).
804        *  do_toupper() must always return the same result for the same input.
805        *
806        *  @param __c  The char to convert.
807        *  @return  The uppercase char if convertible, else @a __c.
808       */
809       char_type
810       toupper(char_type __c) const
811       { return this->do_toupper(__c); }
812 
813       /**
814        *  @brief  Convert array to uppercase.
815        *
816        *  This function converts each char in the range [__lo,__hi) to uppercase
817        *  if possible.  Other chars remain untouched.
818        *
819        *  toupper() acts as if it returns ctype<char>:: do_toupper(__lo, __hi).
820        *  do_toupper() must always return the same result for the same input.
821        *
822        *  @param __lo  Pointer to first char in range.
823        *  @param __hi  Pointer to end of range.
824        *  @return  @a __hi.
825       */
826       const char_type*
827       toupper(char_type *__lo, const char_type* __hi) const
828       { return this->do_toupper(__lo, __hi); }
829 
830       /**
831        *  @brief  Convert to lowercase.
832        *
833        *  This function converts the char argument to lowercase if possible.
834        *  If not possible (for example, '2'), returns the argument.
835        *
836        *  tolower() acts as if it returns ctype<char>::do_tolower(__c).
837        *  do_tolower() must always return the same result for the same input.
838        *
839        *  @param __c  The char to convert.
840        *  @return  The lowercase char if convertible, else @a __c.
841       */
842       char_type
843       tolower(char_type __c) const
844       { return this->do_tolower(__c); }
845 
846       /**
847        *  @brief  Convert array to lowercase.
848        *
849        *  This function converts each char in the range [lo,hi) to lowercase
850        *  if possible.  Other chars remain untouched.
851        *
852        *  tolower() acts as if it returns ctype<char>:: do_tolower(__lo, __hi).
853        *  do_tolower() must always return the same result for the same input.
854        *
855        *  @param __lo  Pointer to first char in range.
856        *  @param __hi  Pointer to end of range.
857        *  @return  @a __hi.
858       */
859       const char_type*
860       tolower(char_type* __lo, const char_type* __hi) const
861       { return this->do_tolower(__lo, __hi); }
862 
863       /**
864        *  @brief  Widen char
865        *
866        *  This function converts the char to char_type using the simplest
867        *  reasonable transformation.  For an underived ctype<char> facet, the
868        *  argument will be returned unchanged.
869        *
870        *  This function works as if it returns ctype<char>::do_widen(c).
871        *  do_widen() must always return the same result for the same input.
872        *
873        *  Note: this is not what you want for codepage conversions.  See
874        *  codecvt for that.
875        *
876        *  @param __c  The char to convert.
877        *  @return  The converted character.
878       */
879       char_type
880       widen(char __c) const
881       {
882 	if (_M_widen_ok)
883 	  return _M_widen[static_cast<unsigned char>(__c)];
884 	this->_M_widen_init();
885 	return this->do_widen(__c);
886       }
887 
888       /**
889        *  @brief  Widen char array
890        *
891        *  This function converts each char in the input to char using the
892        *  simplest reasonable transformation.  For an underived ctype<char>
893        *  facet, the argument will be copied unchanged.
894        *
895        *  This function works as if it returns ctype<char>::do_widen(c).
896        *  do_widen() must always return the same result for the same input.
897        *
898        *  Note: this is not what you want for codepage conversions.  See
899        *  codecvt for that.
900        *
901        *  @param __lo  Pointer to first char in range.
902        *  @param __hi  Pointer to end of range.
903        *  @param __to  Pointer to the destination array.
904        *  @return  @a __hi.
905       */
906       const char*
907       widen(const char* __lo, const char* __hi, char_type* __to) const
908       {
909 	if (_M_widen_ok == 1)
910 	  {
911 	    if (__builtin_expect(__hi != __lo, true))
912 	      __builtin_memcpy(__to, __lo, __hi - __lo);
913 	    return __hi;
914 	  }
915 	if (!_M_widen_ok)
916 	  _M_widen_init();
917 	return this->do_widen(__lo, __hi, __to);
918       }
919 
920       /**
921        *  @brief  Narrow char
922        *
923        *  This function converts the char to char using the simplest
924        *  reasonable transformation.  If the conversion fails, dfault is
925        *  returned instead.  For an underived ctype<char> facet, @a c
926        *  will be returned unchanged.
927        *
928        *  This function works as if it returns ctype<char>::do_narrow(c).
929        *  do_narrow() must always return the same result for the same input.
930        *
931        *  Note: this is not what you want for codepage conversions.  See
932        *  codecvt for that.
933        *
934        *  @param __c  The char to convert.
935        *  @param __dfault  Char to return if conversion fails.
936        *  @return  The converted character.
937       */
938       char
939       narrow(char_type __c, char __dfault) const
940       {
941 	if (_M_narrow[static_cast<unsigned char>(__c)])
942 	  return _M_narrow[static_cast<unsigned char>(__c)];
943 	const char __t = do_narrow(__c, __dfault);
944 	if (__t != __dfault)
945 	  _M_narrow[static_cast<unsigned char>(__c)] = __t;
946 	return __t;
947       }
948 
949       /**
950        *  @brief  Narrow char array
951        *
952        *  This function converts each char in the input to char using the
953        *  simplest reasonable transformation and writes the results to the
954        *  destination array.  For any char in the input that cannot be
955        *  converted, @a dfault is used instead.  For an underived ctype<char>
956        *  facet, the argument will be copied unchanged.
957        *
958        *  This function works as if it returns ctype<char>::do_narrow(lo, hi,
959        *  dfault, to).  do_narrow() must always return the same result for the
960        *  same input.
961        *
962        *  Note: this is not what you want for codepage conversions.  See
963        *  codecvt for that.
964        *
965        *  @param __lo  Pointer to start of range.
966        *  @param __hi  Pointer to end of range.
967        *  @param __dfault  Char to use if conversion fails.
968        *  @param __to  Pointer to the destination array.
969        *  @return  @a __hi.
970       */
971       const char_type*
972       narrow(const char_type* __lo, const char_type* __hi,
973 	     char __dfault, char* __to) const
974       {
975 	if (__builtin_expect(_M_narrow_ok == 1, true))
976 	  {
977 	    if (__builtin_expect(__hi != __lo, true))
978 	      __builtin_memcpy(__to, __lo, __hi - __lo);
979 	    return __hi;
980 	  }
981 	if (!_M_narrow_ok)
982 	  _M_narrow_init();
983 	return this->do_narrow(__lo, __hi, __dfault, __to);
984       }
985 
986       // _GLIBCXX_RESOLVE_LIB_DEFECTS
987       // DR 695. ctype<char>::classic_table() not accessible.
988       /// Returns a pointer to the mask table provided to the constructor, or
989       /// the default from classic_table() if none was provided.
990       const mask*
991       table() const throw()
992       { return _M_table; }
993 
994       /// Returns a pointer to the C locale mask table.
995       static const mask*
996       classic_table() throw();
997     protected:
998 
999       /**
1000        *  @brief  Destructor.
1001        *
1002        *  This function deletes table() if @a del was true in the
1003        *  constructor.
1004       */
1005       virtual
1006       ~ctype();
1007 
1008       /**
1009        *  @brief  Convert to uppercase.
1010        *
1011        *  This virtual function converts the char argument to uppercase if
1012        *  possible.  If not possible (for example, '2'), returns the argument.
1013        *
1014        *  do_toupper() is a hook for a derived facet to change the behavior of
1015        *  uppercasing.  do_toupper() must always return the same result for
1016        *  the same input.
1017        *
1018        *  @param __c  The char to convert.
1019        *  @return  The uppercase char if convertible, else @a __c.
1020       */
1021       virtual char_type
1022       do_toupper(char_type __c) const;
1023 
1024       /**
1025        *  @brief  Convert array to uppercase.
1026        *
1027        *  This virtual function converts each char in the range [lo,hi) to
1028        *  uppercase if possible.  Other chars remain untouched.
1029        *
1030        *  do_toupper() is a hook for a derived facet to change the behavior of
1031        *  uppercasing.  do_toupper() must always return the same result for
1032        *  the same input.
1033        *
1034        *  @param __lo  Pointer to start of range.
1035        *  @param __hi  Pointer to end of range.
1036        *  @return  @a __hi.
1037       */
1038       virtual const char_type*
1039       do_toupper(char_type* __lo, const char_type* __hi) const;
1040 
1041       /**
1042        *  @brief  Convert to lowercase.
1043        *
1044        *  This virtual function converts the char argument to lowercase if
1045        *  possible.  If not possible (for example, '2'), returns the argument.
1046        *
1047        *  do_tolower() is a hook for a derived facet to change the behavior of
1048        *  lowercasing.  do_tolower() must always return the same result for
1049        *  the same input.
1050        *
1051        *  @param __c  The char to convert.
1052        *  @return  The lowercase char if convertible, else @a __c.
1053       */
1054       virtual char_type
1055       do_tolower(char_type __c) const;
1056 
1057       /**
1058        *  @brief  Convert array to lowercase.
1059        *
1060        *  This virtual function converts each char in the range [lo,hi) to
1061        *  lowercase if possible.  Other chars remain untouched.
1062        *
1063        *  do_tolower() is a hook for a derived facet to change the behavior of
1064        *  lowercasing.  do_tolower() must always return the same result for
1065        *  the same input.
1066        *
1067        *  @param __lo  Pointer to first char in range.
1068        *  @param __hi  Pointer to end of range.
1069        *  @return  @a __hi.
1070       */
1071       virtual const char_type*
1072       do_tolower(char_type* __lo, const char_type* __hi) const;
1073 
1074       /**
1075        *  @brief  Widen char
1076        *
1077        *  This virtual function converts the char to char using the simplest
1078        *  reasonable transformation.  For an underived ctype<char> facet, the
1079        *  argument will be returned unchanged.
1080        *
1081        *  do_widen() is a hook for a derived facet to change the behavior of
1082        *  widening.  do_widen() must always return the same result for the
1083        *  same input.
1084        *
1085        *  Note: this is not what you want for codepage conversions.  See
1086        *  codecvt for that.
1087        *
1088        *  @param __c  The char to convert.
1089        *  @return  The converted character.
1090       */
1091       virtual char_type
1092       do_widen(char __c) const
1093       { return __c; }
1094 
1095       /**
1096        *  @brief  Widen char array
1097        *
1098        *  This function converts each char in the range [lo,hi) to char using
1099        *  the simplest reasonable transformation.  For an underived
1100        *  ctype<char> facet, the argument will be copied unchanged.
1101        *
1102        *  do_widen() is a hook for a derived facet to change the behavior of
1103        *  widening.  do_widen() must always return the same result for the
1104        *  same input.
1105        *
1106        *  Note: this is not what you want for codepage conversions.  See
1107        *  codecvt for that.
1108        *
1109        *  @param __lo  Pointer to start of range.
1110        *  @param __hi  Pointer to end of range.
1111        *  @param __to  Pointer to the destination array.
1112        *  @return  @a __hi.
1113       */
1114       virtual const char*
1115       do_widen(const char* __lo, const char* __hi, char_type* __to) const
1116       {
1117 	if (__builtin_expect(__hi != __lo, true))
1118 	  __builtin_memcpy(__to, __lo, __hi - __lo);
1119 	return __hi;
1120       }
1121 
1122       /**
1123        *  @brief  Narrow char
1124        *
1125        *  This virtual function converts the char to char using the simplest
1126        *  reasonable transformation.  If the conversion fails, dfault is
1127        *  returned instead.  For an underived ctype<char> facet, @a c will be
1128        *  returned unchanged.
1129        *
1130        *  do_narrow() is a hook for a derived facet to change the behavior of
1131        *  narrowing.  do_narrow() must always return the same result for the
1132        *  same input.
1133        *
1134        *  Note: this is not what you want for codepage conversions.  See
1135        *  codecvt for that.
1136        *
1137        *  @param __c  The char to convert.
1138        *  @param __dfault  Char to return if conversion fails.
1139        *  @return  The converted char.
1140       */
1141       virtual char
1142       do_narrow(char_type __c, char __dfault __attribute__((__unused__))) const
1143       { return __c; }
1144 
1145       /**
1146        *  @brief  Narrow char array to char array
1147        *
1148        *  This virtual function converts each char in the range [lo,hi) to
1149        *  char using the simplest reasonable transformation and writes the
1150        *  results to the destination array.  For any char in the input that
1151        *  cannot be converted, @a dfault is used instead.  For an underived
1152        *  ctype<char> facet, the argument will be copied unchanged.
1153        *
1154        *  do_narrow() is a hook for a derived facet to change the behavior of
1155        *  narrowing.  do_narrow() must always return the same result for the
1156        *  same input.
1157        *
1158        *  Note: this is not what you want for codepage conversions.  See
1159        *  codecvt for that.
1160        *
1161        *  @param __lo  Pointer to start of range.
1162        *  @param __hi  Pointer to end of range.
1163        *  @param __dfault  Char to use if conversion fails.
1164        *  @param __to  Pointer to the destination array.
1165        *  @return  @a __hi.
1166       */
1167       virtual const char_type*
1168       do_narrow(const char_type* __lo, const char_type* __hi,
1169 		char __dfault __attribute__((__unused__)), char* __to) const
1170       {
1171 	if (__builtin_expect(__hi != __lo, true))
1172 	  __builtin_memcpy(__to, __lo, __hi - __lo);
1173 	return __hi;
1174       }
1175 
1176     private:
1177       void _M_narrow_init() const;
1178       void _M_widen_init() const;
1179     };
1180 
1181 #ifdef _GLIBCXX_USE_WCHAR_T
1182   /**
1183    *  @brief  The ctype<wchar_t> specialization.
1184    *  @ingroup locales
1185    *
1186    *  This class defines classification and conversion functions for the
1187    *  wchar_t type.  It gets used by wchar_t streams for many I/O operations.
1188    *  The wchar_t specialization provides a number of optimizations as well.
1189    *
1190    *  ctype<wchar_t> inherits its public methods from
1191    *  __ctype_abstract_base<wchar_t>.
1192   */
1193   template<>
1194     class ctype<wchar_t> : public __ctype_abstract_base<wchar_t>
1195     {
1196     public:
1197       // Types:
1198       /// Typedef for the template parameter wchar_t.
1199       typedef wchar_t		char_type;
1200       typedef wctype_t		__wmask_type;
1201 
1202     protected:
1203       __c_locale		_M_c_locale_ctype;
1204 
1205       // Pre-computed narrowed and widened chars.
1206       bool                      _M_narrow_ok;
1207       char                      _M_narrow[128];
1208       wint_t                    _M_widen[1 + static_cast<unsigned char>(-1)];
1209 
1210       // Pre-computed elements for do_is.
1211       mask                      _M_bit[16];
1212       __wmask_type              _M_wmask[16];
1213 
1214     public:
1215       // Data Members:
1216       /// The facet id for ctype<wchar_t>
1217       static locale::id		id;
1218 
1219       /**
1220        *  @brief  Constructor performs initialization.
1221        *
1222        *  This is the constructor provided by the standard.
1223        *
1224        *  @param __refs  Passed to the base facet class.
1225       */
1226       explicit
1227       ctype(size_t __refs = 0);
1228 
1229       /**
1230        *  @brief  Constructor performs static initialization.
1231        *
1232        *  This constructor is used to construct the initial C locale facet.
1233        *
1234        *  @param __cloc  Handle to C locale data.
1235        *  @param __refs  Passed to the base facet class.
1236       */
1237       explicit
1238       ctype(__c_locale __cloc, size_t __refs = 0);
1239 
1240     protected:
1241       __wmask_type
1242       _M_convert_to_wmask(const mask __m) const throw();
1243 
1244       /// Destructor
1245       virtual
1246       ~ctype();
1247 
1248       /**
1249        *  @brief  Test wchar_t classification.
1250        *
1251        *  This function finds a mask M for @a c and compares it to mask @a m.
1252        *
1253        *  do_is() is a hook for a derived facet to change the behavior of
1254        *  classifying.  do_is() must always return the same result for the
1255        *  same input.
1256        *
1257        *  @param __c  The wchar_t to find the mask of.
1258        *  @param __m  The mask to compare against.
1259        *  @return  (M & __m) != 0.
1260       */
1261       virtual bool
1262       do_is(mask __m, char_type __c) const;
1263 
1264       /**
1265        *  @brief  Return a mask array.
1266        *
1267        *  This function finds the mask for each wchar_t in the range [lo,hi)
1268        *  and successively writes it to vec.  vec must have as many elements
1269        *  as the input.
1270        *
1271        *  do_is() is a hook for a derived facet to change the behavior of
1272        *  classifying.  do_is() must always return the same result for the
1273        *  same input.
1274        *
1275        *  @param __lo  Pointer to start of range.
1276        *  @param __hi  Pointer to end of range.
1277        *  @param __vec  Pointer to an array of mask storage.
1278        *  @return  @a __hi.
1279       */
1280       virtual const char_type*
1281       do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
1282 
1283       /**
1284        *  @brief  Find wchar_t matching mask
1285        *
1286        *  This function searches for and returns the first wchar_t c in
1287        *  [__lo,__hi) for which is(__m,c) is true.
1288        *
1289        *  do_scan_is() is a hook for a derived facet to change the behavior of
1290        *  match searching.  do_is() must always return the same result for the
1291        *  same input.
1292        *
1293        *  @param __m  The mask to compare against.
1294        *  @param __lo  Pointer to start of range.
1295        *  @param __hi  Pointer to end of range.
1296        *  @return  Pointer to a matching wchar_t if found, else @a __hi.
1297       */
1298       virtual const char_type*
1299       do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
1300 
1301       /**
1302        *  @brief  Find wchar_t not matching mask
1303        *
1304        *  This function searches for and returns a pointer to the first
1305        *  wchar_t c of [__lo,__hi) for which is(__m,c) is false.
1306        *
1307        *  do_scan_is() is a hook for a derived facet to change the behavior of
1308        *  match searching.  do_is() must always return the same result for the
1309        *  same input.
1310        *
1311        *  @param __m  The mask to compare against.
1312        *  @param __lo  Pointer to start of range.
1313        *  @param __hi  Pointer to end of range.
1314        *  @return  Pointer to a non-matching wchar_t if found, else @a __hi.
1315       */
1316       virtual const char_type*
1317       do_scan_not(mask __m, const char_type* __lo,
1318 		  const char_type* __hi) const;
1319 
1320       /**
1321        *  @brief  Convert to uppercase.
1322        *
1323        *  This virtual function converts the wchar_t argument to uppercase if
1324        *  possible.  If not possible (for example, '2'), returns the argument.
1325        *
1326        *  do_toupper() is a hook for a derived facet to change the behavior of
1327        *  uppercasing.  do_toupper() must always return the same result for
1328        *  the same input.
1329        *
1330        *  @param __c  The wchar_t to convert.
1331        *  @return  The uppercase wchar_t if convertible, else @a __c.
1332       */
1333       virtual char_type
1334       do_toupper(char_type __c) const;
1335 
1336       /**
1337        *  @brief  Convert array to uppercase.
1338        *
1339        *  This virtual function converts each wchar_t in the range [lo,hi) to
1340        *  uppercase if possible.  Other elements remain untouched.
1341        *
1342        *  do_toupper() is a hook for a derived facet to change the behavior of
1343        *  uppercasing.  do_toupper() must always return the same result for
1344        *  the same input.
1345        *
1346        *  @param __lo  Pointer to start of range.
1347        *  @param __hi  Pointer to end of range.
1348        *  @return  @a __hi.
1349       */
1350       virtual const char_type*
1351       do_toupper(char_type* __lo, const char_type* __hi) const;
1352 
1353       /**
1354        *  @brief  Convert to lowercase.
1355        *
1356        *  This virtual function converts the argument to lowercase if
1357        *  possible.  If not possible (for example, '2'), returns the argument.
1358        *
1359        *  do_tolower() is a hook for a derived facet to change the behavior of
1360        *  lowercasing.  do_tolower() must always return the same result for
1361        *  the same input.
1362        *
1363        *  @param __c  The wchar_t to convert.
1364        *  @return  The lowercase wchar_t if convertible, else @a __c.
1365       */
1366       virtual char_type
1367       do_tolower(char_type __c) const;
1368 
1369       /**
1370        *  @brief  Convert array to lowercase.
1371        *
1372        *  This virtual function converts each wchar_t in the range [lo,hi) to
1373        *  lowercase if possible.  Other elements remain untouched.
1374        *
1375        *  do_tolower() is a hook for a derived facet to change the behavior of
1376        *  lowercasing.  do_tolower() must always return the same result for
1377        *  the same input.
1378        *
1379        *  @param __lo  Pointer to start of range.
1380        *  @param __hi  Pointer to end of range.
1381        *  @return  @a __hi.
1382       */
1383       virtual const char_type*
1384       do_tolower(char_type* __lo, const char_type* __hi) const;
1385 
1386       /**
1387        *  @brief  Widen char to wchar_t
1388        *
1389        *  This virtual function converts the char to wchar_t using the
1390        *  simplest reasonable transformation.  For an underived ctype<wchar_t>
1391        *  facet, the argument will be cast to wchar_t.
1392        *
1393        *  do_widen() is a hook for a derived facet to change the behavior of
1394        *  widening.  do_widen() must always return the same result for the
1395        *  same input.
1396        *
1397        *  Note: this is not what you want for codepage conversions.  See
1398        *  codecvt for that.
1399        *
1400        *  @param __c  The char to convert.
1401        *  @return  The converted wchar_t.
1402       */
1403       virtual char_type
1404       do_widen(char __c) const;
1405 
1406       /**
1407        *  @brief  Widen char array to wchar_t array
1408        *
1409        *  This function converts each char in the input to wchar_t using the
1410        *  simplest reasonable transformation.  For an underived ctype<wchar_t>
1411        *  facet, the argument will be copied, casting each element to wchar_t.
1412        *
1413        *  do_widen() is a hook for a derived facet to change the behavior of
1414        *  widening.  do_widen() must always return the same result for the
1415        *  same input.
1416        *
1417        *  Note: this is not what you want for codepage conversions.  See
1418        *  codecvt for that.
1419        *
1420        *  @param __lo  Pointer to start range.
1421        *  @param __hi  Pointer to end of range.
1422        *  @param __to  Pointer to the destination array.
1423        *  @return  @a __hi.
1424       */
1425       virtual const char*
1426       do_widen(const char* __lo, const char* __hi, char_type* __to) const;
1427 
1428       /**
1429        *  @brief  Narrow wchar_t to char
1430        *
1431        *  This virtual function converts the argument to char using
1432        *  the simplest reasonable transformation.  If the conversion
1433        *  fails, dfault is returned instead.  For an underived
1434        *  ctype<wchar_t> facet, @a c will be cast to char and
1435        *  returned.
1436        *
1437        *  do_narrow() is a hook for a derived facet to change the
1438        *  behavior of narrowing.  do_narrow() must always return the
1439        *  same result for the same input.
1440        *
1441        *  Note: this is not what you want for codepage conversions.  See
1442        *  codecvt for that.
1443        *
1444        *  @param __c  The wchar_t to convert.
1445        *  @param __dfault  Char to return if conversion fails.
1446        *  @return  The converted char.
1447       */
1448       virtual char
1449       do_narrow(char_type __c, char __dfault) const;
1450 
1451       /**
1452        *  @brief  Narrow wchar_t array to char array
1453        *
1454        *  This virtual function converts each wchar_t in the range [lo,hi) to
1455        *  char using the simplest reasonable transformation and writes the
1456        *  results to the destination array.  For any wchar_t in the input that
1457        *  cannot be converted, @a dfault is used instead.  For an underived
1458        *  ctype<wchar_t> facet, the argument will be copied, casting each
1459        *  element to char.
1460        *
1461        *  do_narrow() is a hook for a derived facet to change the behavior of
1462        *  narrowing.  do_narrow() must always return the same result for the
1463        *  same input.
1464        *
1465        *  Note: this is not what you want for codepage conversions.  See
1466        *  codecvt for that.
1467        *
1468        *  @param __lo  Pointer to start of range.
1469        *  @param __hi  Pointer to end of range.
1470        *  @param __dfault  Char to use if conversion fails.
1471        *  @param __to  Pointer to the destination array.
1472        *  @return  @a __hi.
1473       */
1474       virtual const char_type*
1475       do_narrow(const char_type* __lo, const char_type* __hi,
1476 		char __dfault, char* __to) const;
1477 
1478       // For use at construction time only.
1479       void
1480       _M_initialize_ctype() throw();
1481     };
1482 #endif //_GLIBCXX_USE_WCHAR_T
1483 
1484   /// class ctype_byname [22.2.1.2].
1485   template<typename _CharT>
1486     class ctype_byname : public ctype<_CharT>
1487     {
1488     public:
1489       typedef typename ctype<_CharT>::mask  mask;
1490 
1491       explicit
1492       ctype_byname(const char* __s, size_t __refs = 0);
1493 
1494 #if __cplusplus >= 201103L
1495       explicit
1496       ctype_byname(const string& __s, size_t __refs = 0)
1497       : ctype_byname(__s.c_str(), __refs) { }
1498 #endif
1499 
1500     protected:
1501       virtual
1502       ~ctype_byname() { }
1503     };
1504 
1505   /// 22.2.1.4  Class ctype_byname specializations.
1506   template<>
1507     class ctype_byname<char> : public ctype<char>
1508     {
1509     public:
1510       explicit
1511       ctype_byname(const char* __s, size_t __refs = 0);
1512 
1513 #if __cplusplus >= 201103L
1514       explicit
1515       ctype_byname(const string& __s, size_t __refs = 0);
1516 #endif
1517 
1518     protected:
1519       virtual
1520       ~ctype_byname();
1521     };
1522 
1523 #ifdef _GLIBCXX_USE_WCHAR_T
1524   template<>
1525     class ctype_byname<wchar_t> : public ctype<wchar_t>
1526     {
1527     public:
1528       explicit
1529       ctype_byname(const char* __s, size_t __refs = 0);
1530 
1531 #if __cplusplus >= 201103L
1532       explicit
1533       ctype_byname(const string& __s, size_t __refs = 0);
1534 #endif
1535 
1536     protected:
1537       virtual
1538       ~ctype_byname();
1539     };
1540 #endif
1541 
1542 _GLIBCXX_END_NAMESPACE_VERSION
1543 } // namespace
1544 
1545 // Include host and configuration specific ctype inlines.
1546 #include <bits/ctype_inline.h>
1547 
_GLIBCXX_VISIBILITY(default)1548 namespace std _GLIBCXX_VISIBILITY(default)
1549 {
1550 _GLIBCXX_BEGIN_NAMESPACE_VERSION
1551 
1552   // 22.2.2  The numeric category.
1553   class __num_base
1554   {
1555   public:
1556     // NB: Code depends on the order of _S_atoms_out elements.
1557     // Below are the indices into _S_atoms_out.
1558     enum
1559       {
1560 	_S_ominus,
1561 	_S_oplus,
1562 	_S_ox,
1563 	_S_oX,
1564 	_S_odigits,
1565 	_S_odigits_end = _S_odigits + 16,
1566 	_S_oudigits = _S_odigits_end,
1567 	_S_oudigits_end = _S_oudigits + 16,
1568 	_S_oe = _S_odigits + 14,  // For scientific notation, 'e'
1569 	_S_oE = _S_oudigits + 14, // For scientific notation, 'E'
1570 	_S_oend = _S_oudigits_end
1571       };
1572 
1573     // A list of valid numeric literals for output.  This array
1574     // contains chars that will be passed through the current locale's
1575     // ctype<_CharT>.widen() and then used to render numbers.
1576     // For the standard "C" locale, this is
1577     // "-+xX0123456789abcdef0123456789ABCDEF".
1578     static const char* _S_atoms_out;
1579 
1580     // String literal of acceptable (narrow) input, for num_get.
1581     // "-+xX0123456789abcdefABCDEF"
1582     static const char* _S_atoms_in;
1583 
1584     enum
1585     {
1586       _S_iminus,
1587       _S_iplus,
1588       _S_ix,
1589       _S_iX,
1590       _S_izero,
1591       _S_ie = _S_izero + 14,
1592       _S_iE = _S_izero + 20,
1593       _S_iend = 26
1594     };
1595 
1596     // num_put
1597     // Construct and return valid scanf format for floating point types.
1598     static void
1599     _S_format_float(const ios_base& __io, char* __fptr, char __mod) throw();
1600   };
1601 
1602   template<typename _CharT>
1603     struct __numpunct_cache : public locale::facet
1604     {
1605       const char*			_M_grouping;
1606       size_t                            _M_grouping_size;
1607       bool				_M_use_grouping;
1608       const _CharT*			_M_truename;
1609       size_t                            _M_truename_size;
1610       const _CharT*			_M_falsename;
1611       size_t                            _M_falsename_size;
1612       _CharT				_M_decimal_point;
1613       _CharT				_M_thousands_sep;
1614 
1615       // A list of valid numeric literals for output: in the standard
1616       // "C" locale, this is "-+xX0123456789abcdef0123456789ABCDEF".
1617       // This array contains the chars after having been passed
1618       // through the current locale's ctype<_CharT>.widen().
1619       _CharT				_M_atoms_out[__num_base::_S_oend];
1620 
1621       // A list of valid numeric literals for input: in the standard
1622       // "C" locale, this is "-+xX0123456789abcdefABCDEF"
1623       // This array contains the chars after having been passed
1624       // through the current locale's ctype<_CharT>.widen().
1625       _CharT				_M_atoms_in[__num_base::_S_iend];
1626 
1627       bool				_M_allocated;
1628 
1629       __numpunct_cache(size_t __refs = 0)
1630       : facet(__refs), _M_grouping(0), _M_grouping_size(0),
1631 	_M_use_grouping(false),
1632 	_M_truename(0), _M_truename_size(0), _M_falsename(0),
1633 	_M_falsename_size(0), _M_decimal_point(_CharT()),
1634 	_M_thousands_sep(_CharT()), _M_allocated(false)
1635 	{ }
1636 
1637       ~__numpunct_cache();
1638 
1639       void
1640       _M_cache(const locale& __loc);
1641 
1642     private:
1643       __numpunct_cache&
1644       operator=(const __numpunct_cache&);
1645 
1646       explicit
1647       __numpunct_cache(const __numpunct_cache&);
1648     };
1649 
1650   template<typename _CharT>
1651     __numpunct_cache<_CharT>::~__numpunct_cache()
1652     {
1653       if (_M_allocated)
1654 	{
1655 	  delete [] _M_grouping;
1656 	  delete [] _M_truename;
1657 	  delete [] _M_falsename;
1658 	}
1659     }
1660 
1661 _GLIBCXX_BEGIN_NAMESPACE_CXX11
1662 
1663   /**
1664    *  @brief  Primary class template numpunct.
1665    *  @ingroup locales
1666    *
1667    *  This facet stores several pieces of information related to printing and
1668    *  scanning numbers, such as the decimal point character.  It takes a
1669    *  template parameter specifying the char type.  The numpunct facet is
1670    *  used by streams for many I/O operations involving numbers.
1671    *
1672    *  The numpunct template uses protected virtual functions to provide the
1673    *  actual results.  The public accessors forward the call to the virtual
1674    *  functions.  These virtual functions are hooks for developers to
1675    *  implement the behavior they require from a numpunct facet.
1676   */
1677   template<typename _CharT>
1678     class numpunct : public locale::facet
1679     {
1680     public:
1681       // Types:
1682       ///@{
1683       /// Public typedefs
1684       typedef _CharT			char_type;
1685       typedef basic_string<_CharT>	string_type;
1686       ///@}
1687       typedef __numpunct_cache<_CharT>  __cache_type;
1688 
1689     protected:
1690       __cache_type*			_M_data;
1691 
1692     public:
1693       /// Numpunct facet id.
1694       static locale::id			id;
1695 
1696       /**
1697        *  @brief  Numpunct constructor.
1698        *
1699        *  @param  __refs  Refcount to pass to the base class.
1700        */
1701       explicit
1702       numpunct(size_t __refs = 0)
1703       : facet(__refs), _M_data(0)
1704       { _M_initialize_numpunct(); }
1705 
1706       /**
1707        *  @brief  Internal constructor.  Not for general use.
1708        *
1709        *  This is a constructor for use by the library itself to set up the
1710        *  predefined locale facets.
1711        *
1712        *  @param  __cache  __numpunct_cache object.
1713        *  @param  __refs  Refcount to pass to the base class.
1714        */
1715       explicit
1716       numpunct(__cache_type* __cache, size_t __refs = 0)
1717       : facet(__refs), _M_data(__cache)
1718       { _M_initialize_numpunct(); }
1719 
1720       /**
1721        *  @brief  Internal constructor.  Not for general use.
1722        *
1723        *  This is a constructor for use by the library itself to set up new
1724        *  locales.
1725        *
1726        *  @param  __cloc  The C locale.
1727        *  @param  __refs  Refcount to pass to the base class.
1728        */
1729       explicit
1730       numpunct(__c_locale __cloc, size_t __refs = 0)
1731       : facet(__refs), _M_data(0)
1732       { _M_initialize_numpunct(__cloc); }
1733 
1734       /**
1735        *  @brief  Return decimal point character.
1736        *
1737        *  This function returns a char_type to use as a decimal point.  It
1738        *  does so by returning returning
1739        *  numpunct<char_type>::do_decimal_point().
1740        *
1741        *  @return  @a char_type representing a decimal point.
1742       */
1743       char_type
1744       decimal_point() const
1745       { return this->do_decimal_point(); }
1746 
1747       /**
1748        *  @brief  Return thousands separator character.
1749        *
1750        *  This function returns a char_type to use as a thousands
1751        *  separator.  It does so by returning returning
1752        *  numpunct<char_type>::do_thousands_sep().
1753        *
1754        *  @return  char_type representing a thousands separator.
1755       */
1756       char_type
1757       thousands_sep() const
1758       { return this->do_thousands_sep(); }
1759 
1760       /**
1761        *  @brief  Return grouping specification.
1762        *
1763        *  This function returns a string representing groupings for the
1764        *  integer part of a number.  Groupings indicate where thousands
1765        *  separators should be inserted in the integer part of a number.
1766        *
1767        *  Each char in the return string is interpret as an integer
1768        *  rather than a character.  These numbers represent the number
1769        *  of digits in a group.  The first char in the string
1770        *  represents the number of digits in the least significant
1771        *  group.  If a char is negative, it indicates an unlimited
1772        *  number of digits for the group.  If more chars from the
1773        *  string are required to group a number, the last char is used
1774        *  repeatedly.
1775        *
1776        *  For example, if the grouping() returns "\003\002" and is
1777        *  applied to the number 123456789, this corresponds to
1778        *  12,34,56,789.  Note that if the string was "32", this would
1779        *  put more than 50 digits into the least significant group if
1780        *  the character set is ASCII.
1781        *
1782        *  The string is returned by calling
1783        *  numpunct<char_type>::do_grouping().
1784        *
1785        *  @return  string representing grouping specification.
1786       */
1787       string
1788       grouping() const
1789       { return this->do_grouping(); }
1790 
1791       /**
1792        *  @brief  Return string representation of bool true.
1793        *
1794        *  This function returns a string_type containing the text
1795        *  representation for true bool variables.  It does so by calling
1796        *  numpunct<char_type>::do_truename().
1797        *
1798        *  @return  string_type representing printed form of true.
1799       */
1800       string_type
1801       truename() const
1802       { return this->do_truename(); }
1803 
1804       /**
1805        *  @brief  Return string representation of bool false.
1806        *
1807        *  This function returns a string_type containing the text
1808        *  representation for false bool variables.  It does so by calling
1809        *  numpunct<char_type>::do_falsename().
1810        *
1811        *  @return  string_type representing printed form of false.
1812       */
1813       string_type
1814       falsename() const
1815       { return this->do_falsename(); }
1816 
1817     protected:
1818       /// Destructor.
1819       virtual
1820       ~numpunct();
1821 
1822       /**
1823        *  @brief  Return decimal point character.
1824        *
1825        *  Returns a char_type to use as a decimal point.  This function is a
1826        *  hook for derived classes to change the value returned.
1827        *
1828        *  @return  @a char_type representing a decimal point.
1829       */
1830       virtual char_type
1831       do_decimal_point() const
1832       { return _M_data->_M_decimal_point; }
1833 
1834       /**
1835        *  @brief  Return thousands separator character.
1836        *
1837        *  Returns a char_type to use as a thousands separator.  This function
1838        *  is a hook for derived classes to change the value returned.
1839        *
1840        *  @return  @a char_type representing a thousands separator.
1841       */
1842       virtual char_type
1843       do_thousands_sep() const
1844       { return _M_data->_M_thousands_sep; }
1845 
1846       /**
1847        *  @brief  Return grouping specification.
1848        *
1849        *  Returns a string representing groupings for the integer part of a
1850        *  number.  This function is a hook for derived classes to change the
1851        *  value returned.  @see grouping() for details.
1852        *
1853        *  @return  String representing grouping specification.
1854       */
1855       virtual string
1856       do_grouping() const
1857       { return _M_data->_M_grouping; }
1858 
1859       /**
1860        *  @brief  Return string representation of bool true.
1861        *
1862        *  Returns a string_type containing the text representation for true
1863        *  bool variables.  This function is a hook for derived classes to
1864        *  change the value returned.
1865        *
1866        *  @return  string_type representing printed form of true.
1867       */
1868       virtual string_type
1869       do_truename() const
1870       { return _M_data->_M_truename; }
1871 
1872       /**
1873        *  @brief  Return string representation of bool false.
1874        *
1875        *  Returns a string_type containing the text representation for false
1876        *  bool variables.  This function is a hook for derived classes to
1877        *  change the value returned.
1878        *
1879        *  @return  string_type representing printed form of false.
1880       */
1881       virtual string_type
1882       do_falsename() const
1883       { return _M_data->_M_falsename; }
1884 
1885       // For use at construction time only.
1886       void
1887       _M_initialize_numpunct(__c_locale __cloc = 0);
1888     };
1889 
1890   template<typename _CharT>
1891     locale::id numpunct<_CharT>::id;
1892 
1893   template<>
1894     numpunct<char>::~numpunct();
1895 
1896   template<>
1897     void
1898     numpunct<char>::_M_initialize_numpunct(__c_locale __cloc);
1899 
1900 #ifdef _GLIBCXX_USE_WCHAR_T
1901   template<>
1902     numpunct<wchar_t>::~numpunct();
1903 
1904   template<>
1905     void
1906     numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc);
1907 #endif
1908 
1909   /// class numpunct_byname [22.2.3.2].
1910   template<typename _CharT>
1911     class numpunct_byname : public numpunct<_CharT>
1912     {
1913     public:
1914       typedef _CharT			char_type;
1915       typedef basic_string<_CharT>	string_type;
1916 
1917       explicit
1918       numpunct_byname(const char* __s, size_t __refs = 0)
1919       : numpunct<_CharT>(__refs)
1920       {
1921 	if (__builtin_strcmp(__s, "C") != 0
1922 	    && __builtin_strcmp(__s, "POSIX") != 0)
1923 	  {
1924 	    __c_locale __tmp;
1925 	    this->_S_create_c_locale(__tmp, __s);
1926 	    this->_M_initialize_numpunct(__tmp);
1927 	    this->_S_destroy_c_locale(__tmp);
1928 	  }
1929       }
1930 
1931 #if __cplusplus >= 201103L
1932       explicit
1933       numpunct_byname(const string& __s, size_t __refs = 0)
1934       : numpunct_byname(__s.c_str(), __refs) { }
1935 #endif
1936 
1937     protected:
1938       virtual
1939       ~numpunct_byname() { }
1940     };
1941 
1942 _GLIBCXX_END_NAMESPACE_CXX11
1943 
1944 _GLIBCXX_BEGIN_NAMESPACE_LDBL
1945 
1946   /**
1947    *  @brief  Primary class template num_get.
1948    *  @ingroup locales
1949    *
1950    *  This facet encapsulates the code to parse and return a number
1951    *  from a string.  It is used by the istream numeric extraction
1952    *  operators.
1953    *
1954    *  The num_get template uses protected virtual functions to provide the
1955    *  actual results.  The public accessors forward the call to the virtual
1956    *  functions.  These virtual functions are hooks for developers to
1957    *  implement the behavior they require from the num_get facet.
1958   */
1959   template<typename _CharT, typename _InIter>
1960     class num_get : public locale::facet
1961     {
1962     public:
1963       // Types:
1964       ///@{
1965       /// Public typedefs
1966       typedef _CharT			char_type;
1967       typedef _InIter			iter_type;
1968       ///@}
1969 
1970       /// Numpunct facet id.
1971       static locale::id			id;
1972 
1973       /**
1974        *  @brief  Constructor performs initialization.
1975        *
1976        *  This is the constructor provided by the standard.
1977        *
1978        *  @param __refs  Passed to the base facet class.
1979       */
1980       explicit
1981       num_get(size_t __refs = 0) : facet(__refs) { }
1982 
1983       /**
1984        *  @brief  Numeric parsing.
1985        *
1986        *  Parses the input stream into the bool @a v.  It does so by calling
1987        *  num_get::do_get().
1988        *
1989        *  If ios_base::boolalpha is set, attempts to read
1990        *  ctype<CharT>::truename() or ctype<CharT>::falsename().  Sets
1991        *  @a v to true or false if successful.  Sets err to
1992        *  ios_base::failbit if reading the string fails.  Sets err to
1993        *  ios_base::eofbit if the stream is emptied.
1994        *
1995        *  If ios_base::boolalpha is not set, proceeds as with reading a long,
1996        *  except if the value is 1, sets @a v to true, if the value is 0, sets
1997        *  @a v to false, and otherwise set err to ios_base::failbit.
1998        *
1999        *  @param  __in  Start of input stream.
2000        *  @param  __end  End of input stream.
2001        *  @param  __io  Source of locale and flags.
2002        *  @param  __err  Error flags to set.
2003        *  @param  __v  Value to format and insert.
2004        *  @return  Iterator after reading.
2005       */
2006       iter_type
2007       get(iter_type __in, iter_type __end, ios_base& __io,
2008 	  ios_base::iostate& __err, bool& __v) const
2009       { return this->do_get(__in, __end, __io, __err, __v); }
2010 
2011       ///@{
2012       /**
2013        *  @brief  Numeric parsing.
2014        *
2015        *  Parses the input stream into the integral variable @a v.  It does so
2016        *  by calling num_get::do_get().
2017        *
2018        *  Parsing is affected by the flag settings in @a io.
2019        *
2020        *  The basic parse is affected by the value of io.flags() &
2021        *  ios_base::basefield.  If equal to ios_base::oct, parses like the
2022        *  scanf %o specifier.  Else if equal to ios_base::hex, parses like %X
2023        *  specifier.  Else if basefield equal to 0, parses like the %i
2024        *  specifier.  Otherwise, parses like %d for signed and %u for unsigned
2025        *  types.  The matching type length modifier is also used.
2026        *
2027        *  Digit grouping is interpreted according to
2028        *  numpunct::grouping() and numpunct::thousands_sep().  If the
2029        *  pattern of digit groups isn't consistent, sets err to
2030        *  ios_base::failbit.
2031        *
2032        *  If parsing the string yields a valid value for @a v, @a v is set.
2033        *  Otherwise, sets err to ios_base::failbit and leaves @a v unaltered.
2034        *  Sets err to ios_base::eofbit if the stream is emptied.
2035        *
2036        *  @param  __in  Start of input stream.
2037        *  @param  __end  End of input stream.
2038        *  @param  __io  Source of locale and flags.
2039        *  @param  __err  Error flags to set.
2040        *  @param  __v  Value to format and insert.
2041        *  @return  Iterator after reading.
2042       */
2043       iter_type
2044       get(iter_type __in, iter_type __end, ios_base& __io,
2045 	  ios_base::iostate& __err, long& __v) const
2046       { return this->do_get(__in, __end, __io, __err, __v); }
2047 
2048       iter_type
2049       get(iter_type __in, iter_type __end, ios_base& __io,
2050 	  ios_base::iostate& __err, unsigned short& __v) const
2051       { return this->do_get(__in, __end, __io, __err, __v); }
2052 
2053       iter_type
2054       get(iter_type __in, iter_type __end, ios_base& __io,
2055 	  ios_base::iostate& __err, unsigned int& __v)   const
2056       { return this->do_get(__in, __end, __io, __err, __v); }
2057 
2058       iter_type
2059       get(iter_type __in, iter_type __end, ios_base& __io,
2060 	  ios_base::iostate& __err, unsigned long& __v)  const
2061       { return this->do_get(__in, __end, __io, __err, __v); }
2062 
2063 #ifdef _GLIBCXX_USE_LONG_LONG
2064       iter_type
2065       get(iter_type __in, iter_type __end, ios_base& __io,
2066 	  ios_base::iostate& __err, long long& __v) const
2067       { return this->do_get(__in, __end, __io, __err, __v); }
2068 
2069       iter_type
2070       get(iter_type __in, iter_type __end, ios_base& __io,
2071 	  ios_base::iostate& __err, unsigned long long& __v)  const
2072       { return this->do_get(__in, __end, __io, __err, __v); }
2073 #endif
2074       ///@}
2075 
2076       ///@{
2077       /**
2078        *  @brief  Numeric parsing.
2079        *
2080        *  Parses the input stream into the integral variable @a v.  It does so
2081        *  by calling num_get::do_get().
2082        *
2083        *  The input characters are parsed like the scanf %g specifier.  The
2084        *  matching type length modifier is also used.
2085        *
2086        *  The decimal point character used is numpunct::decimal_point().
2087        *  Digit grouping is interpreted according to
2088        *  numpunct::grouping() and numpunct::thousands_sep().  If the
2089        *  pattern of digit groups isn't consistent, sets err to
2090        *  ios_base::failbit.
2091        *
2092        *  If parsing the string yields a valid value for @a v, @a v is set.
2093        *  Otherwise, sets err to ios_base::failbit and leaves @a v unaltered.
2094        *  Sets err to ios_base::eofbit if the stream is emptied.
2095        *
2096        *  @param  __in  Start of input stream.
2097        *  @param  __end  End of input stream.
2098        *  @param  __io  Source of locale and flags.
2099        *  @param  __err  Error flags to set.
2100        *  @param  __v  Value to format and insert.
2101        *  @return  Iterator after reading.
2102       */
2103       iter_type
2104       get(iter_type __in, iter_type __end, ios_base& __io,
2105 	  ios_base::iostate& __err, float& __v) const
2106       { return this->do_get(__in, __end, __io, __err, __v); }
2107 
2108       iter_type
2109       get(iter_type __in, iter_type __end, ios_base& __io,
2110 	  ios_base::iostate& __err, double& __v) const
2111       { return this->do_get(__in, __end, __io, __err, __v); }
2112 
2113       iter_type
2114       get(iter_type __in, iter_type __end, ios_base& __io,
2115 	  ios_base::iostate& __err, long double& __v) const
2116       { return this->do_get(__in, __end, __io, __err, __v); }
2117       ///@}
2118 
2119       /**
2120        *  @brief  Numeric parsing.
2121        *
2122        *  Parses the input stream into the pointer variable @a v.  It does so
2123        *  by calling num_get::do_get().
2124        *
2125        *  The input characters are parsed like the scanf %p specifier.
2126        *
2127        *  Digit grouping is interpreted according to
2128        *  numpunct::grouping() and numpunct::thousands_sep().  If the
2129        *  pattern of digit groups isn't consistent, sets err to
2130        *  ios_base::failbit.
2131        *
2132        *  Note that the digit grouping effect for pointers is a bit ambiguous
2133        *  in the standard and shouldn't be relied on.  See DR 344.
2134        *
2135        *  If parsing the string yields a valid value for @a v, @a v is set.
2136        *  Otherwise, sets err to ios_base::failbit and leaves @a v unaltered.
2137        *  Sets err to ios_base::eofbit if the stream is emptied.
2138        *
2139        *  @param  __in  Start of input stream.
2140        *  @param  __end  End of input stream.
2141        *  @param  __io  Source of locale and flags.
2142        *  @param  __err  Error flags to set.
2143        *  @param  __v  Value to format and insert.
2144        *  @return  Iterator after reading.
2145       */
2146       iter_type
2147       get(iter_type __in, iter_type __end, ios_base& __io,
2148 	  ios_base::iostate& __err, void*& __v) const
2149       { return this->do_get(__in, __end, __io, __err, __v); }
2150 
2151     protected:
2152       /// Destructor.
2153       virtual ~num_get() { }
2154 
2155       _GLIBCXX_DEFAULT_ABI_TAG
2156       iter_type
2157       _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
2158 		       string&) const;
2159 
2160       template<typename _ValueT>
2161 	_GLIBCXX_DEFAULT_ABI_TAG
2162 	iter_type
2163 	_M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
2164 		       _ValueT&) const;
2165 
2166       template<typename _CharT2>
2167       typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, int>::__type
2168 	_M_find(const _CharT2*, size_t __len, _CharT2 __c) const
2169 	{
2170 	  int __ret = -1;
2171 	  if (__len <= 10)
2172 	    {
2173 	      if (__c >= _CharT2('0') && __c < _CharT2(_CharT2('0') + __len))
2174 		__ret = __c - _CharT2('0');
2175 	    }
2176 	  else
2177 	    {
2178 	      if (__c >= _CharT2('0') && __c <= _CharT2('9'))
2179 		__ret = __c - _CharT2('0');
2180 	      else if (__c >= _CharT2('a') && __c <= _CharT2('f'))
2181 		__ret = 10 + (__c - _CharT2('a'));
2182 	      else if (__c >= _CharT2('A') && __c <= _CharT2('F'))
2183 		__ret = 10 + (__c - _CharT2('A'));
2184 	    }
2185 	  return __ret;
2186 	}
2187 
2188       template<typename _CharT2>
2189       typename __gnu_cxx::__enable_if<!__is_char<_CharT2>::__value,
2190 				      int>::__type
2191 	_M_find(const _CharT2* __zero, size_t __len, _CharT2 __c) const
2192 	{
2193 	  int __ret = -1;
2194 	  const char_type* __q = char_traits<_CharT2>::find(__zero, __len, __c);
2195 	  if (__q)
2196 	    {
2197 	      __ret = __q - __zero;
2198 	      if (__ret > 15)
2199 		__ret -= 6;
2200 	    }
2201 	  return __ret;
2202 	}
2203 
2204       ///@{
2205       /**
2206        *  @brief  Numeric parsing.
2207        *
2208        *  Parses the input stream into the variable @a v.  This function is a
2209        *  hook for derived classes to change the value returned.  @see get()
2210        *  for more details.
2211        *
2212        *  @param  __beg  Start of input stream.
2213        *  @param  __end  End of input stream.
2214        *  @param  __io  Source of locale and flags.
2215        *  @param  __err  Error flags to set.
2216        *  @param  __v  Value to format and insert.
2217        *  @return  Iterator after reading.
2218       */
2219       virtual iter_type
2220       do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
2221 
2222       virtual iter_type
2223       do_get(iter_type __beg, iter_type __end, ios_base& __io,
2224 	     ios_base::iostate& __err, long& __v) const
2225       { return _M_extract_int(__beg, __end, __io, __err, __v); }
2226 
2227       virtual iter_type
2228       do_get(iter_type __beg, iter_type __end, ios_base& __io,
2229 	     ios_base::iostate& __err, unsigned short& __v) const
2230       { return _M_extract_int(__beg, __end, __io, __err, __v); }
2231 
2232       virtual iter_type
2233       do_get(iter_type __beg, iter_type __end, ios_base& __io,
2234 	     ios_base::iostate& __err, unsigned int& __v) const
2235       { return _M_extract_int(__beg, __end, __io, __err, __v); }
2236 
2237       virtual iter_type
2238       do_get(iter_type __beg, iter_type __end, ios_base& __io,
2239 	     ios_base::iostate& __err, unsigned long& __v) const
2240       { return _M_extract_int(__beg, __end, __io, __err, __v); }
2241 
2242 #ifdef _GLIBCXX_USE_LONG_LONG
2243       virtual iter_type
2244       do_get(iter_type __beg, iter_type __end, ios_base& __io,
2245 	     ios_base::iostate& __err, long long& __v) const
2246       { return _M_extract_int(__beg, __end, __io, __err, __v); }
2247 
2248       virtual iter_type
2249       do_get(iter_type __beg, iter_type __end, ios_base& __io,
2250 	     ios_base::iostate& __err, unsigned long long& __v) const
2251       { return _M_extract_int(__beg, __end, __io, __err, __v); }
2252 #endif
2253 
2254       virtual iter_type
2255       do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, float&) const;
2256 
2257       virtual iter_type
2258       do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
2259 	     double&) const;
2260 
2261       // XXX GLIBCXX_ABI Deprecated
2262 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
2263       // For __gnu_cxx_ldbl128::num_get and __gnu_cxx_ieee128::num_get
2264       // this entry in the vtable is for a 64-bit "long double" with the
2265       // same format as double. This keeps the vtable layout consistent
2266       // with std::num_get (visible when -mlong-double-64 is used).
2267       virtual iter_type
2268       __do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
2269 	       double&) const;
2270 #else
2271       virtual iter_type
2272       do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
2273 	     long double&) const;
2274 #endif
2275 
2276       virtual iter_type
2277       do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, void*&) const;
2278 
2279       // XXX GLIBCXX_ABI Deprecated
2280 #if defined _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT \
2281       && defined __LONG_DOUBLE_IEEE128__
2282       // For __gnu_cxx_ieee128::num_get this entry in the vtable is for
2283       // the non-IEEE 128-bit "long double" (aka "double double"). This
2284       // is consistent with __gnu_cxx_ldbl128::num_get (-mabi=ibmlongdouble)
2285       virtual iter_type
2286       __do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
2287 	       __ibm128&) const;
2288 #endif
2289 
2290       // XXX GLIBCXX_ABI Deprecated
2291 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
2292       // For __gnu_cxx_ldbl128::num_get and __gnu_cxx_ieee128::num_get
2293       // this entry in the vtable is for the 128-bit "long double" type.
2294       virtual iter_type
2295       do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
2296 	     long double&) const;
2297 #endif
2298       ///@}
2299     };
2300 
2301   template<typename _CharT, typename _InIter>
2302     locale::id num_get<_CharT, _InIter>::id;
2303 
2304 
2305   /**
2306    *  @brief  Primary class template num_put.
2307    *  @ingroup locales
2308    *
2309    *  This facet encapsulates the code to convert a number to a string.  It is
2310    *  used by the ostream numeric insertion operators.
2311    *
2312    *  The num_put template uses protected virtual functions to provide the
2313    *  actual results.  The public accessors forward the call to the virtual
2314    *  functions.  These virtual functions are hooks for developers to
2315    *  implement the behavior they require from the num_put facet.
2316   */
2317   template<typename _CharT, typename _OutIter>
2318     class num_put : public locale::facet
2319     {
2320     public:
2321       // Types:
2322       ///@{
2323       /// Public typedefs
2324       typedef _CharT		char_type;
2325       typedef _OutIter		iter_type;
2326       ///@}
2327 
2328       /// Numpunct facet id.
2329       static locale::id		id;
2330 
2331       /**
2332        *  @brief  Constructor performs initialization.
2333        *
2334        *  This is the constructor provided by the standard.
2335        *
2336        *  @param __refs  Passed to the base facet class.
2337       */
2338       explicit
2339       num_put(size_t __refs = 0) : facet(__refs) { }
2340 
2341       /**
2342        *  @brief  Numeric formatting.
2343        *
2344        *  Formats the boolean @a v and inserts it into a stream.  It does so
2345        *  by calling num_put::do_put().
2346        *
2347        *  If ios_base::boolalpha is set, writes ctype<CharT>::truename() or
2348        *  ctype<CharT>::falsename().  Otherwise formats @a v as an int.
2349        *
2350        *  @param  __s  Stream to write to.
2351        *  @param  __io  Source of locale and flags.
2352        *  @param  __fill  Char_type to use for filling.
2353        *  @param  __v  Value to format and insert.
2354        *  @return  Iterator after writing.
2355       */
2356       iter_type
2357       put(iter_type __s, ios_base& __io, char_type __fill, bool __v) const
2358       { return this->do_put(__s, __io, __fill, __v); }
2359 
2360       ///@{
2361       /**
2362        *  @brief  Numeric formatting.
2363        *
2364        *  Formats the integral value @a v and inserts it into a
2365        *  stream.  It does so by calling num_put::do_put().
2366        *
2367        *  Formatting is affected by the flag settings in @a io.
2368        *
2369        *  The basic format is affected by the value of io.flags() &
2370        *  ios_base::basefield.  If equal to ios_base::oct, formats like the
2371        *  printf %o specifier.  Else if equal to ios_base::hex, formats like
2372        *  %x or %X with ios_base::uppercase unset or set respectively.
2373        *  Otherwise, formats like %d, %ld, %lld for signed and %u, %lu, %llu
2374        *  for unsigned values.  Note that if both oct and hex are set, neither
2375        *  will take effect.
2376        *
2377        *  If ios_base::showpos is set, '+' is output before positive values.
2378        *  If ios_base::showbase is set, '0' precedes octal values (except 0)
2379        *  and '0[xX]' precedes hex values.
2380        *
2381        *  The decimal point character used is numpunct::decimal_point().
2382        *  Thousands separators are inserted according to
2383        *  numpunct::grouping() and numpunct::thousands_sep().
2384        *
2385        *  If io.width() is non-zero, enough @a fill characters are inserted to
2386        *  make the result at least that wide.  If
2387        *  (io.flags() & ios_base::adjustfield) == ios_base::left, result is
2388        *  padded at the end.  If ios_base::internal, then padding occurs
2389        *  immediately after either a '+' or '-' or after '0x' or '0X'.
2390        *  Otherwise, padding occurs at the beginning.
2391        *
2392        *  @param  __s  Stream to write to.
2393        *  @param  __io  Source of locale and flags.
2394        *  @param  __fill  Char_type to use for filling.
2395        *  @param  __v  Value to format and insert.
2396        *  @return  Iterator after writing.
2397       */
2398       iter_type
2399       put(iter_type __s, ios_base& __io, char_type __fill, long __v) const
2400       { return this->do_put(__s, __io, __fill, __v); }
2401 
2402       iter_type
2403       put(iter_type __s, ios_base& __io, char_type __fill,
2404 	  unsigned long __v) const
2405       { return this->do_put(__s, __io, __fill, __v); }
2406 
2407 #ifdef _GLIBCXX_USE_LONG_LONG
2408       iter_type
2409       put(iter_type __s, ios_base& __io, char_type __fill, long long __v) const
2410       { return this->do_put(__s, __io, __fill, __v); }
2411 
2412       iter_type
2413       put(iter_type __s, ios_base& __io, char_type __fill,
2414 	  unsigned long long __v) const
2415       { return this->do_put(__s, __io, __fill, __v); }
2416 #endif
2417       ///@}
2418 
2419       ///@{
2420       /**
2421        *  @brief  Numeric formatting.
2422        *
2423        *  Formats the floating point value @a v and inserts it into a stream.
2424        *  It does so by calling num_put::do_put().
2425        *
2426        *  Formatting is affected by the flag settings in @a io.
2427        *
2428        *  The basic format is affected by the value of io.flags() &
2429        *  ios_base::floatfield.  If equal to ios_base::fixed, formats like the
2430        *  printf %f specifier.  Else if equal to ios_base::scientific, formats
2431        *  like %e or %E with ios_base::uppercase unset or set respectively.
2432        *  Otherwise, formats like %g or %G depending on uppercase.  Note that
2433        *  if both fixed and scientific are set, the effect will also be like
2434        *  %g or %G.
2435        *
2436        *  The output precision is given by io.precision().  This precision is
2437        *  capped at numeric_limits::digits10 + 2 (different for double and
2438        *  long double).  The default precision is 6.
2439        *
2440        *  If ios_base::showpos is set, '+' is output before positive values.
2441        *  If ios_base::showpoint is set, a decimal point will always be
2442        *  output.
2443        *
2444        *  The decimal point character used is numpunct::decimal_point().
2445        *  Thousands separators are inserted according to
2446        *  numpunct::grouping() and numpunct::thousands_sep().
2447        *
2448        *  If io.width() is non-zero, enough @a fill characters are inserted to
2449        *  make the result at least that wide.  If
2450        *  (io.flags() & ios_base::adjustfield) == ios_base::left, result is
2451        *  padded at the end.  If ios_base::internal, then padding occurs
2452        *  immediately after either a '+' or '-' or after '0x' or '0X'.
2453        *  Otherwise, padding occurs at the beginning.
2454        *
2455        *  @param  __s  Stream to write to.
2456        *  @param  __io  Source of locale and flags.
2457        *  @param  __fill  Char_type to use for filling.
2458        *  @param  __v  Value to format and insert.
2459        *  @return  Iterator after writing.
2460       */
2461       iter_type
2462       put(iter_type __s, ios_base& __io, char_type __fill, double __v) const
2463       { return this->do_put(__s, __io, __fill, __v); }
2464 
2465       iter_type
2466       put(iter_type __s, ios_base& __io, char_type __fill,
2467 	  long double __v) const
2468       { return this->do_put(__s, __io, __fill, __v); }
2469       ///@}
2470 
2471       /**
2472        *  @brief  Numeric formatting.
2473        *
2474        *  Formats the pointer value @a v and inserts it into a stream.  It
2475        *  does so by calling num_put::do_put().
2476        *
2477        *  This function formats @a v as an unsigned long with ios_base::hex
2478        *  and ios_base::showbase set.
2479        *
2480        *  @param  __s  Stream to write to.
2481        *  @param  __io  Source of locale and flags.
2482        *  @param  __fill  Char_type to use for filling.
2483        *  @param  __v  Value to format and insert.
2484        *  @return  Iterator after writing.
2485       */
2486       iter_type
2487       put(iter_type __s, ios_base& __io, char_type __fill,
2488 	  const void* __v) const
2489       { return this->do_put(__s, __io, __fill, __v); }
2490 
2491     protected:
2492       template<typename _ValueT>
2493 	iter_type
2494 	_M_insert_float(iter_type, ios_base& __io, char_type __fill,
2495 			char __mod, _ValueT __v) const;
2496 
2497       void
2498       _M_group_float(const char* __grouping, size_t __grouping_size,
2499 		     char_type __sep, const char_type* __p, char_type* __new,
2500 		     char_type* __cs, int& __len) const;
2501 
2502       template<typename _ValueT>
2503 	iter_type
2504 	_M_insert_int(iter_type, ios_base& __io, char_type __fill,
2505 		      _ValueT __v) const;
2506 
2507       void
2508       _M_group_int(const char* __grouping, size_t __grouping_size,
2509 		   char_type __sep, ios_base& __io, char_type* __new,
2510 		   char_type* __cs, int& __len) const;
2511 
2512       void
2513       _M_pad(char_type __fill, streamsize __w, ios_base& __io,
2514 	     char_type* __new, const char_type* __cs, int& __len) const;
2515 
2516       /// Destructor.
2517       virtual
2518       ~num_put() { }
2519 
2520       ///@{
2521       /**
2522        *  @brief  Numeric formatting.
2523        *
2524        *  These functions do the work of formatting numeric values and
2525        *  inserting them into a stream. This function is a hook for derived
2526        *  classes to change the value returned.
2527        *
2528        *  @param  __s  Stream to write to.
2529        *  @param  __io  Source of locale and flags.
2530        *  @param  __fill  Char_type to use for filling.
2531        *  @param  __v  Value to format and insert.
2532        *  @return  Iterator after writing.
2533       */
2534       virtual iter_type
2535       do_put(iter_type __s, ios_base& __io, char_type __fill, bool __v) const;
2536 
2537       virtual iter_type
2538       do_put(iter_type __s, ios_base& __io, char_type __fill, long __v) const
2539       { return _M_insert_int(__s, __io, __fill, __v); }
2540 
2541       virtual iter_type
2542       do_put(iter_type __s, ios_base& __io, char_type __fill,
2543 	     unsigned long __v) const
2544       { return _M_insert_int(__s, __io, __fill, __v); }
2545 
2546 #ifdef _GLIBCXX_USE_LONG_LONG
2547       virtual iter_type
2548       do_put(iter_type __s, ios_base& __io, char_type __fill,
2549 	     long long __v) const
2550       { return _M_insert_int(__s, __io, __fill, __v); }
2551 
2552       virtual iter_type
2553       do_put(iter_type __s, ios_base& __io, char_type __fill,
2554 	     unsigned long long __v) const
2555       { return _M_insert_int(__s, __io, __fill, __v); }
2556 #endif
2557 
2558       virtual iter_type
2559       do_put(iter_type, ios_base&, char_type, double) const;
2560 
2561       // XXX GLIBCXX_ABI Deprecated
2562 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
2563       virtual iter_type
2564       __do_put(iter_type, ios_base&, char_type, double) const;
2565 #else
2566       virtual iter_type
2567       do_put(iter_type, ios_base&, char_type, long double) const;
2568 #endif
2569 
2570       virtual iter_type
2571       do_put(iter_type, ios_base&, char_type, const void*) const;
2572 
2573       // XXX GLIBCXX_ABI Deprecated
2574 #if defined _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT \
2575       && defined __LONG_DOUBLE_IEEE128__
2576       virtual iter_type
2577       __do_put(iter_type, ios_base&, char_type, __ibm128) const;
2578 #endif
2579 
2580       // XXX GLIBCXX_ABI Deprecated
2581 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
2582       virtual iter_type
2583       do_put(iter_type, ios_base&, char_type, long double) const;
2584 #endif
2585       ///@}
2586     };
2587 
2588   template <typename _CharT, typename _OutIter>
2589     locale::id num_put<_CharT, _OutIter>::id;
2590 
2591 _GLIBCXX_END_NAMESPACE_LDBL
2592 
2593   // Subclause convenience interfaces, inlines.
2594   // NB: These are inline because, when used in a loop, some compilers
2595   // can hoist the body out of the loop; then it's just as fast as the
2596   // C is*() function.
2597 
2598   /// Convenience interface to ctype.is(ctype_base::space, __c).
2599   template<typename _CharT>
2600     inline bool
2601     isspace(_CharT __c, const locale& __loc)
2602     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::space, __c); }
2603 
2604   /// Convenience interface to ctype.is(ctype_base::print, __c).
2605   template<typename _CharT>
2606     inline bool
2607     isprint(_CharT __c, const locale& __loc)
2608     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::print, __c); }
2609 
2610   /// Convenience interface to ctype.is(ctype_base::cntrl, __c).
2611   template<typename _CharT>
2612     inline bool
2613     iscntrl(_CharT __c, const locale& __loc)
2614     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::cntrl, __c); }
2615 
2616   /// Convenience interface to ctype.is(ctype_base::upper, __c).
2617   template<typename _CharT>
2618     inline bool
2619     isupper(_CharT __c, const locale& __loc)
2620     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::upper, __c); }
2621 
2622   /// Convenience interface to ctype.is(ctype_base::lower, __c).
2623   template<typename _CharT>
2624     inline bool
2625     islower(_CharT __c, const locale& __loc)
2626     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::lower, __c); }
2627 
2628   /// Convenience interface to ctype.is(ctype_base::alpha, __c).
2629   template<typename _CharT>
2630     inline bool
2631     isalpha(_CharT __c, const locale& __loc)
2632     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alpha, __c); }
2633 
2634   /// Convenience interface to ctype.is(ctype_base::digit, __c).
2635   template<typename _CharT>
2636     inline bool
2637     isdigit(_CharT __c, const locale& __loc)
2638     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::digit, __c); }
2639 
2640   /// Convenience interface to ctype.is(ctype_base::punct, __c).
2641   template<typename _CharT>
2642     inline bool
2643     ispunct(_CharT __c, const locale& __loc)
2644     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::punct, __c); }
2645 
2646   /// Convenience interface to ctype.is(ctype_base::xdigit, __c).
2647   template<typename _CharT>
2648     inline bool
2649     isxdigit(_CharT __c, const locale& __loc)
2650     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::xdigit, __c); }
2651 
2652   /// Convenience interface to ctype.is(ctype_base::alnum, __c).
2653   template<typename _CharT>
2654     inline bool
2655     isalnum(_CharT __c, const locale& __loc)
2656     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alnum, __c); }
2657 
2658   /// Convenience interface to ctype.is(ctype_base::graph, __c).
2659   template<typename _CharT>
2660     inline bool
2661     isgraph(_CharT __c, const locale& __loc)
2662     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::graph, __c); }
2663 
2664 #if __cplusplus >= 201103L
2665   /// Convenience interface to ctype.is(ctype_base::blank, __c).
2666   template<typename _CharT>
2667     inline bool
2668     isblank(_CharT __c, const locale& __loc)
2669     { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::blank, __c); }
2670 #endif
2671 
2672   /// Convenience interface to ctype.toupper(__c).
2673   template<typename _CharT>
2674     inline _CharT
2675     toupper(_CharT __c, const locale& __loc)
2676     { return use_facet<ctype<_CharT> >(__loc).toupper(__c); }
2677 
2678   /// Convenience interface to ctype.tolower(__c).
2679   template<typename _CharT>
2680     inline _CharT
2681     tolower(_CharT __c, const locale& __loc)
2682     { return use_facet<ctype<_CharT> >(__loc).tolower(__c); }
2683 
2684 _GLIBCXX_END_NAMESPACE_VERSION
2685 } // namespace std
2686 
2687 # include <bits/locale_facets.tcc>
2688 
2689 #endif
2690