111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Locale support -*- C++ -*- 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright (C) 2007-2014 Free Software Foundation, Inc. 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is part of the GNU ISO C++ Library. This library is free 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// software; you can redistribute it and/or modify it under the 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// terms of the GNU General Public License as published by the 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Free Software Foundation; either version 3, or (at your option) 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// any later version. 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This library is distributed in the hope that it will be useful, 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// but WITHOUT ANY WARRANTY; without even the implied warranty of 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// GNU General Public License for more details. 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Under Section 7 of GPL version 3, you are granted additional 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// permissions described in the GCC Runtime Library Exception, version 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3.1, as published by the Free Software Foundation. 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// You should have received a copy of the GNU General Public License and 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// a copy of the GCC Runtime Library Exception along with this program; 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <http://www.gnu.org/licenses/>. 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/** @file bits/locale_facets_nonio.h 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This is an internal header file, included by other library headers. 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Do not attempt to use it directly. @headername{locale} 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// ISO C++ 14882: 22.1 Locales 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _LOCALE_FACETS_NONIO_H 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _LOCALE_FACETS_NONIO_H 1 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#pragma GCC system_header 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <ctime> // For struct tm 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default) 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Time format ordering data. 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @ingroup locales 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This class provides an enum representing different orderings of 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * time: day, month, and year. 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class time_base 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert enum dateorder { no_order, dmy, mdy, ymd, ydm }; 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT> 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct __timepunct_cache : public locale::facet 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // List of all known timezones, with GMT first. 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static const _CharT* _S_timezones[14]; 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_date_format; 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_date_era_format; 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_time_format; 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_time_era_format; 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_date_time_format; 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_date_time_era_format; 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_am; 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_pm; 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_am_pm_format; 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Day names, starting with "C"'s Sunday. 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_day1; 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_day2; 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_day3; 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_day4; 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_day5; 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_day6; 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_day7; 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Abbreviated day names, starting with "C"'s Sun. 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_aday1; 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_aday2; 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_aday3; 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_aday4; 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_aday5; 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_aday6; 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_aday7; 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Month names, starting with "C"'s January. 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_month01; 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_month02; 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_month03; 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_month04; 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_month05; 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_month06; 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_month07; 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_month08; 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_month09; 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_month10; 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_month11; 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_month12; 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Abbreviated month names, starting with "C"'s Jan. 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_amonth01; 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_amonth02; 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_amonth03; 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_amonth04; 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_amonth05; 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_amonth06; 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_amonth07; 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_amonth08; 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_amonth09; 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_amonth10; 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_amonth11; 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_amonth12; 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool _M_allocated; 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __timepunct_cache(size_t __refs = 0) : facet(__refs), 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_date_format(0), _M_date_era_format(0), _M_time_format(0), 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_time_era_format(0), _M_date_time_format(0), 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_date_time_era_format(0), _M_am(0), _M_pm(0), 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_am_pm_format(0), _M_day1(0), _M_day2(0), _M_day3(0), 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_day4(0), _M_day5(0), _M_day6(0), _M_day7(0), 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_aday1(0), _M_aday2(0), _M_aday3(0), _M_aday4(0), 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_aday5(0), _M_aday6(0), _M_aday7(0), _M_month01(0), 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_month02(0), _M_month03(0), _M_month04(0), _M_month05(0), 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_month06(0), _M_month07(0), _M_month08(0), _M_month09(0), 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_month10(0), _M_month11(0), _M_month12(0), _M_amonth01(0), 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_amonth02(0), _M_amonth03(0), _M_amonth04(0), 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_amonth05(0), _M_amonth06(0), _M_amonth07(0), 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_amonth08(0), _M_amonth09(0), _M_amonth10(0), 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_amonth11(0), _M_amonth12(0), _M_allocated(false) 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { } 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~__timepunct_cache(); 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_cache(const locale& __loc); 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert private: 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __timepunct_cache& 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator=(const __timepunct_cache&); 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __timepunct_cache(const __timepunct_cache&); 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT> 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __timepunct_cache<_CharT>::~__timepunct_cache() 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (_M_allocated) 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Unused. 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Specializations. 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<> 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char* 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __timepunct_cache<char>::_S_timezones[14]; 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_USE_WCHAR_T 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<> 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const wchar_t* 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __timepunct_cache<wchar_t>::_S_timezones[14]; 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Generic. 17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT> 17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* __timepunct_cache<_CharT>::_S_timezones[14]; 17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT> 17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class __timepunct : public locale::facet 17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Types: 18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _CharT __char_type; 18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef basic_string<_CharT> __string_type; 18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __timepunct_cache<_CharT> __cache_type; 18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __cache_type* _M_data; 18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __c_locale _M_c_locale_timepunct; 18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char* _M_name_timepunct; 18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Numpunct facet id. 19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static locale::id id; 19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __timepunct(size_t __refs = 0); 19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __timepunct(__cache_type* __cache, size_t __refs = 0); 19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Internal constructor. Not for general use. 20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This is a constructor for use by the library itself to set up new 20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * locales. 20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __cloc The C locale. 20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The name of a locale. 20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param refs Passed to the base facet class. 20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __timepunct(__c_locale __cloc, const char* __s, size_t __refs = 0); 21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // FIXME: for error checking purposes _M_put should return the return 21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // value of strftime/wcsftime. 21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_put(_CharT* __s, size_t __maxlen, const _CharT* __format, 21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const tm* __tm) const throw (); 21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_date_formats(const _CharT** __date) const 22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Always have default first. 22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __date[0] = _M_data->_M_date_format; 22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __date[1] = _M_data->_M_date_era_format; 22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_time_formats(const _CharT** __time) const 22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Always have default first. 23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __time[0] = _M_data->_M_time_format; 23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __time[1] = _M_data->_M_time_era_format; 23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_date_time_formats(const _CharT** __dt) const 23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Always have default first. 23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __dt[0] = _M_data->_M_date_time_format; 24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __dt[1] = _M_data->_M_date_time_era_format; 24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_am_pm_format(const _CharT* __ampm) const 24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { __ampm = _M_data->_M_am_pm_format; } 24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_am_pm(const _CharT** __ampm) const 24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __ampm[0] = _M_data->_M_am; 25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __ampm[1] = _M_data->_M_pm; 25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_days(const _CharT** __days) const 25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __days[0] = _M_data->_M_day1; 25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __days[1] = _M_data->_M_day2; 25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __days[2] = _M_data->_M_day3; 26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __days[3] = _M_data->_M_day4; 26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __days[4] = _M_data->_M_day5; 26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __days[5] = _M_data->_M_day6; 26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __days[6] = _M_data->_M_day7; 26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_days_abbreviated(const _CharT** __days) const 26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __days[0] = _M_data->_M_aday1; 27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __days[1] = _M_data->_M_aday2; 27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __days[2] = _M_data->_M_aday3; 27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __days[3] = _M_data->_M_aday4; 27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __days[4] = _M_data->_M_aday5; 27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __days[5] = _M_data->_M_aday6; 27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __days[6] = _M_data->_M_aday7; 27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_months(const _CharT** __months) const 28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[0] = _M_data->_M_month01; 28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[1] = _M_data->_M_month02; 28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[2] = _M_data->_M_month03; 28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[3] = _M_data->_M_month04; 28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[4] = _M_data->_M_month05; 28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[5] = _M_data->_M_month06; 28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[6] = _M_data->_M_month07; 28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[7] = _M_data->_M_month08; 28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[8] = _M_data->_M_month09; 29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[9] = _M_data->_M_month10; 29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[10] = _M_data->_M_month11; 29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[11] = _M_data->_M_month12; 29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_months_abbreviated(const _CharT** __months) const 29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[0] = _M_data->_M_amonth01; 29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[1] = _M_data->_M_amonth02; 30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[2] = _M_data->_M_amonth03; 30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[3] = _M_data->_M_amonth04; 30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[4] = _M_data->_M_amonth05; 30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[5] = _M_data->_M_amonth06; 30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[6] = _M_data->_M_amonth07; 30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[7] = _M_data->_M_amonth08; 30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[8] = _M_data->_M_amonth09; 30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[9] = _M_data->_M_amonth10; 30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[10] = _M_data->_M_amonth11; 30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __months[11] = _M_data->_M_amonth12; 31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual 31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~__timepunct(); 31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // For use at construction time only. 31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_initialize_timepunct(__c_locale __cloc = 0); 31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT> 32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert locale::id __timepunct<_CharT>::id; 32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Specializations. 32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<> 32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc); 32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<> 33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __timepunct<char>::_M_put(char*, size_t, const char*, const tm*) const throw (); 33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_USE_WCHAR_T 33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<> 33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc); 33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<> 33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __timepunct<wchar_t>::_M_put(wchar_t*, size_t, const wchar_t*, 34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const tm*) const throw (); 34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION 34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace 34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Include host and configuration specific timepunct functions. 34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert #include <bits/time_members.h> 34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default) 35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION 35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Primary class template time_get. 35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @ingroup locales 35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This facet encapsulates the code to parse and return a date or 35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * time from a string. It is used by the istream numeric 36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * extraction operators. 36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The time_get template uses protected virtual functions to provide the 36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * actual results. The public accessors forward the call to the virtual 36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * functions. These virtual functions are hooks for developers to 36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * implement the behavior they require from the time_get facet. 36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, typename _InIter> 36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class time_get : public locale::facet, public time_base 36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Types: 37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@{ 37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Public typedefs 37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _CharT char_type; 37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _InIter iter_type; 37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@} 37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef basic_string<_CharT> __string_type; 37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Numpunct facet id. 38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static locale::id id; 38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Constructor performs initialization. 38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This is the constructor provided by the standard. 38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __refs Passed to the base facet class. 38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert time_get(size_t __refs = 0) 39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : facet (__refs) { } 39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return preferred order of month, day, and year. 39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function returns an enum from timebase::dateorder giving the 39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * preferred ordering if the format @a x given to time_put::put() only 39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * uses month, day, and year. If the format @a x for the associated 39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * locale uses other fields, this function returns 40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * timebase::dateorder::noorder. 40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * NOTE: The library always returns noorder at the moment. 40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return A member of timebase::dateorder. 40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert dateorder 40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert date_order() const 40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_date_order(); } 40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Parse input time string. 41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function parses a time according to the format @a X and puts the 41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * results into a user-supplied struct tm. The result is returned by 41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * calling time_get::do_get_time(). 41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * If there is a valid time string according to format @a X, @a tm will 41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * be filled in accordingly and the returned iterator will point to the 41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * first character beyond the time string. If an error occurs before 42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the end, err |= ios_base::failbit. If parsing reads all the 42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * characters, err |= ios_base::eofbit. 42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __beg Start of string to parse. 42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __end End of string to parse. 42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of the locale. 42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __err Error flags to set. 42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __tm Pointer to struct tm to fill in. 42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator to first char beyond time string. 42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert get_time(iter_type __beg, iter_type __end, ios_base& __io, 43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, tm* __tm) const 43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_get_time(__beg, __end, __io, __err, __tm); } 43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Parse input date string. 43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function parses a date according to the format @a x and puts the 43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * results into a user-supplied struct tm. The result is returned by 44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * calling time_get::do_get_date(). 44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * If there is a valid date string according to format @a x, @a tm will 44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * be filled in accordingly and the returned iterator will point to the 44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * first character beyond the date string. If an error occurs before 44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the end, err |= ios_base::failbit. If parsing reads all the 44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * characters, err |= ios_base::eofbit. 44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __beg Start of string to parse. 44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __end End of string to parse. 45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of the locale. 45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __err Error flags to set. 45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __tm Pointer to struct tm to fill in. 45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator to first char beyond date string. 45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert get_date(iter_type __beg, iter_type __end, ios_base& __io, 45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, tm* __tm) const 45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_get_date(__beg, __end, __io, __err, __tm); } 45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Parse input weekday string. 46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function parses a weekday name and puts the results into a 46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * user-supplied struct tm. The result is returned by calling 46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * time_get::do_get_weekday(). 46611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 46711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Parsing starts by parsing an abbreviated weekday name. If a valid 46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * abbreviation is followed by a character that would lead to the full 46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * weekday name, parsing continues until the full name is found or an 47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * error occurs. Otherwise parsing finishes at the end of the 47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * abbreviated name. 47211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * If an error occurs before the end, err |= ios_base::failbit. If 47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * parsing reads all the characters, err |= ios_base::eofbit. 47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __beg Start of string to parse. 47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __end End of string to parse. 47811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of the locale. 47911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __err Error flags to set. 48011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __tm Pointer to struct tm to fill in. 48111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator to first char beyond weekday name. 48211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 48311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 48411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert get_weekday(iter_type __beg, iter_type __end, ios_base& __io, 48511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, tm* __tm) const 48611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_get_weekday(__beg, __end, __io, __err, __tm); } 48711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 48811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 48911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Parse input month string. 49011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 49111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function parses a month name and puts the results into a 49211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * user-supplied struct tm. The result is returned by calling 49311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * time_get::do_get_monthname(). 49411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 49511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Parsing starts by parsing an abbreviated month name. If a valid 49611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * abbreviation is followed by a character that would lead to the full 49711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * month name, parsing continues until the full name is found or an 49811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * error occurs. Otherwise parsing finishes at the end of the 49911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * abbreviated name. 50011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 50111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * If an error occurs before the end, err |= ios_base::failbit. If 50211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * parsing reads all the characters, err |= 50311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * ios_base::eofbit. 50411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 50511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __beg Start of string to parse. 50611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __end End of string to parse. 50711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of the locale. 50811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __err Error flags to set. 50911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __tm Pointer to struct tm to fill in. 51011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator to first char beyond month name. 51111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 51211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 51311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert get_monthname(iter_type __beg, iter_type __end, ios_base& __io, 51411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, tm* __tm) const 51511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_get_monthname(__beg, __end, __io, __err, __tm); } 51611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 51711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 51811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Parse input year string. 51911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 52011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function reads up to 4 characters to parse a year string and 52111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * puts the results into a user-supplied struct tm. The result is 52211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * returned by calling time_get::do_get_year(). 52311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 52411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 4 consecutive digits are interpreted as a full year. If there are 52511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * exactly 2 consecutive digits, the library interprets this as the 52611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * number of years since 1900. 52711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 52811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * If an error occurs before the end, err |= ios_base::failbit. If 52911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * parsing reads all the characters, err |= ios_base::eofbit. 53011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 53111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __beg Start of string to parse. 53211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __end End of string to parse. 53311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of the locale. 53411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __err Error flags to set. 53511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __tm Pointer to struct tm to fill in. 53611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator to first char beyond year. 53711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 53811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 53911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert get_year(iter_type __beg, iter_type __end, ios_base& __io, 54011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, tm* __tm) const 54111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_get_year(__beg, __end, __io, __err, __tm); } 54211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 54311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 54411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Destructor. 54511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual 54611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~time_get() { } 54711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 54811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 54911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return preferred order of month, day, and year. 55011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 55111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function returns an enum from timebase::dateorder giving the 55211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * preferred ordering if the format @a x given to time_put::put() only 55311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * uses month, day, and year. This function is a hook for derived 55411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * classes to change the value returned. 55511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 55611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return A member of timebase::dateorder. 55711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 55811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual dateorder 55911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_date_order() const; 56011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 56111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 56211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Parse input time string. 56311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 56411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function parses a time according to the format @a x and puts the 56511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * results into a user-supplied struct tm. This function is a hook for 56611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * derived classes to change the value returned. @see get_time() for 56711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * details. 56811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 56911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __beg Start of string to parse. 57011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __end End of string to parse. 57111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of the locale. 57211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __err Error flags to set. 57311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __tm Pointer to struct tm to fill in. 57411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator to first char beyond time string. 57511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 57611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual iter_type 57711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_get_time(iter_type __beg, iter_type __end, ios_base& __io, 57811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, tm* __tm) const; 57911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 58011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 58111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Parse input date string. 58211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 58311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function parses a date according to the format @a X and puts the 58411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * results into a user-supplied struct tm. This function is a hook for 58511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * derived classes to change the value returned. @see get_date() for 58611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * details. 58711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 58811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __beg Start of string to parse. 58911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __end End of string to parse. 59011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of the locale. 59111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __err Error flags to set. 59211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __tm Pointer to struct tm to fill in. 59311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator to first char beyond date string. 59411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 59511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual iter_type 59611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_get_date(iter_type __beg, iter_type __end, ios_base& __io, 59711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, tm* __tm) const; 59811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 59911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 60011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Parse input weekday string. 60111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 60211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function parses a weekday name and puts the results into a 60311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * user-supplied struct tm. This function is a hook for derived 60411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * classes to change the value returned. @see get_weekday() for 60511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * details. 60611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 60711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __beg Start of string to parse. 60811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __end End of string to parse. 60911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of the locale. 61011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __err Error flags to set. 61111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __tm Pointer to struct tm to fill in. 61211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator to first char beyond weekday name. 61311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 61411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual iter_type 61511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_get_weekday(iter_type __beg, iter_type __end, ios_base&, 61611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, tm* __tm) const; 61711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 61811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 61911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Parse input month string. 62011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 62111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function parses a month name and puts the results into a 62211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * user-supplied struct tm. This function is a hook for derived 62311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * classes to change the value returned. @see get_monthname() for 62411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * details. 62511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 62611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __beg Start of string to parse. 62711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __end End of string to parse. 62811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of the locale. 62911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __err Error flags to set. 63011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __tm Pointer to struct tm to fill in. 63111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator to first char beyond month name. 63211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 63311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual iter_type 63411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_get_monthname(iter_type __beg, iter_type __end, ios_base&, 63511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, tm* __tm) const; 63611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 63711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 63811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Parse input year string. 63911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 64011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function reads up to 4 characters to parse a year string and 64111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * puts the results into a user-supplied struct tm. This function is a 64211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * hook for derived classes to change the value returned. @see 64311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * get_year() for details. 64411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 64511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __beg Start of string to parse. 64611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __end End of string to parse. 64711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of the locale. 64811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __err Error flags to set. 64911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __tm Pointer to struct tm to fill in. 65011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator to first char beyond year. 65111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 65211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual iter_type 65311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_get_year(iter_type __beg, iter_type __end, ios_base& __io, 65411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, tm* __tm) const; 65511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 65611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Extract numeric component of length __len. 65711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 65811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_extract_num(iter_type __beg, iter_type __end, int& __member, 65911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int __min, int __max, size_t __len, 66011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base& __io, ios_base::iostate& __err) const; 66111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 66211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Extract any unique array of string literals in a const _CharT* array. 66311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 66411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_extract_name(iter_type __beg, iter_type __end, int& __member, 66511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT** __names, size_t __indexlen, 66611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base& __io, ios_base::iostate& __err) const; 66711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 66811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Extract day or month name in a const _CharT* array. 66911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 67011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_extract_wday_or_month(iter_type __beg, iter_type __end, int& __member, 67111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT** __names, size_t __indexlen, 67211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base& __io, ios_base::iostate& __err) const; 67311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 67411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Extract on a component-by-component basis, via __format argument. 67511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 67611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_extract_via_format(iter_type __beg, iter_type __end, ios_base& __io, 67711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, tm* __tm, 67811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* __format) const; 67911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 68011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 68111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, typename _InIter> 68211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert locale::id time_get<_CharT, _InIter>::id; 68311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 68411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// class time_get_byname [22.2.5.2]. 68511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, typename _InIter> 68611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class time_get_byname : public time_get<_CharT, _InIter> 68711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 68811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 68911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Types: 69011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _CharT char_type; 69111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _InIter iter_type; 69211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 69311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 69411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert time_get_byname(const char*, size_t __refs = 0) 69511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : time_get<_CharT, _InIter>(__refs) { } 69611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 69711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 69811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual 69911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~time_get_byname() { } 70011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 70111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 70211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 70311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Primary class template time_put. 70411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @ingroup locales 70511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 70611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This facet encapsulates the code to format and output dates and times 70711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * according to formats used by strftime(). 70811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 70911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The time_put template uses protected virtual functions to provide the 71011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * actual results. The public accessors forward the call to the virtual 71111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * functions. These virtual functions are hooks for developers to 71211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * implement the behavior they require from the time_put facet. 71311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 71411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, typename _OutIter> 71511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class time_put : public locale::facet 71611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 71711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 71811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Types: 71911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@{ 72011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Public typedefs 72111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _CharT char_type; 72211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _OutIter iter_type; 72311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@} 72411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 72511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Numpunct facet id. 72611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static locale::id id; 72711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 72811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 72911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Constructor performs initialization. 73011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 73111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This is the constructor provided by the standard. 73211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 73311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __refs Passed to the base facet class. 73411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 73511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 73611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert time_put(size_t __refs = 0) 73711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : facet(__refs) { } 73811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 73911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 74011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Format and output a time or date. 74111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 74211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function formats the data in struct tm according to the 74311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provided format string. The format string is interpreted as by 74411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * strftime(). 74511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 74611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The stream to write to. 74711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of locale. 74811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __fill char_type to use for padding. 74911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __tm Struct tm with date and time info to format. 75011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __beg Start of format string. 75111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __end End of format string. 75211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator after writing. 75311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 75411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 75511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm, 75611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* __beg, const _CharT* __end) const; 75711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 75811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 75911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Format and output a time or date. 76011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 76111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function formats the data in struct tm according to the 76211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provided format char and optional modifier. The format and modifier 76311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * are interpreted as by strftime(). It does so by returning 76411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * time_put::do_put(). 76511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 76611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The stream to write to. 76711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of locale. 76811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __fill char_type to use for padding. 76911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __tm Struct tm with date and time info to format. 77011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __format Format char. 77111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __mod Optional modifier char. 77211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator after writing. 77311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 77411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 77511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert put(iter_type __s, ios_base& __io, char_type __fill, 77611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const tm* __tm, char __format, char __mod = 0) const 77711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_put(__s, __io, __fill, __tm, __format, __mod); } 77811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 77911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 78011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Destructor. 78111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual 78211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~time_put() 78311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { } 78411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 78511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 78611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Format and output a time or date. 78711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 78811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function formats the data in struct tm according to the 78911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provided format char and optional modifier. This function is a hook 79011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * for derived classes to change the value returned. @see put() for 79111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * more details. 79211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 79311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The stream to write to. 79411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of locale. 79511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __fill char_type to use for padding. 79611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __tm Struct tm with date and time info to format. 79711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __format Format char. 79811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __mod Optional modifier char. 79911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator after writing. 80011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 80111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual iter_type 80211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm, 80311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char __format, char __mod) const; 80411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 80511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 80611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, typename _OutIter> 80711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert locale::id time_put<_CharT, _OutIter>::id; 80811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 80911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// class time_put_byname [22.2.5.4]. 81011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, typename _OutIter> 81111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class time_put_byname : public time_put<_CharT, _OutIter> 81211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 81311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 81411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Types: 81511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _CharT char_type; 81611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _OutIter iter_type; 81711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 81811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 81911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert time_put_byname(const char*, size_t __refs = 0) 82011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : time_put<_CharT, _OutIter>(__refs) 82111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { }; 82211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 82311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 82411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual 82511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~time_put_byname() { } 82611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 82711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 82811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 82911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 83011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Money format ordering data. 83111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @ingroup locales 83211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 83311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This class contains an ordered array of 4 fields to represent the 83411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * pattern for formatting a money amount. Each field may contain one entry 83511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * from the part enum. symbol, sign, and value must be present and the 83611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * remaining field must contain either none or space. @see 83711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * moneypunct::pos_format() and moneypunct::neg_format() for details of how 83811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * these fields are interpreted. 83911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 84011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class money_base 84111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 84211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 84311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert enum part { none, space, symbol, sign, value }; 84411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct pattern { char field[4]; }; 84511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 84611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static const pattern _S_default_pattern; 84711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 84811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert enum 84911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 85011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _S_minus, 85111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _S_zero, 85211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _S_end = 11 85311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 85411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 85511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // String literal of acceptable (narrow) input/output, for 85611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // money_get/money_put. "-0123456789" 85711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static const char* _S_atoms; 85811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 85911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Construct and return valid pattern consisting of some combination of: 86011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // space none symbol sign value 86111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _GLIBCXX_CONST static pattern 86211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _S_construct_pattern(char __precedes, char __space, char __posn) throw (); 86311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 86411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 86511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, bool _Intl> 86611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct __moneypunct_cache : public locale::facet 86711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 86811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char* _M_grouping; 86911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert size_t _M_grouping_size; 87011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool _M_use_grouping; 87111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _CharT _M_decimal_point; 87211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _CharT _M_thousands_sep; 87311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_curr_symbol; 87411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert size_t _M_curr_symbol_size; 87511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_positive_sign; 87611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert size_t _M_positive_sign_size; 87711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _CharT* _M_negative_sign; 87811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert size_t _M_negative_sign_size; 87911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int _M_frac_digits; 88011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert money_base::pattern _M_pos_format; 88111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert money_base::pattern _M_neg_format; 88211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 88311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // A list of valid numeric literals for input and output: in the standard 88411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // "C" locale, this is "-0123456789". This array contains the chars after 88511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // having been passed through the current locale's ctype<_CharT>.widen(). 88611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _CharT _M_atoms[money_base::_S_end]; 88711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 88811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool _M_allocated; 88911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 89011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __moneypunct_cache(size_t __refs = 0) : facet(__refs), 89111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_grouping(0), _M_grouping_size(0), _M_use_grouping(false), 89211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_decimal_point(_CharT()), _M_thousands_sep(_CharT()), 89311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_curr_symbol(0), _M_curr_symbol_size(0), 89411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_positive_sign(0), _M_positive_sign_size(0), 89511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_negative_sign(0), _M_negative_sign_size(0), 89611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_frac_digits(0), 89711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_pos_format(money_base::pattern()), 89811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_neg_format(money_base::pattern()), _M_allocated(false) 89911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { } 90011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 90111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~__moneypunct_cache(); 90211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 90311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 90411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_cache(const locale& __loc); 90511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 90611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert private: 90711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __moneypunct_cache& 90811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator=(const __moneypunct_cache&); 90911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 91011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 91111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __moneypunct_cache(const __moneypunct_cache&); 91211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 91311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 91411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, bool _Intl> 91511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __moneypunct_cache<_CharT, _Intl>::~__moneypunct_cache() 91611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 91711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (_M_allocated) 91811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 91911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert delete [] _M_grouping; 92011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert delete [] _M_curr_symbol; 92111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert delete [] _M_positive_sign; 92211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert delete [] _M_negative_sign; 92311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 92411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 92511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 92611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 92711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Primary class template moneypunct. 92811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @ingroup locales 92911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 93011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This facet encapsulates the punctuation, grouping and other formatting 93111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * features of money amount string representations. 93211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 93311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, bool _Intl> 93411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class moneypunct : public locale::facet, public money_base 93511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 93611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 93711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Types: 93811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@{ 93911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Public typedefs 94011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _CharT char_type; 94111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef basic_string<_CharT> string_type; 94211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@} 94311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __moneypunct_cache<_CharT, _Intl> __cache_type; 94411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 94511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert private: 94611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __cache_type* _M_data; 94711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 94811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 94911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// This value is provided by the standard, but no reason for its 95011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// existence. 95111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static const bool intl = _Intl; 95211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Numpunct facet id. 95311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static locale::id id; 95411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 95511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 95611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Constructor performs initialization. 95711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 95811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This is the constructor provided by the standard. 95911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 96011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __refs Passed to the base facet class. 96111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 96211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 96311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert moneypunct(size_t __refs = 0) 96411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : facet(__refs), _M_data(0) 96511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { _M_initialize_moneypunct(); } 96611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 96711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 96811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Constructor performs initialization. 96911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 97011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This is an internal constructor. 97111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 97211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __cache Cache for optimization. 97311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __refs Passed to the base facet class. 97411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 97511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 97611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert moneypunct(__cache_type* __cache, size_t __refs = 0) 97711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : facet(__refs), _M_data(__cache) 97811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { _M_initialize_moneypunct(); } 97911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 98011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 98111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Internal constructor. Not for general use. 98211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 98311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This is a constructor for use by the library itself to set up new 98411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * locales. 98511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 98611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __cloc The C locale. 98711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The name of a locale. 98811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __refs Passed to the base facet class. 98911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 99011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 99111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert moneypunct(__c_locale __cloc, const char* __s, size_t __refs = 0) 99211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : facet(__refs), _M_data(0) 99311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { _M_initialize_moneypunct(__cloc, __s); } 99411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 99511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 99611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return decimal point character. 99711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 99811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function returns a char_type to use as a decimal point. It 99911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * does so by returning returning 100011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * moneypunct<char_type>::do_decimal_point(). 100111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 100211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return @a char_type representing a decimal point. 100311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 100411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char_type 100511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert decimal_point() const 100611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_decimal_point(); } 100711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 100811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 100911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return thousands separator character. 101011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 101111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function returns a char_type to use as a thousands 101211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * separator. It does so by returning returning 101311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * moneypunct<char_type>::do_thousands_sep(). 101411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 101511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return char_type representing a thousands separator. 101611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 101711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char_type 101811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert thousands_sep() const 101911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_thousands_sep(); } 102011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 102111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 102211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return grouping specification. 102311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 102411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function returns a string representing groupings for the 102511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * integer part of an amount. Groupings indicate where thousands 102611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * separators should be inserted. 102711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 102811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Each char in the return string is interpret as an integer rather 102911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * than a character. These numbers represent the number of digits in a 103011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * group. The first char in the string represents the number of digits 103111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * in the least significant group. If a char is negative, it indicates 103211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * an unlimited number of digits for the group. If more chars from the 103311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * string are required to group a number, the last char is used 103411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * repeatedly. 103511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 103611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * For example, if the grouping() returns <code>\003\002</code> 103711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * and is applied to the number 123456789, this corresponds to 103811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 12,34,56,789. Note that if the string was <code>32</code>, this would 103911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * put more than 50 digits into the least significant group if 104011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the character set is ASCII. 104111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 104211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The string is returned by calling 104311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * moneypunct<char_type>::do_grouping(). 104411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 104511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return string representing grouping specification. 104611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 104711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert string 104811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert grouping() const 104911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_grouping(); } 105011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 105111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 105211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return currency symbol string. 105311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 105411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function returns a string_type to use as a currency symbol. It 105511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * does so by returning returning 105611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * moneypunct<char_type>::do_curr_symbol(). 105711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 105811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return @a string_type representing a currency symbol. 105911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 106011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert string_type 106111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert curr_symbol() const 106211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_curr_symbol(); } 106311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 106411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 106511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return positive sign string. 106611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 106711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function returns a string_type to use as a sign for positive 106811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * amounts. It does so by returning returning 106911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * moneypunct<char_type>::do_positive_sign(). 107011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 107111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * If the return value contains more than one character, the first 107211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * character appears in the position indicated by pos_format() and the 107311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * remainder appear at the end of the formatted string. 107411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 107511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return @a string_type representing a positive sign. 107611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 107711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert string_type 107811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert positive_sign() const 107911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_positive_sign(); } 108011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 108111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 108211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return negative sign string. 108311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 108411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function returns a string_type to use as a sign for negative 108511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * amounts. It does so by returning returning 108611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * moneypunct<char_type>::do_negative_sign(). 108711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 108811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * If the return value contains more than one character, the first 108911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * character appears in the position indicated by neg_format() and the 109011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * remainder appear at the end of the formatted string. 109111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 109211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return @a string_type representing a negative sign. 109311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 109411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert string_type 109511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert negative_sign() const 109611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_negative_sign(); } 109711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 109811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 109911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return number of digits in fraction. 110011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 110111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function returns the exact number of digits that make up the 110211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * fractional part of a money amount. It does so by returning 110311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * returning moneypunct<char_type>::do_frac_digits(). 110411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 110511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The fractional part of a money amount is optional. But if it is 110611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * present, there must be frac_digits() digits. 110711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 110811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Number of digits in amount fraction. 110911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 111011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int 111111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert frac_digits() const 111211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_frac_digits(); } 111311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 111411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@{ 111511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 111611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return pattern for money values. 111711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 111811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function returns a pattern describing the formatting of a 111911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * positive or negative valued money amount. It does so by returning 112011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * returning moneypunct<char_type>::do_pos_format() or 112111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * moneypunct<char_type>::do_neg_format(). 112211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 112311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The pattern has 4 fields describing the ordering of symbol, sign, 112411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * value, and none or space. There must be one of each in the pattern. 112511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The none and space enums may not appear in the first field and space 112611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * may not appear in the final field. 112711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 112811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The parts of a money string must appear in the order indicated by 112911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the fields of the pattern. The symbol field indicates that the 113011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * value of curr_symbol() may be present. The sign field indicates 113111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * that the value of positive_sign() or negative_sign() must be 113211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * present. The value field indicates that the absolute value of the 113311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * money amount is present. none indicates 0 or more whitespace 113411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * characters, except at the end, where it permits no whitespace. 113511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * space indicates that 1 or more whitespace characters must be 113611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * present. 113711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 113811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * For example, for the US locale and pos_format() pattern 113911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * {symbol,sign,value,none}, curr_symbol() == '$' 114011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * positive_sign() == '+', and value 10.01, and 114111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * options set to force the symbol, the corresponding string is 114211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * <code>$+10.01</code>. 114311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 114411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Pattern for money values. 114511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 114611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert pattern 114711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert pos_format() const 114811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_pos_format(); } 114911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 115011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert pattern 115111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert neg_format() const 115211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_neg_format(); } 115311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@} 115411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 115511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 115611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Destructor. 115711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual 115811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~moneypunct(); 115911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 116011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 116111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return decimal point character. 116211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 116311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Returns a char_type to use as a decimal point. This function is a 116411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * hook for derived classes to change the value returned. 116511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 116611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return @a char_type representing a decimal point. 116711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 116811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual char_type 116911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_decimal_point() const 117011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_data->_M_decimal_point; } 117111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 117211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 117311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return thousands separator character. 117411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 117511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Returns a char_type to use as a thousands separator. This function 117611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * is a hook for derived classes to change the value returned. 117711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 117811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return @a char_type representing a thousands separator. 117911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 118011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual char_type 118111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_thousands_sep() const 118211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_data->_M_thousands_sep; } 118311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 118411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 118511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return grouping specification. 118611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 118711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Returns a string representing groupings for the integer part of a 118811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * number. This function is a hook for derived classes to change the 118911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * value returned. @see grouping() for details. 119011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 119111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return String representing grouping specification. 119211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 119311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual string 119411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_grouping() const 119511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_data->_M_grouping; } 119611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 119711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 119811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return currency symbol string. 119911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 120011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function returns a string_type to use as a currency symbol. 120111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function is a hook for derived classes to change the value 120211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * returned. @see curr_symbol() for details. 120311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 120411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return @a string_type representing a currency symbol. 120511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 120611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual string_type 120711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_curr_symbol() const 120811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_data->_M_curr_symbol; } 120911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 121011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 121111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return positive sign string. 121211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 121311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function returns a string_type to use as a sign for positive 121411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * amounts. This function is a hook for derived classes to change the 121511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * value returned. @see positive_sign() for details. 121611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 121711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return @a string_type representing a positive sign. 121811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 121911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual string_type 122011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_positive_sign() const 122111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_data->_M_positive_sign; } 122211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 122311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 122411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return negative sign string. 122511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 122611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function returns a string_type to use as a sign for negative 122711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * amounts. This function is a hook for derived classes to change the 122811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * value returned. @see negative_sign() for details. 122911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 123011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return @a string_type representing a negative sign. 123111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 123211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual string_type 123311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_negative_sign() const 123411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_data->_M_negative_sign; } 123511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 123611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 123711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return number of digits in fraction. 123811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 123911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function returns the exact number of digits that make up the 124011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * fractional part of a money amount. This function is a hook for 124111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * derived classes to change the value returned. @see frac_digits() 124211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * for details. 124311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 124411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Number of digits in amount fraction. 124511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 124611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual int 124711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_frac_digits() const 124811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_data->_M_frac_digits; } 124911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 125011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 125111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return pattern for money values. 125211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 125311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function returns a pattern describing the formatting of a 125411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * positive valued money amount. This function is a hook for derived 125511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * classes to change the value returned. @see pos_format() for 125611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * details. 125711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 125811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Pattern for money values. 125911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 126011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual pattern 126111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_pos_format() const 126211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_data->_M_pos_format; } 126311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 126411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 126511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return pattern for money values. 126611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 126711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function returns a pattern describing the formatting of a 126811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * negative valued money amount. This function is a hook for derived 126911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * classes to change the value returned. @see neg_format() for 127011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * details. 127111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 127211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Pattern for money values. 127311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 127411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual pattern 127511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_neg_format() const 127611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_data->_M_neg_format; } 127711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 127811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // For use at construction time only. 127911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 128011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_initialize_moneypunct(__c_locale __cloc = 0, 128111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char* __name = 0); 128211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 128311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 128411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, bool _Intl> 128511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert locale::id moneypunct<_CharT, _Intl>::id; 128611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 128711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, bool _Intl> 128811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const bool moneypunct<_CharT, _Intl>::intl; 128911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 129011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<> 129111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert moneypunct<char, true>::~moneypunct(); 129211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 129311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<> 129411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert moneypunct<char, false>::~moneypunct(); 129511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 129611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<> 129711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 129811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert moneypunct<char, true>::_M_initialize_moneypunct(__c_locale, const char*); 129911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 130011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<> 130111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 130211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert moneypunct<char, false>::_M_initialize_moneypunct(__c_locale, const char*); 130311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 130411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_USE_WCHAR_T 130511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<> 130611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert moneypunct<wchar_t, true>::~moneypunct(); 130711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 130811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<> 130911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert moneypunct<wchar_t, false>::~moneypunct(); 131011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 131111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<> 131211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 131311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale, 131411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char*); 131511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 131611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<> 131711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 131811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale, 131911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char*); 132011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 132111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 132211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// class moneypunct_byname [22.2.6.4]. 132311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, bool _Intl> 132411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class moneypunct_byname : public moneypunct<_CharT, _Intl> 132511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 132611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 132711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _CharT char_type; 132811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef basic_string<_CharT> string_type; 132911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 133011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static const bool intl = _Intl; 133111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 133211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 133311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert moneypunct_byname(const char* __s, size_t __refs = 0) 133411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : moneypunct<_CharT, _Intl>(__refs) 133511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 133611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (__builtin_strcmp(__s, "C") != 0 133711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert && __builtin_strcmp(__s, "POSIX") != 0) 133811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 133911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __c_locale __tmp; 134011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert this->_S_create_c_locale(__tmp, __s); 134111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert this->_M_initialize_moneypunct(__tmp); 134211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert this->_S_destroy_c_locale(__tmp); 134311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 134411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 134511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 134611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 134711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual 134811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~moneypunct_byname() { } 134911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 135011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 135111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, bool _Intl> 135211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const bool moneypunct_byname<_CharT, _Intl>::intl; 135311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 135411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_LDBL 135511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 135611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 135711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Primary class template money_get. 135811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @ingroup locales 135911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 136011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This facet encapsulates the code to parse and return a monetary 136111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * amount from a string. 136211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 136311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The money_get template uses protected virtual functions to 136411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provide the actual results. The public accessors forward the 136511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * call to the virtual functions. These virtual functions are 136611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * hooks for developers to implement the behavior they require from 136711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the money_get facet. 136811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 136911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, typename _InIter> 137011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class money_get : public locale::facet 137111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 137211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 137311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Types: 137411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@{ 137511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Public typedefs 137611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _CharT char_type; 137711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _InIter iter_type; 137811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef basic_string<_CharT> string_type; 137911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@} 138011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 138111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Numpunct facet id. 138211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static locale::id id; 138311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 138411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 138511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Constructor performs initialization. 138611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 138711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This is the constructor provided by the standard. 138811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 138911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __refs Passed to the base facet class. 139011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 139111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 139211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert money_get(size_t __refs = 0) : facet(__refs) { } 139311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 139411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 139511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Read and parse a monetary value. 139611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 139711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function reads characters from @a __s, interprets them as a 139811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * monetary value according to moneypunct and ctype facets retrieved 139911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * from io.getloc(), and returns the result in @a units as an integral 140011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * value moneypunct::frac_digits() * the actual amount. For example, 140111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the string $10.01 in a US locale would store 1001 in @a units. 140211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 140311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Any characters not part of a valid money amount are not consumed. 140411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 140511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * If a money value cannot be parsed from the input stream, sets 140611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * err=(err|io.failbit). If the stream is consumed before finishing 140711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * parsing, sets err=(err|io.failbit|io.eofbit). @a units is 140811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * unchanged if parsing fails. 140911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 141011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function works by returning the result of do_get(). 141111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 141211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s Start of characters to parse. 141311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __end End of characters to parse. 141411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __intl Parameter to use_facet<moneypunct<CharT,intl> >. 141511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of facets and io state. 141611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __err Error field to set if parsing fails. 141711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __units Place to store result of parsing. 141811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator referencing first character beyond valid money 141911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * amount. 142011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 142111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 142211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 142311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, long double& __units) const 142411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_get(__s, __end, __intl, __io, __err, __units); } 142511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 142611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 142711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Read and parse a monetary value. 142811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 142911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function reads characters from @a __s, interprets them as 143011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * a monetary value according to moneypunct and ctype facets 143111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * retrieved from io.getloc(), and returns the result in @a 143211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * digits. For example, the string $10.01 in a US locale would 143311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * store <code>1001</code> in @a digits. 143411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 143511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Any characters not part of a valid money amount are not consumed. 143611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 143711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * If a money value cannot be parsed from the input stream, sets 143811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * err=(err|io.failbit). If the stream is consumed before finishing 143911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * parsing, sets err=(err|io.failbit|io.eofbit). 144011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 144111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function works by returning the result of do_get(). 144211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 144311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s Start of characters to parse. 144411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __end End of characters to parse. 144511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __intl Parameter to use_facet<moneypunct<CharT,intl> >. 144611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of facets and io state. 144711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __err Error field to set if parsing fails. 144811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __digits Place to store result of parsing. 144911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator referencing first character beyond valid money 145011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * amount. 145111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 145211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 145311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 145411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, string_type& __digits) const 145511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_get(__s, __end, __intl, __io, __err, __digits); } 145611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 145711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 145811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Destructor. 145911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual 146011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~money_get() { } 146111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 146211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 146311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Read and parse a monetary value. 146411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 146511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function reads and parses characters representing a monetary 146611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * value. This function is a hook for derived classes to change the 146711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * value returned. @see get() for details. 146811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 146911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // XXX GLIBCXX_ABI Deprecated 147011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ 147111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual iter_type 147211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 147311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, double& __units) const; 147411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else 147511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual iter_type 147611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 147711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, long double& __units) const; 147811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 147911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 148011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 148111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Read and parse a monetary value. 148211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 148311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function reads and parses characters representing a monetary 148411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * value. This function is a hook for derived classes to change the 148511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * value returned. @see get() for details. 148611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 148711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual iter_type 148811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 148911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, string_type& __digits) const; 149011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 149111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // XXX GLIBCXX_ABI Deprecated 149211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ 149311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual iter_type 149411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, 149511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, long double& __units) const; 149611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 149711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 149811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<bool _Intl> 149911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 150011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_extract(iter_type __s, iter_type __end, ios_base& __io, 150111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios_base::iostate& __err, string& __digits) const; 150211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 150311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 150411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, typename _InIter> 150511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert locale::id money_get<_CharT, _InIter>::id; 150611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 150711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 150811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Primary class template money_put. 150911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @ingroup locales 151011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 151111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This facet encapsulates the code to format and output a monetary 151211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * amount. 151311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 151411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The money_put template uses protected virtual functions to 151511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provide the actual results. The public accessors forward the 151611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * call to the virtual functions. These virtual functions are 151711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * hooks for developers to implement the behavior they require from 151811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the money_put facet. 151911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 152011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, typename _OutIter> 152111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class money_put : public locale::facet 152211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 152311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 152411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@{ 152511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Public typedefs 152611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _CharT char_type; 152711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _OutIter iter_type; 152811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef basic_string<_CharT> string_type; 152911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@} 153011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 153111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Numpunct facet id. 153211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static locale::id id; 153311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 153411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 153511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Constructor performs initialization. 153611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 153711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This is the constructor provided by the standard. 153811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 153911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __refs Passed to the base facet class. 154011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 154111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 154211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert money_put(size_t __refs = 0) : facet(__refs) { } 154311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 154411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 154511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Format and output a monetary value. 154611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 154711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function formats @a units as a monetary value according to 154811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * moneypunct and ctype facets retrieved from io.getloc(), and writes 154911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the resulting characters to @a __s. For example, the value 1001 in a 155011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * US locale would write <code>$10.01</code> to @a __s. 155111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 155211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function works by returning the result of do_put(). 155311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 155411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The stream to write to. 155511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __intl Parameter to use_facet<moneypunct<CharT,intl> >. 155611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of facets and io state. 155711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __fill char_type to use for padding. 155811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __units Place to store result of parsing. 155911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator after writing. 156011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 156111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 156211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert put(iter_type __s, bool __intl, ios_base& __io, 156311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char_type __fill, long double __units) const 156411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_put(__s, __intl, __io, __fill, __units); } 156511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 156611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 156711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Format and output a monetary value. 156811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 156911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function formats @a digits as a monetary value 157011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * according to moneypunct and ctype facets retrieved from 157111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * io.getloc(), and writes the resulting characters to @a __s. 157211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * For example, the string <code>1001</code> in a US locale 157311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * would write <code>$10.01</code> to @a __s. 157411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 157511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function works by returning the result of do_put(). 157611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 157711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The stream to write to. 157811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __intl Parameter to use_facet<moneypunct<CharT,intl> >. 157911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of facets and io state. 158011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __fill char_type to use for padding. 158111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __digits Place to store result of parsing. 158211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator after writing. 158311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 158411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 158511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert put(iter_type __s, bool __intl, ios_base& __io, 158611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char_type __fill, const string_type& __digits) const 158711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_put(__s, __intl, __io, __fill, __digits); } 158811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 158911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 159011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Destructor. 159111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual 159211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~money_put() { } 159311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 159411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 159511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Format and output a monetary value. 159611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 159711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function formats @a units as a monetary value according to 159811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * moneypunct and ctype facets retrieved from io.getloc(), and writes 159911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the resulting characters to @a __s. For example, the value 1001 in a 160011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * US locale would write <code>$10.01</code> to @a __s. 160111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 160211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function is a hook for derived classes to change the value 160311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * returned. @see put(). 160411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 160511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The stream to write to. 160611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __intl Parameter to use_facet<moneypunct<CharT,intl> >. 160711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of facets and io state. 160811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __fill char_type to use for padding. 160911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __units Place to store result of parsing. 161011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator after writing. 161111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 161211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // XXX GLIBCXX_ABI Deprecated 161311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ 161411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual iter_type 161511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, 161611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert double __units) const; 161711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else 161811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual iter_type 161911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, 162011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long double __units) const; 162111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 162211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 162311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 162411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Format and output a monetary value. 162511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 162611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function formats @a digits as a monetary value 162711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * according to moneypunct and ctype facets retrieved from 162811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * io.getloc(), and writes the resulting characters to @a __s. 162911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * For example, the string <code>1001</code> in a US locale 163011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * would write <code>$10.01</code> to @a __s. 163111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 163211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function is a hook for derived classes to change the value 163311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * returned. @see put(). 163411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 163511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The stream to write to. 163611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __intl Parameter to use_facet<moneypunct<CharT,intl> >. 163711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __io Source of facets and io state. 163811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __fill char_type to use for padding. 163911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __digits Place to store result of parsing. 164011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Iterator after writing. 164111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 164211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual iter_type 164311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, 164411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const string_type& __digits) const; 164511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 164611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // XXX GLIBCXX_ABI Deprecated 164711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ 164811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual iter_type 164911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, 165011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long double __units) const; 165111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 165211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 165311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<bool _Intl> 165411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iter_type 165511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_insert(iter_type __s, ios_base& __io, char_type __fill, 165611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const string_type& __digits) const; 165711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 165811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 165911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, typename _OutIter> 166011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert locale::id money_put<_CharT, _OutIter>::id; 166111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 166211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_LDBL 166311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 166411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 166511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Messages facet base class providing catalog typedef. 166611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @ingroup locales 166711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 166811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct messages_base 166911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 167011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef int catalog; 167111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 167211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 167311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 167411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Primary class template messages. 167511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @ingroup locales 167611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 167711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This facet encapsulates the code to retrieve messages from 167811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * message catalogs. The only thing defined by the standard for this facet 167911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * is the interface. All underlying functionality is 168011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * implementation-defined. 168111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 168211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This library currently implements 3 versions of the message facet. The 168311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * first version (gnu) is a wrapper around gettext, provided by libintl. 168411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The second version (ieee) is a wrapper around catgets. The final 168511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * version (default) does no actual translation. These implementations are 168611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * only provided for char and wchar_t instantiations. 168711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 168811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The messages template uses protected virtual functions to 168911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provide the actual results. The public accessors forward the 169011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * call to the virtual functions. These virtual functions are 169111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * hooks for developers to implement the behavior they require from 169211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the messages facet. 169311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 169411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT> 169511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class messages : public locale::facet, public messages_base 169611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 169711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 169811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Types: 169911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@{ 170011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Public typedefs 170111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _CharT char_type; 170211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef basic_string<_CharT> string_type; 170311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@} 170411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 170511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 170611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Underlying "C" library locale information saved from 170711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // initialization, needed by messages_byname as well. 170811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __c_locale _M_c_locale_messages; 170911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char* _M_name_messages; 171011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 171111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 171211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Numpunct facet id. 171311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static locale::id id; 171411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 171511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 171611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Constructor performs initialization. 171711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 171811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This is the constructor provided by the standard. 171911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 172011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __refs Passed to the base facet class. 172111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 172211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 172311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert messages(size_t __refs = 0); 172411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 172511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Non-standard. 172611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 172711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Internal constructor. Not for general use. 172811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 172911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This is a constructor for use by the library itself to set up new 173011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * locales. 173111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 173211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __cloc The C locale. 173311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The name of a locale. 173411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __refs Refcount to pass to the base class. 173511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 173611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 173711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert messages(__c_locale __cloc, const char* __s, size_t __refs = 0); 173811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 173911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /* 174011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Open a message catalog. 174111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 174211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function opens and returns a handle to a message catalog by 174311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * returning do_open(__s, __loc). 174411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 174511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The catalog to open. 174611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __loc Locale to use for character set conversions. 174711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Handle to the catalog or value < 0 if open fails. 174811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 174911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert catalog 175011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert open(const basic_string<char>& __s, const locale& __loc) const 175111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_open(__s, __loc); } 175211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 175311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Non-standard and unorthodox, yet effective. 175411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /* 175511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Open a message catalog. 175611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 175711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This non-standard function opens and returns a handle to a message 175811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * catalog by returning do_open(s, loc). The third argument provides a 175911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * message catalog root directory for gnu gettext and is ignored 176011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * otherwise. 176111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 176211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The catalog to open. 176311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __loc Locale to use for character set conversions. 176411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __dir Message catalog root directory. 176511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Handle to the catalog or value < 0 if open fails. 176611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 176711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert catalog 176811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert open(const basic_string<char>&, const locale&, const char*) const; 176911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 177011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /* 177111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Look up a string in a message catalog. 177211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 177311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function retrieves and returns a message from a catalog by 177411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * returning do_get(c, set, msgid, s). 177511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 177611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * For gnu, @a __set and @a msgid are ignored. Returns gettext(s). 177711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * For default, returns s. For ieee, returns catgets(c,set,msgid,s). 177811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 177911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __c The catalog to access. 178011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __set Implementation-defined. 178111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __msgid Implementation-defined. 178211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s Default return value if retrieval fails. 178311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Retrieved message or @a __s if get fails. 178411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 178511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert string_type 178611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert get(catalog __c, int __set, int __msgid, const string_type& __s) const 178711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_get(__c, __set, __msgid, __s); } 178811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 178911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /* 179011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Close a message catalog. 179111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 179211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Closes catalog @a c by calling do_close(c). 179311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 179411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __c The catalog to close. 179511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 179611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 179711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert close(catalog __c) const 179811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->do_close(__c); } 179911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 180011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 180111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Destructor. 180211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual 180311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~messages(); 180411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 180511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /* 180611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Open a message catalog. 180711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 180811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function opens and returns a handle to a message catalog in an 180911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * implementation-defined manner. This function is a hook for derived 181011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * classes to change the value returned. 181111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 181211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The catalog to open. 181311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __loc Locale to use for character set conversions. 181411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Handle to the opened catalog, value < 0 if open failed. 181511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 181611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual catalog 181711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_open(const basic_string<char>&, const locale&) const; 181811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 181911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /* 182011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Look up a string in a message catalog. 182111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 182211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This function retrieves and returns a message from a catalog in an 182311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * implementation-defined manner. This function is a hook for derived 182411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * classes to change the value returned. 182511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 182611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * For gnu, @a __set and @a __msgid are ignored. Returns gettext(s). 182711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * For default, returns s. For ieee, returns catgets(c,set,msgid,s). 182811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 182911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __c The catalog to access. 183011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __set Implementation-defined. 183111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __msgid Implementation-defined. 183211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s Default return value if retrieval fails. 183311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Retrieved message or @a __s if get fails. 183411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 183511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual string_type 183611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_get(catalog, int, int, const string_type& __dfault) const; 183711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 183811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /* 183911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Close a message catalog. 184011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 184111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __c The catalog to close. 184211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 184311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual void 184411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert do_close(catalog) const; 184511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 184611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Returns a locale and codeset-converted string, given a char* message. 184711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char* 184811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_convert_to_char(const string_type& __msg) const 184911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 185011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // XXX 185111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return reinterpret_cast<char*>(const_cast<_CharT*>(__msg.c_str())); 185211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 185311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 185411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Returns a locale and codeset-converted string, given a char* message. 185511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert string_type 185611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_convert_from_char(char*) const 185711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 185811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // XXX 185911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return string_type(); 186011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 186111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 186211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 186311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT> 186411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert locale::id messages<_CharT>::id; 186511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 186611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Specializations for required instantiations. 186711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<> 186811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert string 186911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert messages<char>::do_get(catalog, int, int, const string&) const; 187011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 187111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_USE_WCHAR_T 187211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<> 187311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert wstring 187411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert messages<wchar_t>::do_get(catalog, int, int, const wstring&) const; 187511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 187611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 187711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// class messages_byname [22.2.7.2]. 187811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT> 187911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class messages_byname : public messages<_CharT> 188011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 188111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 188211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _CharT char_type; 188311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef basic_string<_CharT> string_type; 188411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 188511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 188611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert messages_byname(const char* __s, size_t __refs = 0); 188711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 188811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 188911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual 189011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~messages_byname() 189111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { } 189211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 189311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 189411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION 189511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace 189611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 189711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Include host and configuration specific messages functions. 189811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/messages_members.h> 189911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 190011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 22.2.1.5 Template class codecvt 190111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/codecvt.h> 190211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 190311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/locale_facets_nonio.tcc> 190411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 190511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 1906