Where Online Learning is simpler!
The C and C++ Include Header Files
/usr/include/c++/13/bits/locale_facets_nonio.h
$ cat -n /usr/include/c++/13/bits/locale_facets_nonio.h 1 // Locale support -*- C++ -*- 2 3 // Copyright (C) 2007-2023 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 //
. 24 25 /** @file bits/locale_facets_nonio.h 26 * This is an internal header file, included by other library headers. 27 * Do not attempt to use it directly. @headername{locale} 28 */ 29 30 // 31 // ISO C++ 14882: 22.1 Locales 32 // 33 34 #ifndef _LOCALE_FACETS_NONIO_H 35 #define _LOCALE_FACETS_NONIO_H 1 36 37 #pragma GCC system_header 38 39 #include
// For struct tm 40 41 namespace std _GLIBCXX_VISIBILITY(default) 42 { 43 _GLIBCXX_BEGIN_NAMESPACE_VERSION 44 45 /** 46 * @brief Time format ordering data. 47 * @ingroup locales 48 * 49 * This class provides an enum representing different orderings of 50 * time: day, month, and year. 51 */ 52 class time_base 53 { 54 public: 55 enum dateorder { no_order, dmy, mdy, ymd, ydm }; 56 }; 57 58 template
59 struct __timepunct_cache : public locale::facet 60 { 61 // List of all known timezones, with GMT first. 62 static const _CharT* _S_timezones[14]; 63 64 const _CharT* _M_date_format; 65 const _CharT* _M_date_era_format; 66 const _CharT* _M_time_format; 67 const _CharT* _M_time_era_format; 68 const _CharT* _M_date_time_format; 69 const _CharT* _M_date_time_era_format; 70 const _CharT* _M_am; 71 const _CharT* _M_pm; 72 const _CharT* _M_am_pm_format; 73 74 // Day names, starting with "C"'s Sunday. 75 const _CharT* _M_day1; 76 const _CharT* _M_day2; 77 const _CharT* _M_day3; 78 const _CharT* _M_day4; 79 const _CharT* _M_day5; 80 const _CharT* _M_day6; 81 const _CharT* _M_day7; 82 83 // Abbreviated day names, starting with "C"'s Sun. 84 const _CharT* _M_aday1; 85 const _CharT* _M_aday2; 86 const _CharT* _M_aday3; 87 const _CharT* _M_aday4; 88 const _CharT* _M_aday5; 89 const _CharT* _M_aday6; 90 const _CharT* _M_aday7; 91 92 // Month names, starting with "C"'s January. 93 const _CharT* _M_month01; 94 const _CharT* _M_month02; 95 const _CharT* _M_month03; 96 const _CharT* _M_month04; 97 const _CharT* _M_month05; 98 const _CharT* _M_month06; 99 const _CharT* _M_month07; 100 const _CharT* _M_month08; 101 const _CharT* _M_month09; 102 const _CharT* _M_month10; 103 const _CharT* _M_month11; 104 const _CharT* _M_month12; 105 106 // Abbreviated month names, starting with "C"'s Jan. 107 const _CharT* _M_amonth01; 108 const _CharT* _M_amonth02; 109 const _CharT* _M_amonth03; 110 const _CharT* _M_amonth04; 111 const _CharT* _M_amonth05; 112 const _CharT* _M_amonth06; 113 const _CharT* _M_amonth07; 114 const _CharT* _M_amonth08; 115 const _CharT* _M_amonth09; 116 const _CharT* _M_amonth10; 117 const _CharT* _M_amonth11; 118 const _CharT* _M_amonth12; 119 120 bool _M_allocated; 121 122 __timepunct_cache(size_t __refs = 0) : facet(__refs), 123 _M_date_format(0), _M_date_era_format(0), _M_time_format(0), 124 _M_time_era_format(0), _M_date_time_format(0), 125 _M_date_time_era_format(0), _M_am(0), _M_pm(0), 126 _M_am_pm_format(0), _M_day1(0), _M_day2(0), _M_day3(0), 127 _M_day4(0), _M_day5(0), _M_day6(0), _M_day7(0), 128 _M_aday1(0), _M_aday2(0), _M_aday3(0), _M_aday4(0), 129 _M_aday5(0), _M_aday6(0), _M_aday7(0), _M_month01(0), 130 _M_month02(0), _M_month03(0), _M_month04(0), _M_month05(0), 131 _M_month06(0), _M_month07(0), _M_month08(0), _M_month09(0), 132 _M_month10(0), _M_month11(0), _M_month12(0), _M_amonth01(0), 133 _M_amonth02(0), _M_amonth03(0), _M_amonth04(0), 134 _M_amonth05(0), _M_amonth06(0), _M_amonth07(0), 135 _M_amonth08(0), _M_amonth09(0), _M_amonth10(0), 136 _M_amonth11(0), _M_amonth12(0), _M_allocated(false) 137 { } 138 139 ~__timepunct_cache(); 140 141 private: 142 __timepunct_cache& 143 operator=(const __timepunct_cache&); 144 145 explicit 146 __timepunct_cache(const __timepunct_cache&); 147 }; 148 149 template
150 __timepunct_cache<_CharT>::~__timepunct_cache() 151 { 152 if (_M_allocated) 153 { 154 // Unused. 155 } 156 } 157 158 // Specializations. 159 template<> 160 const char* 161 __timepunct_cache
::_S_timezones[14]; 162 163 #ifdef _GLIBCXX_USE_WCHAR_T 164 template<> 165 const wchar_t* 166 __timepunct_cache
::_S_timezones[14]; 167 #endif 168 169 // Generic. 170 template
171 const _CharT* __timepunct_cache<_CharT>::_S_timezones[14]; 172 173 template
174 class __timepunct : public locale::facet 175 { 176 public: 177 // Types: 178 typedef _CharT __char_type; 179 typedef __timepunct_cache<_CharT> __cache_type; 180 181 protected: 182 __cache_type* _M_data; 183 __c_locale _M_c_locale_timepunct; 184 const char* _M_name_timepunct; 185 186 public: 187 /// Numpunct facet id. 188 static locale::id id; 189 190 explicit 191 __timepunct(size_t __refs = 0); 192 193 explicit 194 __timepunct(__cache_type* __cache, size_t __refs = 0); 195 196 /** 197 * @brief Internal constructor. Not for general use. 198 * 199 * This is a constructor for use by the library itself to set up new 200 * locales. 201 * 202 * @param __cloc The C locale. 203 * @param __s The name of a locale. 204 * @param refs Passed to the base facet class. 205 */ 206 explicit 207 __timepunct(__c_locale __cloc, const char* __s, size_t __refs = 0); 208 209 // FIXME: for error checking purposes _M_put should return the return 210 // value of strftime/wcsftime. 211 void 212 _M_put(_CharT* __s, size_t __maxlen, const _CharT* __format, 213 const tm* __tm) const throw (); 214 215 void 216 _M_date_formats(const _CharT** __date) const 217 { 218 // Always have default first. 219 __date[0] = _M_data->_M_date_format; 220 __date[1] = _M_data->_M_date_era_format; 221 } 222 223 void 224 _M_time_formats(const _CharT** __time) const 225 { 226 // Always have default first. 227 __time[0] = _M_data->_M_time_format; 228 __time[1] = _M_data->_M_time_era_format; 229 } 230 231 void 232 _M_date_time_formats(const _CharT** __dt) const 233 { 234 // Always have default first. 235 __dt[0] = _M_data->_M_date_time_format; 236 __dt[1] = _M_data->_M_date_time_era_format; 237 } 238 239 #if !_GLIBCXX_INLINE_VERSION 240 void 241 _M_am_pm_format(const _CharT*) const 242 { /* Kept for ABI compatibility, see PR65927 */ } 243 #endif 244 245 void 246 _M_am_pm_format(const _CharT** __ampm_format) const 247 { 248 __ampm_format[0] = _M_data->_M_am_pm_format; 249 } 250 251 void 252 _M_am_pm(const _CharT** __ampm) const 253 { 254 __ampm[0] = _M_data->_M_am; 255 __ampm[1] = _M_data->_M_pm; 256 } 257 258 void 259 _M_days(const _CharT** __days) const 260 { 261 __days[0] = _M_data->_M_day1; 262 __days[1] = _M_data->_M_day2; 263 __days[2] = _M_data->_M_day3; 264 __days[3] = _M_data->_M_day4; 265 __days[4] = _M_data->_M_day5; 266 __days[5] = _M_data->_M_day6; 267 __days[6] = _M_data->_M_day7; 268 } 269 270 void 271 _M_days_abbreviated(const _CharT** __days) const 272 { 273 __days[0] = _M_data->_M_aday1; 274 __days[1] = _M_data->_M_aday2; 275 __days[2] = _M_data->_M_aday3; 276 __days[3] = _M_data->_M_aday4; 277 __days[4] = _M_data->_M_aday5; 278 __days[5] = _M_data->_M_aday6; 279 __days[6] = _M_data->_M_aday7; 280 } 281 282 void 283 _M_months(const _CharT** __months) const 284 { 285 __months[0] = _M_data->_M_month01; 286 __months[1] = _M_data->_M_month02; 287 __months[2] = _M_data->_M_month03; 288 __months[3] = _M_data->_M_month04; 289 __months[4] = _M_data->_M_month05; 290 __months[5] = _M_data->_M_month06; 291 __months[6] = _M_data->_M_month07; 292 __months[7] = _M_data->_M_month08; 293 __months[8] = _M_data->_M_month09; 294 __months[9] = _M_data->_M_month10; 295 __months[10] = _M_data->_M_month11; 296 __months[11] = _M_data->_M_month12; 297 } 298 299 void 300 _M_months_abbreviated(const _CharT** __months) const 301 { 302 __months[0] = _M_data->_M_amonth01; 303 __months[1] = _M_data->_M_amonth02; 304 __months[2] = _M_data->_M_amonth03; 305 __months[3] = _M_data->_M_amonth04; 306 __months[4] = _M_data->_M_amonth05; 307 __months[5] = _M_data->_M_amonth06; 308 __months[6] = _M_data->_M_amonth07; 309 __months[7] = _M_data->_M_amonth08; 310 __months[8] = _M_data->_M_amonth09; 311 __months[9] = _M_data->_M_amonth10; 312 __months[10] = _M_data->_M_amonth11; 313 __months[11] = _M_data->_M_amonth12; 314 } 315 316 protected: 317 virtual 318 ~__timepunct(); 319 320 // For use at construction time only. 321 void 322 _M_initialize_timepunct(__c_locale __cloc = 0); 323 }; 324 325 template
326 locale::id __timepunct<_CharT>::id; 327 328 // Specializations. 329 template<> 330 void 331 __timepunct
::_M_initialize_timepunct(__c_locale __cloc); 332 333 template<> 334 void 335 __timepunct
::_M_put(char*, size_t, const char*, const tm*) const throw (); 336 337 #ifdef _GLIBCXX_USE_WCHAR_T 338 template<> 339 void 340 __timepunct
::_M_initialize_timepunct(__c_locale __cloc); 341 342 template<> 343 void 344 __timepunct
::_M_put(wchar_t*, size_t, const wchar_t*, 345 const tm*) const throw (); 346 #endif 347 348 _GLIBCXX_END_NAMESPACE_VERSION 349 } // namespace 350 351 // Include host and configuration specific timepunct functions. 352 #include
353 354 namespace std _GLIBCXX_VISIBILITY(default) 355 { 356 _GLIBCXX_BEGIN_NAMESPACE_VERSION 357 358 struct __time_get_state 359 { 360 // Finalize state. 361 void 362 _M_finalize_state(tm* __tm); 363 364 unsigned int _M_have_I : 1; 365 unsigned int _M_have_wday : 1; 366 unsigned int _M_have_yday : 1; 367 unsigned int _M_have_mon : 1; 368 unsigned int _M_have_mday : 1; 369 unsigned int _M_have_uweek : 1; 370 unsigned int _M_have_wweek : 1; 371 unsigned int _M_have_century : 1; 372 unsigned int _M_is_pm : 1; 373 unsigned int _M_want_century : 1; 374 unsigned int _M_want_xday : 1; 375 unsigned int _M_pad1 : 5; 376 unsigned int _M_week_no : 6; 377 unsigned int _M_pad2 : 10; 378 int _M_century; 379 int _M_pad3; 380 }; 381 382 _GLIBCXX_BEGIN_NAMESPACE_CXX11 383 384 /** 385 * @brief Primary class template time_get. 386 * @ingroup locales 387 * 388 * This facet encapsulates the code to parse and return a date or 389 * time from a string. It is used by the istream numeric 390 * extraction operators. 391 * 392 * The time_get template uses protected virtual functions to provide the 393 * actual results. The public accessors forward the call to the virtual 394 * functions. These virtual functions are hooks for developers to 395 * implement the behavior they require from the time_get facet. 396 */ 397 template
398 class time_get : public locale::facet, public time_base 399 { 400 public: 401 // Types: 402 ///@{ 403 /// Public typedefs 404 typedef _CharT char_type; 405 typedef _InIter iter_type; 406 ///@} 407 408 /// Numpunct facet id. 409 static locale::id id; 410 411 /** 412 * @brief Constructor performs initialization. 413 * 414 * This is the constructor provided by the standard. 415 * 416 * @param __refs Passed to the base facet class. 417 */ 418 explicit 419 time_get(size_t __refs = 0) 420 : facet (__refs) { } 421 422 /** 423 * @brief Return preferred order of month, day, and year. 424 * 425 * This function returns an enum from time_base::dateorder giving the 426 * preferred ordering if the format @a x given to time_put::put() only 427 * uses month, day, and year. If the format @a x for the associated 428 * locale uses other fields, this function returns 429 * time_base::dateorder::noorder. 430 * 431 * NOTE: The library always returns noorder at the moment. 432 * 433 * @return A member of time_base::dateorder. 434 */ 435 dateorder 436 date_order() const 437 { return this->do_date_order(); } 438 439 /** 440 * @brief Parse input time string. 441 * 442 * This function parses a time according to the format @a X and puts the 443 * results into a user-supplied struct tm. The result is returned by 444 * calling time_get::do_get_time(). 445 * 446 * If there is a valid time string according to format @a X, @a tm will 447 * be filled in accordingly and the returned iterator will point to the 448 * first character beyond the time string. If an error occurs before 449 * the end, err |= ios_base::failbit. If parsing reads all the 450 * characters, err |= ios_base::eofbit. 451 * 452 * @param __beg Start of string to parse. 453 * @param __end End of string to parse. 454 * @param __io Source of the locale. 455 * @param __err Error flags to set. 456 * @param __tm Pointer to struct tm to fill in. 457 * @return Iterator to first char beyond time string. 458 */ 459 iter_type 460 get_time(iter_type __beg, iter_type __end, ios_base& __io, 461 ios_base::iostate& __err, tm* __tm) const 462 { return this->do_get_time(__beg, __end, __io, __err, __tm); } 463 464 /** 465 * @brief Parse input date string. 466 * 467 * This function parses a date according to the format @a x and puts the 468 * results into a user-supplied struct tm. The result is returned by 469 * calling time_get::do_get_date(). 470 * 471 * If there is a valid date string according to format @a x, @a tm will 472 * be filled in accordingly and the returned iterator will point to the 473 * first character beyond the date string. If an error occurs before 474 * the end, err |= ios_base::failbit. If parsing reads all the 475 * characters, err |= ios_base::eofbit. 476 * 477 * @param __beg Start of string to parse. 478 * @param __end End of string to parse. 479 * @param __io Source of the locale. 480 * @param __err Error flags to set. 481 * @param __tm Pointer to struct tm to fill in. 482 * @return Iterator to first char beyond date string. 483 */ 484 iter_type 485 get_date(iter_type __beg, iter_type __end, ios_base& __io, 486 ios_base::iostate& __err, tm* __tm) const 487 { return this->do_get_date(__beg, __end, __io, __err, __tm); } 488 489 /** 490 * @brief Parse input weekday string. 491 * 492 * This function parses a weekday name and puts the results into a 493 * user-supplied struct tm. The result is returned by calling 494 * time_get::do_get_weekday(). 495 * 496 * Parsing starts by parsing an abbreviated weekday name. If a valid 497 * abbreviation is followed by a character that would lead to the full 498 * weekday name, parsing continues until the full name is found or an 499 * error occurs. Otherwise parsing finishes at the end of the 500 * abbreviated name. 501 * 502 * If an error occurs before the end, err |= ios_base::failbit. If 503 * parsing reads all the characters, err |= ios_base::eofbit. 504 * 505 * @param __beg Start of string to parse. 506 * @param __end End of string to parse. 507 * @param __io Source of the locale. 508 * @param __err Error flags to set. 509 * @param __tm Pointer to struct tm to fill in. 510 * @return Iterator to first char beyond weekday name. 511 */ 512 iter_type 513 get_weekday(iter_type __beg, iter_type __end, ios_base& __io, 514 ios_base::iostate& __err, tm* __tm) const 515 { return this->do_get_weekday(__beg, __end, __io, __err, __tm); } 516 517 /** 518 * @brief Parse input month string. 519 * 520 * This function parses a month name and puts the results into a 521 * user-supplied struct tm. The result is returned by calling 522 * time_get::do_get_monthname(). 523 * 524 * Parsing starts by parsing an abbreviated month name. If a valid 525 * abbreviation is followed by a character that would lead to the full 526 * month name, parsing continues until the full name is found or an 527 * error occurs. Otherwise parsing finishes at the end of the 528 * abbreviated name. 529 * 530 * If an error occurs before the end, err |= ios_base::failbit. If 531 * parsing reads all the characters, err |= 532 * ios_base::eofbit. 533 * 534 * @param __beg Start of string to parse. 535 * @param __end End of string to parse. 536 * @param __io Source of the locale. 537 * @param __err Error flags to set. 538 * @param __tm Pointer to struct tm to fill in. 539 * @return Iterator to first char beyond month name. 540 */ 541 iter_type 542 get_monthname(iter_type __beg, iter_type __end, ios_base& __io, 543 ios_base::iostate& __err, tm* __tm) const 544 { return this->do_get_monthname(__beg, __end, __io, __err, __tm); } 545 546 /** 547 * @brief Parse input year string. 548 * 549 * This function reads up to 4 characters to parse a year string and 550 * puts the results into a user-supplied struct tm. The result is 551 * returned by calling time_get::do_get_year(). 552 * 553 * 4 consecutive digits are interpreted as a full year. If there are 554 * exactly 2 consecutive digits, the library interprets this as the 555 * number of years since 1900. 556 * 557 * If an error occurs before the end, err |= ios_base::failbit. If 558 * parsing reads all the characters, err |= ios_base::eofbit. 559 * 560 * @param __beg Start of string to parse. 561 * @param __end End of string to parse. 562 * @param __io Source of the locale. 563 * @param __err Error flags to set. 564 * @param __tm Pointer to struct tm to fill in. 565 * @return Iterator to first char beyond year. 566 */ 567 iter_type 568 get_year(iter_type __beg, iter_type __end, ios_base& __io, 569 ios_base::iostate& __err, tm* __tm) const 570 { return this->do_get_year(__beg, __end, __io, __err, __tm); } 571 572 #if __cplusplus >= 201103L 573 /** 574 * @brief Parse input string according to format. 575 * 576 * This function calls time_get::do_get with the provided 577 * parameters. @see do_get() and get(). 578 * 579 * @param __s Start of string to parse. 580 * @param __end End of string to parse. 581 * @param __io Source of the locale. 582 * @param __err Error flags to set. 583 * @param __tm Pointer to struct tm to fill in. 584 * @param __format Format specifier. 585 * @param __modifier Format modifier. 586 * @return Iterator to first char not parsed. 587 */ 588 inline 589 iter_type get(iter_type __s, iter_type __end, ios_base& __io, 590 ios_base::iostate& __err, tm* __tm, char __format, 591 char __modifier = 0) const 592 { 593 return this->do_get(__s, __end, __io, __err, __tm, __format, 594 __modifier); 595 } 596 597 /** 598 * @brief Parse input string according to format. 599 * 600 * This function parses the input string according to a 601 * provided format string. It does the inverse of 602 * time_put::put. The format string follows the format 603 * specified for strftime(3)/strptime(3). The actual parsing 604 * is done by time_get::do_get. 605 * 606 * @param __s Start of string to parse. 607 * @param __end End of string to parse. 608 * @param __io Source of the locale. 609 * @param __err Error flags to set. 610 * @param __tm Pointer to struct tm to fill in. 611 * @param __fmt Start of the format string. 612 * @param __fmtend End of the format string. 613 * @return Iterator to first char not parsed. 614 */ 615 iter_type get(iter_type __s, iter_type __end, ios_base& __io, 616 ios_base::iostate& __err, tm* __tm, const char_type* __fmt, 617 const char_type* __fmtend) const; 618 #endif // __cplusplus >= 201103L 619 620 protected: 621 /// Destructor. 622 virtual 623 ~time_get() { } 624 625 /** 626 * @brief Return preferred order of month, day, and year. 627 * 628 * This function returns an enum from time_base::dateorder giving the 629 * preferred ordering if the format @a x given to time_put::put() only 630 * uses month, day, and year. This function is a hook for derived 631 * classes to change the value returned. 632 * 633 * @return A member of time_base::dateorder. 634 */ 635 virtual dateorder 636 do_date_order() const; 637 638 /** 639 * @brief Parse input time string. 640 * 641 * This function parses a time according to the format @a x and puts the 642 * results into a user-supplied struct tm. This function is a hook for 643 * derived classes to change the value returned. @see get_time() for 644 * details. 645 * 646 * @param __beg Start of string to parse. 647 * @param __end End of string to parse. 648 * @param __io Source of the locale. 649 * @param __err Error flags to set. 650 * @param __tm Pointer to struct tm to fill in. 651 * @return Iterator to first char beyond time string. 652 */ 653 virtual iter_type 654 do_get_time(iter_type __beg, iter_type __end, ios_base& __io, 655 ios_base::iostate& __err, tm* __tm) const; 656 657 /** 658 * @brief Parse input date string. 659 * 660 * This function parses a date according to the format @a X and puts the 661 * results into a user-supplied struct tm. This function is a hook for 662 * derived classes to change the value returned. @see get_date() for 663 * details. 664 * 665 * @param __beg Start of string to parse. 666 * @param __end End of string to parse. 667 * @param __io Source of the locale. 668 * @param __err Error flags to set. 669 * @param __tm Pointer to struct tm to fill in. 670 * @return Iterator to first char beyond date string. 671 */ 672 virtual iter_type 673 do_get_date(iter_type __beg, iter_type __end, ios_base& __io, 674 ios_base::iostate& __err, tm* __tm) const; 675 676 /** 677 * @brief Parse input weekday string. 678 * 679 * This function parses a weekday name and puts the results into a 680 * user-supplied struct tm. This function is a hook for derived 681 * classes to change the value returned. @see get_weekday() for 682 * details. 683 * 684 * @param __beg Start of string to parse. 685 * @param __end End of string to parse. 686 * @param __io Source of the locale. 687 * @param __err Error flags to set. 688 * @param __tm Pointer to struct tm to fill in. 689 * @return Iterator to first char beyond weekday name. 690 */ 691 virtual iter_type 692 do_get_weekday(iter_type __beg, iter_type __end, ios_base&, 693 ios_base::iostate& __err, tm* __tm) const; 694 695 /** 696 * @brief Parse input month string. 697 * 698 * This function parses a month name and puts the results into a 699 * user-supplied struct tm. This function is a hook for derived 700 * classes to change the value returned. @see get_monthname() for 701 * details. 702 * 703 * @param __beg Start of string to parse. 704 * @param __end End of string to parse. 705 * @param __io Source of the locale. 706 * @param __err Error flags to set. 707 * @param __tm Pointer to struct tm to fill in. 708 * @return Iterator to first char beyond month name. 709 */ 710 virtual iter_type 711 do_get_monthname(iter_type __beg, iter_type __end, ios_base&, 712 ios_base::iostate& __err, tm* __tm) const; 713 714 /** 715 * @brief Parse input year string. 716 * 717 * This function reads up to 4 characters to parse a year string and 718 * puts the results into a user-supplied struct tm. This function is a 719 * hook for derived classes to change the value returned. @see 720 * get_year() for details. 721 * 722 * @param __beg Start of string to parse. 723 * @param __end End of string to parse. 724 * @param __io Source of the locale. 725 * @param __err Error flags to set. 726 * @param __tm Pointer to struct tm to fill in. 727 * @return Iterator to first char beyond year. 728 */ 729 virtual iter_type 730 do_get_year(iter_type __beg, iter_type __end, ios_base& __io, 731 ios_base::iostate& __err, tm* __tm) const; 732 733 #if __cplusplus >= 201103L 734 /** 735 * @brief Parse input string according to format. 736 * 737 * This function parses the string according to the provided 738 * format and optional modifier. This function is a hook for 739 * derived classes to change the value returned. @see get() 740 * for more details. 741 * 742 * @param __s Start of string to parse. 743 * @param __end End of string to parse. 744 * @param __f Source of the locale. 745 * @param __err Error flags to set. 746 * @param __tm Pointer to struct tm to fill in. 747 * @param __format Format specifier. 748 * @param __modifier Format modifier. 749 * @return Iterator to first char not parsed. 750 */ 751 #if _GLIBCXX_USE_CXX11_ABI 752 virtual 753 #endif 754 iter_type 755 do_get(iter_type __s, iter_type __end, ios_base& __f, 756 ios_base::iostate& __err, tm* __tm, 757 char __format, char __modifier) const; 758 #endif // __cplusplus >= 201103L 759 760 // Extract numeric component of length __len. 761 iter_type 762 _M_extract_num(iter_type __beg, iter_type __end, int& __member, 763 int __min, int __max, size_t __len, 764 ios_base& __io, ios_base::iostate& __err) const; 765 766 // Extract any unique array of string literals in a const _CharT* array. 767 iter_type 768 _M_extract_name(iter_type __beg, iter_type __end, int& __member, 769 const _CharT** __names, size_t __indexlen, 770 ios_base& __io, ios_base::iostate& __err) const; 771 772 // Extract day or month name in a const _CharT* array. 773 iter_type 774 _M_extract_wday_or_month(iter_type __beg, iter_type __end, int& __member, 775 const _CharT** __names, size_t __indexlen, 776 ios_base& __io, ios_base::iostate& __err) const; 777 778 // Extract on a component-by-component basis, via __format argument. 779 iter_type 780 _M_extract_via_format(iter_type __beg, iter_type __end, ios_base& __io, 781 ios_base::iostate& __err, tm* __tm, 782 const _CharT* __format) const; 783 784 // Extract on a component-by-component basis, via __format argument, with 785 // state. 786 iter_type 787 _M_extract_via_format(iter_type __beg, iter_type __end, ios_base& __io, 788 ios_base::iostate& __err, tm* __tm, 789 const _CharT* __format, 790 __time_get_state &__state) const; 791 }; 792 793 template
794 locale::id time_get<_CharT, _InIter>::id; 795 796 /// class time_get_byname [22.2.5.2]. 797 template
798 class time_get_byname : public time_get<_CharT, _InIter> 799 { 800 public: 801 // Types: 802 typedef _CharT char_type; 803 typedef _InIter iter_type; 804 805 explicit 806 time_get_byname(const char*, size_t __refs = 0) 807 : time_get<_CharT, _InIter>(__refs) { } 808 809 #if __cplusplus >= 201103L 810 explicit 811 time_get_byname(const string& __s, size_t __refs = 0) 812 : time_get_byname(__s.c_str(), __refs) { } 813 #endif 814 815 protected: 816 virtual 817 ~time_get_byname() { } 818 }; 819 820 _GLIBCXX_END_NAMESPACE_CXX11 821 822 /** 823 * @brief Primary class template time_put. 824 * @ingroup locales 825 * 826 * This facet encapsulates the code to format and output dates and times 827 * according to formats used by strftime(). 828 * 829 * The time_put template uses protected virtual functions to provide the 830 * actual results. The public accessors forward the call to the virtual 831 * functions. These virtual functions are hooks for developers to 832 * implement the behavior they require from the time_put facet. 833 */ 834 template
835 class time_put : public locale::facet 836 { 837 public: 838 // Types: 839 ///@{ 840 /// Public typedefs 841 typedef _CharT char_type; 842 typedef _OutIter iter_type; 843 ///@} 844 845 /// Numpunct facet id. 846 static locale::id id; 847 848 /** 849 * @brief Constructor performs initialization. 850 * 851 * This is the constructor provided by the standard. 852 * 853 * @param __refs Passed to the base facet class. 854 */ 855 explicit 856 time_put(size_t __refs = 0) 857 : facet(__refs) { } 858 859 /** 860 * @brief Format and output a time or date. 861 * 862 * This function formats the data in struct tm according to the 863 * provided format string. The format string is interpreted as by 864 * strftime(). 865 * 866 * @param __s The stream to write to. 867 * @param __io Source of locale. 868 * @param __fill char_type to use for padding. 869 * @param __tm Struct tm with date and time info to format. 870 * @param __beg Start of format string. 871 * @param __end End of format string. 872 * @return Iterator after writing. 873 */ 874 iter_type 875 put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm, 876 const _CharT* __beg, const _CharT* __end) const; 877 878 /** 879 * @brief Format and output a time or date. 880 * 881 * This function formats the data in struct tm according to the 882 * provided format char and optional modifier. The format and modifier 883 * are interpreted as by strftime(). It does so by returning 884 * time_put::do_put(). 885 * 886 * @param __s The stream to write to. 887 * @param __io Source of locale. 888 * @param __fill char_type to use for padding. 889 * @param __tm Struct tm with date and time info to format. 890 * @param __format Format char. 891 * @param __mod Optional modifier char. 892 * @return Iterator after writing. 893 */ 894 iter_type 895 put(iter_type __s, ios_base& __io, char_type __fill, 896 const tm* __tm, char __format, char __mod = 0) const 897 { return this->do_put(__s, __io, __fill, __tm, __format, __mod); } 898 899 protected: 900 /// Destructor. 901 virtual 902 ~time_put() 903 { } 904 905 /** 906 * @brief Format and output a time or date. 907 * 908 * This function formats the data in struct tm according to the 909 * provided format char and optional modifier. This function is a hook 910 * for derived classes to change the value returned. @see put() for 911 * more details. 912 * 913 * @param __s The stream to write to. 914 * @param __io Source of locale. 915 * @param __fill char_type to use for padding. 916 * @param __tm Struct tm with date and time info to format. 917 * @param __format Format char. 918 * @param __mod Optional modifier char. 919 * @return Iterator after writing. 920 */ 921 virtual iter_type 922 do_put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm, 923 char __format, char __mod) const; 924 }; 925 926 template
927 locale::id time_put<_CharT, _OutIter>::id; 928 929 /// class time_put_byname [22.2.5.4]. 930 template
931 class time_put_byname : public time_put<_CharT, _OutIter> 932 { 933 public: 934 // Types: 935 typedef _CharT char_type; 936 typedef _OutIter iter_type; 937 938 explicit 939 time_put_byname(const char*, size_t __refs = 0) 940 : time_put<_CharT, _OutIter>(__refs) 941 { } 942 943 #if __cplusplus >= 201103L 944 explicit 945 time_put_byname(const string& __s, size_t __refs = 0) 946 : time_put_byname(__s.c_str(), __refs) { } 947 #endif 948 949 protected: 950 virtual 951 ~time_put_byname() { } 952 }; 953 954 955 /** 956 * @brief Money format ordering data. 957 * @ingroup locales 958 * 959 * This class contains an ordered array of 4 fields to represent the 960 * pattern for formatting a money amount. Each field may contain one entry 961 * from the part enum. symbol, sign, and value must be present and the 962 * remaining field must contain either none or space. @see 963 * moneypunct::pos_format() and moneypunct::neg_format() for details of how 964 * these fields are interpreted. 965 */ 966 class money_base 967 { 968 public: 969 enum part { none, space, symbol, sign, value }; 970 struct pattern { char field[4]; }; 971 972 static const pattern _S_default_pattern; 973 974 enum 975 { 976 _S_minus, 977 _S_zero, 978 _S_end = 11 979 }; 980 981 // String literal of acceptable (narrow) input/output, for 982 // money_get/money_put. "-0123456789" 983 static const char* _S_atoms; 984 985 // Construct and return valid pattern consisting of some combination of: 986 // space none symbol sign value 987 _GLIBCXX_CONST static pattern 988 _S_construct_pattern(char __precedes, char __space, char __posn) throw (); 989 }; 990 991 template
992 struct __moneypunct_cache : public locale::facet 993 { 994 const char* _M_grouping; 995 size_t _M_grouping_size; 996 bool _M_use_grouping; 997 _CharT _M_decimal_point; 998 _CharT _M_thousands_sep; 999 const _CharT* _M_curr_symbol; 1000 size_t _M_curr_symbol_size; 1001 const _CharT* _M_positive_sign; 1002 size_t _M_positive_sign_size; 1003 const _CharT* _M_negative_sign; 1004 size_t _M_negative_sign_size; 1005 int _M_frac_digits; 1006 money_base::pattern _M_pos_format; 1007 money_base::pattern _M_neg_format; 1008 1009 // A list of valid numeric literals for input and output: in the standard 1010 // "C" locale, this is "-0123456789". This array contains the chars after 1011 // having been passed through the current locale's ctype<_CharT>.widen(). 1012 _CharT _M_atoms[money_base::_S_end]; 1013 1014 bool _M_allocated; 1015 1016 __moneypunct_cache(size_t __refs = 0) : facet(__refs), 1017 _M_grouping(0), _M_grouping_size(0), _M_use_grouping(false), 1018 _M_decimal_point(_CharT()), _M_thousands_sep(_CharT()), 1019 _M_curr_symbol(0), _M_curr_symbol_size(0), 1020 _M_positive_sign(0), _M_positive_sign_size(0), 1021 _M_negative_sign(0), _M_negative_sign_size(0), 1022 _M_frac_digits(0), 1023 _M_pos_format(money_base::pattern()), 1024 _M_neg_format(money_base::pattern()), _M_allocated(false) 1025 { } 1026 1027 ~__moneypunct_cache(); 1028 1029 void 1030 _M_cache(const locale& __loc); 1031 1032 private: 1033 __moneypunct_cache& 1034 operator=(const __moneypunct_cache&); 1035 1036 explicit 1037 __moneypunct_cache(const __moneypunct_cache&); 1038 }; 1039 1040 template
1041 __moneypunct_cache<_CharT, _Intl>::~__moneypunct_cache() 1042 { 1043 if (_M_allocated) 1044 { 1045 delete [] _M_grouping; 1046 delete [] _M_curr_symbol; 1047 delete [] _M_positive_sign; 1048 delete [] _M_negative_sign; 1049 } 1050 } 1051 1052 _GLIBCXX_BEGIN_NAMESPACE_CXX11 1053 1054 /** 1055 * @brief Primary class template moneypunct. 1056 * @ingroup locales 1057 * 1058 * This facet encapsulates the punctuation, grouping and other formatting 1059 * features of money amount string representations. 1060 */ 1061 template
1062 class moneypunct : public locale::facet, public money_base 1063 { 1064 public: 1065 // Types: 1066 ///@{ 1067 /// Public typedefs 1068 typedef _CharT char_type; 1069 typedef basic_string<_CharT> string_type; 1070 ///@} 1071 typedef __moneypunct_cache<_CharT, _Intl> __cache_type; 1072 1073 private: 1074 __cache_type* _M_data; 1075 1076 public: 1077 /// This value is provided by the standard, but no reason for its 1078 /// existence. 1079 static const bool intl = _Intl; 1080 /// Numpunct facet id. 1081 static locale::id id; 1082 1083 /** 1084 * @brief Constructor performs initialization. 1085 * 1086 * This is the constructor provided by the standard. 1087 * 1088 * @param __refs Passed to the base facet class. 1089 */ 1090 explicit 1091 moneypunct(size_t __refs = 0) 1092 : facet(__refs), _M_data(0) 1093 { _M_initialize_moneypunct(); } 1094 1095 /** 1096 * @brief Constructor performs initialization. 1097 * 1098 * This is an internal constructor. 1099 * 1100 * @param __cache Cache for optimization. 1101 * @param __refs Passed to the base facet class. 1102 */ 1103 explicit 1104 moneypunct(__cache_type* __cache, size_t __refs = 0) 1105 : facet(__refs), _M_data(__cache) 1106 { _M_initialize_moneypunct(); } 1107 1108 /** 1109 * @brief Internal constructor. Not for general use. 1110 * 1111 * This is a constructor for use by the library itself to set up new 1112 * locales. 1113 * 1114 * @param __cloc The C locale. 1115 * @param __s The name of a locale. 1116 * @param __refs Passed to the base facet class. 1117 */ 1118 explicit 1119 moneypunct(__c_locale __cloc, const char* __s, size_t __refs = 0) 1120 : facet(__refs), _M_data(0) 1121 { _M_initialize_moneypunct(__cloc, __s); } 1122 1123 /** 1124 * @brief Return decimal point character. 1125 * 1126 * This function returns a char_type to use as a decimal point. It 1127 * does so by returning returning 1128 * moneypunct
::do_decimal_point(). 1129 * 1130 * @return @a char_type representing a decimal point. 1131 */ 1132 char_type 1133 decimal_point() const 1134 { return this->do_decimal_point(); } 1135 1136 /** 1137 * @brief Return thousands separator character. 1138 * 1139 * This function returns a char_type to use as a thousands 1140 * separator. It does so by returning returning 1141 * moneypunct
::do_thousands_sep(). 1142 * 1143 * @return char_type representing a thousands separator. 1144 */ 1145 char_type 1146 thousands_sep() const 1147 { return this->do_thousands_sep(); } 1148 1149 /** 1150 * @brief Return grouping specification. 1151 * 1152 * This function returns a string representing groupings for the 1153 * integer part of an amount. Groupings indicate where thousands 1154 * separators should be inserted. 1155 * 1156 * Each char in the return string is interpret as an integer rather 1157 * than a character. These numbers represent the number of digits in a 1158 * group. The first char in the string represents the number of digits 1159 * in the least significant group. If a char is negative, it indicates 1160 * an unlimited number of digits for the group. If more chars from the 1161 * string are required to group a number, the last char is used 1162 * repeatedly. 1163 * 1164 * For example, if the grouping() returns
\003\002
1165 * and is applied to the number 123456789, this corresponds to 1166 * 12,34,56,789. Note that if the string was
32
, this would 1167 * put more than 50 digits into the least significant group if 1168 * the character set is ASCII. 1169 * 1170 * The string is returned by calling 1171 * moneypunct
::do_grouping(). 1172 * 1173 * @return string representing grouping specification. 1174 */ 1175 string 1176 grouping() const 1177 { return this->do_grouping(); } 1178 1179 /** 1180 * @brief Return currency symbol string. 1181 * 1182 * This function returns a string_type to use as a currency symbol. It 1183 * does so by returning returning 1184 * moneypunct
::do_curr_symbol(). 1185 * 1186 * @return @a string_type representing a currency symbol. 1187 */ 1188 string_type 1189 curr_symbol() const 1190 { return this->do_curr_symbol(); } 1191 1192 /** 1193 * @brief Return positive sign string. 1194 * 1195 * This function returns a string_type to use as a sign for positive 1196 * amounts. It does so by returning returning 1197 * moneypunct
::do_positive_sign(). 1198 * 1199 * If the return value contains more than one character, the first 1200 * character appears in the position indicated by pos_format() and the 1201 * remainder appear at the end of the formatted string. 1202 * 1203 * @return @a string_type representing a positive sign. 1204 */ 1205 string_type 1206 positive_sign() const 1207 { return this->do_positive_sign(); } 1208 1209 /** 1210 * @brief Return negative sign string. 1211 * 1212 * This function returns a string_type to use as a sign for negative 1213 * amounts. It does so by returning returning 1214 * moneypunct
::do_negative_sign(). 1215 * 1216 * If the return value contains more than one character, the first 1217 * character appears in the position indicated by neg_format() and the 1218 * remainder appear at the end of the formatted string. 1219 * 1220 * @return @a string_type representing a negative sign. 1221 */ 1222 string_type 1223 negative_sign() const 1224 { return this->do_negative_sign(); } 1225 1226 /** 1227 * @brief Return number of digits in fraction. 1228 * 1229 * This function returns the exact number of digits that make up the 1230 * fractional part of a money amount. It does so by returning 1231 * returning moneypunct
::do_frac_digits(). 1232 * 1233 * The fractional part of a money amount is optional. But if it is 1234 * present, there must be frac_digits() digits. 1235 * 1236 * @return Number of digits in amount fraction. 1237 */ 1238 int 1239 frac_digits() const 1240 { return this->do_frac_digits(); } 1241 1242 ///@{ 1243 /** 1244 * @brief Return pattern for money values. 1245 * 1246 * This function returns a pattern describing the formatting of a 1247 * positive or negative valued money amount. It does so by returning 1248 * returning moneypunct
::do_pos_format() or 1249 * moneypunct
::do_neg_format(). 1250 * 1251 * The pattern has 4 fields describing the ordering of symbol, sign, 1252 * value, and none or space. There must be one of each in the pattern. 1253 * The none and space enums may not appear in the first field and space 1254 * may not appear in the final field. 1255 * 1256 * The parts of a money string must appear in the order indicated by 1257 * the fields of the pattern. The symbol field indicates that the 1258 * value of curr_symbol() may be present. The sign field indicates 1259 * that the value of positive_sign() or negative_sign() must be 1260 * present. The value field indicates that the absolute value of the 1261 * money amount is present. none indicates 0 or more whitespace 1262 * characters, except at the end, where it permits no whitespace. 1263 * space indicates that 1 or more whitespace characters must be 1264 * present. 1265 * 1266 * For example, for the US locale and pos_format() pattern 1267 * {symbol,sign,value,none}, curr_symbol() == '$' 1268 * positive_sign() == '+', and value 10.01, and 1269 * options set to force the symbol, the corresponding string is 1270 *
$+10.01
. 1271 * 1272 * @return Pattern for money values. 1273 */ 1274 pattern 1275 pos_format() const 1276 { return this->do_pos_format(); } 1277 1278 pattern 1279 neg_format() const 1280 { return this->do_neg_format(); } 1281 ///@} 1282 1283 protected: 1284 /// Destructor. 1285 virtual 1286 ~moneypunct(); 1287 1288 /** 1289 * @brief Return decimal point character. 1290 * 1291 * Returns a char_type to use as a decimal point. This function is a 1292 * hook for derived classes to change the value returned. 1293 * 1294 * @return @a char_type representing a decimal point. 1295 */ 1296 virtual char_type 1297 do_decimal_point() const 1298 { return _M_data->_M_decimal_point; } 1299 1300 /** 1301 * @brief Return thousands separator character. 1302 * 1303 * Returns a char_type to use as a thousands separator. This function 1304 * is a hook for derived classes to change the value returned. 1305 * 1306 * @return @a char_type representing a thousands separator. 1307 */ 1308 virtual char_type 1309 do_thousands_sep() const 1310 { return _M_data->_M_thousands_sep; } 1311 1312 /** 1313 * @brief Return grouping specification. 1314 * 1315 * Returns a string representing groupings for the integer part of a 1316 * number. This function is a hook for derived classes to change the 1317 * value returned. @see grouping() for details. 1318 * 1319 * @return String representing grouping specification. 1320 */ 1321 virtual string 1322 do_grouping() const 1323 { return _M_data->_M_grouping; } 1324 1325 /** 1326 * @brief Return currency symbol string. 1327 * 1328 * This function returns a string_type to use as a currency symbol. 1329 * This function is a hook for derived classes to change the value 1330 * returned. @see curr_symbol() for details. 1331 * 1332 * @return @a string_type representing a currency symbol. 1333 */ 1334 virtual string_type 1335 do_curr_symbol() const 1336 { return _M_data->_M_curr_symbol; } 1337 1338 /** 1339 * @brief Return positive sign string. 1340 * 1341 * This function returns a string_type to use as a sign for positive 1342 * amounts. This function is a hook for derived classes to change the 1343 * value returned. @see positive_sign() for details. 1344 * 1345 * @return @a string_type representing a positive sign. 1346 */ 1347 virtual string_type 1348 do_positive_sign() const 1349 { return _M_data->_M_positive_sign; } 1350 1351 /** 1352 * @brief Return negative sign string. 1353 * 1354 * This function returns a string_type to use as a sign for negative 1355 * amounts. This function is a hook for derived classes to change the 1356 * value returned. @see negative_sign() for details. 1357 * 1358 * @return @a string_type representing a negative sign. 1359 */ 1360 virtual string_type 1361 do_negative_sign() const 1362 { return _M_data->_M_negative_sign; } 1363 1364 /** 1365 * @brief Return number of digits in fraction. 1366 * 1367 * This function returns the exact number of digits that make up the 1368 * fractional part of a money amount. This function is a hook for 1369 * derived classes to change the value returned. @see frac_digits() 1370 * for details. 1371 * 1372 * @return Number of digits in amount fraction. 1373 */ 1374 virtual int 1375 do_frac_digits() const 1376 { return _M_data->_M_frac_digits; } 1377 1378 /** 1379 * @brief Return pattern for money values. 1380 * 1381 * This function returns a pattern describing the formatting of a 1382 * positive valued money amount. This function is a hook for derived 1383 * classes to change the value returned. @see pos_format() for 1384 * details. 1385 * 1386 * @return Pattern for money values. 1387 */ 1388 virtual pattern 1389 do_pos_format() const 1390 { return _M_data->_M_pos_format; } 1391 1392 /** 1393 * @brief Return pattern for money values. 1394 * 1395 * This function returns a pattern describing the formatting of a 1396 * negative valued money amount. This function is a hook for derived 1397 * classes to change the value returned. @see neg_format() for 1398 * details. 1399 * 1400 * @return Pattern for money values. 1401 */ 1402 virtual pattern 1403 do_neg_format() const 1404 { return _M_data->_M_neg_format; } 1405 1406 // For use at construction time only. 1407 void 1408 _M_initialize_moneypunct(__c_locale __cloc = 0, 1409 const char* __name = 0); 1410 }; 1411 1412 template
1413 locale::id moneypunct<_CharT, _Intl>::id; 1414 1415 template
1416 const bool moneypunct<_CharT, _Intl>::intl; 1417 1418 template<> 1419 moneypunct
::~moneypunct(); 1420 1421 template<> 1422 moneypunct
::~moneypunct(); 1423 1424 template<> 1425 void 1426 moneypunct
::_M_initialize_moneypunct(__c_locale, const char*); 1427 1428 template<> 1429 void 1430 moneypunct
::_M_initialize_moneypunct(__c_locale, const char*); 1431 1432 #ifdef _GLIBCXX_USE_WCHAR_T 1433 template<> 1434 moneypunct
::~moneypunct(); 1435 1436 template<> 1437 moneypunct
::~moneypunct(); 1438 1439 template<> 1440 void 1441 moneypunct
::_M_initialize_moneypunct(__c_locale, 1442 const char*); 1443 1444 template<> 1445 void 1446 moneypunct
::_M_initialize_moneypunct(__c_locale, 1447 const char*); 1448 #endif 1449 1450 /// class moneypunct_byname [22.2.6.4]. 1451 template
1452 class moneypunct_byname : public moneypunct<_CharT, _Intl> 1453 { 1454 public: 1455 typedef _CharT char_type; 1456 typedef basic_string<_CharT> string_type; 1457 1458 static const bool intl = _Intl; 1459 1460 explicit 1461 moneypunct_byname(const char* __s, size_t __refs = 0) 1462 : moneypunct<_CharT, _Intl>(__refs) 1463 { 1464 if (__builtin_strcmp(__s, "C") != 0 1465 && __builtin_strcmp(__s, "POSIX") != 0) 1466 { 1467 __c_locale __tmp; 1468 this->_S_create_c_locale(__tmp, __s); 1469 this->_M_initialize_moneypunct(__tmp); 1470 this->_S_destroy_c_locale(__tmp); 1471 } 1472 } 1473 1474 #if __cplusplus >= 201103L 1475 explicit 1476 moneypunct_byname(const string& __s, size_t __refs = 0) 1477 : moneypunct_byname(__s.c_str(), __refs) { } 1478 #endif 1479 1480 protected: 1481 virtual 1482 ~moneypunct_byname() { } 1483 }; 1484 1485 template
1486 const bool moneypunct_byname<_CharT, _Intl>::intl; 1487 1488 _GLIBCXX_END_NAMESPACE_CXX11 1489 1490 _GLIBCXX_BEGIN_NAMESPACE_LDBL_OR_CXX11 1491 1492 /** 1493 * @brief Primary class template money_get. 1494 * @ingroup locales 1495 * 1496 * This facet encapsulates the code to parse and return a monetary 1497 * amount from a string. 1498 * 1499 * The money_get template uses protected virtual functions to 1500 * provide the actual results. The public accessors forward the 1501 * call to the virtual functions. These virtual functions are 1502 * hooks for developers to implement the behavior they require from 1503 * the money_get facet. 1504 */ 1505 template
1506 class money_get : public locale::facet 1507 { 1508 public: 1509 // Types: 1510 ///@{ 1511 /// Public typedefs 1512 typedef _CharT char_type; 1513 typedef _InIter iter_type; 1514 typedef basic_string<_CharT> string_type; 1515 ///@} 1516 1517 /// Numpunct facet id. 1518 static locale::id id; 1519 1520 /** 1521 * @brief Constructor performs initialization. 1522 * 1523 * This is the constructor provided by the standard. 1524 * 1525 * @param __refs Passed to the base facet class. 1526 */ 1527 explicit 1528 money_get(size_t __refs = 0) : facet(__refs) { } 1529 1530 /** 1531 * @brief Read and parse a monetary value. 1532 * 1533 * This function reads characters from @a __s, interprets them as a 1534 * monetary value according to moneypunct and ctype facets retrieved 1535 * from io.getloc(), and returns the result in @a units as an integral 1536 * value moneypunct::frac_digits() * the actual amount. For example, 1537 * the string $10.01 in a US locale would store 1001 in @a units. 1538 * 1539 * Any characters not part of a valid money amount are not consumed. 1540 * 1541 * If a money value cannot be parsed from the input stream, sets 1542 * err=(err|io.failbit). If the stream is consumed before finishing 1543 * parsing, sets err=(err|io.failbit|io.eofbit). @a units is 1544 * unchanged if parsing fails. 1545 * 1546 * This function works by returning the result of do_get(). 1547 * 1548 * @param __s Start of characters to parse. 1549 * @param __end End of characters to parse. 1550 * @param __intl Parameter to use_facet
>. 1551 * @param __io Source of facets and io state. 1552 * @param __err Error field to set if parsing fails. 1553 * @param __units Place to store result of parsing. 1554 * @return Iterator referencing first character beyond valid money 1555 * amount. 1556 */ 1557 iter_type 1558 get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 1559 ios_base::iostate& __err, long double& __units) const 1560 { return this->do_get(__s, __end, __intl, __io, __err, __units); } 1561 1562 /** 1563 * @brief Read and parse a monetary value. 1564 * 1565 * This function reads characters from @a __s, interprets them as 1566 * a monetary value according to moneypunct and ctype facets 1567 * retrieved from io.getloc(), and returns the result in @a 1568 * digits. For example, the string $10.01 in a US locale would 1569 * store
1001
in @a digits. 1570 * 1571 * Any characters not part of a valid money amount are not consumed. 1572 * 1573 * If a money value cannot be parsed from the input stream, sets 1574 * err=(err|io.failbit). If the stream is consumed before finishing 1575 * parsing, sets err=(err|io.failbit|io.eofbit). 1576 * 1577 * This function works by returning the result of do_get(). 1578 * 1579 * @param __s Start of characters to parse. 1580 * @param __end End of characters to parse. 1581 * @param __intl Parameter to use_facet
>. 1582 * @param __io Source of facets and io state. 1583 * @param __err Error field to set if parsing fails. 1584 * @param __digits Place to store result of parsing. 1585 * @return Iterator referencing first character beyond valid money 1586 * amount. 1587 */ 1588 iter_type 1589 get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 1590 ios_base::iostate& __err, string_type& __digits) const 1591 { return this->do_get(__s, __end, __intl, __io, __err, __digits); } 1592 1593 protected: 1594 /// Destructor. 1595 virtual 1596 ~money_get() { } 1597 1598 /** 1599 * @brief Read and parse a monetary value. 1600 * 1601 * This function reads and parses characters representing a monetary 1602 * value. This function is a hook for derived classes to change the 1603 * value returned. @see get() for details. 1604 */ 1605 // XXX GLIBCXX_ABI Deprecated 1606 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ \ 1607 && (_GLIBCXX_USE_CXX11_ABI == 0 || defined __LONG_DOUBLE_IEEE128__) 1608 virtual iter_type 1609 __do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 1610 ios_base::iostate& __err, double& __units) const; 1611 #else 1612 virtual iter_type 1613 do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 1614 ios_base::iostate& __err, long double& __units) const; 1615 #endif 1616 1617 /** 1618 * @brief Read and parse a monetary value. 1619 * 1620 * This function reads and parses characters representing a monetary 1621 * value. This function is a hook for derived classes to change the 1622 * value returned. @see get() for details. 1623 */ 1624 virtual iter_type 1625 do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 1626 ios_base::iostate& __err, string_type& __digits) const; 1627 1628 // XXX GLIBCXX_ABI Deprecated 1629 #if defined _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT \ 1630 && defined __LONG_DOUBLE_IEEE128__ 1631 virtual iter_type 1632 __do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 1633 ios_base::iostate& __err, __ibm128& __units) const; 1634 #endif 1635 1636 // XXX GLIBCXX_ABI Deprecated 1637 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ \ 1638 && (_GLIBCXX_USE_CXX11_ABI == 0 || defined __LONG_DOUBLE_IEEE128__) 1639 virtual iter_type 1640 do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 1641 ios_base::iostate& __err, long double& __units) const; 1642 #endif 1643 1644 template
1645 iter_type 1646 _M_extract(iter_type __s, iter_type __end, ios_base& __io, 1647 ios_base::iostate& __err, string& __digits) const; 1648 }; 1649 1650 template
1651 locale::id money_get<_CharT, _InIter>::id; 1652 1653 /** 1654 * @brief Primary class template money_put. 1655 * @ingroup locales 1656 * 1657 * This facet encapsulates the code to format and output a monetary 1658 * amount. 1659 * 1660 * The money_put template uses protected virtual functions to 1661 * provide the actual results. The public accessors forward the 1662 * call to the virtual functions. These virtual functions are 1663 * hooks for developers to implement the behavior they require from 1664 * the money_put facet. 1665 */ 1666 template
1667 class money_put : public locale::facet 1668 { 1669 public: 1670 ///@{ 1671 /// Public typedefs 1672 typedef _CharT char_type; 1673 typedef _OutIter iter_type; 1674 typedef basic_string<_CharT> string_type; 1675 ///@} 1676 1677 /// Numpunct facet id. 1678 static locale::id id; 1679 1680 /** 1681 * @brief Constructor performs initialization. 1682 * 1683 * This is the constructor provided by the standard. 1684 * 1685 * @param __refs Passed to the base facet class. 1686 */ 1687 explicit 1688 money_put(size_t __refs = 0) : facet(__refs) { } 1689 1690 /** 1691 * @brief Format and output a monetary value. 1692 * 1693 * This function formats @a units as a monetary value according to 1694 * moneypunct and ctype facets retrieved from io.getloc(), and writes 1695 * the resulting characters to @a __s. For example, the value 1001 in a 1696 * US locale would write
$10.01
to @a __s. 1697 * 1698 * This function works by returning the result of do_put(). 1699 * 1700 * @param __s The stream to write to. 1701 * @param __intl Parameter to use_facet
>. 1702 * @param __io Source of facets and io state. 1703 * @param __fill char_type to use for padding. 1704 * @param __units Place to store result of parsing. 1705 * @return Iterator after writing. 1706 */ 1707 iter_type 1708 put(iter_type __s, bool __intl, ios_base& __io, 1709 char_type __fill, long double __units) const 1710 { return this->do_put(__s, __intl, __io, __fill, __units); } 1711 1712 /** 1713 * @brief Format and output a monetary value. 1714 * 1715 * This function formats @a digits as a monetary value 1716 * according to moneypunct and ctype facets retrieved from 1717 * io.getloc(), and writes the resulting characters to @a __s. 1718 * For example, the string
1001
in a US locale 1719 * would write
$10.01
to @a __s. 1720 * 1721 * This function works by returning the result of do_put(). 1722 * 1723 * @param __s The stream to write to. 1724 * @param __intl Parameter to use_facet
>. 1725 * @param __io Source of facets and io state. 1726 * @param __fill char_type to use for padding. 1727 * @param __digits Place to store result of parsing. 1728 * @return Iterator after writing. 1729 */ 1730 iter_type 1731 put(iter_type __s, bool __intl, ios_base& __io, 1732 char_type __fill, const string_type& __digits) const 1733 { return this->do_put(__s, __intl, __io, __fill, __digits); } 1734 1735 protected: 1736 /// Destructor. 1737 virtual 1738 ~money_put() { } 1739 1740 /** 1741 * @brief Format and output a monetary value. 1742 * 1743 * This function formats @a units as a monetary value according to 1744 * moneypunct and ctype facets retrieved from io.getloc(), and writes 1745 * the resulting characters to @a __s. For example, the value 1001 in a 1746 * US locale would write
$10.01
to @a __s. 1747 * 1748 * This function is a hook for derived classes to change the value 1749 * returned. @see put(). 1750 * 1751 * @param __s The stream to write to. 1752 * @param __intl Parameter to use_facet
>. 1753 * @param __io Source of facets and io state. 1754 * @param __fill char_type to use for padding. 1755 * @param __units Place to store result of parsing. 1756 * @return Iterator after writing. 1757 */ 1758 // XXX GLIBCXX_ABI Deprecated 1759 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ \ 1760 && (_GLIBCXX_USE_CXX11_ABI == 0 || defined __LONG_DOUBLE_IEEE128__) 1761 virtual iter_type 1762 __do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, 1763 double __units) const; 1764 #else 1765 virtual iter_type 1766 do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, 1767 long double __units) const; 1768 #endif 1769 1770 /** 1771 * @brief Format and output a monetary value. 1772 * 1773 * This function formats @a digits as a monetary value 1774 * according to moneypunct and ctype facets retrieved from 1775 * io.getloc(), and writes the resulting characters to @a __s. 1776 * For example, the string
1001
in a US locale 1777 * would write
$10.01
to @a __s. 1778 * 1779 * This function is a hook for derived classes to change the value 1780 * returned. @see put(). 1781 * 1782 * @param __s The stream to write to. 1783 * @param __intl Parameter to use_facet
>. 1784 * @param __io Source of facets and io state. 1785 * @param __fill char_type to use for padding. 1786 * @param __digits Place to store result of parsing. 1787 * @return Iterator after writing. 1788 */ 1789 virtual iter_type 1790 do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, 1791 const string_type& __digits) const; 1792 1793 // XXX GLIBCXX_ABI Deprecated 1794 #if defined _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT \ 1795 && defined __LONG_DOUBLE_IEEE128__ 1796 virtual iter_type 1797 __do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, 1798 __ibm128 __units) const; 1799 #endif 1800 1801 // XXX GLIBCXX_ABI Deprecated 1802 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ \ 1803 && (_GLIBCXX_USE_CXX11_ABI == 0 || defined __LONG_DOUBLE_IEEE128__) 1804 virtual iter_type 1805 do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, 1806 long double __units) const; 1807 #endif 1808 1809 template
1810 iter_type 1811 _M_insert(iter_type __s, ios_base& __io, char_type __fill, 1812 const string_type& __digits) const; 1813 }; 1814 1815 template
1816 locale::id money_put<_CharT, _OutIter>::id; 1817 1818 _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11 1819 1820 /** 1821 * @brief Messages facet base class providing catalog typedef. 1822 * @ingroup locales 1823 */ 1824 struct messages_base 1825 { 1826 typedef int catalog; 1827 }; 1828 1829 _GLIBCXX_BEGIN_NAMESPACE_CXX11 1830 1831 /** 1832 * @brief Primary class template messages. 1833 * @ingroup locales 1834 * 1835 * This facet encapsulates the code to retrieve messages from 1836 * message catalogs. The only thing defined by the standard for this facet 1837 * is the interface. All underlying functionality is 1838 * implementation-defined. 1839 * 1840 * This library currently implements 3 versions of the message facet. The 1841 * first version (gnu) is a wrapper around gettext, provided by libintl. 1842 * The second version (ieee) is a wrapper around catgets. The final 1843 * version (default) does no actual translation. These implementations are 1844 * only provided for char and wchar_t instantiations. 1845 * 1846 * The messages template uses protected virtual functions to 1847 * provide the actual results. The public accessors forward the 1848 * call to the virtual functions. These virtual functions are 1849 * hooks for developers to implement the behavior they require from 1850 * the messages facet. 1851 */ 1852 template
1853 class messages : public locale::facet, public messages_base 1854 { 1855 public: 1856 // Types: 1857 ///@{ 1858 /// Public typedefs 1859 typedef _CharT char_type; 1860 typedef basic_string<_CharT> string_type; 1861 ///@} 1862 1863 protected: 1864 // Underlying "C" library locale information saved from 1865 // initialization, needed by messages_byname as well. 1866 __c_locale _M_c_locale_messages; 1867 const char* _M_name_messages; 1868 1869 public: 1870 /// Numpunct facet id. 1871 static locale::id id; 1872 1873 /** 1874 * @brief Constructor performs initialization. 1875 * 1876 * This is the constructor provided by the standard. 1877 * 1878 * @param __refs Passed to the base facet class. 1879 */ 1880 explicit 1881 messages(size_t __refs = 0); 1882 1883 // Non-standard. 1884 /** 1885 * @brief Internal constructor. Not for general use. 1886 * 1887 * This is a constructor for use by the library itself to set up new 1888 * locales. 1889 * 1890 * @param __cloc The C locale. 1891 * @param __s The name of a locale. 1892 * @param __refs Refcount to pass to the base class. 1893 */ 1894 explicit 1895 messages(__c_locale __cloc, const char* __s, size_t __refs = 0); 1896 1897 /* 1898 * @brief Open a message catalog. 1899 * 1900 * This function opens and returns a handle to a message catalog by 1901 * returning do_open(__s, __loc). 1902 * 1903 * @param __s The catalog to open. 1904 * @param __loc Locale to use for character set conversions. 1905 * @return Handle to the catalog or value < 0 if open fails. 1906 */ 1907 catalog 1908 open(const basic_string
& __s, const locale& __loc) const 1909 { return this->do_open(__s, __loc); } 1910 1911 // Non-standard and unorthodox, yet effective. 1912 /* 1913 * @brief Open a message catalog. 1914 * 1915 * This non-standard function opens and returns a handle to a message 1916 * catalog by returning do_open(s, loc). The third argument provides a 1917 * message catalog root directory for gnu gettext and is ignored 1918 * otherwise. 1919 * 1920 * @param __s The catalog to open. 1921 * @param __loc Locale to use for character set conversions. 1922 * @param __dir Message catalog root directory. 1923 * @return Handle to the catalog or value < 0 if open fails. 1924 */ 1925 catalog 1926 open(const basic_string
&, const locale&, const char*) const; 1927 1928 /* 1929 * @brief Look up a string in a message catalog. 1930 * 1931 * This function retrieves and returns a message from a catalog by 1932 * returning do_get(c, set, msgid, s). 1933 * 1934 * For gnu, @a __set and @a msgid are ignored. Returns gettext(s). 1935 * For default, returns s. For ieee, returns catgets(c,set,msgid,s). 1936 * 1937 * @param __c The catalog to access. 1938 * @param __set Implementation-defined. 1939 * @param __msgid Implementation-defined. 1940 * @param __s Default return value if retrieval fails. 1941 * @return Retrieved message or @a __s if get fails. 1942 */ 1943 string_type 1944 get(catalog __c, int __set, int __msgid, const string_type& __s) const 1945 { return this->do_get(__c, __set, __msgid, __s); } 1946 1947 /* 1948 * @brief Close a message catalog. 1949 * 1950 * Closes catalog @a c by calling do_close(c). 1951 * 1952 * @param __c The catalog to close. 1953 */ 1954 void 1955 close(catalog __c) const 1956 { return this->do_close(__c); } 1957 1958 protected: 1959 /// Destructor. 1960 virtual 1961 ~messages(); 1962 1963 /* 1964 * @brief Open a message catalog. 1965 * 1966 * This function opens and returns a handle to a message catalog in an 1967 * implementation-defined manner. This function is a hook for derived 1968 * classes to change the value returned. 1969 * 1970 * @param __s The catalog to open. 1971 * @param __loc Locale to use for character set conversions. 1972 * @return Handle to the opened catalog, value < 0 if open failed. 1973 */ 1974 virtual catalog 1975 do_open(const basic_string
&, const locale&) const; 1976 1977 /* 1978 * @brief Look up a string in a message catalog. 1979 * 1980 * This function retrieves and returns a message from a catalog in an 1981 * implementation-defined manner. This function is a hook for derived 1982 * classes to change the value returned. 1983 * 1984 * For gnu, @a __set and @a __msgid are ignored. Returns gettext(s). 1985 * For default, returns s. For ieee, returns catgets(c,set,msgid,s). 1986 * 1987 * @param __c The catalog to access. 1988 * @param __set Implementation-defined. 1989 * @param __msgid Implementation-defined. 1990 * @param __s Default return value if retrieval fails. 1991 * @return Retrieved message or @a __s if get fails. 1992 */ 1993 virtual string_type 1994 do_get(catalog, int, int, const string_type& __dfault) const; 1995 1996 /* 1997 * @brief Close a message catalog. 1998 * 1999 * @param __c The catalog to close. 2000 */ 2001 virtual void 2002 do_close(catalog) const; 2003 2004 // Returns a locale and codeset-converted string, given a char* message. 2005 char* 2006 _M_convert_to_char(const string_type& __msg) const 2007 { 2008 // XXX 2009 return reinterpret_cast
(const_cast<_CharT*>(__msg.c_str())); 2010 } 2011 2012 // Returns a locale and codeset-converted string, given a char* message. 2013 string_type 2014 _M_convert_from_char(char*) const 2015 { 2016 // XXX 2017 return string_type(); 2018 } 2019 }; 2020 2021 template
2022 locale::id messages<_CharT>::id; 2023 2024 /// Specializations for required instantiations. 2025 template<> 2026 string 2027 messages
::do_get(catalog, int, int, const string&) const; 2028 2029 #ifdef _GLIBCXX_USE_WCHAR_T 2030 template<> 2031 wstring 2032 messages
::do_get(catalog, int, int, const wstring&) const; 2033 #endif 2034 2035 /// class messages_byname [22.2.7.2]. 2036 template
2037 class messages_byname : public messages<_CharT> 2038 { 2039 public: 2040 typedef _CharT char_type; 2041 typedef basic_string<_CharT> string_type; 2042 2043 explicit 2044 messages_byname(const char* __s, size_t __refs = 0); 2045 2046 #if __cplusplus >= 201103L 2047 explicit 2048 messages_byname(const string& __s, size_t __refs = 0) 2049 : messages_byname(__s.c_str(), __refs) { } 2050 #endif 2051 2052 protected: 2053 virtual 2054 ~messages_byname() 2055 { } 2056 }; 2057 2058 _GLIBCXX_END_NAMESPACE_CXX11 2059 2060 _GLIBCXX_END_NAMESPACE_VERSION 2061 } // namespace 2062 2063 // Include host and configuration specific messages functions. 2064 #include
2065 2066 // 22.2.1.5 Template class codecvt 2067 #include
2068 2069 #include
2070 2071 #endif
Contact us
|
About us
|
Term of use
|
Copyright © 2000-2025 MyWebUniversity.com ™