OSDN Git Service

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