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