1 // Locale support -*- C++ -*-
2
3 // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
4 // Free Software Foundation, Inc.
5 //
6 // This file is part of the GNU ISO C++ Library. This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 2, or (at your option)
10 // any later version.
11
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16
17 // You should have received a copy of the GNU General Public License along
18 // with this library; see the file COPYING. If not, write to the Free
19 // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
20 // USA.
21
22 // As a special exception, you may use this file as part of a free software
23 // library without restriction. Specifically, if other files instantiate
24 // templates or use macros or inline functions from this file, or you compile
25 // this file and link it with other files to produce an executable, this
26 // file does not by itself cause the resulting executable to be covered by
27 // the GNU General Public License. This exception does not however
28 // invalidate any other reasons why the executable file might be covered by
29 // the GNU General Public License.
30
31 /** @file locale_facets.h
32 * This is an internal header file, included by other library headers.
33 * You should not attempt to use it directly.
34 */
35
36 //
37 // ISO C++ 14882: 22.1 Locales
38 //
39
40 #ifndef _LOCALE_FACETS_H
41 #define _LOCALE_FACETS_H 1
42
43 #pragma GCC system_header
44
45 #include <ctime> // For struct tm
46 #include <cwctype> // For wctype_t
47 #include <bits/ctype_base.h>
48 #include <iosfwd>
49 #include <bits/ios_base.h> // For ios_base, ios_base::iostate
50 #include <streambuf>
51 #include <bits/cpp_type_traits.h>
52
53 _GLIBCXX_BEGIN_NAMESPACE(std)
54
55 // NB: Don't instantiate required wchar_t facets if no wchar_t support.
56 #ifdef _GLIBCXX_USE_WCHAR_T
57 # define _GLIBCXX_NUM_FACETS 28
58 #else
59 # define _GLIBCXX_NUM_FACETS 14
60 #endif
61
62 // Convert string to numeric value of type _Tv and store results.
63 // NB: This is specialized for all required types, there is no
64 // generic definition.
65 template<typename _Tv>
66 void
67 __convert_to_v(const char* __in, _Tv& __out, ios_base::iostate& __err,
68 const __c_locale& __cloc);
69
70 // Explicit specializations for required types.
71 template<>
72 void
73 __convert_to_v(const char*, float&, ios_base::iostate&,
74 const __c_locale&);
75
76 template<>
77 void
78 __convert_to_v(const char*, double&, ios_base::iostate&,
79 const __c_locale&);
80
81 template<>
82 void
83 __convert_to_v(const char*, long double&, ios_base::iostate&,
84 const __c_locale&);
85
86 // NB: __pad is a struct, rather than a function, so it can be
87 // partially-specialized.
88 template<typename _CharT, typename _Traits>
89 struct __pad
90 {
91 static void
92 _S_pad(ios_base& __io, _CharT __fill, _CharT* __news,
93 const _CharT* __olds, const streamsize __newlen,
94 const streamsize __oldlen, const bool __num);
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 __glen != 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>
__write(ostreambuf_iterator<_CharT> __s,const _CharT * __ws,int __len)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
__write(_OutIter __s,const _CharT * __ws,int __len)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 // Common base for ctype<_CharT>.
136 /**
137 * @brief Common base for ctype facet
138 *
139 * This template class provides implementations of the public functions
140 * that forward to the protected virtual functions.
141 *
142 * This template also provides abtract stubs for the protected virtual
143 * functions.
144 */
145 template<typename _CharT>
146 class __ctype_abstract_base : public locale::facet, public ctype_base
147 {
148 public:
149 // Types:
150 /// Typedef for the template parameter
151 typedef _CharT char_type;
152
153 /**
154 * @brief Test char_type classification.
155 *
156 * This function finds a mask M for @a c and compares it to mask @a m.
157 * It does so by returning the value of 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
is(mask __m,char_type __c)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*
is(const char_type * __lo,const char_type * __hi,mask * __vec)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*
scan_is(mask __m,const char_type * __lo,const char_type * __hi)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*
scan_not(mask __m,const char_type * __lo,const char_type * __hi)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
toupper(char_type __c)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*
toupper(char_type * __lo,const char_type * __hi)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
tolower(char_type __c)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*
tolower(char_type * __lo,const char_type * __hi)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
widen(char __c)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*
widen(const char * __lo,const char * __hi,char_type * __to)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
narrow(char_type __c,char __dfault)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*
narrow(const char_type * __lo,const char_type * __hi,char __dfault,char * __to)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
facet(__refs)354 __ctype_abstract_base(size_t __refs = 0): facet(__refs) { }
355
356 virtual
~__ctype_abstract_base()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) 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) 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) 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,
539 char_type* __dest) const = 0;
540
541 /**
542 * @brief Narrow char_type to char
543 *
544 * This virtual function converts the argument to char using the
545 * simplest reasonable transformation. If the conversion fails, dfault
546 * is returned instead.
547 *
548 * do_narrow() is a hook for a derived facet to change the behavior of
549 * narrowing. do_narrow() must always return the same result for the
550 * same input.
551 *
552 * Note: this is not what you want for codepage conversions. See
553 * codecvt for that.
554 *
555 * @param c The char_type to convert.
556 * @param dfault Char to return if conversion fails.
557 * @return The converted char.
558 */
559 virtual char
560 do_narrow(char_type, char __dfault) const = 0;
561
562 /**
563 * @brief Narrow char_type array to char
564 *
565 * This virtual function converts each char_type in the range [lo,hi) to
566 * char using the simplest reasonable transformation and writes the
567 * results to the destination array. For any element in the input that
568 * cannot be 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* __dest) const = 0;
586 };
587
588 // NB: Generic, mostly useless implementation.
589 /**
590 * @brief Template ctype facet
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* __dest) const;
661 };
662
663 template<typename _CharT>
664 locale::id ctype<_CharT>::id;
665
666 // 22.2.1.3 ctype<char> specialization.
667 /**
668 * @brief The ctype<char> specialization.
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
toupper(char_type __c)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*
toupper(char_type * __lo,const char_type * __hi)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
tolower(char_type __c)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*
tolower(char_type * __lo,const char_type * __hi)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
widen(char __c)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*
widen(const char * __lo,const char * __hi,char_type * __to)894 widen(const char* __lo, const char* __hi, char_type* __to) const
895 {
896 if (_M_widen_ok == 1)
897 {
898 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
narrow(char_type __c,char __dfault)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*
narrow(const char_type * __lo,const char_type * __hi,char __dfault,char * __to)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 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 protected:
972 /// Returns a pointer to the mask table provided to the constructor, or
973 /// the default from classic_table() if none was provided.
974 const mask*
table()975 table() const throw()
976 { return _M_table; }
977
978 /// Returns a pointer to the C locale mask table.
979 static const mask*
980 classic_table() throw();
981
982 /**
983 * @brief Destructor.
984 *
985 * This function deletes table() if @a del was true in the
986 * constructor.
987 */
988 virtual
989 ~ctype();
990
991 /**
992 * @brief Convert to uppercase.
993 *
994 * This virtual function converts the char argument to uppercase if
995 * possible. If not possible (for example, '2'), returns the argument.
996 *
997 * do_toupper() is a hook for a derived facet to change the behavior of
998 * uppercasing. do_toupper() must always return the same result for
999 * the same input.
1000 *
1001 * @param c The char to convert.
1002 * @return The uppercase char if convertible, else @a c.
1003 */
1004 virtual char_type
1005 do_toupper(char_type) const;
1006
1007 /**
1008 * @brief Convert array to uppercase.
1009 *
1010 * This virtual function converts each char in the range [lo,hi) to
1011 * uppercase if possible. Other chars remain untouched.
1012 *
1013 * do_toupper() is a hook for a derived facet to change the behavior of
1014 * uppercasing. do_toupper() must always return the same result for
1015 * the same input.
1016 *
1017 * @param lo Pointer to start of range.
1018 * @param hi Pointer to end of range.
1019 * @return @a hi.
1020 */
1021 virtual const char_type*
1022 do_toupper(char_type* __lo, const char_type* __hi) const;
1023
1024 /**
1025 * @brief Convert to lowercase.
1026 *
1027 * This virtual function converts the char argument to lowercase if
1028 * possible. If not possible (for example, '2'), returns the argument.
1029 *
1030 * do_tolower() is a hook for a derived facet to change the behavior of
1031 * lowercasing. do_tolower() must always return the same result for
1032 * the same input.
1033 *
1034 * @param c The char to convert.
1035 * @return The lowercase char if convertible, else @a c.
1036 */
1037 virtual char_type
1038 do_tolower(char_type) const;
1039
1040 /**
1041 * @brief Convert array to lowercase.
1042 *
1043 * This virtual function converts each char in the range [lo,hi) to
1044 * lowercase if possible. Other chars remain untouched.
1045 *
1046 * do_tolower() is a hook for a derived facet to change the behavior of
1047 * lowercasing. do_tolower() must always return the same result for
1048 * the same input.
1049 *
1050 * @param lo Pointer to first char in range.
1051 * @param hi Pointer to end of range.
1052 * @return @a hi.
1053 */
1054 virtual const char_type*
1055 do_tolower(char_type* __lo, const char_type* __hi) const;
1056
1057 /**
1058 * @brief Widen char
1059 *
1060 * This virtual function converts the char to char using the simplest
1061 * reasonable transformation. For an underived ctype<char> facet, the
1062 * argument will be returned unchanged.
1063 *
1064 * do_widen() is a hook for a derived facet to change the behavior of
1065 * widening. do_widen() must always return the same result for the
1066 * same input.
1067 *
1068 * Note: this is not what you want for codepage conversions. See
1069 * codecvt for that.
1070 *
1071 * @param c The char to convert.
1072 * @return The converted character.
1073 */
1074 virtual char_type
do_widen(char __c)1075 do_widen(char __c) const
1076 { return __c; }
1077
1078 /**
1079 * @brief Widen char array
1080 *
1081 * This function converts each char in the range [lo,hi) to char using
1082 * the simplest reasonable transformation. For an underived
1083 * ctype<char> facet, the argument will be copied unchanged.
1084 *
1085 * do_widen() is a hook for a derived facet to change the behavior of
1086 * widening. do_widen() must always return the same result for the
1087 * same input.
1088 *
1089 * Note: this is not what you want for codepage conversions. See
1090 * codecvt for that.
1091 *
1092 * @param lo Pointer to start of range.
1093 * @param hi Pointer to end of range.
1094 * @param to Pointer to the destination array.
1095 * @return @a hi.
1096 */
1097 virtual const char*
do_widen(const char * __lo,const char * __hi,char_type * __dest)1098 do_widen(const char* __lo, const char* __hi, char_type* __dest) const
1099 {
1100 memcpy(__dest, __lo, __hi - __lo);
1101 return __hi;
1102 }
1103
1104 /**
1105 * @brief Narrow char
1106 *
1107 * This virtual function converts the char to char using the simplest
1108 * reasonable transformation. If the conversion fails, dfault is
1109 * returned instead. For an underived ctype<char> facet, @a c will be
1110 * returned unchanged.
1111 *
1112 * do_narrow() is a hook for a derived facet to change the behavior of
1113 * narrowing. do_narrow() must always return the same result for the
1114 * same input.
1115 *
1116 * Note: this is not what you want for codepage conversions. See
1117 * codecvt for that.
1118 *
1119 * @param c The char to convert.
1120 * @param dfault Char to return if conversion fails.
1121 * @return The converted char.
1122 */
1123 virtual char
do_narrow(char_type __c,char)1124 do_narrow(char_type __c, char) const
1125 { return __c; }
1126
1127 /**
1128 * @brief Narrow char array to char array
1129 *
1130 * This virtual function converts each char in the range [lo,hi) to
1131 * char using the simplest reasonable transformation and writes the
1132 * results to the destination array. For any char in the input that
1133 * cannot be converted, @a dfault is used instead. For an underived
1134 * ctype<char> facet, the argument will be copied unchanged.
1135 *
1136 * do_narrow() is a hook for a derived facet to change the behavior of
1137 * narrowing. do_narrow() must always return the same result for the
1138 * same input.
1139 *
1140 * Note: this is not what you want for codepage conversions. See
1141 * codecvt for that.
1142 *
1143 * @param lo Pointer to start of range.
1144 * @param hi Pointer to end of range.
1145 * @param dfault Char to use if conversion fails.
1146 * @param to Pointer to the destination array.
1147 * @return @a hi.
1148 */
1149 virtual const char_type*
do_narrow(const char_type * __lo,const char_type * __hi,char,char * __dest)1150 do_narrow(const char_type* __lo, const char_type* __hi,
1151 char, char* __dest) const
1152 {
1153 memcpy(__dest, __lo, __hi - __lo);
1154 return __hi;
1155 }
1156
1157 private:
1158
_M_widen_init()1159 void _M_widen_init() const
1160 {
1161 char __tmp[sizeof(_M_widen)];
1162 for (size_t __i = 0; __i < sizeof(_M_widen); ++__i)
1163 __tmp[__i] = __i;
1164 do_widen(__tmp, __tmp + sizeof(__tmp), _M_widen);
1165
1166 _M_widen_ok = 1;
1167 // Set _M_widen_ok to 2 if memcpy can't be used.
1168 if (memcmp(__tmp, _M_widen, sizeof(_M_widen)))
1169 _M_widen_ok = 2;
1170 }
1171
1172 // Fill in the narrowing cache and flag whether all values are
1173 // valid or not. _M_narrow_ok is set to 2 if memcpy can't
1174 // be used.
_M_narrow_init()1175 void _M_narrow_init() const
1176 {
1177 char __tmp[sizeof(_M_narrow)];
1178 for (size_t __i = 0; __i < sizeof(_M_narrow); ++__i)
1179 __tmp[__i] = __i;
1180 do_narrow(__tmp, __tmp + sizeof(__tmp), 0, _M_narrow);
1181
1182 _M_narrow_ok = 1;
1183 if (memcmp(__tmp, _M_narrow, sizeof(_M_narrow)))
1184 _M_narrow_ok = 2;
1185 else
1186 {
1187 // Deal with the special case of zero: renarrow with a
1188 // different default and compare.
1189 char __c;
1190 do_narrow(__tmp, __tmp + 1, 1, &__c);
1191 if (__c == 1)
1192 _M_narrow_ok = 2;
1193 }
1194 }
1195 };
1196
1197 template<>
1198 const ctype<char>&
1199 use_facet<ctype<char> >(const locale& __loc);
1200
1201 #ifdef _GLIBCXX_USE_WCHAR_T
1202 // 22.2.1.3 ctype<wchar_t> specialization
1203 /**
1204 * @brief The ctype<wchar_t> specialization.
1205 *
1206 * This class defines classification and conversion functions for the
1207 * wchar_t type. It gets used by wchar_t streams for many I/O operations.
1208 * The wchar_t specialization provides a number of optimizations as well.
1209 *
1210 * ctype<wchar_t> inherits its public methods from
1211 * __ctype_abstract_base<wchar_t>.
1212 */
1213 template<>
1214 class ctype<wchar_t> : public __ctype_abstract_base<wchar_t>
1215 {
1216 public:
1217 // Types:
1218 /// Typedef for the template parameter wchar_t.
1219 typedef wchar_t char_type;
1220 typedef wctype_t __wmask_type;
1221
1222 protected:
1223 __c_locale _M_c_locale_ctype;
1224
1225 // Pre-computed narrowed and widened chars.
1226 bool _M_narrow_ok;
1227 char _M_narrow[128];
1228 wint_t _M_widen[1 + static_cast<unsigned char>(-1)];
1229
1230 // Pre-computed elements for do_is.
1231 mask _M_bit[16];
1232 __wmask_type _M_wmask[16];
1233
1234 public:
1235 // Data Members:
1236 /// The facet id for ctype<wchar_t>
1237 static locale::id id;
1238
1239 /**
1240 * @brief Constructor performs initialization.
1241 *
1242 * This is the constructor provided by the standard.
1243 *
1244 * @param refs Passed to the base facet class.
1245 */
1246 explicit
1247 ctype(size_t __refs = 0);
1248
1249 /**
1250 * @brief Constructor performs static initialization.
1251 *
1252 * This constructor is used to construct the initial C locale facet.
1253 *
1254 * @param cloc Handle to C locale data.
1255 * @param refs Passed to the base facet class.
1256 */
1257 explicit
1258 ctype(__c_locale __cloc, size_t __refs = 0);
1259
1260 protected:
1261 __wmask_type
1262 _M_convert_to_wmask(const mask __m) const;
1263
1264 /// Destructor
1265 virtual
1266 ~ctype();
1267
1268 /**
1269 * @brief Test wchar_t classification.
1270 *
1271 * This function finds a mask M for @a c and compares it to mask @a m.
1272 *
1273 * do_is() is a hook for a derived facet to change the behavior of
1274 * classifying. do_is() must always return the same result for the
1275 * same input.
1276 *
1277 * @param c The wchar_t to find the mask of.
1278 * @param m The mask to compare against.
1279 * @return (M & m) != 0.
1280 */
1281 virtual bool
1282 do_is(mask __m, char_type __c) const;
1283
1284 /**
1285 * @brief Return a mask array.
1286 *
1287 * This function finds the mask for each wchar_t in the range [lo,hi)
1288 * and successively writes it to vec. vec must have as many elements
1289 * as the input.
1290 *
1291 * do_is() is a hook for a derived facet to change the behavior of
1292 * classifying. do_is() must always return the same result for the
1293 * same input.
1294 *
1295 * @param lo Pointer to start of range.
1296 * @param hi Pointer to end of range.
1297 * @param vec Pointer to an array of mask storage.
1298 * @return @a hi.
1299 */
1300 virtual const char_type*
1301 do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
1302
1303 /**
1304 * @brief Find wchar_t matching mask
1305 *
1306 * This function searches for and returns the first wchar_t c in
1307 * [lo,hi) for which is(m,c) is true.
1308 *
1309 * do_scan_is() is a hook for a derived facet to change the behavior of
1310 * match searching. do_is() must always return the same result for the
1311 * same input.
1312 *
1313 * @param m The mask to compare against.
1314 * @param lo Pointer to start of range.
1315 * @param hi Pointer to end of range.
1316 * @return Pointer to a matching wchar_t if found, else @a hi.
1317 */
1318 virtual const char_type*
1319 do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
1320
1321 /**
1322 * @brief Find wchar_t not matching mask
1323 *
1324 * This function searches for and returns a pointer to the first
1325 * wchar_t c of [lo,hi) for which is(m,c) is false.
1326 *
1327 * do_scan_is() is a hook for a derived facet to change the behavior of
1328 * match searching. do_is() must always return the same result for the
1329 * same input.
1330 *
1331 * @param m The mask to compare against.
1332 * @param lo Pointer to start of range.
1333 * @param hi Pointer to end of range.
1334 * @return Pointer to a non-matching wchar_t if found, else @a hi.
1335 */
1336 virtual const char_type*
1337 do_scan_not(mask __m, const char_type* __lo,
1338 const char_type* __hi) const;
1339
1340 /**
1341 * @brief Convert to uppercase.
1342 *
1343 * This virtual function converts the wchar_t argument to uppercase if
1344 * possible. If not possible (for example, '2'), returns the argument.
1345 *
1346 * do_toupper() is a hook for a derived facet to change the behavior of
1347 * uppercasing. do_toupper() must always return the same result for
1348 * the same input.
1349 *
1350 * @param c The wchar_t to convert.
1351 * @return The uppercase wchar_t if convertible, else @a c.
1352 */
1353 virtual char_type
1354 do_toupper(char_type) const;
1355
1356 /**
1357 * @brief Convert array to uppercase.
1358 *
1359 * This virtual function converts each wchar_t in the range [lo,hi) to
1360 * uppercase if possible. Other elements remain untouched.
1361 *
1362 * do_toupper() is a hook for a derived facet to change the behavior of
1363 * uppercasing. do_toupper() must always return the same result for
1364 * the same input.
1365 *
1366 * @param lo Pointer to start of range.
1367 * @param hi Pointer to end of range.
1368 * @return @a hi.
1369 */
1370 virtual const char_type*
1371 do_toupper(char_type* __lo, const char_type* __hi) const;
1372
1373 /**
1374 * @brief Convert to lowercase.
1375 *
1376 * This virtual function converts the argument to lowercase if
1377 * possible. If not possible (for example, '2'), returns the argument.
1378 *
1379 * do_tolower() is a hook for a derived facet to change the behavior of
1380 * lowercasing. do_tolower() must always return the same result for
1381 * the same input.
1382 *
1383 * @param c The wchar_t to convert.
1384 * @return The lowercase wchar_t if convertible, else @a c.
1385 */
1386 virtual char_type
1387 do_tolower(char_type) const;
1388
1389 /**
1390 * @brief Convert array to lowercase.
1391 *
1392 * This virtual function converts each wchar_t in the range [lo,hi) to
1393 * lowercase if possible. Other elements remain untouched.
1394 *
1395 * do_tolower() is a hook for a derived facet to change the behavior of
1396 * lowercasing. do_tolower() must always return the same result for
1397 * the same input.
1398 *
1399 * @param lo Pointer to start of range.
1400 * @param hi Pointer to end of range.
1401 * @return @a hi.
1402 */
1403 virtual const char_type*
1404 do_tolower(char_type* __lo, const char_type* __hi) const;
1405
1406 /**
1407 * @brief Widen char to wchar_t
1408 *
1409 * This virtual function converts the char to wchar_t using the
1410 * simplest reasonable transformation. For an underived ctype<wchar_t>
1411 * facet, the argument will be cast to wchar_t.
1412 *
1413 * do_widen() is a hook for a derived facet to change the behavior of
1414 * widening. do_widen() must always return the same result for the
1415 * same input.
1416 *
1417 * Note: this is not what you want for codepage conversions. See
1418 * codecvt for that.
1419 *
1420 * @param c The char to convert.
1421 * @return The converted wchar_t.
1422 */
1423 virtual char_type
1424 do_widen(char) const;
1425
1426 /**
1427 * @brief Widen char array to wchar_t array
1428 *
1429 * This function converts each char in the input to wchar_t using the
1430 * simplest reasonable transformation. For an underived ctype<wchar_t>
1431 * facet, the argument will be copied, casting each element to wchar_t.
1432 *
1433 * do_widen() is a hook for a derived facet to change the behavior of
1434 * widening. do_widen() must always return the same result for the
1435 * same input.
1436 *
1437 * Note: this is not what you want for codepage conversions. See
1438 * codecvt for that.
1439 *
1440 * @param lo Pointer to start range.
1441 * @param hi Pointer to end of range.
1442 * @param to Pointer to the destination array.
1443 * @return @a hi.
1444 */
1445 virtual const char*
1446 do_widen(const char* __lo, const char* __hi, char_type* __dest) const;
1447
1448 /**
1449 * @brief Narrow wchar_t to char
1450 *
1451 * This virtual function converts the argument to char using
1452 * the simplest reasonable transformation. If the conversion
1453 * fails, dfault is returned instead. For an underived
1454 * ctype<wchar_t> facet, @a c will be cast to char and
1455 * returned.
1456 *
1457 * do_narrow() is a hook for a derived facet to change the
1458 * behavior of narrowing. do_narrow() must always return the
1459 * same result for the same input.
1460 *
1461 * Note: this is not what you want for codepage conversions. See
1462 * codecvt for that.
1463 *
1464 * @param c The wchar_t to convert.
1465 * @param dfault Char to return if conversion fails.
1466 * @return The converted char.
1467 */
1468 virtual char
1469 do_narrow(char_type, char __dfault) const;
1470
1471 /**
1472 * @brief Narrow wchar_t array to char array
1473 *
1474 * This virtual function converts each wchar_t in the range [lo,hi) to
1475 * char using the simplest reasonable transformation and writes the
1476 * results to the destination array. For any wchar_t in the input that
1477 * cannot be converted, @a dfault is used instead. For an underived
1478 * ctype<wchar_t> facet, the argument will be copied, casting each
1479 * element to char.
1480 *
1481 * do_narrow() is a hook for a derived facet to change the behavior of
1482 * narrowing. do_narrow() must always return the same result for the
1483 * same input.
1484 *
1485 * Note: this is not what you want for codepage conversions. See
1486 * codecvt for that.
1487 *
1488 * @param lo Pointer to start of range.
1489 * @param hi Pointer to end of range.
1490 * @param dfault Char to use if conversion fails.
1491 * @param to Pointer to the destination array.
1492 * @return @a hi.
1493 */
1494 virtual const char_type*
1495 do_narrow(const char_type* __lo, const char_type* __hi,
1496 char __dfault, char* __dest) const;
1497
1498 // For use at construction time only.
1499 void
1500 _M_initialize_ctype();
1501 };
1502
1503 template<>
1504 const ctype<wchar_t>&
1505 use_facet<ctype<wchar_t> >(const locale& __loc);
1506 #endif //_GLIBCXX_USE_WCHAR_T
1507
1508 /// @brief class ctype_byname [22.2.1.2].
1509 template<typename _CharT>
1510 class ctype_byname : public ctype<_CharT>
1511 {
1512 public:
1513 typedef _CharT char_type;
1514
1515 explicit
1516 ctype_byname(const char* __s, size_t __refs = 0);
1517
1518 protected:
1519 virtual
~ctype_byname()1520 ~ctype_byname() { };
1521 };
1522
1523 /// 22.2.1.4 Class ctype_byname specializations.
1524 template<>
1525 ctype_byname<char>::ctype_byname(const char*, size_t refs);
1526
1527 template<>
1528 ctype_byname<wchar_t>::ctype_byname(const char*, size_t refs);
1529
1530 _GLIBCXX_END_NAMESPACE
1531
1532 // Include host and configuration specific ctype inlines.
1533 #include <bits/ctype_inline.h>
1534
1535 // 22.2.1.5 Template class codecvt
1536 #include <bits/codecvt.h>
1537
_GLIBCXX_BEGIN_NAMESPACE(std)1538 _GLIBCXX_BEGIN_NAMESPACE(std)
1539
1540 // 22.2.2 The numeric category.
1541 class __num_base
1542 {
1543 public:
1544 // NB: Code depends on the order of _S_atoms_out elements.
1545 // Below are the indices into _S_atoms_out.
1546 enum
1547 {
1548 _S_ominus,
1549 _S_oplus,
1550 _S_ox,
1551 _S_oX,
1552 _S_odigits,
1553 _S_odigits_end = _S_odigits + 16,
1554 _S_oudigits = _S_odigits_end,
1555 _S_oudigits_end = _S_oudigits + 16,
1556 _S_oe = _S_odigits + 14, // For scientific notation, 'e'
1557 _S_oE = _S_oudigits + 14, // For scientific notation, 'E'
1558 _S_oend = _S_oudigits_end
1559 };
1560
1561 // A list of valid numeric literals for output. This array
1562 // contains chars that will be passed through the current locale's
1563 // ctype<_CharT>.widen() and then used to render numbers.
1564 // For the standard "C" locale, this is
1565 // "-+xX0123456789abcdef0123456789ABCDEF".
1566 static const char* _S_atoms_out;
1567
1568 // String literal of acceptable (narrow) input, for num_get.
1569 // "-+xX0123456789abcdefABCDEF"
1570 static const char* _S_atoms_in;
1571
1572 enum
1573 {
1574 _S_iminus,
1575 _S_iplus,
1576 _S_ix,
1577 _S_iX,
1578 _S_izero,
1579 _S_ie = _S_izero + 14,
1580 _S_iE = _S_izero + 20,
1581 _S_iend = 26
1582 };
1583
1584 // num_put
1585 // Construct and return valid scanf format for floating point types.
1586 static void
1587 _S_format_float(const ios_base& __io, char* __fptr, char __mod);
1588 };
1589
1590 template<typename _CharT>
1591 struct __numpunct_cache : public locale::facet
1592 {
1593 const char* _M_grouping;
1594 size_t _M_grouping_size;
1595 bool _M_use_grouping;
1596 const _CharT* _M_truename;
1597 size_t _M_truename_size;
1598 const _CharT* _M_falsename;
1599 size_t _M_falsename_size;
1600 _CharT _M_decimal_point;
1601 _CharT _M_thousands_sep;
1602
1603 // A list of valid numeric literals for output: in the standard
1604 // "C" locale, this is "-+xX0123456789abcdef0123456789ABCDEF".
1605 // This array contains the chars after having been passed
1606 // through the current locale's ctype<_CharT>.widen().
1607 _CharT _M_atoms_out[__num_base::_S_oend];
1608
1609 // A list of valid numeric literals for input: in the standard
1610 // "C" locale, this is "-+xX0123456789abcdefABCDEF"
1611 // This array contains the chars after having been passed
1612 // through the current locale's ctype<_CharT>.widen().
1613 _CharT _M_atoms_in[__num_base::_S_iend];
1614
1615 bool _M_allocated;
1616
facet__numpunct_cache1617 __numpunct_cache(size_t __refs = 0) : facet(__refs),
1618 _M_grouping(NULL), _M_grouping_size(0), _M_use_grouping(false),
1619 _M_truename(NULL), _M_truename_size(0), _M_falsename(NULL),
1620 _M_falsename_size(0), _M_decimal_point(_CharT()),
1621 _M_thousands_sep(_CharT()), _M_allocated(false)
1622 { }
1623
1624 ~__numpunct_cache();
1625
1626 void
1627 _M_cache(const locale& __loc);
1628
1629 private:
1630 __numpunct_cache&
1631 operator=(const __numpunct_cache&);
1632
1633 explicit
1634 __numpunct_cache(const __numpunct_cache&);
1635 };
1636
1637 template<typename _CharT>
~__numpunct_cache()1638 __numpunct_cache<_CharT>::~__numpunct_cache()
1639 {
1640 if (_M_allocated)
1641 {
1642 delete [] _M_grouping;
1643 delete [] _M_truename;
1644 delete [] _M_falsename;
1645 }
1646 }
1647
1648 /**
1649 * @brief Numpunct facet.
1650 *
1651 * This facet stores several pieces of information related to printing and
1652 * scanning numbers, such as the decimal point character. It takes a
1653 * template parameter specifying the char type. The numpunct facet is
1654 * used by streams for many I/O operations involving numbers.
1655 *
1656 * The numpunct template uses protected virtual functions to provide the
1657 * actual results. The public accessors forward the call to the virtual
1658 * functions. These virtual functions are hooks for developers to
1659 * implement the behavior they require from a numpunct facet.
1660 */
1661 template<typename _CharT>
1662 class numpunct : public locale::facet
1663 {
1664 public:
1665 // Types:
1666 //@{
1667 /// Public typedefs
1668 typedef _CharT char_type;
1669 typedef basic_string<_CharT> string_type;
1670 //@}
1671 typedef __numpunct_cache<_CharT> __cache_type;
1672
1673 protected:
1674 __cache_type* _M_data;
1675
1676 public:
1677 /// Numpunct facet id.
1678 static locale::id id;
1679
1680 /**
1681 * @brief Numpunct constructor.
1682 *
1683 * @param refs Refcount to pass to the base class.
1684 */
1685 explicit
facet(__refs)1686 numpunct(size_t __refs = 0) : facet(__refs), _M_data(NULL)
1687 { _M_initialize_numpunct(); }
1688
1689 /**
1690 * @brief Internal constructor. Not for general use.
1691 *
1692 * This is a constructor for use by the library itself to set up the
1693 * predefined locale facets.
1694 *
1695 * @param cache __numpunct_cache object.
1696 * @param refs Refcount to pass to the base class.
1697 */
1698 explicit
1699 numpunct(__cache_type* __cache, size_t __refs = 0)
facet(__refs)1700 : facet(__refs), _M_data(__cache)
1701 { _M_initialize_numpunct(); }
1702
1703 /**
1704 * @brief Internal constructor. Not for general use.
1705 *
1706 * This is a constructor for use by the library itself to set up new
1707 * locales.
1708 *
1709 * @param cloc The "C" locale.
1710 * @param refs Refcount to pass to the base class.
1711 */
1712 explicit
1713 numpunct(__c_locale __cloc, size_t __refs = 0)
facet(__refs)1714 : facet(__refs), _M_data(NULL)
1715 { _M_initialize_numpunct(__cloc); }
1716
1717 /**
1718 * @brief Return decimal point character.
1719 *
1720 * This function returns a char_type to use as a decimal point. It
1721 * does so by returning returning
1722 * numpunct<char_type>::do_decimal_point().
1723 *
1724 * @return @a char_type representing a decimal point.
1725 */
1726 char_type
decimal_point()1727 decimal_point() const
1728 { return this->do_decimal_point(); }
1729
1730 /**
1731 * @brief Return thousands separator character.
1732 *
1733 * This function returns a char_type to use as a thousands
1734 * separator. It does so by returning returning
1735 * numpunct<char_type>::do_thousands_sep().
1736 *
1737 * @return char_type representing a thousands separator.
1738 */
1739 char_type
thousands_sep()1740 thousands_sep() const
1741 { return this->do_thousands_sep(); }
1742
1743 /**
1744 * @brief Return grouping specification.
1745 *
1746 * This function returns a string representing groupings for the
1747 * integer part of a number. Groupings indicate where thousands
1748 * separators should be inserted in the integer part of a number.
1749 *
1750 * Each char in the return string is interpret as an integer
1751 * rather than a character. These numbers represent the number
1752 * of digits in a group. The first char in the string
1753 * represents the number of digits in the least significant
1754 * group. If a char is negative, it indicates an unlimited
1755 * number of digits for the group. If more chars from the
1756 * string are required to group a number, the last char is used
1757 * repeatedly.
1758 *
1759 * For example, if the grouping() returns "\003\002" and is
1760 * applied to the number 123456789, this corresponds to
1761 * 12,34,56,789. Note that if the string was "32", this would
1762 * put more than 50 digits into the least significant group if
1763 * the character set is ASCII.
1764 *
1765 * The string is returned by calling
1766 * numpunct<char_type>::do_grouping().
1767 *
1768 * @return string representing grouping specification.
1769 */
1770 string
grouping()1771 grouping() const
1772 { return this->do_grouping(); }
1773
1774 /**
1775 * @brief Return string representation of bool true.
1776 *
1777 * This function returns a string_type containing the text
1778 * representation for true bool variables. It does so by calling
1779 * numpunct<char_type>::do_truename().
1780 *
1781 * @return string_type representing printed form of true.
1782 */
1783 string_type
truename()1784 truename() const
1785 { return this->do_truename(); }
1786
1787 /**
1788 * @brief Return string representation of bool false.
1789 *
1790 * This function returns a string_type containing the text
1791 * representation for false bool variables. It does so by calling
1792 * numpunct<char_type>::do_falsename().
1793 *
1794 * @return string_type representing printed form of false.
1795 */
1796 string_type
falsename()1797 falsename() const
1798 { return this->do_falsename(); }
1799
1800 protected:
1801 /// Destructor.
1802 virtual
1803 ~numpunct();
1804
1805 /**
1806 * @brief Return decimal point character.
1807 *
1808 * Returns a char_type to use as a decimal point. This function is a
1809 * hook for derived classes to change the value returned.
1810 *
1811 * @return @a char_type representing a decimal point.
1812 */
1813 virtual char_type
do_decimal_point()1814 do_decimal_point() const
1815 { return _M_data->_M_decimal_point; }
1816
1817 /**
1818 * @brief Return thousands separator character.
1819 *
1820 * Returns a char_type to use as a thousands separator. This function
1821 * is a hook for derived classes to change the value returned.
1822 *
1823 * @return @a char_type representing a thousands separator.
1824 */
1825 virtual char_type
do_thousands_sep()1826 do_thousands_sep() const
1827 { return _M_data->_M_thousands_sep; }
1828
1829 /**
1830 * @brief Return grouping specification.
1831 *
1832 * Returns a string representing groupings for the integer part of a
1833 * number. This function is a hook for derived classes to change the
1834 * value returned. @see grouping() for details.
1835 *
1836 * @return String representing grouping specification.
1837 */
1838 virtual string
do_grouping()1839 do_grouping() const
1840 { return _M_data->_M_grouping; }
1841
1842 /**
1843 * @brief Return string representation of bool true.
1844 *
1845 * Returns a string_type containing the text representation for true
1846 * bool variables. This function is a hook for derived classes to
1847 * change the value returned.
1848 *
1849 * @return string_type representing printed form of true.
1850 */
1851 virtual string_type
do_truename()1852 do_truename() const
1853 { return _M_data->_M_truename; }
1854
1855 /**
1856 * @brief Return string representation of bool false.
1857 *
1858 * Returns a string_type containing the text representation for false
1859 * bool variables. This function is a hook for derived classes to
1860 * change the value returned.
1861 *
1862 * @return string_type representing printed form of false.
1863 */
1864 virtual string_type
do_falsename()1865 do_falsename() const
1866 { return _M_data->_M_falsename; }
1867
1868 // For use at construction time only.
1869 void
1870 _M_initialize_numpunct(__c_locale __cloc = NULL);
1871 };
1872
1873 template<typename _CharT>
1874 locale::id numpunct<_CharT>::id;
1875
1876 template<>
1877 numpunct<char>::~numpunct();
1878
1879 template<>
1880 void
1881 numpunct<char>::_M_initialize_numpunct(__c_locale __cloc);
1882
1883 #ifdef _GLIBCXX_USE_WCHAR_T
1884 template<>
1885 numpunct<wchar_t>::~numpunct();
1886
1887 template<>
1888 void
1889 numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc);
1890 #endif
1891
1892 /// @brief class numpunct_byname [22.2.3.2].
1893 template<typename _CharT>
1894 class numpunct_byname : public numpunct<_CharT>
1895 {
1896 public:
1897 typedef _CharT char_type;
1898 typedef basic_string<_CharT> string_type;
1899
1900 explicit
1901 numpunct_byname(const char* __s, size_t __refs = 0)
1902 : numpunct<_CharT>(__refs)
1903 {
1904 if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
1905 {
1906 __c_locale __tmp;
1907 this->_S_create_c_locale(__tmp, __s);
1908 this->_M_initialize_numpunct(__tmp);
1909 this->_S_destroy_c_locale(__tmp);
1910 }
1911 }
1912
1913 protected:
1914 virtual
~numpunct_byname()1915 ~numpunct_byname() { }
1916 };
1917
1918 _GLIBCXX_BEGIN_LDBL_NAMESPACE
1919 /**
1920 * @brief Facet for parsing number strings.
1921 *
1922 * This facet encapsulates the code to parse and return a number
1923 * from a string. It is used by the istream numeric extraction
1924 * operators.
1925 *
1926 * The num_get template uses protected virtual functions to provide the
1927 * actual results. The public accessors forward the call to the virtual
1928 * functions. These virtual functions are hooks for developers to
1929 * implement the behavior they require from the num_get facet.
1930 */
1931 template<typename _CharT, typename _InIter>
1932 class num_get : public locale::facet
1933 {
1934 public:
1935 // Types:
1936 //@{
1937 /// Public typedefs
1938 typedef _CharT char_type;
1939 typedef _InIter iter_type;
1940 //@}
1941
1942 /// Numpunct facet id.
1943 static locale::id id;
1944
1945 /**
1946 * @brief Constructor performs initialization.
1947 *
1948 * This is the constructor provided by the standard.
1949 *
1950 * @param refs Passed to the base facet class.
1951 */
1952 explicit
facet(__refs)1953 num_get(size_t __refs = 0) : facet(__refs) { }
1954
1955 /**
1956 * @brief Numeric parsing.
1957 *
1958 * Parses the input stream into the bool @a v. It does so by calling
1959 * num_get::do_get().
1960 *
1961 * If ios_base::boolalpha is set, attempts to read
1962 * ctype<CharT>::truename() or ctype<CharT>::falsename(). Sets
1963 * @a v to true or false if successful. Sets err to
1964 * ios_base::failbit if reading the string fails. Sets err to
1965 * ios_base::eofbit if the stream is emptied.
1966 *
1967 * If ios_base::boolalpha is not set, proceeds as with reading a long,
1968 * except if the value is 1, sets @a v to true, if the value is 0, sets
1969 * @a v to false, and otherwise set err to ios_base::failbit.
1970 *
1971 * @param in Start of input stream.
1972 * @param end End of input stream.
1973 * @param io Source of locale and flags.
1974 * @param err Error flags to set.
1975 * @param v Value to format and insert.
1976 * @return Iterator after reading.
1977 */
1978 iter_type
get(iter_type __in,iter_type __end,ios_base & __io,ios_base::iostate & __err,bool & __v)1979 get(iter_type __in, iter_type __end, ios_base& __io,
1980 ios_base::iostate& __err, bool& __v) const
1981 { return this->do_get(__in, __end, __io, __err, __v); }
1982
1983 //@{
1984 /**
1985 * @brief Numeric parsing.
1986 *
1987 * Parses the input stream into the integral variable @a v. It does so
1988 * by calling num_get::do_get().
1989 *
1990 * Parsing is affected by the flag settings in @a io.
1991 *
1992 * The basic parse is affected by the value of io.flags() &
1993 * ios_base::basefield. If equal to ios_base::oct, parses like the
1994 * scanf %o specifier. Else if equal to ios_base::hex, parses like %X
1995 * specifier. Else if basefield equal to 0, parses like the %i
1996 * specifier. Otherwise, parses like %d for signed and %u for unsigned
1997 * types. The matching type length modifier is also used.
1998 *
1999 * Digit grouping is intrepreted according to numpunct::grouping() and
2000 * numpunct::thousands_sep(). If the pattern of digit groups isn't
2001 * consistent, sets err to ios_base::failbit.
2002 *
2003 * If parsing the string yields a valid value for @a v, @a v is set.
2004 * Otherwise, sets err to ios_base::failbit and leaves @a v unaltered.
2005 * Sets err to ios_base::eofbit if the stream is emptied.
2006 *
2007 * @param in Start of input stream.
2008 * @param end End of input stream.
2009 * @param io Source of locale and flags.
2010 * @param err Error flags to set.
2011 * @param v Value to format and insert.
2012 * @return Iterator after reading.
2013 */
2014 iter_type
get(iter_type __in,iter_type __end,ios_base & __io,ios_base::iostate & __err,long & __v)2015 get(iter_type __in, iter_type __end, ios_base& __io,
2016 ios_base::iostate& __err, long& __v) const
2017 { return this->do_get(__in, __end, __io, __err, __v); }
2018
2019 iter_type
get(iter_type __in,iter_type __end,ios_base & __io,ios_base::iostate & __err,unsigned short & __v)2020 get(iter_type __in, iter_type __end, ios_base& __io,
2021 ios_base::iostate& __err, unsigned short& __v) const
2022 { return this->do_get(__in, __end, __io, __err, __v); }
2023
2024 iter_type
get(iter_type __in,iter_type __end,ios_base & __io,ios_base::iostate & __err,unsigned int & __v)2025 get(iter_type __in, iter_type __end, ios_base& __io,
2026 ios_base::iostate& __err, unsigned int& __v) const
2027 { return this->do_get(__in, __end, __io, __err, __v); }
2028
2029 iter_type
get(iter_type __in,iter_type __end,ios_base & __io,ios_base::iostate & __err,unsigned long & __v)2030 get(iter_type __in, iter_type __end, ios_base& __io,
2031 ios_base::iostate& __err, unsigned long& __v) const
2032 { return this->do_get(__in, __end, __io, __err, __v); }
2033
2034 #ifdef _GLIBCXX_USE_LONG_LONG
2035 iter_type
get(iter_type __in,iter_type __end,ios_base & __io,ios_base::iostate & __err,long long & __v)2036 get(iter_type __in, iter_type __end, ios_base& __io,
2037 ios_base::iostate& __err, long long& __v) const
2038 { return this->do_get(__in, __end, __io, __err, __v); }
2039
2040 iter_type
get(iter_type __in,iter_type __end,ios_base & __io,ios_base::iostate & __err,unsigned long long & __v)2041 get(iter_type __in, iter_type __end, ios_base& __io,
2042 ios_base::iostate& __err, unsigned long long& __v) const
2043 { return this->do_get(__in, __end, __io, __err, __v); }
2044 #endif
2045 //@}
2046
2047 //@{
2048 /**
2049 * @brief Numeric parsing.
2050 *
2051 * Parses the input stream into the integral variable @a v. It does so
2052 * by calling num_get::do_get().
2053 *
2054 * The input characters are parsed like the scanf %g specifier. The
2055 * matching type length modifier is also used.
2056 *
2057 * The decimal point character used is numpunct::decimal_point().
2058 * Digit grouping is intrepreted according to numpunct::grouping() and
2059 * numpunct::thousands_sep(). If the pattern of digit groups isn't
2060 * consistent, sets err to ios_base::failbit.
2061 *
2062 * If parsing the string yields a valid value for @a v, @a v is set.
2063 * Otherwise, sets err to ios_base::failbit and leaves @a v unaltered.
2064 * Sets err to ios_base::eofbit if the stream is emptied.
2065 *
2066 * @param in Start of input stream.
2067 * @param end End of input stream.
2068 * @param io Source of locale and flags.
2069 * @param err Error flags to set.
2070 * @param v Value to format and insert.
2071 * @return Iterator after reading.
2072 */
2073 iter_type
get(iter_type __in,iter_type __end,ios_base & __io,ios_base::iostate & __err,float & __v)2074 get(iter_type __in, iter_type __end, ios_base& __io,
2075 ios_base::iostate& __err, float& __v) const
2076 { return this->do_get(__in, __end, __io, __err, __v); }
2077
2078 iter_type
get(iter_type __in,iter_type __end,ios_base & __io,ios_base::iostate & __err,double & __v)2079 get(iter_type __in, iter_type __end, ios_base& __io,
2080 ios_base::iostate& __err, double& __v) const
2081 { return this->do_get(__in, __end, __io, __err, __v); }
2082
2083 iter_type
get(iter_type __in,iter_type __end,ios_base & __io,ios_base::iostate & __err,long double & __v)2084 get(iter_type __in, iter_type __end, ios_base& __io,
2085 ios_base::iostate& __err, long double& __v) const
2086 { return this->do_get(__in, __end, __io, __err, __v); }
2087 //@}
2088
2089 /**
2090 * @brief Numeric parsing.
2091 *
2092 * Parses the input stream into the pointer variable @a v. It does so
2093 * by calling num_get::do_get().
2094 *
2095 * The input characters are parsed like the scanf %p specifier.
2096 *
2097 * Digit grouping is intrepreted according to numpunct::grouping() and
2098 * numpunct::thousands_sep(). If the pattern of digit groups isn't
2099 * consistent, sets err to ios_base::failbit.
2100 *
2101 * Note that the digit grouping effect for pointers is a bit ambiguous
2102 * in the standard and shouldn't be relied on. See DR 344.
2103 *
2104 * If parsing the string yields a valid value for @a v, @a v is set.
2105 * Otherwise, sets err to ios_base::failbit and leaves @a v unaltered.
2106 * Sets err to ios_base::eofbit if the stream is emptied.
2107 *
2108 * @param in Start of input stream.
2109 * @param end End of input stream.
2110 * @param io Source of locale and flags.
2111 * @param err Error flags to set.
2112 * @param v Value to format and insert.
2113 * @return Iterator after reading.
2114 */
2115 iter_type
get(iter_type __in,iter_type __end,ios_base & __io,ios_base::iostate & __err,void * & __v)2116 get(iter_type __in, iter_type __end, ios_base& __io,
2117 ios_base::iostate& __err, void*& __v) const
2118 { return this->do_get(__in, __end, __io, __err, __v); }
2119
2120 protected:
2121 /// Destructor.
~num_get()2122 virtual ~num_get() { }
2123
2124 iter_type
2125 _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
2126 string& __xtrc) const;
2127
2128 template<typename _ValueT>
2129 iter_type
2130 _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
2131 _ValueT& __v) const;
2132
2133 template<typename _CharT2>
2134 typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, int>::__type
_M_find(const _CharT2 *,size_t __len,_CharT2 __c)2135 _M_find(const _CharT2*, size_t __len, _CharT2 __c) const
2136 {
2137 int __ret = -1;
2138 if (__len <= 10)
2139 {
2140 if (__c >= _CharT2('0') && __c < _CharT2(_CharT2('0') + __len))
2141 __ret = __c - _CharT2('0');
2142 }
2143 else
2144 {
2145 if (__c >= _CharT2('0') && __c <= _CharT2('9'))
2146 __ret = __c - _CharT2('0');
2147 else if (__c >= _CharT2('a') && __c <= _CharT2('f'))
2148 __ret = 10 + (__c - _CharT2('a'));
2149 else if (__c >= _CharT2('A') && __c <= _CharT2('F'))
2150 __ret = 10 + (__c - _CharT2('A'));
2151 }
2152 return __ret;
2153 }
2154
2155 template<typename _CharT2>
2156 typename __gnu_cxx::__enable_if<!__is_char<_CharT2>::__value,
2157 int>::__type
_M_find(const _CharT2 * __zero,size_t __len,_CharT2 __c)2158 _M_find(const _CharT2* __zero, size_t __len, _CharT2 __c) const
2159 {
2160 int __ret = -1;
2161 const char_type* __q = char_traits<_CharT2>::find(__zero, __len, __c);
2162 if (__q)
2163 {
2164 __ret = __q - __zero;
2165 if (__ret > 15)
2166 __ret -= 6;
2167 }
2168 return __ret;
2169 }
2170
2171 //@{
2172 /**
2173 * @brief Numeric parsing.
2174 *
2175 * Parses the input stream into the variable @a v. This function is a
2176 * hook for derived classes to change the value returned. @see get()
2177 * for more details.
2178 *
2179 * @param in Start of input stream.
2180 * @param end End of input stream.
2181 * @param io Source of locale and flags.
2182 * @param err Error flags to set.
2183 * @param v Value to format and insert.
2184 * @return Iterator after reading.
2185 */
2186 virtual iter_type
2187 do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
2188
2189
2190 virtual iter_type
2191 do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, long&) const;
2192
2193 virtual iter_type
2194 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
2195 unsigned short&) const;
2196
2197 virtual iter_type
2198 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
2199 unsigned int&) const;
2200
2201 virtual iter_type
2202 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
2203 unsigned long&) const;
2204
2205 #ifdef _GLIBCXX_USE_LONG_LONG
2206 virtual iter_type
2207 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
2208 long long&) const;
2209
2210 virtual iter_type
2211 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
2212 unsigned long long&) const;
2213 #endif
2214
2215 virtual iter_type
2216 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
2217 float&) const;
2218
2219 virtual iter_type
2220 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
2221 double&) const;
2222
2223 // XXX GLIBCXX_ABI Deprecated
2224 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
2225 virtual iter_type
2226 __do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
2227 double&) const;
2228 #else
2229 virtual iter_type
2230 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
2231 long double&) const;
2232 #endif
2233
2234 virtual iter_type
2235 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
2236 void*&) const;
2237
2238 // XXX GLIBCXX_ABI Deprecated
2239 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
2240 virtual iter_type
2241 do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
2242 long double&) const;
2243 #endif
2244 //@}
2245 };
2246
2247 template<typename _CharT, typename _InIter>
2248 locale::id num_get<_CharT, _InIter>::id;
2249
2250
2251 /**
2252 * @brief Facet for converting numbers to strings.
2253 *
2254 * This facet encapsulates the code to convert a number to a string. It is
2255 * used by the ostream numeric insertion operators.
2256 *
2257 * The num_put template uses protected virtual functions to provide the
2258 * actual results. The public accessors forward the call to the virtual
2259 * functions. These virtual functions are hooks for developers to
2260 * implement the behavior they require from the num_put facet.
2261 */
2262 template<typename _CharT, typename _OutIter>
2263 class num_put : public locale::facet
2264 {
2265 public:
2266 // Types:
2267 //@{
2268 /// Public typedefs
2269 typedef _CharT char_type;
2270 typedef _OutIter iter_type;
2271 //@}
2272
2273 /// Numpunct facet id.
2274 static locale::id id;
2275
2276 /**
2277 * @brief Constructor performs initialization.
2278 *
2279 * This is the constructor provided by the standard.
2280 *
2281 * @param refs Passed to the base facet class.
2282 */
2283 explicit
facet(__refs)2284 num_put(size_t __refs = 0) : facet(__refs) { }
2285
2286 /**
2287 * @brief Numeric formatting.
2288 *
2289 * Formats the boolean @a v and inserts it into a stream. It does so
2290 * by calling num_put::do_put().
2291 *
2292 * If ios_base::boolalpha is set, writes ctype<CharT>::truename() or
2293 * ctype<CharT>::falsename(). Otherwise formats @a v as an int.
2294 *
2295 * @param s Stream to write to.
2296 * @param io Source of locale and flags.
2297 * @param fill Char_type to use for filling.
2298 * @param v Value to format and insert.
2299 * @return Iterator after writing.
2300 */
2301 iter_type
put(iter_type __s,ios_base & __f,char_type __fill,bool __v)2302 put(iter_type __s, ios_base& __f, char_type __fill, bool __v) const
2303 { return this->do_put(__s, __f, __fill, __v); }
2304
2305 //@{
2306 /**
2307 * @brief Numeric formatting.
2308 *
2309 * Formats the integral value @a v and inserts it into a
2310 * stream. It does so by calling num_put::do_put().
2311 *
2312 * Formatting is affected by the flag settings in @a io.
2313 *
2314 * The basic format is affected by the value of io.flags() &
2315 * ios_base::basefield. If equal to ios_base::oct, formats like the
2316 * printf %o specifier. Else if equal to ios_base::hex, formats like
2317 * %x or %X with ios_base::uppercase unset or set respectively.
2318 * Otherwise, formats like %d, %ld, %lld for signed and %u, %lu, %llu
2319 * for unsigned values. Note that if both oct and hex are set, neither
2320 * will take effect.
2321 *
2322 * If ios_base::showpos is set, '+' is output before positive values.
2323 * If ios_base::showbase is set, '0' precedes octal values (except 0)
2324 * and '0[xX]' precedes hex values.
2325 *
2326 * Thousands separators are inserted according to numpunct::grouping()
2327 * and numpunct::thousands_sep(). The decimal point character used is
2328 * numpunct::decimal_point().
2329 *
2330 * If io.width() is non-zero, enough @a fill characters are inserted to
2331 * make the result at least that wide. If
2332 * (io.flags() & ios_base::adjustfield) == ios_base::left, result is
2333 * padded at the end. If ios_base::internal, then padding occurs
2334 * immediately after either a '+' or '-' or after '0x' or '0X'.
2335 * Otherwise, padding occurs at the beginning.
2336 *
2337 * @param s Stream to write to.
2338 * @param io Source of locale and flags.
2339 * @param fill Char_type to use for filling.
2340 * @param v Value to format and insert.
2341 * @return Iterator after writing.
2342 */
2343 iter_type
put(iter_type __s,ios_base & __f,char_type __fill,long __v)2344 put(iter_type __s, ios_base& __f, char_type __fill, long __v) const
2345 { return this->do_put(__s, __f, __fill, __v); }
2346
2347 iter_type
put(iter_type __s,ios_base & __f,char_type __fill,unsigned long __v)2348 put(iter_type __s, ios_base& __f, char_type __fill,
2349 unsigned long __v) const
2350 { return this->do_put(__s, __f, __fill, __v); }
2351
2352 #ifdef _GLIBCXX_USE_LONG_LONG
2353 iter_type
put(iter_type __s,ios_base & __f,char_type __fill,long long __v)2354 put(iter_type __s, ios_base& __f, char_type __fill, long long __v) const
2355 { return this->do_put(__s, __f, __fill, __v); }
2356
2357 iter_type
put(iter_type __s,ios_base & __f,char_type __fill,unsigned long long __v)2358 put(iter_type __s, ios_base& __f, char_type __fill,
2359 unsigned long long __v) const
2360 { return this->do_put(__s, __f, __fill, __v); }
2361 #endif
2362 //@}
2363
2364 //@{
2365 /**
2366 * @brief Numeric formatting.
2367 *
2368 * Formats the floating point value @a v and inserts it into a stream.
2369 * It does so by calling num_put::do_put().
2370 *
2371 * Formatting is affected by the flag settings in @a io.
2372 *
2373 * The basic format is affected by the value of io.flags() &
2374 * ios_base::floatfield. If equal to ios_base::fixed, formats like the
2375 * printf %f specifier. Else if equal to ios_base::scientific, formats
2376 * like %e or %E with ios_base::uppercase unset or set respectively.
2377 * Otherwise, formats like %g or %G depending on uppercase. Note that
2378 * if both fixed and scientific are set, the effect will also be like
2379 * %g or %G.
2380 *
2381 * The output precision is given by io.precision(). This precision is
2382 * capped at numeric_limits::digits10 + 2 (different for double and
2383 * long double). The default precision is 6.
2384 *
2385 * If ios_base::showpos is set, '+' is output before positive values.
2386 * If ios_base::showpoint is set, a decimal point will always be
2387 * output.
2388 *
2389 * Thousands separators are inserted according to numpunct::grouping()
2390 * and numpunct::thousands_sep(). The decimal point character used is
2391 * numpunct::decimal_point().
2392 *
2393 * If io.width() is non-zero, enough @a fill characters are inserted to
2394 * make the result at least that wide. If
2395 * (io.flags() & ios_base::adjustfield) == ios_base::left, result is
2396 * padded at the end. If ios_base::internal, then padding occurs
2397 * immediately after either a '+' or '-' or after '0x' or '0X'.
2398 * Otherwise, padding occurs at the beginning.
2399 *
2400 * @param s Stream to write to.
2401 * @param io Source of locale and flags.
2402 * @param fill Char_type to use for filling.
2403 * @param v Value to format and insert.
2404 * @return Iterator after writing.
2405 */
2406 iter_type
put(iter_type __s,ios_base & __f,char_type __fill,double __v)2407 put(iter_type __s, ios_base& __f, char_type __fill, double __v) const
2408 { return this->do_put(__s, __f, __fill, __v); }
2409
2410 iter_type
put(iter_type __s,ios_base & __f,char_type __fill,long double __v)2411 put(iter_type __s, ios_base& __f, char_type __fill,
2412 long double __v) const
2413 { return this->do_put(__s, __f, __fill, __v); }
2414 //@}
2415
2416 /**
2417 * @brief Numeric formatting.
2418 *
2419 * Formats the pointer value @a v and inserts it into a stream. It
2420 * does so by calling num_put::do_put().
2421 *
2422 * This function formats @a v as an unsigned long with ios_base::hex
2423 * and ios_base::showbase set.
2424 *
2425 * @param s Stream to write to.
2426 * @param io Source of locale and flags.
2427 * @param fill Char_type to use for filling.
2428 * @param v Value to format and insert.
2429 * @return Iterator after writing.
2430 */
2431 iter_type
put(iter_type __s,ios_base & __f,char_type __fill,const void * __v)2432 put(iter_type __s, ios_base& __f, char_type __fill,
2433 const void* __v) const
2434 { return this->do_put(__s, __f, __fill, __v); }
2435
2436 protected:
2437 template<typename _ValueT>
2438 iter_type
2439 _M_insert_float(iter_type, ios_base& __io, char_type __fill,
2440 char __mod, _ValueT __v) const;
2441
2442 void
2443 _M_group_float(const char* __grouping, size_t __grouping_size,
2444 char_type __sep, const char_type* __p, char_type* __new,
2445 char_type* __cs, int& __len) const;
2446
2447 template<typename _ValueT>
2448 iter_type
2449 _M_insert_int(iter_type, ios_base& __io, char_type __fill,
2450 _ValueT __v) const;
2451
2452 void
2453 _M_group_int(const char* __grouping, size_t __grouping_size,
2454 char_type __sep, ios_base& __io, char_type* __new,
2455 char_type* __cs, int& __len) const;
2456
2457 void
2458 _M_pad(char_type __fill, streamsize __w, ios_base& __io,
2459 char_type* __new, const char_type* __cs, int& __len) const;
2460
2461 /// Destructor.
2462 virtual
~num_put()2463 ~num_put() { };
2464
2465 //@{
2466 /**
2467 * @brief Numeric formatting.
2468 *
2469 * These functions do the work of formatting numeric values and
2470 * inserting them into a stream. This function is a hook for derived
2471 * classes to change the value returned.
2472 *
2473 * @param s Stream to write to.
2474 * @param io Source of locale and flags.
2475 * @param fill Char_type to use for filling.
2476 * @param v Value to format and insert.
2477 * @return Iterator after writing.
2478 */
2479 virtual iter_type
2480 do_put(iter_type, ios_base&, char_type __fill, bool __v) const;
2481
2482 virtual iter_type
2483 do_put(iter_type, ios_base&, char_type __fill, long __v) const;
2484
2485 virtual iter_type
2486 do_put(iter_type, ios_base&, char_type __fill, unsigned long) const;
2487
2488 #ifdef _GLIBCXX_USE_LONG_LONG
2489 virtual iter_type
2490 do_put(iter_type, ios_base&, char_type __fill, long long __v) const;
2491
2492 virtual iter_type
2493 do_put(iter_type, ios_base&, char_type __fill, unsigned long long) const;
2494 #endif
2495
2496 virtual iter_type
2497 do_put(iter_type, ios_base&, char_type __fill, double __v) 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 __fill, double __v) const;
2503 #else
2504 virtual iter_type
2505 do_put(iter_type, ios_base&, char_type __fill, long double __v) const;
2506 #endif
2507
2508 virtual iter_type
2509 do_put(iter_type, ios_base&, char_type __fill, const void* __v) 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 __fill, long double __v) const;
2515 #endif
2516 //@}
2517 };
2518
2519 template <typename _CharT, typename _OutIter>
2520 locale::id num_put<_CharT, _OutIter>::id;
2521
2522 _GLIBCXX_END_LDBL_NAMESPACE
2523
2524 /**
2525 * @brief Facet for localized string comparison.
2526 *
2527 * This facet encapsulates the code to compare strings in a localized
2528 * manner.
2529 *
2530 * The collate template uses protected virtual functions to provide
2531 * the actual results. The public accessors forward the call to
2532 * the virtual functions. These virtual functions are hooks for
2533 * developers to implement the behavior they require from the
2534 * collate facet.
2535 */
2536 template<typename _CharT>
2537 class collate : public locale::facet
2538 {
2539 public:
2540 // Types:
2541 //@{
2542 /// Public typedefs
2543 typedef _CharT char_type;
2544 typedef basic_string<_CharT> string_type;
2545 //@}
2546
2547 protected:
2548 // Underlying "C" library locale information saved from
2549 // initialization, needed by collate_byname as well.
2550 __c_locale _M_c_locale_collate;
2551
2552 public:
2553 /// Numpunct facet id.
2554 static locale::id id;
2555
2556 /**
2557 * @brief Constructor performs initialization.
2558 *
2559 * This is the constructor provided by the standard.
2560 *
2561 * @param refs Passed to the base facet class.
2562 */
2563 explicit
2564 collate(size_t __refs = 0)
facet(__refs)2565 : facet(__refs), _M_c_locale_collate(_S_get_c_locale())
2566 { }
2567
2568 /**
2569 * @brief Internal constructor. Not for general use.
2570 *
2571 * This is a constructor for use by the library itself to set up new
2572 * locales.
2573 *
2574 * @param cloc The "C" locale.
2575 * @param refs Passed to the base facet class.
2576 */
2577 explicit
2578 collate(__c_locale __cloc, size_t __refs = 0)
facet(__refs)2579 : facet(__refs), _M_c_locale_collate(_S_clone_c_locale(__cloc))
2580 { }
2581
2582 /**
2583 * @brief Compare two strings.
2584 *
2585 * This function compares two strings and returns the result by calling
2586 * collate::do_compare().
2587 *
2588 * @param lo1 Start of string 1.
2589 * @param hi1 End of string 1.
2590 * @param lo2 Start of string 2.
2591 * @param hi2 End of string 2.
2592 * @return 1 if string1 > string2, -1 if string1 < string2, else 0.
2593 */
2594 int
compare(const _CharT * __lo1,const _CharT * __hi1,const _CharT * __lo2,const _CharT * __hi2)2595 compare(const _CharT* __lo1, const _CharT* __hi1,
2596 const _CharT* __lo2, const _CharT* __hi2) const
2597 { return this->do_compare(__lo1, __hi1, __lo2, __hi2); }
2598
2599 /**
2600 * @brief Transform string to comparable form.
2601 *
2602 * This function is a wrapper for strxfrm functionality. It takes the
2603 * input string and returns a modified string that can be directly
2604 * compared to other transformed strings. In the "C" locale, this
2605 * function just returns a copy of the input string. In some other
2606 * locales, it may replace two chars with one, change a char for
2607 * another, etc. It does so by returning collate::do_transform().
2608 *
2609 * @param lo Start of string.
2610 * @param hi End of string.
2611 * @return Transformed string_type.
2612 */
2613 string_type
transform(const _CharT * __lo,const _CharT * __hi)2614 transform(const _CharT* __lo, const _CharT* __hi) const
2615 { return this->do_transform(__lo, __hi); }
2616
2617 /**
2618 * @brief Return hash of a string.
2619 *
2620 * This function computes and returns a hash on the input string. It
2621 * does so by returning collate::do_hash().
2622 *
2623 * @param lo Start of string.
2624 * @param hi End of string.
2625 * @return Hash value.
2626 */
2627 long
hash(const _CharT * __lo,const _CharT * __hi)2628 hash(const _CharT* __lo, const _CharT* __hi) const
2629 { return this->do_hash(__lo, __hi); }
2630
2631 // Used to abstract out _CharT bits in virtual member functions, below.
2632 int
2633 _M_compare(const _CharT*, const _CharT*) const;
2634
2635 size_t
2636 _M_transform(_CharT*, const _CharT*, size_t) const;
2637
2638 protected:
2639 /// Destructor.
2640 virtual
~collate()2641 ~collate()
2642 { _S_destroy_c_locale(_M_c_locale_collate); }
2643
2644 /**
2645 * @brief Compare two strings.
2646 *
2647 * This function is a hook for derived classes to change the value
2648 * returned. @see compare().
2649 *
2650 * @param lo1 Start of string 1.
2651 * @param hi1 End of string 1.
2652 * @param lo2 Start of string 2.
2653 * @param hi2 End of string 2.
2654 * @return 1 if string1 > string2, -1 if string1 < string2, else 0.
2655 */
2656 virtual int
2657 do_compare(const _CharT* __lo1, const _CharT* __hi1,
2658 const _CharT* __lo2, const _CharT* __hi2) const;
2659
2660 /**
2661 * @brief Transform string to comparable form.
2662 *
2663 * This function is a hook for derived classes to change the value
2664 * returned.
2665 *
2666 * @param lo1 Start of string 1.
2667 * @param hi1 End of string 1.
2668 * @param lo2 Start of string 2.
2669 * @param hi2 End of string 2.
2670 * @return 1 if string1 > string2, -1 if string1 < string2, else 0.
2671 */
2672 virtual string_type
2673 do_transform(const _CharT* __lo, const _CharT* __hi) const;
2674
2675 /**
2676 * @brief Return hash of a string.
2677 *
2678 * This function computes and returns a hash on the input string. This
2679 * function is a hook for derived classes to change the value returned.
2680 *
2681 * @param lo Start of string.
2682 * @param hi End of string.
2683 * @return Hash value.
2684 */
2685 virtual long
2686 do_hash(const _CharT* __lo, const _CharT* __hi) const;
2687 };
2688
2689 template<typename _CharT>
2690 locale::id collate<_CharT>::id;
2691
2692 // Specializations.
2693 template<>
2694 int
2695 collate<char>::_M_compare(const char*, const char*) const;
2696
2697 template<>
2698 size_t
2699 collate<char>::_M_transform(char*, const char*, size_t) const;
2700
2701 #ifdef _GLIBCXX_USE_WCHAR_T
2702 template<>
2703 int
2704 collate<wchar_t>::_M_compare(const wchar_t*, const wchar_t*) const;
2705
2706 template<>
2707 size_t
2708 collate<wchar_t>::_M_transform(wchar_t*, const wchar_t*, size_t) const;
2709 #endif
2710
2711 /// @brief class collate_byname [22.2.4.2].
2712 template<typename _CharT>
2713 class collate_byname : public collate<_CharT>
2714 {
2715 public:
2716 //@{
2717 /// Public typedefs
2718 typedef _CharT char_type;
2719 typedef basic_string<_CharT> string_type;
2720 //@}
2721
2722 explicit
2723 collate_byname(const char* __s, size_t __refs = 0)
2724 : collate<_CharT>(__refs)
2725 {
2726 if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
2727 {
2728 this->_S_destroy_c_locale(this->_M_c_locale_collate);
2729 this->_S_create_c_locale(this->_M_c_locale_collate, __s);
2730 }
2731 }
2732
2733 protected:
2734 virtual
~collate_byname()2735 ~collate_byname() { }
2736 };
2737
2738
2739 /**
2740 * @brief Time format ordering data.
2741 *
2742 * This class provides an enum representing different orderings of day,
2743 * month, and year.
2744 */
2745 class time_base
2746 {
2747 public:
2748 enum dateorder { no_order, dmy, mdy, ymd, ydm };
2749 };
2750
2751 template<typename _CharT>
2752 struct __timepunct_cache : public locale::facet
2753 {
2754 // List of all known timezones, with GMT first.
2755 static const _CharT* _S_timezones[14];
2756
2757 const _CharT* _M_date_format;
2758 const _CharT* _M_date_era_format;
2759 const _CharT* _M_time_format;
2760 const _CharT* _M_time_era_format;
2761 const _CharT* _M_date_time_format;
2762 const _CharT* _M_date_time_era_format;
2763 const _CharT* _M_am;
2764 const _CharT* _M_pm;
2765 const _CharT* _M_am_pm_format;
2766
2767 // Day names, starting with "C"'s Sunday.
2768 const _CharT* _M_day1;
2769 const _CharT* _M_day2;
2770 const _CharT* _M_day3;
2771 const _CharT* _M_day4;
2772 const _CharT* _M_day5;
2773 const _CharT* _M_day6;
2774 const _CharT* _M_day7;
2775
2776 // Abbreviated day names, starting with "C"'s Sun.
2777 const _CharT* _M_aday1;
2778 const _CharT* _M_aday2;
2779 const _CharT* _M_aday3;
2780 const _CharT* _M_aday4;
2781 const _CharT* _M_aday5;
2782 const _CharT* _M_aday6;
2783 const _CharT* _M_aday7;
2784
2785 // Month names, starting with "C"'s January.
2786 const _CharT* _M_month01;
2787 const _CharT* _M_month02;
2788 const _CharT* _M_month03;
2789 const _CharT* _M_month04;
2790 const _CharT* _M_month05;
2791 const _CharT* _M_month06;
2792 const _CharT* _M_month07;
2793 const _CharT* _M_month08;
2794 const _CharT* _M_month09;
2795 const _CharT* _M_month10;
2796 const _CharT* _M_month11;
2797 const _CharT* _M_month12;
2798
2799 // Abbreviated month names, starting with "C"'s Jan.
2800 const _CharT* _M_amonth01;
2801 const _CharT* _M_amonth02;
2802 const _CharT* _M_amonth03;
2803 const _CharT* _M_amonth04;
2804 const _CharT* _M_amonth05;
2805 const _CharT* _M_amonth06;
2806 const _CharT* _M_amonth07;
2807 const _CharT* _M_amonth08;
2808 const _CharT* _M_amonth09;
2809 const _CharT* _M_amonth10;
2810 const _CharT* _M_amonth11;
2811 const _CharT* _M_amonth12;
2812
2813 bool _M_allocated;
2814
facet__timepunct_cache2815 __timepunct_cache(size_t __refs = 0) : facet(__refs),
2816 _M_date_format(NULL), _M_date_era_format(NULL), _M_time_format(NULL),
2817 _M_time_era_format(NULL), _M_date_time_format(NULL),
2818 _M_date_time_era_format(NULL), _M_am(NULL), _M_pm(NULL),
2819 _M_am_pm_format(NULL), _M_day1(NULL), _M_day2(NULL), _M_day3(NULL),
2820 _M_day4(NULL), _M_day5(NULL), _M_day6(NULL), _M_day7(NULL),
2821 _M_aday1(NULL), _M_aday2(NULL), _M_aday3(NULL), _M_aday4(NULL),
2822 _M_aday5(NULL), _M_aday6(NULL), _M_aday7(NULL), _M_month01(NULL),
2823 _M_month02(NULL), _M_month03(NULL), _M_month04(NULL), _M_month05(NULL),
2824 _M_month06(NULL), _M_month07(NULL), _M_month08(NULL), _M_month09(NULL),
2825 _M_month10(NULL), _M_month11(NULL), _M_month12(NULL), _M_amonth01(NULL),
2826 _M_amonth02(NULL), _M_amonth03(NULL), _M_amonth04(NULL),
2827 _M_amonth05(NULL), _M_amonth06(NULL), _M_amonth07(NULL),
2828 _M_amonth08(NULL), _M_amonth09(NULL), _M_amonth10(NULL),
2829 _M_amonth11(NULL), _M_amonth12(NULL), _M_allocated(false)
2830 { }
2831
2832 ~__timepunct_cache();
2833
2834 void
2835 _M_cache(const locale& __loc);
2836
2837 private:
2838 __timepunct_cache&
2839 operator=(const __timepunct_cache&);
2840
2841 explicit
2842 __timepunct_cache(const __timepunct_cache&);
2843 };
2844
2845 template<typename _CharT>
~__timepunct_cache()2846 __timepunct_cache<_CharT>::~__timepunct_cache()
2847 {
2848 if (_M_allocated)
2849 {
2850 // Unused.
2851 }
2852 }
2853
2854 // Specializations.
2855 template<>
2856 const char*
2857 __timepunct_cache<char>::_S_timezones[14];
2858
2859 #ifdef _GLIBCXX_USE_WCHAR_T
2860 template<>
2861 const wchar_t*
2862 __timepunct_cache<wchar_t>::_S_timezones[14];
2863 #endif
2864
2865 // Generic.
2866 template<typename _CharT>
2867 const _CharT* __timepunct_cache<_CharT>::_S_timezones[14];
2868
2869 template<typename _CharT>
2870 class __timepunct : public locale::facet
2871 {
2872 public:
2873 // Types:
2874 typedef _CharT __char_type;
2875 typedef basic_string<_CharT> __string_type;
2876 typedef __timepunct_cache<_CharT> __cache_type;
2877
2878 protected:
2879 __cache_type* _M_data;
2880 __c_locale _M_c_locale_timepunct;
2881 const char* _M_name_timepunct;
2882
2883 public:
2884 /// Numpunct facet id.
2885 static locale::id id;
2886
2887 explicit
2888 __timepunct(size_t __refs = 0);
2889
2890 explicit
2891 __timepunct(__cache_type* __cache, size_t __refs = 0);
2892
2893 /**
2894 * @brief Internal constructor. Not for general use.
2895 *
2896 * This is a constructor for use by the library itself to set up new
2897 * locales.
2898 *
2899 * @param cloc The "C" locale.
2900 * @param s The name of a locale.
2901 * @param refs Passed to the base facet class.
2902 */
2903 explicit
2904 __timepunct(__c_locale __cloc, const char* __s, size_t __refs = 0);
2905
2906 // FIXME: for error checking purposes _M_put should return the return
2907 // value of strftime/wcsftime.
2908 void
2909 _M_put(_CharT* __s, size_t __maxlen, const _CharT* __format,
2910 const tm* __tm) const;
2911
2912 void
_M_date_formats(const _CharT ** __date)2913 _M_date_formats(const _CharT** __date) const
2914 {
2915 // Always have default first.
2916 __date[0] = _M_data->_M_date_format;
2917 __date[1] = _M_data->_M_date_era_format;
2918 }
2919
2920 void
_M_time_formats(const _CharT ** __time)2921 _M_time_formats(const _CharT** __time) const
2922 {
2923 // Always have default first.
2924 __time[0] = _M_data->_M_time_format;
2925 __time[1] = _M_data->_M_time_era_format;
2926 }
2927
2928 void
_M_date_time_formats(const _CharT ** __dt)2929 _M_date_time_formats(const _CharT** __dt) const
2930 {
2931 // Always have default first.
2932 __dt[0] = _M_data->_M_date_time_format;
2933 __dt[1] = _M_data->_M_date_time_era_format;
2934 }
2935
2936 void
_M_am_pm_format(const _CharT * __ampm)2937 _M_am_pm_format(const _CharT* __ampm) const
2938 { __ampm = _M_data->_M_am_pm_format; }
2939
2940 void
_M_am_pm(const _CharT ** __ampm)2941 _M_am_pm(const _CharT** __ampm) const
2942 {
2943 __ampm[0] = _M_data->_M_am;
2944 __ampm[1] = _M_data->_M_pm;
2945 }
2946
2947 void
_M_days(const _CharT ** __days)2948 _M_days(const _CharT** __days) const
2949 {
2950 __days[0] = _M_data->_M_day1;
2951 __days[1] = _M_data->_M_day2;
2952 __days[2] = _M_data->_M_day3;
2953 __days[3] = _M_data->_M_day4;
2954 __days[4] = _M_data->_M_day5;
2955 __days[5] = _M_data->_M_day6;
2956 __days[6] = _M_data->_M_day7;
2957 }
2958
2959 void
_M_days_abbreviated(const _CharT ** __days)2960 _M_days_abbreviated(const _CharT** __days) const
2961 {
2962 __days[0] = _M_data->_M_aday1;
2963 __days[1] = _M_data->_M_aday2;
2964 __days[2] = _M_data->_M_aday3;
2965 __days[3] = _M_data->_M_aday4;
2966 __days[4] = _M_data->_M_aday5;
2967 __days[5] = _M_data->_M_aday6;
2968 __days[6] = _M_data->_M_aday7;
2969 }
2970
2971 void
_M_months(const _CharT ** __months)2972 _M_months(const _CharT** __months) const
2973 {
2974 __months[0] = _M_data->_M_month01;
2975 __months[1] = _M_data->_M_month02;
2976 __months[2] = _M_data->_M_month03;
2977 __months[3] = _M_data->_M_month04;
2978 __months[4] = _M_data->_M_month05;
2979 __months[5] = _M_data->_M_month06;
2980 __months[6] = _M_data->_M_month07;
2981 __months[7] = _M_data->_M_month08;
2982 __months[8] = _M_data->_M_month09;
2983 __months[9] = _M_data->_M_month10;
2984 __months[10] = _M_data->_M_month11;
2985 __months[11] = _M_data->_M_month12;
2986 }
2987
2988 void
_M_months_abbreviated(const _CharT ** __months)2989 _M_months_abbreviated(const _CharT** __months) const
2990 {
2991 __months[0] = _M_data->_M_amonth01;
2992 __months[1] = _M_data->_M_amonth02;
2993 __months[2] = _M_data->_M_amonth03;
2994 __months[3] = _M_data->_M_amonth04;
2995 __months[4] = _M_data->_M_amonth05;
2996 __months[5] = _M_data->_M_amonth06;
2997 __months[6] = _M_data->_M_amonth07;
2998 __months[7] = _M_data->_M_amonth08;
2999 __months[8] = _M_data->_M_amonth09;
3000 __months[9] = _M_data->_M_amonth10;
3001 __months[10] = _M_data->_M_amonth11;
3002 __months[11] = _M_data->_M_amonth12;
3003 }
3004
3005 protected:
3006 virtual
3007 ~__timepunct();
3008
3009 // For use at construction time only.
3010 void
3011 _M_initialize_timepunct(__c_locale __cloc = NULL);
3012 };
3013
3014 template<typename _CharT>
3015 locale::id __timepunct<_CharT>::id;
3016
3017 // Specializations.
3018 template<>
3019 void
3020 __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc);
3021
3022 template<>
3023 void
3024 __timepunct<char>::_M_put(char*, size_t, const char*, const tm*) const;
3025
3026 #ifdef _GLIBCXX_USE_WCHAR_T
3027 template<>
3028 void
3029 __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc);
3030
3031 template<>
3032 void
3033 __timepunct<wchar_t>::_M_put(wchar_t*, size_t, const wchar_t*,
3034 const tm*) const;
3035 #endif
3036
3037 _GLIBCXX_END_NAMESPACE
3038
3039 // Include host and configuration specific timepunct functions.
3040 #include <bits/time_members.h>
3041
_GLIBCXX_BEGIN_NAMESPACE(std)3042 _GLIBCXX_BEGIN_NAMESPACE(std)
3043
3044 /**
3045 * @brief Facet for parsing dates and times.
3046 *
3047 * This facet encapsulates the code to parse and return a date or
3048 * time from a string. It is used by the istream numeric
3049 * extraction operators.
3050 *
3051 * The time_get template uses protected virtual functions to provide the
3052 * actual results. The public accessors forward the call to the virtual
3053 * functions. These virtual functions are hooks for developers to
3054 * implement the behavior they require from the time_get facet.
3055 */
3056 template<typename _CharT, typename _InIter>
3057 class time_get : public locale::facet, public time_base
3058 {
3059 public:
3060 // Types:
3061 //@{
3062 /// Public typedefs
3063 typedef _CharT char_type;
3064 typedef _InIter iter_type;
3065 //@}
3066 typedef basic_string<_CharT> __string_type;
3067
3068 /// Numpunct facet id.
3069 static locale::id id;
3070
3071 /**
3072 * @brief Constructor performs initialization.
3073 *
3074 * This is the constructor provided by the standard.
3075 *
3076 * @param refs Passed to the base facet class.
3077 */
3078 explicit
3079 time_get(size_t __refs = 0)
3080 : facet (__refs) { }
3081
3082 /**
3083 * @brief Return preferred order of month, day, and year.
3084 *
3085 * This function returns an enum from timebase::dateorder giving the
3086 * preferred ordering if the format "x" given to time_put::put() only
3087 * uses month, day, and year. If the format "x" for the associated
3088 * locale uses other fields, this function returns
3089 * timebase::dateorder::noorder.
3090 *
3091 * NOTE: The library always returns noorder at the moment.
3092 *
3093 * @return A member of timebase::dateorder.
3094 */
3095 dateorder
3096 date_order() const
3097 { return this->do_date_order(); }
3098
3099 /**
3100 * @brief Parse input time string.
3101 *
3102 * This function parses a time according to the format "x" and puts the
3103 * results into a user-supplied struct tm. The result is returned by
3104 * calling time_get::do_get_time().
3105 *
3106 * If there is a valid time string according to format "x", @a tm will
3107 * be filled in accordingly and the returned iterator will point to the
3108 * first character beyond the time string. If an error occurs before
3109 * the end, err |= ios_base::failbit. If parsing reads all the
3110 * characters, err |= ios_base::eofbit.
3111 *
3112 * @param beg Start of string to parse.
3113 * @param end End of string to parse.
3114 * @param io Source of the locale.
3115 * @param err Error flags to set.
3116 * @param tm Pointer to struct tm to fill in.
3117 * @return Iterator to first char beyond time string.
3118 */
3119 iter_type
3120 get_time(iter_type __beg, iter_type __end, ios_base& __io,
3121 ios_base::iostate& __err, tm* __tm) const
3122 { return this->do_get_time(__beg, __end, __io, __err, __tm); }
3123
3124 /**
3125 * @brief Parse input date string.
3126 *
3127 * This function parses a date according to the format "X" and puts the
3128 * results into a user-supplied struct tm. The result is returned by
3129 * calling time_get::do_get_date().
3130 *
3131 * If there is a valid date string according to format "X", @a tm will
3132 * be filled in accordingly and the returned iterator will point to the
3133 * first character beyond the date string. If an error occurs before
3134 * the end, err |= ios_base::failbit. If parsing reads all the
3135 * characters, err |= ios_base::eofbit.
3136 *
3137 * @param beg Start of string to parse.
3138 * @param end End of string to parse.
3139 * @param io Source of the locale.
3140 * @param err Error flags to set.
3141 * @param tm Pointer to struct tm to fill in.
3142 * @return Iterator to first char beyond date string.
3143 */
3144 iter_type
3145 get_date(iter_type __beg, iter_type __end, ios_base& __io,
3146 ios_base::iostate& __err, tm* __tm) const
3147 { return this->do_get_date(__beg, __end, __io, __err, __tm); }
3148
3149 /**
3150 * @brief Parse input weekday string.
3151 *
3152 * This function parses a weekday name and puts the results into a
3153 * user-supplied struct tm. The result is returned by calling
3154 * time_get::do_get_weekday().
3155 *
3156 * Parsing starts by parsing an abbreviated weekday name. If a valid
3157 * abbreviation is followed by a character that would lead to the full
3158 * weekday name, parsing continues until the full name is found or an
3159 * error occurs. Otherwise parsing finishes at the end of the
3160 * abbreviated name.
3161 *
3162 * If an error occurs before the end, err |= ios_base::failbit. If
3163 * parsing reads all the characters, err |= ios_base::eofbit.
3164 *
3165 * @param beg Start of string to parse.
3166 * @param end End of string to parse.
3167 * @param io Source of the locale.
3168 * @param err Error flags to set.
3169 * @param tm Pointer to struct tm to fill in.
3170 * @return Iterator to first char beyond weekday name.
3171 */
3172 iter_type
3173 get_weekday(iter_type __beg, iter_type __end, ios_base& __io,
3174 ios_base::iostate& __err, tm* __tm) const
3175 { return this->do_get_weekday(__beg, __end, __io, __err, __tm); }
3176
3177 /**
3178 * @brief Parse input month string.
3179 *
3180 * This function parses a month name and puts the results into a
3181 * user-supplied struct tm. The result is returned by calling
3182 * time_get::do_get_monthname().
3183 *
3184 * Parsing starts by parsing an abbreviated month name. If a valid
3185 * abbreviation is followed by a character that would lead to the full
3186 * month name, parsing continues until the full name is found or an
3187 * error occurs. Otherwise parsing finishes at the end of the
3188 * abbreviated name.
3189 *
3190 * If an error occurs before the end, err |= ios_base::failbit. If
3191 * parsing reads all the characters, err |=
3192 * ios_base::eofbit.
3193 *
3194 * @param beg Start of string to parse.
3195 * @param end End of string to parse.
3196 * @param io Source of the locale.
3197 * @param err Error flags to set.
3198 * @param tm Pointer to struct tm to fill in.
3199 * @return Iterator to first char beyond month name.
3200 */
3201 iter_type
3202 get_monthname(iter_type __beg, iter_type __end, ios_base& __io,
3203 ios_base::iostate& __err, tm* __tm) const
3204 { return this->do_get_monthname(__beg, __end, __io, __err, __tm); }
3205
3206 /**
3207 * @brief Parse input year string.
3208 *
3209 * This function reads up to 4 characters to parse a year string and
3210 * puts the results into a user-supplied struct tm. The result is
3211 * returned by calling time_get::do_get_year().
3212 *
3213 * 4 consecutive digits are interpreted as a full year. If there are
3214 * exactly 2 consecutive digits, the library interprets this as the
3215 * number of years since 1900.
3216 *
3217 * If an error occurs before the end, err |= ios_base::failbit. If
3218 * parsing reads all the characters, err |= ios_base::eofbit.
3219 *
3220 * @param beg Start of string to parse.
3221 * @param end End of string to parse.
3222 * @param io Source of the locale.
3223 * @param err Error flags to set.
3224 * @param tm Pointer to struct tm to fill in.
3225 * @return Iterator to first char beyond year.
3226 */
3227 iter_type
3228 get_year(iter_type __beg, iter_type __end, ios_base& __io,
3229 ios_base::iostate& __err, tm* __tm) const
3230 { return this->do_get_year(__beg, __end, __io, __err, __tm); }
3231
3232 protected:
3233 /// Destructor.
3234 virtual
3235 ~time_get() { }
3236
3237 /**
3238 * @brief Return preferred order of month, day, and year.
3239 *
3240 * This function returns an enum from timebase::dateorder giving the
3241 * preferred ordering if the format "x" given to time_put::put() only
3242 * uses month, day, and year. This function is a hook for derived
3243 * classes to change the value returned.
3244 *
3245 * @return A member of timebase::dateorder.
3246 */
3247 virtual dateorder
3248 do_date_order() const;
3249
3250 /**
3251 * @brief Parse input time string.
3252 *
3253 * This function parses a time according to the format "x" and puts the
3254 * results into a user-supplied struct tm. This function is a hook for
3255 * derived classes to change the value returned. @see get_time() for
3256 * details.
3257 *
3258 * @param beg Start of string to parse.
3259 * @param end End of string to parse.
3260 * @param io Source of the locale.
3261 * @param err Error flags to set.
3262 * @param tm Pointer to struct tm to fill in.
3263 * @return Iterator to first char beyond time string.
3264 */
3265 virtual iter_type
3266 do_get_time(iter_type __beg, iter_type __end, ios_base& __io,
3267 ios_base::iostate& __err, tm* __tm) const;
3268
3269 /**
3270 * @brief Parse input date string.
3271 *
3272 * This function parses a date according to the format "X" and puts the
3273 * results into a user-supplied struct tm. This function is a hook for
3274 * derived classes to change the value returned. @see get_date() for
3275 * details.
3276 *
3277 * @param beg Start of string to parse.
3278 * @param end End of string to parse.
3279 * @param io Source of the locale.
3280 * @param err Error flags to set.
3281 * @param tm Pointer to struct tm to fill in.
3282 * @return Iterator to first char beyond date string.
3283 */
3284 virtual iter_type
3285 do_get_date(iter_type __beg, iter_type __end, ios_base& __io,
3286 ios_base::iostate& __err, tm* __tm) const;
3287
3288 /**
3289 * @brief Parse input weekday string.
3290 *
3291 * This function parses a weekday name and puts the results into a
3292 * user-supplied struct tm. This function is a hook for derived
3293 * classes to change the value returned. @see get_weekday() for
3294 * details.
3295 *
3296 * @param beg Start of string to parse.
3297 * @param end End of string to parse.
3298 * @param io Source of the locale.
3299 * @param err Error flags to set.
3300 * @param tm Pointer to struct tm to fill in.
3301 * @return Iterator to first char beyond weekday name.
3302 */
3303 virtual iter_type
3304 do_get_weekday(iter_type __beg, iter_type __end, ios_base&,
3305 ios_base::iostate& __err, tm* __tm) const;
3306
3307 /**
3308 * @brief Parse input month string.
3309 *
3310 * This function parses a month name and puts the results into a
3311 * user-supplied struct tm. This function is a hook for derived
3312 * classes to change the value returned. @see get_monthname() for
3313 * details.
3314 *
3315 * @param beg Start of string to parse.
3316 * @param end End of string to parse.
3317 * @param io Source of the locale.
3318 * @param err Error flags to set.
3319 * @param tm Pointer to struct tm to fill in.
3320 * @return Iterator to first char beyond month name.
3321 */
3322 virtual iter_type
3323 do_get_monthname(iter_type __beg, iter_type __end, ios_base&,
3324 ios_base::iostate& __err, tm* __tm) const;
3325
3326 /**
3327 * @brief Parse input year string.
3328 *
3329 * This function reads up to 4 characters to parse a year string and
3330 * puts the results into a user-supplied struct tm. This function is a
3331 * hook for derived classes to change the value returned. @see
3332 * get_year() for details.
3333 *
3334 * @param beg Start of string to parse.
3335 * @param end End of string to parse.
3336 * @param io Source of the locale.
3337 * @param err Error flags to set.
3338 * @param tm Pointer to struct tm to fill in.
3339 * @return Iterator to first char beyond year.
3340 */
3341 virtual iter_type
3342 do_get_year(iter_type __beg, iter_type __end, ios_base& __io,
3343 ios_base::iostate& __err, tm* __tm) const;
3344
3345 // Extract numeric component of length __len.
3346 iter_type
3347 _M_extract_num(iter_type __beg, iter_type __end, int& __member,
3348 int __min, int __max, size_t __len,
3349 ios_base& __io, ios_base::iostate& __err) const;
3350
3351 // Extract day or month name, or any unique array of string
3352 // literals in a const _CharT* array.
3353 iter_type
3354 _M_extract_name(iter_type __beg, iter_type __end, int& __member,
3355 const _CharT** __names, size_t __indexlen,
3356 ios_base& __io, ios_base::iostate& __err) const;
3357
3358 // Extract on a component-by-component basis, via __format argument.
3359 iter_type
3360 _M_extract_via_format(iter_type __beg, iter_type __end, ios_base& __io,
3361 ios_base::iostate& __err, tm* __tm,
3362 const _CharT* __format) const;
3363 };
3364
3365 template<typename _CharT, typename _InIter>
3366 locale::id time_get<_CharT, _InIter>::id;
3367
3368 /// @brief class time_get_byname [22.2.5.2].
3369 template<typename _CharT, typename _InIter>
3370 class time_get_byname : public time_get<_CharT, _InIter>
3371 {
3372 public:
3373 // Types:
3374 typedef _CharT char_type;
3375 typedef _InIter iter_type;
3376
3377 explicit
3378 time_get_byname(const char*, size_t __refs = 0)
3379 : time_get<_CharT, _InIter>(__refs) { }
3380
3381 protected:
3382 virtual
~time_get_byname()3383 ~time_get_byname() { }
3384 };
3385
3386 /**
3387 * @brief Facet for outputting dates and times.
3388 *
3389 * This facet encapsulates the code to format and output dates and times
3390 * according to formats used by strftime().
3391 *
3392 * The time_put template uses protected virtual functions to provide the
3393 * actual results. The public accessors forward the call to the virtual
3394 * functions. These virtual functions are hooks for developers to
3395 * implement the behavior they require from the time_put facet.
3396 */
3397 template<typename _CharT, typename _OutIter>
3398 class time_put : public locale::facet
3399 {
3400 public:
3401 // Types:
3402 //@{
3403 /// Public typedefs
3404 typedef _CharT char_type;
3405 typedef _OutIter iter_type;
3406 //@}
3407
3408 /// Numpunct facet id.
3409 static locale::id id;
3410
3411 /**
3412 * @brief Constructor performs initialization.
3413 *
3414 * This is the constructor provided by the standard.
3415 *
3416 * @param refs Passed to the base facet class.
3417 */
3418 explicit
3419 time_put(size_t __refs = 0)
facet(__refs)3420 : facet(__refs) { }
3421
3422 /**
3423 * @brief Format and output a time or date.
3424 *
3425 * This function formats the data in struct tm according to the
3426 * provided format string. The format string is interpreted as by
3427 * strftime().
3428 *
3429 * @param s The stream to write to.
3430 * @param io Source of locale.
3431 * @param fill char_type to use for padding.
3432 * @param tm Struct tm with date and time info to format.
3433 * @param beg Start of format string.
3434 * @param end End of format string.
3435 * @return Iterator after writing.
3436 */
3437 iter_type
3438 put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
3439 const _CharT* __beg, const _CharT* __end) const;
3440
3441 /**
3442 * @brief Format and output a time or date.
3443 *
3444 * This function formats the data in struct tm according to the
3445 * provided format char and optional modifier. The format and modifier
3446 * are interpreted as by strftime(). It does so by returning
3447 * time_put::do_put().
3448 *
3449 * @param s The stream to write to.
3450 * @param io Source of locale.
3451 * @param fill char_type to use for padding.
3452 * @param tm Struct tm with date and time info to format.
3453 * @param format Format char.
3454 * @param mod Optional modifier char.
3455 * @return Iterator after writing.
3456 */
3457 iter_type
3458 put(iter_type __s, ios_base& __io, char_type __fill,
3459 const tm* __tm, char __format, char __mod = 0) const
3460 { return this->do_put(__s, __io, __fill, __tm, __format, __mod); }
3461
3462 protected:
3463 /// Destructor.
3464 virtual
~time_put()3465 ~time_put()
3466 { }
3467
3468 /**
3469 * @brief Format and output a time or date.
3470 *
3471 * This function formats the data in struct tm according to the
3472 * provided format char and optional modifier. This function is a hook
3473 * for derived classes to change the value returned. @see put() for
3474 * more details.
3475 *
3476 * @param s The stream to write to.
3477 * @param io Source of locale.
3478 * @param fill char_type to use for padding.
3479 * @param tm Struct tm with date and time info to format.
3480 * @param format Format char.
3481 * @param mod Optional modifier char.
3482 * @return Iterator after writing.
3483 */
3484 virtual iter_type
3485 do_put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
3486 char __format, char __mod) const;
3487 };
3488
3489 template<typename _CharT, typename _OutIter>
3490 locale::id time_put<_CharT, _OutIter>::id;
3491
3492 /// @brief class time_put_byname [22.2.5.4].
3493 template<typename _CharT, typename _OutIter>
3494 class time_put_byname : public time_put<_CharT, _OutIter>
3495 {
3496 public:
3497 // Types:
3498 typedef _CharT char_type;
3499 typedef _OutIter iter_type;
3500
3501 explicit
3502 time_put_byname(const char*, size_t __refs = 0)
3503 : time_put<_CharT, _OutIter>(__refs)
3504 { };
3505
3506 protected:
3507 virtual
~time_put_byname()3508 ~time_put_byname() { }
3509 };
3510
3511
3512 /**
3513 * @brief Money format ordering data.
3514 *
3515 * This class contains an ordered array of 4 fields to represent the
3516 * pattern for formatting a money amount. Each field may contain one entry
3517 * from the part enum. symbol, sign, and value must be present and the
3518 * remaining field must contain either none or space. @see
3519 * moneypunct::pos_format() and moneypunct::neg_format() for details of how
3520 * these fields are interpreted.
3521 */
3522 class money_base
3523 {
3524 public:
3525 enum part { none, space, symbol, sign, value };
3526 struct pattern { char field[4]; };
3527
3528 static const pattern _S_default_pattern;
3529
3530 enum
3531 {
3532 _S_minus,
3533 _S_zero,
3534 _S_end = 11
3535 };
3536
3537 // String literal of acceptable (narrow) input/output, for
3538 // money_get/money_put. "-0123456789"
3539 static const char* _S_atoms;
3540
3541 // Construct and return valid pattern consisting of some combination of:
3542 // space none symbol sign value
3543 static pattern
3544 _S_construct_pattern(char __precedes, char __space, char __posn);
3545 };
3546
3547 template<typename _CharT, bool _Intl>
3548 struct __moneypunct_cache : public locale::facet
3549 {
3550 const char* _M_grouping;
3551 size_t _M_grouping_size;
3552 bool _M_use_grouping;
3553 _CharT _M_decimal_point;
3554 _CharT _M_thousands_sep;
3555 const _CharT* _M_curr_symbol;
3556 size_t _M_curr_symbol_size;
3557 const _CharT* _M_positive_sign;
3558 size_t _M_positive_sign_size;
3559 const _CharT* _M_negative_sign;
3560 size_t _M_negative_sign_size;
3561 int _M_frac_digits;
3562 money_base::pattern _M_pos_format;
3563 money_base::pattern _M_neg_format;
3564
3565 // A list of valid numeric literals for input and output: in the standard
3566 // "C" locale, this is "-0123456789". This array contains the chars after
3567 // having been passed through the current locale's ctype<_CharT>.widen().
3568 _CharT _M_atoms[money_base::_S_end];
3569
3570 bool _M_allocated;
3571
facet__moneypunct_cache3572 __moneypunct_cache(size_t __refs = 0) : facet(__refs),
3573 _M_grouping(NULL), _M_grouping_size(0), _M_use_grouping(false),
3574 _M_decimal_point(_CharT()), _M_thousands_sep(_CharT()),
3575 _M_curr_symbol(NULL), _M_curr_symbol_size(0),
3576 _M_positive_sign(NULL), _M_positive_sign_size(0),
3577 _M_negative_sign(NULL), _M_negative_sign_size(0),
3578 _M_frac_digits(0),
3579 _M_pos_format(money_base::pattern()),
3580 _M_neg_format(money_base::pattern()), _M_allocated(false)
3581 { }
3582
3583 ~__moneypunct_cache();
3584
3585 void
3586 _M_cache(const locale& __loc);
3587
3588 private:
3589 __moneypunct_cache&
3590 operator=(const __moneypunct_cache&);
3591
3592 explicit
3593 __moneypunct_cache(const __moneypunct_cache&);
3594 };
3595
3596 template<typename _CharT, bool _Intl>
~__moneypunct_cache()3597 __moneypunct_cache<_CharT, _Intl>::~__moneypunct_cache()
3598 {
3599 if (_M_allocated)
3600 {
3601 delete [] _M_grouping;
3602 delete [] _M_curr_symbol;
3603 delete [] _M_positive_sign;
3604 delete [] _M_negative_sign;
3605 }
3606 }
3607
3608 /**
3609 * @brief Facet for formatting data for money amounts.
3610 *
3611 * This facet encapsulates the punctuation, grouping and other formatting
3612 * features of money amount string representations.
3613 */
3614 template<typename _CharT, bool _Intl>
3615 class moneypunct : public locale::facet, public money_base
3616 {
3617 public:
3618 // Types:
3619 //@{
3620 /// Public typedefs
3621 typedef _CharT char_type;
3622 typedef basic_string<_CharT> string_type;
3623 //@}
3624 typedef __moneypunct_cache<_CharT, _Intl> __cache_type;
3625
3626 private:
3627 __cache_type* _M_data;
3628
3629 public:
3630 /// This value is provided by the standard, but no reason for its
3631 /// existence.
3632 static const bool intl = _Intl;
3633 /// Numpunct facet id.
3634 static locale::id id;
3635
3636 /**
3637 * @brief Constructor performs initialization.
3638 *
3639 * This is the constructor provided by the standard.
3640 *
3641 * @param refs Passed to the base facet class.
3642 */
3643 explicit
facet(__refs)3644 moneypunct(size_t __refs = 0) : facet(__refs), _M_data(NULL)
3645 { _M_initialize_moneypunct(); }
3646
3647 /**
3648 * @brief Constructor performs initialization.
3649 *
3650 * This is an internal constructor.
3651 *
3652 * @param cache Cache for optimization.
3653 * @param refs Passed to the base facet class.
3654 */
3655 explicit
3656 moneypunct(__cache_type* __cache, size_t __refs = 0)
facet(__refs)3657 : facet(__refs), _M_data(__cache)
3658 { _M_initialize_moneypunct(); }
3659
3660 /**
3661 * @brief Internal constructor. Not for general use.
3662 *
3663 * This is a constructor for use by the library itself to set up new
3664 * locales.
3665 *
3666 * @param cloc The "C" locale.
3667 * @param s The name of a locale.
3668 * @param refs Passed to the base facet class.
3669 */
3670 explicit
3671 moneypunct(__c_locale __cloc, const char* __s, size_t __refs = 0)
facet(__refs)3672 : facet(__refs), _M_data(NULL)
3673 { _M_initialize_moneypunct(__cloc, __s); }
3674
3675 /**
3676 * @brief Return decimal point character.
3677 *
3678 * This function returns a char_type to use as a decimal point. It
3679 * does so by returning returning
3680 * moneypunct<char_type>::do_decimal_point().
3681 *
3682 * @return @a char_type representing a decimal point.
3683 */
3684 char_type
decimal_point()3685 decimal_point() const
3686 { return this->do_decimal_point(); }
3687
3688 /**
3689 * @brief Return thousands separator character.
3690 *
3691 * This function returns a char_type to use as a thousands
3692 * separator. It does so by returning returning
3693 * moneypunct<char_type>::do_thousands_sep().
3694 *
3695 * @return char_type representing a thousands separator.
3696 */
3697 char_type
thousands_sep()3698 thousands_sep() const
3699 { return this->do_thousands_sep(); }
3700
3701 /**
3702 * @brief Return grouping specification.
3703 *
3704 * This function returns a string representing groupings for the
3705 * integer part of an amount. Groupings indicate where thousands
3706 * separators should be inserted.
3707 *
3708 * Each char in the return string is interpret as an integer rather
3709 * than a character. These numbers represent the number of digits in a
3710 * group. The first char in the string represents the number of digits
3711 * in the least significant group. If a char is negative, it indicates
3712 * an unlimited number of digits for the group. If more chars from the
3713 * string are required to group a number, the last char is used
3714 * repeatedly.
3715 *
3716 * For example, if the grouping() returns "\003\002" and is applied to
3717 * the number 123456789, this corresponds to 12,34,56,789. Note that
3718 * if the string was "32", this would put more than 50 digits into the
3719 * least significant group if the character set is ASCII.
3720 *
3721 * The string is returned by calling
3722 * moneypunct<char_type>::do_grouping().
3723 *
3724 * @return string representing grouping specification.
3725 */
3726 string
grouping()3727 grouping() const
3728 { return this->do_grouping(); }
3729
3730 /**
3731 * @brief Return currency symbol string.
3732 *
3733 * This function returns a string_type to use as a currency symbol. It
3734 * does so by returning returning
3735 * moneypunct<char_type>::do_curr_symbol().
3736 *
3737 * @return @a string_type representing a currency symbol.
3738 */
3739 string_type
curr_symbol()3740 curr_symbol() const
3741 { return this->do_curr_symbol(); }
3742
3743 /**
3744 * @brief Return positive sign string.
3745 *
3746 * This function returns a string_type to use as a sign for positive
3747 * amounts. It does so by returning returning
3748 * moneypunct<char_type>::do_positive_sign().
3749 *
3750 * If the return value contains more than one character, the first
3751 * character appears in the position indicated by pos_format() and the
3752 * remainder appear at the end of the formatted string.
3753 *
3754 * @return @a string_type representing a positive sign.
3755 */
3756 string_type
positive_sign()3757 positive_sign() const
3758 { return this->do_positive_sign(); }
3759
3760 /**
3761 * @brief Return negative sign string.
3762 *
3763 * This function returns a string_type to use as a sign for negative
3764 * amounts. It does so by returning returning
3765 * moneypunct<char_type>::do_negative_sign().
3766 *
3767 * If the return value contains more than one character, the first
3768 * character appears in the position indicated by neg_format() and the
3769 * remainder appear at the end of the formatted string.
3770 *
3771 * @return @a string_type representing a negative sign.
3772 */
3773 string_type
negative_sign()3774 negative_sign() const
3775 { return this->do_negative_sign(); }
3776
3777 /**
3778 * @brief Return number of digits in fraction.
3779 *
3780 * This function returns the exact number of digits that make up the
3781 * fractional part of a money amount. It does so by returning
3782 * returning moneypunct<char_type>::do_frac_digits().
3783 *
3784 * The fractional part of a money amount is optional. But if it is
3785 * present, there must be frac_digits() digits.
3786 *
3787 * @return Number of digits in amount fraction.
3788 */
3789 int
frac_digits()3790 frac_digits() const
3791 { return this->do_frac_digits(); }
3792
3793 //@{
3794 /**
3795 * @brief Return pattern for money values.
3796 *
3797 * This function returns a pattern describing the formatting of a
3798 * positive or negative valued money amount. It does so by returning
3799 * returning moneypunct<char_type>::do_pos_format() or
3800 * moneypunct<char_type>::do_neg_format().
3801 *
3802 * The pattern has 4 fields describing the ordering of symbol, sign,
3803 * value, and none or space. There must be one of each in the pattern.
3804 * The none and space enums may not appear in the first field and space
3805 * may not appear in the final field.
3806 *
3807 * The parts of a money string must appear in the order indicated by
3808 * the fields of the pattern. The symbol field indicates that the
3809 * value of curr_symbol() may be present. The sign field indicates
3810 * that the value of positive_sign() or negative_sign() must be
3811 * present. The value field indicates that the absolute value of the
3812 * money amount is present. none indicates 0 or more whitespace
3813 * characters, except at the end, where it permits no whitespace.
3814 * space indicates that 1 or more whitespace characters must be
3815 * present.
3816 *
3817 * For example, for the US locale and pos_format() pattern
3818 * {symbol,sign,value,none}, curr_symbol() == '$' positive_sign() ==
3819 * '+', and value 10.01, and options set to force the symbol, the
3820 * corresponding string is "$+10.01".
3821 *
3822 * @return Pattern for money values.
3823 */
3824 pattern
pos_format()3825 pos_format() const
3826 { return this->do_pos_format(); }
3827
3828 pattern
neg_format()3829 neg_format() const
3830 { return this->do_neg_format(); }
3831 //@}
3832
3833 protected:
3834 /// Destructor.
3835 virtual
3836 ~moneypunct();
3837
3838 /**
3839 * @brief Return decimal point character.
3840 *
3841 * Returns a char_type to use as a decimal point. This function is a
3842 * hook for derived classes to change the value returned.
3843 *
3844 * @return @a char_type representing a decimal point.
3845 */
3846 virtual char_type
do_decimal_point()3847 do_decimal_point() const
3848 { return _M_data->_M_decimal_point; }
3849
3850 /**
3851 * @brief Return thousands separator character.
3852 *
3853 * Returns a char_type to use as a thousands separator. This function
3854 * is a hook for derived classes to change the value returned.
3855 *
3856 * @return @a char_type representing a thousands separator.
3857 */
3858 virtual char_type
do_thousands_sep()3859 do_thousands_sep() const
3860 { return _M_data->_M_thousands_sep; }
3861
3862 /**
3863 * @brief Return grouping specification.
3864 *
3865 * Returns a string representing groupings for the integer part of a
3866 * number. This function is a hook for derived classes to change the
3867 * value returned. @see grouping() for details.
3868 *
3869 * @return String representing grouping specification.
3870 */
3871 virtual string
do_grouping()3872 do_grouping() const
3873 { return _M_data->_M_grouping; }
3874
3875 /**
3876 * @brief Return currency symbol string.
3877 *
3878 * This function returns a string_type to use as a currency symbol.
3879 * This function is a hook for derived classes to change the value
3880 * returned. @see curr_symbol() for details.
3881 *
3882 * @return @a string_type representing a currency symbol.
3883 */
3884 virtual string_type
do_curr_symbol()3885 do_curr_symbol() const
3886 { return _M_data->_M_curr_symbol; }
3887
3888 /**
3889 * @brief Return positive sign string.
3890 *
3891 * This function returns a string_type to use as a sign for positive
3892 * amounts. This function is a hook for derived classes to change the
3893 * value returned. @see positive_sign() for details.
3894 *
3895 * @return @a string_type representing a positive sign.
3896 */
3897 virtual string_type
do_positive_sign()3898 do_positive_sign() const
3899 { return _M_data->_M_positive_sign; }
3900
3901 /**
3902 * @brief Return negative sign string.
3903 *
3904 * This function returns a string_type to use as a sign for negative
3905 * amounts. This function is a hook for derived classes to change the
3906 * value returned. @see negative_sign() for details.
3907 *
3908 * @return @a string_type representing a negative sign.
3909 */
3910 virtual string_type
do_negative_sign()3911 do_negative_sign() const
3912 { return _M_data->_M_negative_sign; }
3913
3914 /**
3915 * @brief Return number of digits in fraction.
3916 *
3917 * This function returns the exact number of digits that make up the
3918 * fractional part of a money amount. This function is a hook for
3919 * derived classes to change the value returned. @see frac_digits()
3920 * for details.
3921 *
3922 * @return Number of digits in amount fraction.
3923 */
3924 virtual int
do_frac_digits()3925 do_frac_digits() const
3926 { return _M_data->_M_frac_digits; }
3927
3928 /**
3929 * @brief Return pattern for money values.
3930 *
3931 * This function returns a pattern describing the formatting of a
3932 * positive valued money amount. This function is a hook for derived
3933 * classes to change the value returned. @see pos_format() for
3934 * details.
3935 *
3936 * @return Pattern for money values.
3937 */
3938 virtual pattern
do_pos_format()3939 do_pos_format() const
3940 { return _M_data->_M_pos_format; }
3941
3942 /**
3943 * @brief Return pattern for money values.
3944 *
3945 * This function returns a pattern describing the formatting of a
3946 * negative valued money amount. This function is a hook for derived
3947 * classes to change the value returned. @see neg_format() for
3948 * details.
3949 *
3950 * @return Pattern for money values.
3951 */
3952 virtual pattern
do_neg_format()3953 do_neg_format() const
3954 { return _M_data->_M_neg_format; }
3955
3956 // For use at construction time only.
3957 void
3958 _M_initialize_moneypunct(__c_locale __cloc = NULL,
3959 const char* __name = NULL);
3960 };
3961
3962 template<typename _CharT, bool _Intl>
3963 locale::id moneypunct<_CharT, _Intl>::id;
3964
3965 template<typename _CharT, bool _Intl>
3966 const bool moneypunct<_CharT, _Intl>::intl;
3967
3968 template<>
3969 moneypunct<char, true>::~moneypunct();
3970
3971 template<>
3972 moneypunct<char, false>::~moneypunct();
3973
3974 template<>
3975 void
3976 moneypunct<char, true>::_M_initialize_moneypunct(__c_locale, const char*);
3977
3978 template<>
3979 void
3980 moneypunct<char, false>::_M_initialize_moneypunct(__c_locale, const char*);
3981
3982 #ifdef _GLIBCXX_USE_WCHAR_T
3983 template<>
3984 moneypunct<wchar_t, true>::~moneypunct();
3985
3986 template<>
3987 moneypunct<wchar_t, false>::~moneypunct();
3988
3989 template<>
3990 void
3991 moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale,
3992 const char*);
3993
3994 template<>
3995 void
3996 moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale,
3997 const char*);
3998 #endif
3999
4000 /// @brief class moneypunct_byname [22.2.6.4].
4001 template<typename _CharT, bool _Intl>
4002 class moneypunct_byname : public moneypunct<_CharT, _Intl>
4003 {
4004 public:
4005 typedef _CharT char_type;
4006 typedef basic_string<_CharT> string_type;
4007
4008 static const bool intl = _Intl;
4009
4010 explicit
4011 moneypunct_byname(const char* __s, size_t __refs = 0)
4012 : moneypunct<_CharT, _Intl>(__refs)
4013 {
4014 if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
4015 {
4016 __c_locale __tmp;
4017 this->_S_create_c_locale(__tmp, __s);
4018 this->_M_initialize_moneypunct(__tmp);
4019 this->_S_destroy_c_locale(__tmp);
4020 }
4021 }
4022
4023 protected:
4024 virtual
~moneypunct_byname()4025 ~moneypunct_byname() { }
4026 };
4027
4028 template<typename _CharT, bool _Intl>
4029 const bool moneypunct_byname<_CharT, _Intl>::intl;
4030
4031 _GLIBCXX_BEGIN_LDBL_NAMESPACE
4032 /**
4033 * @brief Facet for parsing monetary amounts.
4034 *
4035 * This facet encapsulates the code to parse and return a monetary
4036 * amount from a string.
4037 *
4038 * The money_get template uses protected virtual functions to
4039 * provide the actual results. The public accessors forward the
4040 * call to the virtual functions. These virtual functions are
4041 * hooks for developers to implement the behavior they require from
4042 * the money_get facet.
4043 */
4044 template<typename _CharT, typename _InIter>
4045 class money_get : public locale::facet
4046 {
4047 public:
4048 // Types:
4049 //@{
4050 /// Public typedefs
4051 typedef _CharT char_type;
4052 typedef _InIter iter_type;
4053 typedef basic_string<_CharT> string_type;
4054 //@}
4055
4056 /// Numpunct facet id.
4057 static locale::id id;
4058
4059 /**
4060 * @brief Constructor performs initialization.
4061 *
4062 * This is the constructor provided by the standard.
4063 *
4064 * @param refs Passed to the base facet class.
4065 */
4066 explicit
facet(__refs)4067 money_get(size_t __refs = 0) : facet(__refs) { }
4068
4069 /**
4070 * @brief Read and parse a monetary value.
4071 *
4072 * This function reads characters from @a s, interprets them as a
4073 * monetary value according to moneypunct and ctype facets retrieved
4074 * from io.getloc(), and returns the result in @a units as an integral
4075 * value moneypunct::frac_digits() * the actual amount. For example,
4076 * the string $10.01 in a US locale would store 1001 in @a units.
4077 *
4078 * Any characters not part of a valid money amount are not consumed.
4079 *
4080 * If a money value cannot be parsed from the input stream, sets
4081 * err=(err|io.failbit). If the stream is consumed before finishing
4082 * parsing, sets err=(err|io.failbit|io.eofbit). @a units is
4083 * unchanged if parsing fails.
4084 *
4085 * This function works by returning the result of do_get().
4086 *
4087 * @param s Start of characters to parse.
4088 * @param end End of characters to parse.
4089 * @param intl Parameter to use_facet<moneypunct<CharT,intl> >.
4090 * @param io Source of facets and io state.
4091 * @param err Error field to set if parsing fails.
4092 * @param units Place to store result of parsing.
4093 * @return Iterator referencing first character beyond valid money
4094 * amount.
4095 */
4096 iter_type
get(iter_type __s,iter_type __end,bool __intl,ios_base & __io,ios_base::iostate & __err,long double & __units)4097 get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
4098 ios_base::iostate& __err, long double& __units) const
4099 { return this->do_get(__s, __end, __intl, __io, __err, __units); }
4100
4101 /**
4102 * @brief Read and parse a monetary value.
4103 *
4104 * This function reads characters from @a s, interprets them as a
4105 * monetary value according to moneypunct and ctype facets retrieved
4106 * from io.getloc(), and returns the result in @a digits. For example,
4107 * the string $10.01 in a US locale would store "1001" in @a digits.
4108 *
4109 * Any characters not part of a valid money amount are not consumed.
4110 *
4111 * If a money value cannot be parsed from the input stream, sets
4112 * err=(err|io.failbit). If the stream is consumed before finishing
4113 * parsing, sets err=(err|io.failbit|io.eofbit).
4114 *
4115 * This function works by returning the result of do_get().
4116 *
4117 * @param s Start of characters to parse.
4118 * @param end End of characters to parse.
4119 * @param intl Parameter to use_facet<moneypunct<CharT,intl> >.
4120 * @param io Source of facets and io state.
4121 * @param err Error field to set if parsing fails.
4122 * @param digits Place to store result of parsing.
4123 * @return Iterator referencing first character beyond valid money
4124 * amount.
4125 */
4126 iter_type
get(iter_type __s,iter_type __end,bool __intl,ios_base & __io,ios_base::iostate & __err,string_type & __digits)4127 get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
4128 ios_base::iostate& __err, string_type& __digits) const
4129 { return this->do_get(__s, __end, __intl, __io, __err, __digits); }
4130
4131 protected:
4132 /// Destructor.
4133 virtual
~money_get()4134 ~money_get() { }
4135
4136 /**
4137 * @brief Read and parse a monetary value.
4138 *
4139 * This function reads and parses characters representing a monetary
4140 * value. This function is a hook for derived classes to change the
4141 * value returned. @see get() for details.
4142 */
4143 // XXX GLIBCXX_ABI Deprecated
4144 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
4145 virtual iter_type
4146 __do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
4147 ios_base::iostate& __err, double& __units) const;
4148 #else
4149 virtual iter_type
4150 do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
4151 ios_base::iostate& __err, long double& __units) const;
4152 #endif
4153
4154 /**
4155 * @brief Read and parse a monetary value.
4156 *
4157 * This function reads and parses characters representing a monetary
4158 * value. This function is a hook for derived classes to change the
4159 * value returned. @see get() for details.
4160 */
4161 virtual iter_type
4162 do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
4163 ios_base::iostate& __err, string_type& __digits) const;
4164
4165 // XXX GLIBCXX_ABI Deprecated
4166 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
4167 virtual iter_type
4168 do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
4169 ios_base::iostate& __err, long double& __units) const;
4170 #endif
4171
4172 template<bool _Intl>
4173 iter_type
4174 _M_extract(iter_type __s, iter_type __end, ios_base& __io,
4175 ios_base::iostate& __err, string& __digits) const;
4176 };
4177
4178 template<typename _CharT, typename _InIter>
4179 locale::id money_get<_CharT, _InIter>::id;
4180
4181 /**
4182 * @brief Facet for outputting monetary amounts.
4183 *
4184 * This facet encapsulates the code to format and output a monetary
4185 * amount.
4186 *
4187 * The money_put template uses protected virtual functions to
4188 * provide the actual results. The public accessors forward the
4189 * call to the virtual functions. These virtual functions are
4190 * hooks for developers to implement the behavior they require from
4191 * the money_put facet.
4192 */
4193 template<typename _CharT, typename _OutIter>
4194 class money_put : public locale::facet
4195 {
4196 public:
4197 //@{
4198 /// Public typedefs
4199 typedef _CharT char_type;
4200 typedef _OutIter iter_type;
4201 typedef basic_string<_CharT> string_type;
4202 //@}
4203
4204 /// Numpunct facet id.
4205 static locale::id id;
4206
4207 /**
4208 * @brief Constructor performs initialization.
4209 *
4210 * This is the constructor provided by the standard.
4211 *
4212 * @param refs Passed to the base facet class.
4213 */
4214 explicit
facet(__refs)4215 money_put(size_t __refs = 0) : facet(__refs) { }
4216
4217 /**
4218 * @brief Format and output a monetary value.
4219 *
4220 * This function formats @a units as a monetary value according to
4221 * moneypunct and ctype facets retrieved from io.getloc(), and writes
4222 * the resulting characters to @a s. For example, the value 1001 in a
4223 * US locale would write "$10.01" to @a s.
4224 *
4225 * This function works by returning the result of do_put().
4226 *
4227 * @param s The stream to write to.
4228 * @param intl Parameter to use_facet<moneypunct<CharT,intl> >.
4229 * @param io Source of facets and io state.
4230 * @param fill char_type to use for padding.
4231 * @param units Place to store result of parsing.
4232 * @return Iterator after writing.
4233 */
4234 iter_type
put(iter_type __s,bool __intl,ios_base & __io,char_type __fill,long double __units)4235 put(iter_type __s, bool __intl, ios_base& __io,
4236 char_type __fill, long double __units) const
4237 { return this->do_put(__s, __intl, __io, __fill, __units); }
4238
4239 /**
4240 * @brief Format and output a monetary value.
4241 *
4242 * This function formats @a digits as a monetary value according to
4243 * moneypunct and ctype facets retrieved from io.getloc(), and writes
4244 * the resulting characters to @a s. For example, the string "1001" in
4245 * a US locale would write "$10.01" to @a s.
4246 *
4247 * This function works by returning the result of do_put().
4248 *
4249 * @param s The stream to write to.
4250 * @param intl Parameter to use_facet<moneypunct<CharT,intl> >.
4251 * @param io Source of facets and io state.
4252 * @param fill char_type to use for padding.
4253 * @param units Place to store result of parsing.
4254 * @return Iterator after writing.
4255 */
4256 iter_type
put(iter_type __s,bool __intl,ios_base & __io,char_type __fill,const string_type & __digits)4257 put(iter_type __s, bool __intl, ios_base& __io,
4258 char_type __fill, const string_type& __digits) const
4259 { return this->do_put(__s, __intl, __io, __fill, __digits); }
4260
4261 protected:
4262 /// Destructor.
4263 virtual
~money_put()4264 ~money_put() { }
4265
4266 /**
4267 * @brief Format and output a monetary value.
4268 *
4269 * This function formats @a units as a monetary value according to
4270 * moneypunct and ctype facets retrieved from io.getloc(), and writes
4271 * the resulting characters to @a s. For example, the value 1001 in a
4272 * US locale would write "$10.01" to @a s.
4273 *
4274 * This function is a hook for derived classes to change the value
4275 * returned. @see put().
4276 *
4277 * @param s The stream to write to.
4278 * @param intl Parameter to use_facet<moneypunct<CharT,intl> >.
4279 * @param io Source of facets and io state.
4280 * @param fill char_type to use for padding.
4281 * @param units Place to store result of parsing.
4282 * @return Iterator after writing.
4283 */
4284 // XXX GLIBCXX_ABI Deprecated
4285 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
4286 virtual iter_type
4287 __do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
4288 double __units) const;
4289 #else
4290 virtual iter_type
4291 do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
4292 long double __units) const;
4293 #endif
4294
4295 /**
4296 * @brief Format and output a monetary value.
4297 *
4298 * This function formats @a digits as a monetary value according to
4299 * moneypunct and ctype facets retrieved from io.getloc(), and writes
4300 * the resulting characters to @a s. For example, the string "1001" in
4301 * a US locale would write "$10.01" to @a s.
4302 *
4303 * This function is a hook for derived classes to change the value
4304 * returned. @see put().
4305 *
4306 * @param s The stream to write to.
4307 * @param intl Parameter to use_facet<moneypunct<CharT,intl> >.
4308 * @param io Source of facets and io state.
4309 * @param fill char_type to use for padding.
4310 * @param units Place to store result of parsing.
4311 * @return Iterator after writing.
4312 */
4313 virtual iter_type
4314 do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
4315 const string_type& __digits) const;
4316
4317 // XXX GLIBCXX_ABI Deprecated
4318 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
4319 virtual iter_type
4320 do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
4321 long double __units) const;
4322 #endif
4323
4324 template<bool _Intl>
4325 iter_type
4326 _M_insert(iter_type __s, ios_base& __io, char_type __fill,
4327 const string_type& __digits) const;
4328 };
4329
4330 template<typename _CharT, typename _OutIter>
4331 locale::id money_put<_CharT, _OutIter>::id;
4332
4333 _GLIBCXX_END_LDBL_NAMESPACE
4334
4335 /**
4336 * @brief Messages facet base class providing catalog typedef.
4337 */
4338 struct messages_base
4339 {
4340 typedef int catalog;
4341 };
4342
4343 /**
4344 * @brief Facet for handling message catalogs
4345 *
4346 * This facet encapsulates the code to retrieve messages from
4347 * message catalogs. The only thing defined by the standard for this facet
4348 * is the interface. All underlying functionality is
4349 * implementation-defined.
4350 *
4351 * This library currently implements 3 versions of the message facet. The
4352 * first version (gnu) is a wrapper around gettext, provided by libintl.
4353 * The second version (ieee) is a wrapper around catgets. The final
4354 * version (default) does no actual translation. These implementations are
4355 * only provided for char and wchar_t instantiations.
4356 *
4357 * The messages template uses protected virtual functions to
4358 * provide the actual results. The public accessors forward the
4359 * call to the virtual functions. These virtual functions are
4360 * hooks for developers to implement the behavior they require from
4361 * the messages facet.
4362 */
4363 template<typename _CharT>
4364 class messages : public locale::facet, public messages_base
4365 {
4366 public:
4367 // Types:
4368 //@{
4369 /// Public typedefs
4370 typedef _CharT char_type;
4371 typedef basic_string<_CharT> string_type;
4372 //@}
4373
4374 protected:
4375 // Underlying "C" library locale information saved from
4376 // initialization, needed by messages_byname as well.
4377 __c_locale _M_c_locale_messages;
4378 const char* _M_name_messages;
4379
4380 public:
4381 /// Numpunct facet id.
4382 static locale::id id;
4383
4384 /**
4385 * @brief Constructor performs initialization.
4386 *
4387 * This is the constructor provided by the standard.
4388 *
4389 * @param refs Passed to the base facet class.
4390 */
4391 explicit
4392 messages(size_t __refs = 0);
4393
4394 // Non-standard.
4395 /**
4396 * @brief Internal constructor. Not for general use.
4397 *
4398 * This is a constructor for use by the library itself to set up new
4399 * locales.
4400 *
4401 * @param cloc The "C" locale.
4402 * @param s The name of a locale.
4403 * @param refs Refcount to pass to the base class.
4404 */
4405 explicit
4406 messages(__c_locale __cloc, const char* __s, size_t __refs = 0);
4407
4408 /*
4409 * @brief Open a message catalog.
4410 *
4411 * This function opens and returns a handle to a message catalog by
4412 * returning do_open(s, loc).
4413 *
4414 * @param s The catalog to open.
4415 * @param loc Locale to use for character set conversions.
4416 * @return Handle to the catalog or value < 0 if open fails.
4417 */
4418 catalog
open(const basic_string<char> & __s,const locale & __loc)4419 open(const basic_string<char>& __s, const locale& __loc) const
4420 { return this->do_open(__s, __loc); }
4421
4422 // Non-standard and unorthodox, yet effective.
4423 /*
4424 * @brief Open a message catalog.
4425 *
4426 * This non-standard function opens and returns a handle to a message
4427 * catalog by returning do_open(s, loc). The third argument provides a
4428 * message catalog root directory for gnu gettext and is ignored
4429 * otherwise.
4430 *
4431 * @param s The catalog to open.
4432 * @param loc Locale to use for character set conversions.
4433 * @param dir Message catalog root directory.
4434 * @return Handle to the catalog or value < 0 if open fails.
4435 */
4436 catalog
4437 open(const basic_string<char>&, const locale&, const char*) const;
4438
4439 /*
4440 * @brief Look up a string in a message catalog.
4441 *
4442 * This function retrieves and returns a message from a catalog by
4443 * returning do_get(c, set, msgid, s).
4444 *
4445 * For gnu, @a set and @a msgid are ignored. Returns gettext(s).
4446 * For default, returns s. For ieee, returns catgets(c,set,msgid,s).
4447 *
4448 * @param c The catalog to access.
4449 * @param set Implementation-defined.
4450 * @param msgid Implementation-defined.
4451 * @param s Default return value if retrieval fails.
4452 * @return Retrieved message or @a s if get fails.
4453 */
4454 string_type
get(catalog __c,int __set,int __msgid,const string_type & __s)4455 get(catalog __c, int __set, int __msgid, const string_type& __s) const
4456 { return this->do_get(__c, __set, __msgid, __s); }
4457
4458 /*
4459 * @brief Close a message catalog.
4460 *
4461 * Closes catalog @a c by calling do_close(c).
4462 *
4463 * @param c The catalog to close.
4464 */
4465 void
close(catalog __c)4466 close(catalog __c) const
4467 { return this->do_close(__c); }
4468
4469 protected:
4470 /// Destructor.
4471 virtual
4472 ~messages();
4473
4474 /*
4475 * @brief Open a message catalog.
4476 *
4477 * This function opens and returns a handle to a message catalog in an
4478 * implementation-defined manner. This function is a hook for derived
4479 * classes to change the value returned.
4480 *
4481 * @param s The catalog to open.
4482 * @param loc Locale to use for character set conversions.
4483 * @return Handle to the opened catalog, value < 0 if open failed.
4484 */
4485 virtual catalog
4486 do_open(const basic_string<char>&, const locale&) const;
4487
4488 /*
4489 * @brief Look up a string in a message catalog.
4490 *
4491 * This function retrieves and returns a message from a catalog in an
4492 * implementation-defined manner. This function is a hook for derived
4493 * classes to change the value returned.
4494 *
4495 * For gnu, @a set and @a msgid are ignored. Returns gettext(s).
4496 * For default, returns s. For ieee, returns catgets(c,set,msgid,s).
4497 *
4498 * @param c The catalog to access.
4499 * @param set Implementation-defined.
4500 * @param msgid Implementation-defined.
4501 * @param s Default return value if retrieval fails.
4502 * @return Retrieved message or @a s if get fails.
4503 */
4504 virtual string_type
4505 do_get(catalog, int, int, const string_type& __dfault) const;
4506
4507 /*
4508 * @brief Close a message catalog.
4509 *
4510 * @param c The catalog to close.
4511 */
4512 virtual void
4513 do_close(catalog) const;
4514
4515 // Returns a locale and codeset-converted string, given a char* message.
4516 char*
_M_convert_to_char(const string_type & __msg)4517 _M_convert_to_char(const string_type& __msg) const
4518 {
4519 // XXX
4520 return reinterpret_cast<char*>(const_cast<_CharT*>(__msg.c_str()));
4521 }
4522
4523 // Returns a locale and codeset-converted string, given a char* message.
4524 string_type
_M_convert_from_char(char *)4525 _M_convert_from_char(char*) const
4526 {
4527 #if 0
4528 // Length of message string without terminating null.
4529 size_t __len = char_traits<char>::length(__msg) - 1;
4530
4531 // "everybody can easily convert the string using
4532 // mbsrtowcs/wcsrtombs or with iconv()"
4533
4534 // Convert char* to _CharT in locale used to open catalog.
4535 // XXX need additional template parameter on messages class for this..
4536 // typedef typename codecvt<char, _CharT, _StateT> __codecvt_type;
4537 typedef typename codecvt<char, _CharT, mbstate_t> __codecvt_type;
4538
4539 __codecvt_type::state_type __state;
4540 // XXX may need to initialize state.
4541 //initialize_state(__state._M_init());
4542
4543 char* __from_next;
4544 // XXX what size for this string?
4545 _CharT* __to = static_cast<_CharT*>(__builtin_alloca(__len + 1));
4546 const __codecvt_type& __cvt = use_facet<__codecvt_type>(_M_locale_conv);
4547 __cvt.out(__state, __msg, __msg + __len, __from_next,
4548 __to, __to + __len + 1, __to_next);
4549 return string_type(__to);
4550 #endif
4551 #if 0
4552 typedef ctype<_CharT> __ctype_type;
4553 // const __ctype_type& __cvt = use_facet<__ctype_type>(_M_locale_msg);
4554 const __ctype_type& __cvt = use_facet<__ctype_type>(locale());
4555 // XXX Again, proper length of converted string an issue here.
4556 // For now, assume the converted length is not larger.
4557 _CharT* __dest = static_cast<_CharT*>(__builtin_alloca(__len + 1));
4558 __cvt.widen(__msg, __msg + __len, __dest);
4559 return basic_string<_CharT>(__dest);
4560 #endif
4561 return string_type();
4562 }
4563 };
4564
4565 template<typename _CharT>
4566 locale::id messages<_CharT>::id;
4567
4568 // Specializations for required instantiations.
4569 template<>
4570 string
4571 messages<char>::do_get(catalog, int, int, const string&) const;
4572
4573 #ifdef _GLIBCXX_USE_WCHAR_T
4574 template<>
4575 wstring
4576 messages<wchar_t>::do_get(catalog, int, int, const wstring&) const;
4577 #endif
4578
4579 /// @brief class messages_byname [22.2.7.2].
4580 template<typename _CharT>
4581 class messages_byname : public messages<_CharT>
4582 {
4583 public:
4584 typedef _CharT char_type;
4585 typedef basic_string<_CharT> string_type;
4586
4587 explicit
4588 messages_byname(const char* __s, size_t __refs = 0);
4589
4590 protected:
4591 virtual
~messages_byname()4592 ~messages_byname()
4593 { }
4594 };
4595
4596 _GLIBCXX_END_NAMESPACE
4597
4598 // Include host and configuration specific messages functions.
4599 #include <bits/messages_members.h>
4600
_GLIBCXX_BEGIN_NAMESPACE(std)4601 _GLIBCXX_BEGIN_NAMESPACE(std)
4602
4603 // Subclause convenience interfaces, inlines.
4604 // NB: These are inline because, when used in a loop, some compilers
4605 // can hoist the body out of the loop; then it's just as fast as the
4606 // C is*() function.
4607
4608 /// Convenience interface to ctype.is(ctype_base::space, __c).
4609 template<typename _CharT>
4610 inline bool
4611 isspace(_CharT __c, const locale& __loc)
4612 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::space, __c); }
4613
4614 /// Convenience interface to ctype.is(ctype_base::print, __c).
4615 template<typename _CharT>
4616 inline bool
isprint(_CharT __c,const locale & __loc)4617 isprint(_CharT __c, const locale& __loc)
4618 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::print, __c); }
4619
4620 /// Convenience interface to ctype.is(ctype_base::cntrl, __c).
4621 template<typename _CharT>
4622 inline bool
iscntrl(_CharT __c,const locale & __loc)4623 iscntrl(_CharT __c, const locale& __loc)
4624 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::cntrl, __c); }
4625
4626 /// Convenience interface to ctype.is(ctype_base::upper, __c).
4627 template<typename _CharT>
4628 inline bool
isupper(_CharT __c,const locale & __loc)4629 isupper(_CharT __c, const locale& __loc)
4630 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::upper, __c); }
4631
4632 /// Convenience interface to ctype.is(ctype_base::lower, __c).
4633 template<typename _CharT>
4634 inline bool
islower(_CharT __c,const locale & __loc)4635 islower(_CharT __c, const locale& __loc)
4636 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::lower, __c); }
4637
4638 /// Convenience interface to ctype.is(ctype_base::alpha, __c).
4639 template<typename _CharT>
4640 inline bool
isalpha(_CharT __c,const locale & __loc)4641 isalpha(_CharT __c, const locale& __loc)
4642 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alpha, __c); }
4643
4644 /// Convenience interface to ctype.is(ctype_base::digit, __c).
4645 template<typename _CharT>
4646 inline bool
isdigit(_CharT __c,const locale & __loc)4647 isdigit(_CharT __c, const locale& __loc)
4648 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::digit, __c); }
4649
4650 /// Convenience interface to ctype.is(ctype_base::punct, __c).
4651 template<typename _CharT>
4652 inline bool
ispunct(_CharT __c,const locale & __loc)4653 ispunct(_CharT __c, const locale& __loc)
4654 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::punct, __c); }
4655
4656 /// Convenience interface to ctype.is(ctype_base::xdigit, __c).
4657 template<typename _CharT>
4658 inline bool
isxdigit(_CharT __c,const locale & __loc)4659 isxdigit(_CharT __c, const locale& __loc)
4660 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::xdigit, __c); }
4661
4662 /// Convenience interface to ctype.is(ctype_base::alnum, __c).
4663 template<typename _CharT>
4664 inline bool
isalnum(_CharT __c,const locale & __loc)4665 isalnum(_CharT __c, const locale& __loc)
4666 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alnum, __c); }
4667
4668 /// Convenience interface to ctype.is(ctype_base::graph, __c).
4669 template<typename _CharT>
4670 inline bool
isgraph(_CharT __c,const locale & __loc)4671 isgraph(_CharT __c, const locale& __loc)
4672 { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::graph, __c); }
4673
4674 /// Convenience interface to ctype.toupper(__c).
4675 template<typename _CharT>
4676 inline _CharT
toupper(_CharT __c,const locale & __loc)4677 toupper(_CharT __c, const locale& __loc)
4678 { return use_facet<ctype<_CharT> >(__loc).toupper(__c); }
4679
4680 /// Convenience interface to ctype.tolower(__c).
4681 template<typename _CharT>
4682 inline _CharT
tolower(_CharT __c,const locale & __loc)4683 tolower(_CharT __c, const locale& __loc)
4684 { return use_facet<ctype<_CharT> >(__loc).tolower(__c); }
4685
4686 _GLIBCXX_END_NAMESPACE
4687
4688 #endif
4689