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