OpenCores
URL https://opencores.org/ocsvn/altor32/altor32/trunk

Subversion Repositories altor32

[/] [altor32/] [trunk/] [gcc-x64/] [or1knd-elf/] [or1knd-elf/] [include/] [c++/] [4.8.0/] [bits/] [locale_facets.h] - Blame information for rev 35

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 35 ultra_embe
// Locale support -*- C++ -*-
2
 
3
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
4
// 2006, 2007, 2008, 2009, 2010, 2011, 2012
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
1985
       *  numpunct::grouping() and numpunct::thousands_sep().  If the
1986
       *  pattern of digit groups isn't consistent, sets err to
1987
       *  ios_base::failbit.
1988
       *
1989
       *  If parsing the string yields a valid value for @a v, @a v is set.
1990
       *  Otherwise, sets err to ios_base::failbit and leaves @a v unaltered.
1991
       *  Sets err to ios_base::eofbit if the stream is emptied.
1992
       *
1993
       *  @param  __in  Start of input stream.
1994
       *  @param  __end  End of input stream.
1995
       *  @param  __io  Source of locale and flags.
1996
       *  @param  __err  Error flags to set.
1997
       *  @param  __v  Value to format and insert.
1998
       *  @return  Iterator after reading.
1999
      */
2000
      iter_type
2001
      get(iter_type __in, iter_type __end, ios_base& __io,
2002
          ios_base::iostate& __err, long& __v) const
2003
      { return this->do_get(__in, __end, __io, __err, __v); }
2004
 
2005
      iter_type
2006
      get(iter_type __in, iter_type __end, ios_base& __io,
2007
          ios_base::iostate& __err, unsigned short& __v) const
2008
      { return this->do_get(__in, __end, __io, __err, __v); }
2009
 
2010
      iter_type
2011
      get(iter_type __in, iter_type __end, ios_base& __io,
2012
          ios_base::iostate& __err, unsigned int& __v)   const
2013
      { return this->do_get(__in, __end, __io, __err, __v); }
2014
 
2015
      iter_type
2016
      get(iter_type __in, iter_type __end, ios_base& __io,
2017
          ios_base::iostate& __err, unsigned long& __v)  const
2018
      { return this->do_get(__in, __end, __io, __err, __v); }
2019
 
2020
#ifdef _GLIBCXX_USE_LONG_LONG
2021
      iter_type
2022
      get(iter_type __in, iter_type __end, ios_base& __io,
2023
          ios_base::iostate& __err, long long& __v) const
2024
      { return this->do_get(__in, __end, __io, __err, __v); }
2025
 
2026
      iter_type
2027
      get(iter_type __in, iter_type __end, ios_base& __io,
2028
          ios_base::iostate& __err, unsigned long long& __v)  const
2029
      { return this->do_get(__in, __end, __io, __err, __v); }
2030
#endif
2031
      //@}
2032
 
2033
      //@{
2034
      /**
2035
       *  @brief  Numeric parsing.
2036
       *
2037
       *  Parses the input stream into the integral variable @a v.  It does so
2038
       *  by calling num_get::do_get().
2039
       *
2040
       *  The input characters are parsed like the scanf %g specifier.  The
2041
       *  matching type length modifier is also used.
2042
       *
2043
       *  The decimal point character used is numpunct::decimal_point().
2044
       *  Digit grouping is interpreted according to
2045
       *  numpunct::grouping() and numpunct::thousands_sep().  If the
2046
       *  pattern of digit groups isn't consistent, sets err to
2047
       *  ios_base::failbit.
2048
       *
2049
       *  If parsing the string yields a valid value for @a v, @a v is set.
2050
       *  Otherwise, sets err to ios_base::failbit and leaves @a v unaltered.
2051
       *  Sets err to ios_base::eofbit if the stream is emptied.
2052
       *
2053
       *  @param  __in  Start of input stream.
2054
       *  @param  __end  End of input stream.
2055
       *  @param  __io  Source of locale and flags.
2056
       *  @param  __err  Error flags to set.
2057
       *  @param  __v  Value to format and insert.
2058
       *  @return  Iterator after reading.
2059
      */
2060
      iter_type
2061
      get(iter_type __in, iter_type __end, ios_base& __io,
2062
          ios_base::iostate& __err, float& __v) const
2063
      { return this->do_get(__in, __end, __io, __err, __v); }
2064
 
2065
      iter_type
2066
      get(iter_type __in, iter_type __end, ios_base& __io,
2067
          ios_base::iostate& __err, double& __v) const
2068
      { return this->do_get(__in, __end, __io, __err, __v); }
2069
 
2070
      iter_type
2071
      get(iter_type __in, iter_type __end, ios_base& __io,
2072
          ios_base::iostate& __err, long double& __v) const
2073
      { return this->do_get(__in, __end, __io, __err, __v); }
2074
      //@}
2075
 
2076
      /**
2077
       *  @brief  Numeric parsing.
2078
       *
2079
       *  Parses the input stream into the pointer variable @a v.  It does so
2080
       *  by calling num_get::do_get().
2081
       *
2082
       *  The input characters are parsed like the scanf %p specifier.
2083
       *
2084
       *  Digit grouping is interpreted according to
2085
       *  numpunct::grouping() and numpunct::thousands_sep().  If the
2086
       *  pattern of digit groups isn't consistent, sets err to
2087
       *  ios_base::failbit.
2088
       *
2089
       *  Note that the digit grouping effect for pointers is a bit ambiguous
2090
       *  in the standard and shouldn't be relied on.  See DR 344.
2091
       *
2092
       *  If parsing the string yields a valid value for @a v, @a v is set.
2093
       *  Otherwise, sets err to ios_base::failbit and leaves @a v unaltered.
2094
       *  Sets err to ios_base::eofbit if the stream is emptied.
2095
       *
2096
       *  @param  __in  Start of input stream.
2097
       *  @param  __end  End of input stream.
2098
       *  @param  __io  Source of locale and flags.
2099
       *  @param  __err  Error flags to set.
2100
       *  @param  __v  Value to format and insert.
2101
       *  @return  Iterator after reading.
2102
      */
2103
      iter_type
2104
      get(iter_type __in, iter_type __end, ios_base& __io,
2105
          ios_base::iostate& __err, void*& __v) const
2106
      { return this->do_get(__in, __end, __io, __err, __v); }
2107
 
2108
    protected:
2109
      /// Destructor.
2110
      virtual ~num_get() { }
2111
 
2112
      iter_type
2113
      _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
2114
                       string&) const;
2115
 
2116
      template<typename _ValueT>
2117
        iter_type
2118
        _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
2119
                       _ValueT&) const;
2120
 
2121
      template<typename _CharT2>
2122
      typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, int>::__type
2123
        _M_find(const _CharT2*, size_t __len, _CharT2 __c) const
2124
        {
2125
          int __ret = -1;
2126
          if (__len <= 10)
2127
            {
2128
              if (__c >= _CharT2('0') && __c < _CharT2(_CharT2('0') + __len))
2129
                __ret = __c - _CharT2('0');
2130
            }
2131
          else
2132
            {
2133
              if (__c >= _CharT2('0') && __c <= _CharT2('9'))
2134
                __ret = __c - _CharT2('0');
2135
              else if (__c >= _CharT2('a') && __c <= _CharT2('f'))
2136
                __ret = 10 + (__c - _CharT2('a'));
2137
              else if (__c >= _CharT2('A') && __c <= _CharT2('F'))
2138
                __ret = 10 + (__c - _CharT2('A'));
2139
            }
2140
          return __ret;
2141
        }
2142
 
2143
      template<typename _CharT2>
2144
      typename __gnu_cxx::__enable_if<!__is_char<_CharT2>::__value,
2145
                                      int>::__type
2146
        _M_find(const _CharT2* __zero, size_t __len, _CharT2 __c) const
2147
        {
2148
          int __ret = -1;
2149
          const char_type* __q = char_traits<_CharT2>::find(__zero, __len, __c);
2150
          if (__q)
2151
            {
2152
              __ret = __q - __zero;
2153
              if (__ret > 15)
2154
                __ret -= 6;
2155
            }
2156
          return __ret;
2157
        }
2158
 
2159
      //@{
2160
      /**
2161
       *  @brief  Numeric parsing.
2162
       *
2163
       *  Parses the input stream into the variable @a v.  This function is a
2164
       *  hook for derived classes to change the value returned.  @see get()
2165
       *  for more details.
2166
       *
2167
       *  @param  __beg  Start of input stream.
2168
       *  @param  __end  End of input stream.
2169
       *  @param  __io  Source of locale and flags.
2170
       *  @param  __err  Error flags to set.
2171
       *  @param  __v  Value to format and insert.
2172
       *  @return  Iterator after reading.
2173
      */
2174
      virtual iter_type
2175
      do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
2176
 
2177
      virtual iter_type
2178
      do_get(iter_type __beg, iter_type __end, ios_base& __io,
2179
             ios_base::iostate& __err, long& __v) const
2180
      { return _M_extract_int(__beg, __end, __io, __err, __v); }
2181
 
2182
      virtual iter_type
2183
      do_get(iter_type __beg, iter_type __end, ios_base& __io,
2184
             ios_base::iostate& __err, unsigned short& __v) const
2185
      { return _M_extract_int(__beg, __end, __io, __err, __v); }
2186
 
2187
      virtual iter_type
2188
      do_get(iter_type __beg, iter_type __end, ios_base& __io,
2189
             ios_base::iostate& __err, unsigned int& __v) const
2190
      { return _M_extract_int(__beg, __end, __io, __err, __v); }
2191
 
2192
      virtual iter_type
2193
      do_get(iter_type __beg, iter_type __end, ios_base& __io,
2194
             ios_base::iostate& __err, unsigned long& __v) const
2195
      { return _M_extract_int(__beg, __end, __io, __err, __v); }
2196
 
2197
#ifdef _GLIBCXX_USE_LONG_LONG
2198
      virtual iter_type
2199
      do_get(iter_type __beg, iter_type __end, ios_base& __io,
2200
             ios_base::iostate& __err, long long& __v) const
2201
      { return _M_extract_int(__beg, __end, __io, __err, __v); }
2202
 
2203
      virtual iter_type
2204
      do_get(iter_type __beg, iter_type __end, ios_base& __io,
2205
             ios_base::iostate& __err, unsigned long long& __v) const
2206
      { return _M_extract_int(__beg, __end, __io, __err, __v); }
2207
#endif
2208
 
2209
      virtual iter_type
2210
      do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, float&) const;
2211
 
2212
      virtual iter_type
2213
      do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
2214
             double&) const;
2215
 
2216
      // XXX GLIBCXX_ABI Deprecated
2217
#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
2218
      virtual iter_type
2219
      __do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
2220
               double&) const;
2221
#else
2222
      virtual iter_type
2223
      do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
2224
             long double&) const;
2225
#endif
2226
 
2227
      virtual iter_type
2228
      do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, void*&) const;
2229
 
2230
      // XXX GLIBCXX_ABI Deprecated
2231
#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
2232
      virtual iter_type
2233
      do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
2234
             long double&) const;
2235
#endif
2236
      //@}
2237
    };
2238
 
2239
  template<typename _CharT, typename _InIter>
2240
    locale::id num_get<_CharT, _InIter>::id;
2241
 
2242
 
2243
  /**
2244
   *  @brief  Primary class template num_put.
2245
   *  @ingroup locales
2246
   *
2247
   *  This facet encapsulates the code to convert a number to a string.  It is
2248
   *  used by the ostream numeric insertion operators.
2249
   *
2250
   *  The num_put template uses protected virtual functions to provide the
2251
   *  actual results.  The public accessors forward the call to the virtual
2252
   *  functions.  These virtual functions are hooks for developers to
2253
   *  implement the behavior they require from the num_put facet.
2254
  */
2255
  template<typename _CharT, typename _OutIter>
2256
    class num_put : public locale::facet
2257
    {
2258
    public:
2259
      // Types:
2260
      //@{
2261
      /// Public typedefs
2262
      typedef _CharT            char_type;
2263
      typedef _OutIter          iter_type;
2264
      //@}
2265
 
2266
      /// Numpunct facet id.
2267
      static locale::id         id;
2268
 
2269
      /**
2270
       *  @brief  Constructor performs initialization.
2271
       *
2272
       *  This is the constructor provided by the standard.
2273
       *
2274
       *  @param __refs  Passed to the base facet class.
2275
      */
2276
      explicit
2277
      num_put(size_t __refs = 0) : facet(__refs) { }
2278
 
2279
      /**
2280
       *  @brief  Numeric formatting.
2281
       *
2282
       *  Formats the boolean @a v and inserts it into a stream.  It does so
2283
       *  by calling num_put::do_put().
2284
       *
2285
       *  If ios_base::boolalpha is set, writes ctype<CharT>::truename() or
2286
       *  ctype<CharT>::falsename().  Otherwise formats @a v as an int.
2287
       *
2288
       *  @param  __s  Stream to write to.
2289
       *  @param  __io  Source of locale and flags.
2290
       *  @param  __fill  Char_type to use for filling.
2291
       *  @param  __v  Value to format and insert.
2292
       *  @return  Iterator after writing.
2293
      */
2294
      iter_type
2295
      put(iter_type __s, ios_base& __io, char_type __fill, bool __v) const
2296
      { return this->do_put(__s, __io, __fill, __v); }
2297
 
2298
      //@{
2299
      /**
2300
       *  @brief  Numeric formatting.
2301
       *
2302
       *  Formats the integral value @a v and inserts it into a
2303
       *  stream.  It does so by calling num_put::do_put().
2304
       *
2305
       *  Formatting is affected by the flag settings in @a io.
2306
       *
2307
       *  The basic format is affected by the value of io.flags() &
2308
       *  ios_base::basefield.  If equal to ios_base::oct, formats like the
2309
       *  printf %o specifier.  Else if equal to ios_base::hex, formats like
2310
       *  %x or %X with ios_base::uppercase unset or set respectively.
2311
       *  Otherwise, formats like %d, %ld, %lld for signed and %u, %lu, %llu
2312
       *  for unsigned values.  Note that if both oct and hex are set, neither
2313
       *  will take effect.
2314
       *
2315
       *  If ios_base::showpos is set, '+' is output before positive values.
2316
       *  If ios_base::showbase is set, '0' precedes octal values (except 0)
2317
       *  and '0[xX]' precedes hex values.
2318
       *
2319
       *  The decimal point character used is numpunct::decimal_point().
2320
       *  Thousands separators are inserted according to
2321
       *  numpunct::grouping() and numpunct::thousands_sep().
2322
       *
2323
       *  If io.width() is non-zero, enough @a fill characters are inserted to
2324
       *  make the result at least that wide.  If
2325
       *  (io.flags() & ios_base::adjustfield) == ios_base::left, result is
2326
       *  padded at the end.  If ios_base::internal, then padding occurs
2327
       *  immediately after either a '+' or '-' or after '0x' or '0X'.
2328
       *  Otherwise, padding occurs at the beginning.
2329
       *
2330
       *  @param  __s  Stream to write to.
2331
       *  @param  __io  Source of locale and flags.
2332
       *  @param  __fill  Char_type to use for filling.
2333
       *  @param  __v  Value to format and insert.
2334
       *  @return  Iterator after writing.
2335
      */
2336
      iter_type
2337
      put(iter_type __s, ios_base& __io, char_type __fill, long __v) const
2338
      { return this->do_put(__s, __io, __fill, __v); }
2339
 
2340
      iter_type
2341
      put(iter_type __s, ios_base& __io, char_type __fill,
2342
          unsigned long __v) const
2343
      { return this->do_put(__s, __io, __fill, __v); }
2344
 
2345
#ifdef _GLIBCXX_USE_LONG_LONG
2346
      iter_type
2347
      put(iter_type __s, ios_base& __io, char_type __fill, long long __v) const
2348
      { return this->do_put(__s, __io, __fill, __v); }
2349
 
2350
      iter_type
2351
      put(iter_type __s, ios_base& __io, char_type __fill,
2352
          unsigned long long __v) const
2353
      { return this->do_put(__s, __io, __fill, __v); }
2354
#endif
2355
      //@}
2356
 
2357
      //@{
2358
      /**
2359
       *  @brief  Numeric formatting.
2360
       *
2361
       *  Formats the floating point value @a v and inserts it into a stream.
2362
       *  It does so by calling num_put::do_put().
2363
       *
2364
       *  Formatting is affected by the flag settings in @a io.
2365
       *
2366
       *  The basic format is affected by the value of io.flags() &
2367
       *  ios_base::floatfield.  If equal to ios_base::fixed, formats like the
2368
       *  printf %f specifier.  Else if equal to ios_base::scientific, formats
2369
       *  like %e or %E with ios_base::uppercase unset or set respectively.
2370
       *  Otherwise, formats like %g or %G depending on uppercase.  Note that
2371
       *  if both fixed and scientific are set, the effect will also be like
2372
       *  %g or %G.
2373
       *
2374
       *  The output precision is given by io.precision().  This precision is
2375
       *  capped at numeric_limits::digits10 + 2 (different for double and
2376
       *  long double).  The default precision is 6.
2377
       *
2378
       *  If ios_base::showpos is set, '+' is output before positive values.
2379
       *  If ios_base::showpoint is set, a decimal point will always be
2380
       *  output.
2381
       *
2382
       *  The decimal point character used is numpunct::decimal_point().
2383
       *  Thousands separators are inserted according to
2384
       *  numpunct::grouping() and numpunct::thousands_sep().
2385
       *
2386
       *  If io.width() is non-zero, enough @a fill characters are inserted to
2387
       *  make the result at least that wide.  If
2388
       *  (io.flags() & ios_base::adjustfield) == ios_base::left, result is
2389
       *  padded at the end.  If ios_base::internal, then padding occurs
2390
       *  immediately after either a '+' or '-' or after '0x' or '0X'.
2391
       *  Otherwise, padding occurs at the beginning.
2392
       *
2393
       *  @param  __s  Stream to write to.
2394
       *  @param  __io  Source of locale and flags.
2395
       *  @param  __fill  Char_type to use for filling.
2396
       *  @param  __v  Value to format and insert.
2397
       *  @return  Iterator after writing.
2398
      */
2399
      iter_type
2400
      put(iter_type __s, ios_base& __io, char_type __fill, double __v) const
2401
      { return this->do_put(__s, __io, __fill, __v); }
2402
 
2403
      iter_type
2404
      put(iter_type __s, ios_base& __io, char_type __fill,
2405
          long double __v) const
2406
      { return this->do_put(__s, __io, __fill, __v); }
2407
      //@}
2408
 
2409
      /**
2410
       *  @brief  Numeric formatting.
2411
       *
2412
       *  Formats the pointer value @a v and inserts it into a stream.  It
2413
       *  does so by calling num_put::do_put().
2414
       *
2415
       *  This function formats @a v as an unsigned long with ios_base::hex
2416
       *  and ios_base::showbase set.
2417
       *
2418
       *  @param  __s  Stream to write to.
2419
       *  @param  __io  Source of locale and flags.
2420
       *  @param  __fill  Char_type to use for filling.
2421
       *  @param  __v  Value to format and insert.
2422
       *  @return  Iterator after writing.
2423
      */
2424
      iter_type
2425
      put(iter_type __s, ios_base& __io, char_type __fill,
2426
          const void* __v) const
2427
      { return this->do_put(__s, __io, __fill, __v); }
2428
 
2429
    protected:
2430
      template<typename _ValueT>
2431
        iter_type
2432
        _M_insert_float(iter_type, ios_base& __io, char_type __fill,
2433
                        char __mod, _ValueT __v) const;
2434
 
2435
      void
2436
      _M_group_float(const char* __grouping, size_t __grouping_size,
2437
                     char_type __sep, const char_type* __p, char_type* __new,
2438
                     char_type* __cs, int& __len) const;
2439
 
2440
      template<typename _ValueT>
2441
        iter_type
2442
        _M_insert_int(iter_type, ios_base& __io, char_type __fill,
2443
                      _ValueT __v) const;
2444
 
2445
      void
2446
      _M_group_int(const char* __grouping, size_t __grouping_size,
2447
                   char_type __sep, ios_base& __io, char_type* __new,
2448
                   char_type* __cs, int& __len) const;
2449
 
2450
      void
2451
      _M_pad(char_type __fill, streamsize __w, ios_base& __io,
2452
             char_type* __new, const char_type* __cs, int& __len) const;
2453
 
2454
      /// Destructor.
2455
      virtual
2456
      ~num_put() { };
2457
 
2458
      //@{
2459
      /**
2460
       *  @brief  Numeric formatting.
2461
       *
2462
       *  These functions do the work of formatting numeric values and
2463
       *  inserting them into a stream. This function is a hook for derived
2464
       *  classes to change the value returned.
2465
       *
2466
       *  @param  __s  Stream to write to.
2467
       *  @param  __io  Source of locale and flags.
2468
       *  @param  __fill  Char_type to use for filling.
2469
       *  @param  __v  Value to format and insert.
2470
       *  @return  Iterator after writing.
2471
      */
2472
      virtual iter_type
2473
      do_put(iter_type __s, ios_base& __io, char_type __fill, bool __v) const;
2474
 
2475
      virtual iter_type
2476
      do_put(iter_type __s, ios_base& __io, char_type __fill, long __v) const
2477
      { return _M_insert_int(__s, __io, __fill, __v); }
2478
 
2479
      virtual iter_type
2480
      do_put(iter_type __s, ios_base& __io, char_type __fill,
2481
             unsigned long __v) const
2482
      { return _M_insert_int(__s, __io, __fill, __v); }
2483
 
2484
#ifdef _GLIBCXX_USE_LONG_LONG
2485
      virtual iter_type
2486
      do_put(iter_type __s, ios_base& __io, char_type __fill,
2487
             long long __v) const
2488
      { return _M_insert_int(__s, __io, __fill, __v); }
2489
 
2490
      virtual iter_type
2491
      do_put(iter_type __s, ios_base& __io, char_type __fill,
2492
             unsigned long long __v) const
2493
      { return _M_insert_int(__s, __io, __fill, __v); }
2494
#endif
2495
 
2496
      virtual iter_type
2497
      do_put(iter_type, ios_base&, char_type, double) const;
2498
 
2499
      // XXX GLIBCXX_ABI Deprecated
2500
#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
2501
      virtual iter_type
2502
      __do_put(iter_type, ios_base&, char_type, double) const;
2503
#else
2504
      virtual iter_type
2505
      do_put(iter_type, ios_base&, char_type, long double) const;
2506
#endif
2507
 
2508
      virtual iter_type
2509
      do_put(iter_type, ios_base&, char_type, const void*) const;
2510
 
2511
      // XXX GLIBCXX_ABI Deprecated
2512
#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
2513
      virtual iter_type
2514
      do_put(iter_type, ios_base&, char_type, long double) const;
2515
#endif
2516
      //@}
2517
    };
2518
 
2519
  template <typename _CharT, typename _OutIter>
2520
    locale::id num_put<_CharT, _OutIter>::id;
2521
 
2522
_GLIBCXX_END_NAMESPACE_LDBL
2523
 
2524
  // Subclause convenience interfaces, inlines.
2525
  // NB: These are inline because, when used in a loop, some compilers
2526
  // can hoist the body out of the loop; then it's just as fast as the
2527
  // C is*() function.
2528
 
2529
  /// Convenience interface to ctype.is(ctype_base::space, __c).
2530
  template<typename _CharT>
2531
    inline bool
2532
    isspace(_CharT __c, const locale& __loc)
2533
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::space, __c); }
2534
 
2535
  /// Convenience interface to ctype.is(ctype_base::print, __c).
2536
  template<typename _CharT>
2537
    inline bool
2538
    isprint(_CharT __c, const locale& __loc)
2539
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::print, __c); }
2540
 
2541
  /// Convenience interface to ctype.is(ctype_base::cntrl, __c).
2542
  template<typename _CharT>
2543
    inline bool
2544
    iscntrl(_CharT __c, const locale& __loc)
2545
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::cntrl, __c); }
2546
 
2547
  /// Convenience interface to ctype.is(ctype_base::upper, __c).
2548
  template<typename _CharT>
2549
    inline bool
2550
    isupper(_CharT __c, const locale& __loc)
2551
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::upper, __c); }
2552
 
2553
  /// Convenience interface to ctype.is(ctype_base::lower, __c).
2554
  template<typename _CharT>
2555
    inline bool
2556
    islower(_CharT __c, const locale& __loc)
2557
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::lower, __c); }
2558
 
2559
  /// Convenience interface to ctype.is(ctype_base::alpha, __c).
2560
  template<typename _CharT>
2561
    inline bool
2562
    isalpha(_CharT __c, const locale& __loc)
2563
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alpha, __c); }
2564
 
2565
  /// Convenience interface to ctype.is(ctype_base::digit, __c).
2566
  template<typename _CharT>
2567
    inline bool
2568
    isdigit(_CharT __c, const locale& __loc)
2569
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::digit, __c); }
2570
 
2571
  /// Convenience interface to ctype.is(ctype_base::punct, __c).
2572
  template<typename _CharT>
2573
    inline bool
2574
    ispunct(_CharT __c, const locale& __loc)
2575
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::punct, __c); }
2576
 
2577
  /// Convenience interface to ctype.is(ctype_base::xdigit, __c).
2578
  template<typename _CharT>
2579
    inline bool
2580
    isxdigit(_CharT __c, const locale& __loc)
2581
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::xdigit, __c); }
2582
 
2583
  /// Convenience interface to ctype.is(ctype_base::alnum, __c).
2584
  template<typename _CharT>
2585
    inline bool
2586
    isalnum(_CharT __c, const locale& __loc)
2587
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alnum, __c); }
2588
 
2589
  /// Convenience interface to ctype.is(ctype_base::graph, __c).
2590
  template<typename _CharT>
2591
    inline bool
2592
    isgraph(_CharT __c, const locale& __loc)
2593
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::graph, __c); }
2594
 
2595
  /// Convenience interface to ctype.toupper(__c).
2596
  template<typename _CharT>
2597
    inline _CharT
2598
    toupper(_CharT __c, const locale& __loc)
2599
    { return use_facet<ctype<_CharT> >(__loc).toupper(__c); }
2600
 
2601
  /// Convenience interface to ctype.tolower(__c).
2602
  template<typename _CharT>
2603
    inline _CharT
2604
    tolower(_CharT __c, const locale& __loc)
2605
    { return use_facet<ctype<_CharT> >(__loc).tolower(__c); }
2606
 
2607
_GLIBCXX_END_NAMESPACE_VERSION
2608
} // namespace std
2609
 
2610
# include <bits/locale_facets.tcc>
2611
 
2612
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.