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