libstdc++
locale_facets_nonio.h
Go to the documentation of this file.
00001 // Locale support -*- C++ -*-
00002 
00003 // Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
00004 //
00005 // This file is part of the GNU ISO C++ Library.  This library is free
00006 // software; you can redistribute it and/or modify it under the
00007 // terms of the GNU General Public License as published by the
00008 // Free Software Foundation; either version 3, or (at your option)
00009 // any later version.
00010 
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 // GNU General Public License for more details.
00015 
00016 // Under Section 7 of GPL version 3, you are granted additional
00017 // permissions described in the GCC Runtime Library Exception, version
00018 // 3.1, as published by the Free Software Foundation.
00019 
00020 // You should have received a copy of the GNU General Public License and
00021 // a copy of the GCC Runtime Library Exception along with this program;
00022 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
00023 // <http://www.gnu.org/licenses/>.
00024 
00025 /** @file bits/locale_facets_nonio.h
00026  *  This is an internal header file, included by other library headers.
00027  *  Do not attempt to use it directly. @headername{locale}
00028  */
00029 
00030 //
00031 // ISO C++ 14882: 22.1  Locales
00032 //
00033 
00034 #ifndef _LOCALE_FACETS_NONIO_H
00035 #define _LOCALE_FACETS_NONIO_H 1
00036 
00037 #pragma GCC system_header
00038 
00039 #include <ctime>    // For struct tm
00040 
00041 namespace std _GLIBCXX_VISIBILITY(default)
00042 {
00043 _GLIBCXX_BEGIN_NAMESPACE_VERSION
00044 
00045   /**
00046    *  @brief  Time format ordering data.
00047    *  @ingroup locales
00048    *
00049    *  This class provides an enum representing different orderings of
00050    *  time: day, month, and year.
00051   */
00052   class time_base
00053   {
00054   public:
00055     enum dateorder { no_order, dmy, mdy, ymd, ydm };
00056   };
00057 
00058   template<typename _CharT>
00059     struct __timepunct_cache : public locale::facet
00060     {
00061       // List of all known timezones, with GMT first.
00062       static const _CharT*      _S_timezones[14];
00063 
00064       const _CharT*         _M_date_format;
00065       const _CharT*         _M_date_era_format;
00066       const _CharT*         _M_time_format;
00067       const _CharT*         _M_time_era_format;
00068       const _CharT*         _M_date_time_format;
00069       const _CharT*         _M_date_time_era_format;
00070       const _CharT*         _M_am;
00071       const _CharT*         _M_pm;
00072       const _CharT*         _M_am_pm_format;
00073 
00074       // Day names, starting with "C"'s Sunday.
00075       const _CharT*         _M_day1;
00076       const _CharT*         _M_day2;
00077       const _CharT*         _M_day3;
00078       const _CharT*         _M_day4;
00079       const _CharT*         _M_day5;
00080       const _CharT*         _M_day6;
00081       const _CharT*         _M_day7;
00082 
00083       // Abbreviated day names, starting with "C"'s Sun.
00084       const _CharT*         _M_aday1;
00085       const _CharT*         _M_aday2;
00086       const _CharT*         _M_aday3;
00087       const _CharT*         _M_aday4;
00088       const _CharT*         _M_aday5;
00089       const _CharT*         _M_aday6;
00090       const _CharT*         _M_aday7;
00091 
00092       // Month names, starting with "C"'s January.
00093       const _CharT*         _M_month01;
00094       const _CharT*         _M_month02;
00095       const _CharT*         _M_month03;
00096       const _CharT*         _M_month04;
00097       const _CharT*         _M_month05;
00098       const _CharT*         _M_month06;
00099       const _CharT*         _M_month07;
00100       const _CharT*         _M_month08;
00101       const _CharT*         _M_month09;
00102       const _CharT*         _M_month10;
00103       const _CharT*         _M_month11;
00104       const _CharT*         _M_month12;
00105 
00106       // Abbreviated month names, starting with "C"'s Jan.
00107       const _CharT*         _M_amonth01;
00108       const _CharT*         _M_amonth02;
00109       const _CharT*         _M_amonth03;
00110       const _CharT*         _M_amonth04;
00111       const _CharT*         _M_amonth05;
00112       const _CharT*         _M_amonth06;
00113       const _CharT*         _M_amonth07;
00114       const _CharT*         _M_amonth08;
00115       const _CharT*         _M_amonth09;
00116       const _CharT*         _M_amonth10;
00117       const _CharT*         _M_amonth11;
00118       const _CharT*         _M_amonth12;
00119 
00120       bool              _M_allocated;
00121 
00122       __timepunct_cache(size_t __refs = 0) : facet(__refs),
00123       _M_date_format(0), _M_date_era_format(0), _M_time_format(0),
00124       _M_time_era_format(0), _M_date_time_format(0),
00125       _M_date_time_era_format(0), _M_am(0), _M_pm(0),
00126       _M_am_pm_format(0), _M_day1(0), _M_day2(0), _M_day3(0),
00127       _M_day4(0), _M_day5(0), _M_day6(0), _M_day7(0),
00128       _M_aday1(0), _M_aday2(0), _M_aday3(0), _M_aday4(0),
00129       _M_aday5(0), _M_aday6(0), _M_aday7(0), _M_month01(0),
00130       _M_month02(0), _M_month03(0), _M_month04(0), _M_month05(0),
00131       _M_month06(0), _M_month07(0), _M_month08(0), _M_month09(0),
00132       _M_month10(0), _M_month11(0), _M_month12(0), _M_amonth01(0),
00133       _M_amonth02(0), _M_amonth03(0), _M_amonth04(0),
00134       _M_amonth05(0), _M_amonth06(0), _M_amonth07(0),
00135       _M_amonth08(0), _M_amonth09(0), _M_amonth10(0),
00136       _M_amonth11(0), _M_amonth12(0), _M_allocated(false)
00137       { }
00138 
00139       ~__timepunct_cache();
00140 
00141       void
00142       _M_cache(const locale& __loc);
00143 
00144     private:
00145       __timepunct_cache&
00146       operator=(const __timepunct_cache&);
00147       
00148       explicit
00149       __timepunct_cache(const __timepunct_cache&);
00150     };
00151 
00152   template<typename _CharT>
00153     __timepunct_cache<_CharT>::~__timepunct_cache()
00154     {
00155       if (_M_allocated)
00156     {
00157       // Unused.
00158     }
00159     }
00160 
00161   // Specializations.
00162   template<>
00163     const char*
00164     __timepunct_cache<char>::_S_timezones[14];
00165 
00166 #ifdef _GLIBCXX_USE_WCHAR_T
00167   template<>
00168     const wchar_t*
00169     __timepunct_cache<wchar_t>::_S_timezones[14];
00170 #endif
00171 
00172   // Generic.
00173   template<typename _CharT>
00174     const _CharT* __timepunct_cache<_CharT>::_S_timezones[14];
00175 
00176   template<typename _CharT>
00177     class __timepunct : public locale::facet
00178     {
00179     public:
00180       // Types:
00181       typedef _CharT            __char_type;
00182       typedef basic_string<_CharT>  __string_type;
00183       typedef __timepunct_cache<_CharT> __cache_type;
00184 
00185     protected:
00186       __cache_type*         _M_data;
00187       __c_locale            _M_c_locale_timepunct;
00188       const char*           _M_name_timepunct;
00189 
00190     public:
00191       /// Numpunct facet id.
00192       static locale::id         id;
00193 
00194       explicit
00195       __timepunct(size_t __refs = 0);
00196 
00197       explicit
00198       __timepunct(__cache_type* __cache, size_t __refs = 0);
00199 
00200       /**
00201        *  @brief  Internal constructor. Not for general use.
00202        *
00203        *  This is a constructor for use by the library itself to set up new
00204        *  locales.
00205        *
00206        *  @param cloc  The C locale.
00207        *  @param s  The name of a locale.
00208        *  @param refs  Passed to the base facet class.
00209       */
00210       explicit
00211       __timepunct(__c_locale __cloc, const char* __s, size_t __refs = 0);
00212 
00213       // FIXME: for error checking purposes _M_put should return the return
00214       // value of strftime/wcsftime.
00215       void
00216       _M_put(_CharT* __s, size_t __maxlen, const _CharT* __format,
00217          const tm* __tm) const throw ();
00218 
00219       void
00220       _M_date_formats(const _CharT** __date) const
00221       {
00222     // Always have default first.
00223     __date[0] = _M_data->_M_date_format;
00224     __date[1] = _M_data->_M_date_era_format;
00225       }
00226 
00227       void
00228       _M_time_formats(const _CharT** __time) const
00229       {
00230     // Always have default first.
00231     __time[0] = _M_data->_M_time_format;
00232     __time[1] = _M_data->_M_time_era_format;
00233       }
00234 
00235       void
00236       _M_date_time_formats(const _CharT** __dt) const
00237       {
00238     // Always have default first.
00239     __dt[0] = _M_data->_M_date_time_format;
00240     __dt[1] = _M_data->_M_date_time_era_format;
00241       }
00242 
00243       void
00244       _M_am_pm_format(const _CharT* __ampm) const
00245       { __ampm = _M_data->_M_am_pm_format; }
00246 
00247       void
00248       _M_am_pm(const _CharT** __ampm) const
00249       {
00250     __ampm[0] = _M_data->_M_am;
00251     __ampm[1] = _M_data->_M_pm;
00252       }
00253 
00254       void
00255       _M_days(const _CharT** __days) const
00256       {
00257     __days[0] = _M_data->_M_day1;
00258     __days[1] = _M_data->_M_day2;
00259     __days[2] = _M_data->_M_day3;
00260     __days[3] = _M_data->_M_day4;
00261     __days[4] = _M_data->_M_day5;
00262     __days[5] = _M_data->_M_day6;
00263     __days[6] = _M_data->_M_day7;
00264       }
00265 
00266       void
00267       _M_days_abbreviated(const _CharT** __days) const
00268       {
00269     __days[0] = _M_data->_M_aday1;
00270     __days[1] = _M_data->_M_aday2;
00271     __days[2] = _M_data->_M_aday3;
00272     __days[3] = _M_data->_M_aday4;
00273     __days[4] = _M_data->_M_aday5;
00274     __days[5] = _M_data->_M_aday6;
00275     __days[6] = _M_data->_M_aday7;
00276       }
00277 
00278       void
00279       _M_months(const _CharT** __months) const
00280       {
00281     __months[0] = _M_data->_M_month01;
00282     __months[1] = _M_data->_M_month02;
00283     __months[2] = _M_data->_M_month03;
00284     __months[3] = _M_data->_M_month04;
00285     __months[4] = _M_data->_M_month05;
00286     __months[5] = _M_data->_M_month06;
00287     __months[6] = _M_data->_M_month07;
00288     __months[7] = _M_data->_M_month08;
00289     __months[8] = _M_data->_M_month09;
00290     __months[9] = _M_data->_M_month10;
00291     __months[10] = _M_data->_M_month11;
00292     __months[11] = _M_data->_M_month12;
00293       }
00294 
00295       void
00296       _M_months_abbreviated(const _CharT** __months) const
00297       {
00298     __months[0] = _M_data->_M_amonth01;
00299     __months[1] = _M_data->_M_amonth02;
00300     __months[2] = _M_data->_M_amonth03;
00301     __months[3] = _M_data->_M_amonth04;
00302     __months[4] = _M_data->_M_amonth05;
00303     __months[5] = _M_data->_M_amonth06;
00304     __months[6] = _M_data->_M_amonth07;
00305     __months[7] = _M_data->_M_amonth08;
00306     __months[8] = _M_data->_M_amonth09;
00307     __months[9] = _M_data->_M_amonth10;
00308     __months[10] = _M_data->_M_amonth11;
00309     __months[11] = _M_data->_M_amonth12;
00310       }
00311 
00312     protected:
00313       virtual
00314       ~__timepunct();
00315 
00316       // For use at construction time only.
00317       void
00318       _M_initialize_timepunct(__c_locale __cloc = 0);
00319     };
00320 
00321   template<typename _CharT>
00322     locale::id __timepunct<_CharT>::id;
00323 
00324   // Specializations.
00325   template<>
00326     void
00327     __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc);
00328 
00329   template<>
00330     void
00331     __timepunct<char>::_M_put(char*, size_t, const char*, const tm*) const throw ();
00332 
00333 #ifdef _GLIBCXX_USE_WCHAR_T
00334   template<>
00335     void
00336     __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc);
00337 
00338   template<>
00339     void
00340     __timepunct<wchar_t>::_M_put(wchar_t*, size_t, const wchar_t*,
00341                  const tm*) const throw ();
00342 #endif
00343 
00344 _GLIBCXX_END_NAMESPACE_VERSION
00345 } // namespace
00346 
00347   // Include host and configuration specific timepunct functions.
00348   #include <bits/time_members.h>
00349 
00350 namespace std _GLIBCXX_VISIBILITY(default)
00351 {
00352 _GLIBCXX_BEGIN_NAMESPACE_VERSION
00353 
00354   /**
00355    *  @brief  Primary class template time_get.
00356    *  @ingroup locales
00357    *
00358    *  This facet encapsulates the code to parse and return a date or
00359    *  time from a string.  It is used by the istream numeric
00360    *  extraction operators.
00361    *
00362    *  The time_get template uses protected virtual functions to provide the
00363    *  actual results.  The public accessors forward the call to the virtual
00364    *  functions.  These virtual functions are hooks for developers to
00365    *  implement the behavior they require from the time_get facet.
00366   */
00367   template<typename _CharT, typename _InIter>
00368     class time_get : public locale::facet, public time_base
00369     {
00370     public:
00371       // Types:
00372       //@{
00373       /// Public typedefs
00374       typedef _CharT            char_type;
00375       typedef _InIter           iter_type;
00376       //@}
00377       typedef basic_string<_CharT>  __string_type;
00378 
00379       /// Numpunct facet id.
00380       static locale::id         id;
00381 
00382       /**
00383        *  @brief  Constructor performs initialization.
00384        *
00385        *  This is the constructor provided by the standard.
00386        *
00387        *  @param refs  Passed to the base facet class.
00388       */
00389       explicit
00390       time_get(size_t __refs = 0)
00391       : facet (__refs) { }
00392 
00393       /**
00394        *  @brief  Return preferred order of month, day, and year.
00395        *
00396        *  This function returns an enum from timebase::dateorder giving the
00397        *  preferred ordering if the format @a x given to time_put::put() only
00398        *  uses month, day, and year.  If the format @a x for the associated
00399        *  locale uses other fields, this function returns
00400        *  timebase::dateorder::noorder.
00401        *
00402        *  NOTE: The library always returns noorder at the moment.
00403        *
00404        *  @return  A member of timebase::dateorder.
00405       */
00406       dateorder
00407       date_order()  const
00408       { return this->do_date_order(); }
00409 
00410       /**
00411        *  @brief  Parse input time string.
00412        *
00413        *  This function parses a time according to the format @a X and puts the
00414        *  results into a user-supplied struct tm.  The result is returned by
00415        *  calling time_get::do_get_time().
00416        *
00417        *  If there is a valid time string according to format @a X, @a tm will
00418        *  be filled in accordingly and the returned iterator will point to the
00419        *  first character beyond the time string.  If an error occurs before
00420        *  the end, err |= ios_base::failbit.  If parsing reads all the
00421        *  characters, err |= ios_base::eofbit.
00422        *
00423        *  @param  beg  Start of string to parse.
00424        *  @param  end  End of string to parse.
00425        *  @param  io  Source of the locale.
00426        *  @param  err  Error flags to set.
00427        *  @param  tm  Pointer to struct tm to fill in.
00428        *  @return  Iterator to first char beyond time string.
00429       */
00430       iter_type
00431       get_time(iter_type __beg, iter_type __end, ios_base& __io,
00432            ios_base::iostate& __err, tm* __tm)  const
00433       { return this->do_get_time(__beg, __end, __io, __err, __tm); }
00434 
00435       /**
00436        *  @brief  Parse input date string.
00437        *
00438        *  This function parses a date according to the format @a x and puts the
00439        *  results into a user-supplied struct tm.  The result is returned by
00440        *  calling time_get::do_get_date().
00441        *
00442        *  If there is a valid date string according to format @a x, @a tm will
00443        *  be filled in accordingly and the returned iterator will point to the
00444        *  first character beyond the date string.  If an error occurs before
00445        *  the end, err |= ios_base::failbit.  If parsing reads all the
00446        *  characters, err |= ios_base::eofbit.
00447        *
00448        *  @param  beg  Start of string to parse.
00449        *  @param  end  End of string to parse.
00450        *  @param  io  Source of the locale.
00451        *  @param  err  Error flags to set.
00452        *  @param  tm  Pointer to struct tm to fill in.
00453        *  @return  Iterator to first char beyond date string.
00454       */
00455       iter_type
00456       get_date(iter_type __beg, iter_type __end, ios_base& __io,
00457            ios_base::iostate& __err, tm* __tm)  const
00458       { return this->do_get_date(__beg, __end, __io, __err, __tm); }
00459 
00460       /**
00461        *  @brief  Parse input weekday string.
00462        *
00463        *  This function parses a weekday name and puts the results into a
00464        *  user-supplied struct tm.  The result is returned by calling
00465        *  time_get::do_get_weekday().
00466        *
00467        *  Parsing starts by parsing an abbreviated weekday name.  If a valid
00468        *  abbreviation is followed by a character that would lead to the full
00469        *  weekday name, parsing continues until the full name is found or an
00470        *  error occurs.  Otherwise parsing finishes at the end of the
00471        *  abbreviated name.
00472        *
00473        *  If an error occurs before the end, err |= ios_base::failbit.  If
00474        *  parsing reads all the characters, err |= ios_base::eofbit.
00475        *
00476        *  @param  beg  Start of string to parse.
00477        *  @param  end  End of string to parse.
00478        *  @param  io  Source of the locale.
00479        *  @param  err  Error flags to set.
00480        *  @param  tm  Pointer to struct tm to fill in.
00481        *  @return  Iterator to first char beyond weekday name.
00482       */
00483       iter_type
00484       get_weekday(iter_type __beg, iter_type __end, ios_base& __io,
00485           ios_base::iostate& __err, tm* __tm) const
00486       { return this->do_get_weekday(__beg, __end, __io, __err, __tm); }
00487 
00488       /**
00489        *  @brief  Parse input month string.
00490        *
00491        *  This function parses a month name and puts the results into a
00492        *  user-supplied struct tm.  The result is returned by calling
00493        *  time_get::do_get_monthname().
00494        *
00495        *  Parsing starts by parsing an abbreviated month name.  If a valid
00496        *  abbreviation is followed by a character that would lead to the full
00497        *  month name, parsing continues until the full name is found or an
00498        *  error occurs.  Otherwise parsing finishes at the end of the
00499        *  abbreviated name.
00500        *
00501        *  If an error occurs before the end, err |= ios_base::failbit.  If
00502        *  parsing reads all the characters, err |=
00503        *  ios_base::eofbit.
00504        *
00505        *  @param  beg  Start of string to parse.
00506        *  @param  end  End of string to parse.
00507        *  @param  io  Source of the locale.
00508        *  @param  err  Error flags to set.
00509        *  @param  tm  Pointer to struct tm to fill in.
00510        *  @return  Iterator to first char beyond month name.
00511       */
00512       iter_type
00513       get_monthname(iter_type __beg, iter_type __end, ios_base& __io,
00514             ios_base::iostate& __err, tm* __tm) const
00515       { return this->do_get_monthname(__beg, __end, __io, __err, __tm); }
00516 
00517       /**
00518        *  @brief  Parse input year string.
00519        *
00520        *  This function reads up to 4 characters to parse a year string and
00521        *  puts the results into a user-supplied struct tm.  The result is
00522        *  returned by calling time_get::do_get_year().
00523        *
00524        *  4 consecutive digits are interpreted as a full year.  If there are
00525        *  exactly 2 consecutive digits, the library interprets this as the
00526        *  number of years since 1900.
00527        *
00528        *  If an error occurs before the end, err |= ios_base::failbit.  If
00529        *  parsing reads all the characters, err |= ios_base::eofbit.
00530        *
00531        *  @param  beg  Start of string to parse.
00532        *  @param  end  End of string to parse.
00533        *  @param  io  Source of the locale.
00534        *  @param  err  Error flags to set.
00535        *  @param  tm  Pointer to struct tm to fill in.
00536        *  @return  Iterator to first char beyond year.
00537       */
00538       iter_type
00539       get_year(iter_type __beg, iter_type __end, ios_base& __io,
00540            ios_base::iostate& __err, tm* __tm) const
00541       { return this->do_get_year(__beg, __end, __io, __err, __tm); }
00542 
00543     protected:
00544       /// Destructor.
00545       virtual
00546       ~time_get() { }
00547 
00548       /**
00549        *  @brief  Return preferred order of month, day, and year.
00550        *
00551        *  This function returns an enum from timebase::dateorder giving the
00552        *  preferred ordering if the format @a x given to time_put::put() only
00553        *  uses month, day, and year.  This function is a hook for derived
00554        *  classes to change the value returned.
00555        *
00556        *  @return  A member of timebase::dateorder.
00557       */
00558       virtual dateorder
00559       do_date_order() const;
00560 
00561       /**
00562        *  @brief  Parse input time string.
00563        *
00564        *  This function parses a time according to the format @a x and puts the
00565        *  results into a user-supplied struct tm.  This function is a hook for
00566        *  derived classes to change the value returned.  @see get_time() for
00567        *  details.
00568        *
00569        *  @param  beg  Start of string to parse.
00570        *  @param  end  End of string to parse.
00571        *  @param  io  Source of the locale.
00572        *  @param  err  Error flags to set.
00573        *  @param  tm  Pointer to struct tm to fill in.
00574        *  @return  Iterator to first char beyond time string.
00575       */
00576       virtual iter_type
00577       do_get_time(iter_type __beg, iter_type __end, ios_base& __io,
00578           ios_base::iostate& __err, tm* __tm) const;
00579 
00580       /**
00581        *  @brief  Parse input date string.
00582        *
00583        *  This function parses a date according to the format @a X and puts the
00584        *  results into a user-supplied struct tm.  This function is a hook for
00585        *  derived classes to change the value returned.  @see get_date() for
00586        *  details.
00587        *
00588        *  @param  beg  Start of string to parse.
00589        *  @param  end  End of string to parse.
00590        *  @param  io  Source of the locale.
00591        *  @param  err  Error flags to set.
00592        *  @param  tm  Pointer to struct tm to fill in.
00593        *  @return  Iterator to first char beyond date string.
00594       */
00595       virtual iter_type
00596       do_get_date(iter_type __beg, iter_type __end, ios_base& __io,
00597           ios_base::iostate& __err, tm* __tm) const;
00598 
00599       /**
00600        *  @brief  Parse input weekday string.
00601        *
00602        *  This function parses a weekday name and puts the results into a
00603        *  user-supplied struct tm.  This function is a hook for derived
00604        *  classes to change the value returned.  @see get_weekday() for
00605        *  details.
00606        *
00607        *  @param  beg  Start of string to parse.
00608        *  @param  end  End of string to parse.
00609        *  @param  io  Source of the locale.
00610        *  @param  err  Error flags to set.
00611        *  @param  tm  Pointer to struct tm to fill in.
00612        *  @return  Iterator to first char beyond weekday name.
00613       */
00614       virtual iter_type
00615       do_get_weekday(iter_type __beg, iter_type __end, ios_base&,
00616              ios_base::iostate& __err, tm* __tm) const;
00617 
00618       /**
00619        *  @brief  Parse input month string.
00620        *
00621        *  This function parses a month name and puts the results into a
00622        *  user-supplied struct tm.  This function is a hook for derived
00623        *  classes to change the value returned.  @see get_monthname() for
00624        *  details.
00625        *
00626        *  @param  beg  Start of string to parse.
00627        *  @param  end  End of string to parse.
00628        *  @param  io  Source of the locale.
00629        *  @param  err  Error flags to set.
00630        *  @param  tm  Pointer to struct tm to fill in.
00631        *  @return  Iterator to first char beyond month name.
00632       */
00633       virtual iter_type
00634       do_get_monthname(iter_type __beg, iter_type __end, ios_base&,
00635                ios_base::iostate& __err, tm* __tm) const;
00636 
00637       /**
00638        *  @brief  Parse input year string.
00639        *
00640        *  This function reads up to 4 characters to parse a year string and
00641        *  puts the results into a user-supplied struct tm.  This function is a
00642        *  hook for derived classes to change the value returned.  @see
00643        *  get_year() for details.
00644        *
00645        *  @param  beg  Start of string to parse.
00646        *  @param  end  End of string to parse.
00647        *  @param  io  Source of the locale.
00648        *  @param  err  Error flags to set.
00649        *  @param  tm  Pointer to struct tm to fill in.
00650        *  @return  Iterator to first char beyond year.
00651       */
00652       virtual iter_type
00653       do_get_year(iter_type __beg, iter_type __end, ios_base& __io,
00654           ios_base::iostate& __err, tm* __tm) const;
00655 
00656       // Extract numeric component of length __len.
00657       iter_type
00658       _M_extract_num(iter_type __beg, iter_type __end, int& __member,
00659              int __min, int __max, size_t __len,
00660              ios_base& __io, ios_base::iostate& __err) const;
00661 
00662       // Extract any unique array of string literals in a const _CharT* array.
00663       iter_type
00664       _M_extract_name(iter_type __beg, iter_type __end, int& __member,
00665               const _CharT** __names, size_t __indexlen,
00666               ios_base& __io, ios_base::iostate& __err) const;
00667 
00668       // Extract day or month name in a const _CharT* array.
00669       iter_type
00670       _M_extract_wday_or_month(iter_type __beg, iter_type __end, int& __member,
00671                    const _CharT** __names, size_t __indexlen,
00672                    ios_base& __io, ios_base::iostate& __err) const;
00673 
00674       // Extract on a component-by-component basis, via __format argument.
00675       iter_type
00676       _M_extract_via_format(iter_type __beg, iter_type __end, ios_base& __io,
00677                 ios_base::iostate& __err, tm* __tm,
00678                 const _CharT* __format) const;
00679     };
00680 
00681   template<typename _CharT, typename _InIter>
00682     locale::id time_get<_CharT, _InIter>::id;
00683 
00684   /// class time_get_byname [22.2.5.2].
00685   template<typename _CharT, typename _InIter>
00686     class time_get_byname : public time_get<_CharT, _InIter>
00687     {
00688     public:
00689       // Types:
00690       typedef _CharT            char_type;
00691       typedef _InIter           iter_type;
00692 
00693       explicit
00694       time_get_byname(const char*, size_t __refs = 0)
00695       : time_get<_CharT, _InIter>(__refs) { }
00696 
00697     protected:
00698       virtual
00699       ~time_get_byname() { }
00700     };
00701 
00702   /**
00703    *  @brief  Primary class template time_put.
00704    *  @ingroup locales
00705    *
00706    *  This facet encapsulates the code to format and output dates and times
00707    *  according to formats used by strftime().
00708    *
00709    *  The time_put template uses protected virtual functions to provide the
00710    *  actual results.  The public accessors forward the call to the virtual
00711    *  functions.  These virtual functions are hooks for developers to
00712    *  implement the behavior they require from the time_put facet.
00713   */
00714   template<typename _CharT, typename _OutIter>
00715     class time_put : public locale::facet
00716     {
00717     public:
00718       // Types:
00719       //@{
00720       /// Public typedefs
00721       typedef _CharT            char_type;
00722       typedef _OutIter          iter_type;
00723       //@}
00724 
00725       /// Numpunct facet id.
00726       static locale::id         id;
00727 
00728       /**
00729        *  @brief  Constructor performs initialization.
00730        *
00731        *  This is the constructor provided by the standard.
00732        *
00733        *  @param refs  Passed to the base facet class.
00734       */
00735       explicit
00736       time_put(size_t __refs = 0)
00737       : facet(__refs) { }
00738 
00739       /**
00740        *  @brief  Format and output a time or date.
00741        *
00742        *  This function formats the data in struct tm according to the
00743        *  provided format string.  The format string is interpreted as by
00744        *  strftime().
00745        *
00746        *  @param  s  The stream to write to.
00747        *  @param  io  Source of locale.
00748        *  @param  fill  char_type to use for padding.
00749        *  @param  tm  Struct tm with date and time info to format.
00750        *  @param  beg  Start of format string.
00751        *  @param  end  End of format string.
00752        *  @return  Iterator after writing.
00753        */
00754       iter_type
00755       put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
00756       const _CharT* __beg, const _CharT* __end) const;
00757 
00758       /**
00759        *  @brief  Format and output a time or date.
00760        *
00761        *  This function formats the data in struct tm according to the
00762        *  provided format char and optional modifier.  The format and modifier
00763        *  are interpreted as by strftime().  It does so by returning
00764        *  time_put::do_put().
00765        *
00766        *  @param  s  The stream to write to.
00767        *  @param  io  Source of locale.
00768        *  @param  fill  char_type to use for padding.
00769        *  @param  tm  Struct tm with date and time info to format.
00770        *  @param  format  Format char.
00771        *  @param  mod  Optional modifier char.
00772        *  @return  Iterator after writing.
00773        */
00774       iter_type
00775       put(iter_type __s, ios_base& __io, char_type __fill,
00776       const tm* __tm, char __format, char __mod = 0) const
00777       { return this->do_put(__s, __io, __fill, __tm, __format, __mod); }
00778 
00779     protected:
00780       /// Destructor.
00781       virtual
00782       ~time_put()
00783       { }
00784 
00785       /**
00786        *  @brief  Format and output a time or date.
00787        *
00788        *  This function formats the data in struct tm according to the
00789        *  provided format char and optional modifier.  This function is a hook
00790        *  for derived classes to change the value returned.  @see put() for
00791        *  more details.
00792        *
00793        *  @param  s  The stream to write to.
00794        *  @param  io  Source of locale.
00795        *  @param  fill  char_type to use for padding.
00796        *  @param  tm  Struct tm with date and time info to format.
00797        *  @param  format  Format char.
00798        *  @param  mod  Optional modifier char.
00799        *  @return  Iterator after writing.
00800        */
00801       virtual iter_type
00802       do_put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
00803          char __format, char __mod) const;
00804     };
00805 
00806   template<typename _CharT, typename _OutIter>
00807     locale::id time_put<_CharT, _OutIter>::id;
00808 
00809   /// class time_put_byname [22.2.5.4].
00810   template<typename _CharT, typename _OutIter>
00811     class time_put_byname : public time_put<_CharT, _OutIter>
00812     {
00813     public:
00814       // Types:
00815       typedef _CharT            char_type;
00816       typedef _OutIter          iter_type;
00817 
00818       explicit
00819       time_put_byname(const char*, size_t __refs = 0)
00820       : time_put<_CharT, _OutIter>(__refs)
00821       { };
00822 
00823     protected:
00824       virtual
00825       ~time_put_byname() { }
00826     };
00827 
00828 
00829   /**
00830    *  @brief  Money format ordering data.
00831    *  @ingroup locales
00832    *
00833    *  This class contains an ordered array of 4 fields to represent the
00834    *  pattern for formatting a money amount.  Each field may contain one entry
00835    *  from the part enum.  symbol, sign, and value must be present and the
00836    *  remaining field must contain either none or space.  @see
00837    *  moneypunct::pos_format() and moneypunct::neg_format() for details of how
00838    *  these fields are interpreted.
00839   */
00840   class money_base
00841   {
00842   public:
00843     enum part { none, space, symbol, sign, value };
00844     struct pattern { char field[4]; };
00845 
00846     static const pattern _S_default_pattern;
00847 
00848     enum
00849     {
00850       _S_minus,
00851       _S_zero,
00852       _S_end = 11
00853     };
00854 
00855     // String literal of acceptable (narrow) input/output, for
00856     // money_get/money_put. "-0123456789"
00857     static const char* _S_atoms;
00858 
00859     // Construct and return valid pattern consisting of some combination of:
00860     // space none symbol sign value
00861     _GLIBCXX_CONST static pattern
00862     _S_construct_pattern(char __precedes, char __space, char __posn) throw ();
00863   };
00864 
00865   template<typename _CharT, bool _Intl>
00866     struct __moneypunct_cache : public locale::facet
00867     {
00868       const char*           _M_grouping;
00869       size_t                            _M_grouping_size;
00870       bool              _M_use_grouping;
00871       _CharT                _M_decimal_point;
00872       _CharT                _M_thousands_sep;
00873       const _CharT*         _M_curr_symbol;
00874       size_t                            _M_curr_symbol_size;
00875       const _CharT*         _M_positive_sign;
00876       size_t                            _M_positive_sign_size;
00877       const _CharT*         _M_negative_sign;
00878       size_t                            _M_negative_sign_size;
00879       int               _M_frac_digits;
00880       money_base::pattern       _M_pos_format;
00881       money_base::pattern           _M_neg_format;
00882 
00883       // A list of valid numeric literals for input and output: in the standard
00884       // "C" locale, this is "-0123456789". This array contains the chars after
00885       // having been passed through the current locale's ctype<_CharT>.widen().
00886       _CharT                _M_atoms[money_base::_S_end];
00887 
00888       bool              _M_allocated;
00889 
00890       __moneypunct_cache(size_t __refs = 0) : facet(__refs),
00891       _M_grouping(0), _M_grouping_size(0), _M_use_grouping(false),
00892       _M_decimal_point(_CharT()), _M_thousands_sep(_CharT()),
00893       _M_curr_symbol(0), _M_curr_symbol_size(0),
00894       _M_positive_sign(0), _M_positive_sign_size(0),
00895       _M_negative_sign(0), _M_negative_sign_size(0),
00896       _M_frac_digits(0),
00897       _M_pos_format(money_base::pattern()),
00898       _M_neg_format(money_base::pattern()), _M_allocated(false)
00899       { }
00900 
00901       ~__moneypunct_cache();
00902 
00903       void
00904       _M_cache(const locale& __loc);
00905 
00906     private:
00907       __moneypunct_cache&
00908       operator=(const __moneypunct_cache&);
00909       
00910       explicit
00911       __moneypunct_cache(const __moneypunct_cache&);
00912     };
00913 
00914   template<typename _CharT, bool _Intl>
00915     __moneypunct_cache<_CharT, _Intl>::~__moneypunct_cache()
00916     {
00917       if (_M_allocated)
00918     {
00919       delete [] _M_grouping;
00920       delete [] _M_curr_symbol;
00921       delete [] _M_positive_sign;
00922       delete [] _M_negative_sign;
00923     }
00924     }
00925 
00926   /**
00927    *  @brief  Primary class template moneypunct.
00928    *  @ingroup locales
00929    *
00930    *  This facet encapsulates the punctuation, grouping and other formatting
00931    *  features of money amount string representations.
00932   */
00933   template<typename _CharT, bool _Intl>
00934     class moneypunct : public locale::facet, public money_base
00935     {
00936     public:
00937       // Types:
00938       //@{
00939       /// Public typedefs
00940       typedef _CharT            char_type;
00941       typedef basic_string<_CharT>  string_type;
00942       //@}
00943       typedef __moneypunct_cache<_CharT, _Intl>     __cache_type;
00944 
00945     private:
00946       __cache_type*         _M_data;
00947 
00948     public:
00949       /// This value is provided by the standard, but no reason for its
00950       /// existence.
00951       static const bool         intl = _Intl;
00952       /// Numpunct facet id.
00953       static locale::id         id;
00954 
00955       /**
00956        *  @brief  Constructor performs initialization.
00957        *
00958        *  This is the constructor provided by the standard.
00959        *
00960        *  @param refs  Passed to the base facet class.
00961       */
00962       explicit
00963       moneypunct(size_t __refs = 0)
00964       : facet(__refs), _M_data(0)
00965       { _M_initialize_moneypunct(); }
00966 
00967       /**
00968        *  @brief  Constructor performs initialization.
00969        *
00970        *  This is an internal constructor.
00971        *
00972        *  @param cache  Cache for optimization.
00973        *  @param refs  Passed to the base facet class.
00974       */
00975       explicit
00976       moneypunct(__cache_type* __cache, size_t __refs = 0)
00977       : facet(__refs), _M_data(__cache)
00978       { _M_initialize_moneypunct(); }
00979 
00980       /**
00981        *  @brief  Internal constructor. Not for general use.
00982        *
00983        *  This is a constructor for use by the library itself to set up new
00984        *  locales.
00985        *
00986        *  @param cloc  The C locale.
00987        *  @param s  The name of a locale.
00988        *  @param refs  Passed to the base facet class.
00989       */
00990       explicit
00991       moneypunct(__c_locale __cloc, const char* __s, size_t __refs = 0)
00992       : facet(__refs), _M_data(0)
00993       { _M_initialize_moneypunct(__cloc, __s); }
00994 
00995       /**
00996        *  @brief  Return decimal point character.
00997        *
00998        *  This function returns a char_type to use as a decimal point.  It
00999        *  does so by returning returning
01000        *  moneypunct<char_type>::do_decimal_point().
01001        *
01002        *  @return  @a char_type representing a decimal point.
01003       */
01004       char_type
01005       decimal_point() const
01006       { return this->do_decimal_point(); }
01007 
01008       /**
01009        *  @brief  Return thousands separator character.
01010        *
01011        *  This function returns a char_type to use as a thousands
01012        *  separator.  It does so by returning returning
01013        *  moneypunct<char_type>::do_thousands_sep().
01014        *
01015        *  @return  char_type representing a thousands separator.
01016       */
01017       char_type
01018       thousands_sep() const
01019       { return this->do_thousands_sep(); }
01020 
01021       /**
01022        *  @brief  Return grouping specification.
01023        *
01024        *  This function returns a string representing groupings for the
01025        *  integer part of an amount.  Groupings indicate where thousands
01026        *  separators should be inserted.
01027        *
01028        *  Each char in the return string is interpret as an integer rather
01029        *  than a character.  These numbers represent the number of digits in a
01030        *  group.  The first char in the string represents the number of digits
01031        *  in the least significant group.  If a char is negative, it indicates
01032        *  an unlimited number of digits for the group.  If more chars from the
01033        *  string are required to group a number, the last char is used
01034        *  repeatedly.
01035        *
01036        *  For example, if the grouping() returns <code>\003\002</code>
01037        *  and is applied to the number 123456789, this corresponds to
01038        *  12,34,56,789.  Note that if the string was <code>32</code>, this would
01039        *  put more than 50 digits into the least significant group if
01040        *  the character set is ASCII.
01041        *
01042        *  The string is returned by calling
01043        *  moneypunct<char_type>::do_grouping().
01044        *
01045        *  @return  string representing grouping specification.
01046       */
01047       string
01048       grouping() const
01049       { return this->do_grouping(); }
01050 
01051       /**
01052        *  @brief  Return currency symbol string.
01053        *
01054        *  This function returns a string_type to use as a currency symbol.  It
01055        *  does so by returning returning
01056        *  moneypunct<char_type>::do_curr_symbol().
01057        *
01058        *  @return  @a string_type representing a currency symbol.
01059       */
01060       string_type
01061       curr_symbol() const
01062       { return this->do_curr_symbol(); }
01063 
01064       /**
01065        *  @brief  Return positive sign string.
01066        *
01067        *  This function returns a string_type to use as a sign for positive
01068        *  amounts.  It does so by returning returning
01069        *  moneypunct<char_type>::do_positive_sign().
01070        *
01071        *  If the return value contains more than one character, the first
01072        *  character appears in the position indicated by pos_format() and the
01073        *  remainder appear at the end of the formatted string.
01074        *
01075        *  @return  @a string_type representing a positive sign.
01076       */
01077       string_type
01078       positive_sign() const
01079       { return this->do_positive_sign(); }
01080 
01081       /**
01082        *  @brief  Return negative sign string.
01083        *
01084        *  This function returns a string_type to use as a sign for negative
01085        *  amounts.  It does so by returning returning
01086        *  moneypunct<char_type>::do_negative_sign().
01087        *
01088        *  If the return value contains more than one character, the first
01089        *  character appears in the position indicated by neg_format() and the
01090        *  remainder appear at the end of the formatted string.
01091        *
01092        *  @return  @a string_type representing a negative sign.
01093       */
01094       string_type
01095       negative_sign() const
01096       { return this->do_negative_sign(); }
01097 
01098       /**
01099        *  @brief  Return number of digits in fraction.
01100        *
01101        *  This function returns the exact number of digits that make up the
01102        *  fractional part of a money amount.  It does so by returning
01103        *  returning moneypunct<char_type>::do_frac_digits().
01104        *
01105        *  The fractional part of a money amount is optional.  But if it is
01106        *  present, there must be frac_digits() digits.
01107        *
01108        *  @return  Number of digits in amount fraction.
01109       */
01110       int
01111       frac_digits() const
01112       { return this->do_frac_digits(); }
01113 
01114       //@{
01115       /**
01116        *  @brief  Return pattern for money values.
01117        *
01118        *  This function returns a pattern describing the formatting of a
01119        *  positive or negative valued money amount.  It does so by returning
01120        *  returning moneypunct<char_type>::do_pos_format() or
01121        *  moneypunct<char_type>::do_neg_format().
01122        *
01123        *  The pattern has 4 fields describing the ordering of symbol, sign,
01124        *  value, and none or space.  There must be one of each in the pattern.
01125        *  The none and space enums may not appear in the first field and space
01126        *  may not appear in the final field.
01127        *
01128        *  The parts of a money string must appear in the order indicated by
01129        *  the fields of the pattern.  The symbol field indicates that the
01130        *  value of curr_symbol() may be present.  The sign field indicates
01131        *  that the value of positive_sign() or negative_sign() must be
01132        *  present.  The value field indicates that the absolute value of the
01133        *  money amount is present.  none indicates 0 or more whitespace
01134        *  characters, except at the end, where it permits no whitespace.
01135        *  space indicates that 1 or more whitespace characters must be
01136        *  present.
01137        *
01138        *  For example, for the US locale and pos_format() pattern
01139        *  {symbol,sign,value,none}, curr_symbol() == &apos;$&apos;
01140        *  positive_sign() == &apos;+&apos;, and value 10.01, and
01141        *  options set to force the symbol, the corresponding string is
01142        *  <code>$+10.01</code>.
01143        *
01144        *  @return  Pattern for money values.
01145       */
01146       pattern
01147       pos_format() const
01148       { return this->do_pos_format(); }
01149 
01150       pattern
01151       neg_format() const
01152       { return this->do_neg_format(); }
01153       //@}
01154 
01155     protected:
01156       /// Destructor.
01157       virtual
01158       ~moneypunct();
01159 
01160       /**
01161        *  @brief  Return decimal point character.
01162        *
01163        *  Returns a char_type to use as a decimal point.  This function is a
01164        *  hook for derived classes to change the value returned.
01165        *
01166        *  @return  @a char_type representing a decimal point.
01167       */
01168       virtual char_type
01169       do_decimal_point() const
01170       { return _M_data->_M_decimal_point; }
01171 
01172       /**
01173        *  @brief  Return thousands separator character.
01174        *
01175        *  Returns a char_type to use as a thousands separator.  This function
01176        *  is a hook for derived classes to change the value returned.
01177        *
01178        *  @return  @a char_type representing a thousands separator.
01179       */
01180       virtual char_type
01181       do_thousands_sep() const
01182       { return _M_data->_M_thousands_sep; }
01183 
01184       /**
01185        *  @brief  Return grouping specification.
01186        *
01187        *  Returns a string representing groupings for the integer part of a
01188        *  number.  This function is a hook for derived classes to change the
01189        *  value returned.  @see grouping() for details.
01190        *
01191        *  @return  String representing grouping specification.
01192       */
01193       virtual string
01194       do_grouping() const
01195       { return _M_data->_M_grouping; }
01196 
01197       /**
01198        *  @brief  Return currency symbol string.
01199        *
01200        *  This function returns a string_type to use as a currency symbol.
01201        *  This function is a hook for derived classes to change the value
01202        *  returned.  @see curr_symbol() for details.
01203        *
01204        *  @return  @a string_type representing a currency symbol.
01205       */
01206       virtual string_type
01207       do_curr_symbol()   const
01208       { return _M_data->_M_curr_symbol; }
01209 
01210       /**
01211        *  @brief  Return positive sign string.
01212        *
01213        *  This function returns a string_type to use as a sign for positive
01214        *  amounts.  This function is a hook for derived classes to change the
01215        *  value returned.  @see positive_sign() for details.
01216        *
01217        *  @return  @a string_type representing a positive sign.
01218       */
01219       virtual string_type
01220       do_positive_sign() const
01221       { return _M_data->_M_positive_sign; }
01222 
01223       /**
01224        *  @brief  Return negative sign string.
01225        *
01226        *  This function returns a string_type to use as a sign for negative
01227        *  amounts.  This function is a hook for derived classes to change the
01228        *  value returned.  @see negative_sign() for details.
01229        *
01230        *  @return  @a string_type representing a negative sign.
01231       */
01232       virtual string_type
01233       do_negative_sign() const
01234       { return _M_data->_M_negative_sign; }
01235 
01236       /**
01237        *  @brief  Return number of digits in fraction.
01238        *
01239        *  This function returns the exact number of digits that make up the
01240        *  fractional part of a money amount.  This function is a hook for
01241        *  derived classes to change the value returned.  @see frac_digits()
01242        *  for details.
01243        *
01244        *  @return  Number of digits in amount fraction.
01245       */
01246       virtual int
01247       do_frac_digits() const
01248       { return _M_data->_M_frac_digits; }
01249 
01250       /**
01251        *  @brief  Return pattern for money values.
01252        *
01253        *  This function returns a pattern describing the formatting of a
01254        *  positive valued money amount.  This function is a hook for derived
01255        *  classes to change the value returned.  @see pos_format() for
01256        *  details.
01257        *
01258        *  @return  Pattern for money values.
01259       */
01260       virtual pattern
01261       do_pos_format() const
01262       { return _M_data->_M_pos_format; }
01263 
01264       /**
01265        *  @brief  Return pattern for money values.
01266        *
01267        *  This function returns a pattern describing the formatting of a
01268        *  negative valued money amount.  This function is a hook for derived
01269        *  classes to change the value returned.  @see neg_format() for
01270        *  details.
01271        *
01272        *  @return  Pattern for money values.
01273       */
01274       virtual pattern
01275       do_neg_format() const
01276       { return _M_data->_M_neg_format; }
01277 
01278       // For use at construction time only.
01279        void
01280        _M_initialize_moneypunct(__c_locale __cloc = 0,
01281                 const char* __name = 0);
01282     };
01283 
01284   template<typename _CharT, bool _Intl>
01285     locale::id moneypunct<_CharT, _Intl>::id;
01286 
01287   template<typename _CharT, bool _Intl>
01288     const bool moneypunct<_CharT, _Intl>::intl;
01289 
01290   template<>
01291     moneypunct<char, true>::~moneypunct();
01292 
01293   template<>
01294     moneypunct<char, false>::~moneypunct();
01295 
01296   template<>
01297     void
01298     moneypunct<char, true>::_M_initialize_moneypunct(__c_locale, const char*);
01299 
01300   template<>
01301     void
01302     moneypunct<char, false>::_M_initialize_moneypunct(__c_locale, const char*);
01303 
01304 #ifdef _GLIBCXX_USE_WCHAR_T
01305   template<>
01306     moneypunct<wchar_t, true>::~moneypunct();
01307 
01308   template<>
01309     moneypunct<wchar_t, false>::~moneypunct();
01310 
01311   template<>
01312     void
01313     moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale,
01314                             const char*);
01315 
01316   template<>
01317     void
01318     moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale,
01319                              const char*);
01320 #endif
01321 
01322   /// class moneypunct_byname [22.2.6.4].
01323   template<typename _CharT, bool _Intl>
01324     class moneypunct_byname : public moneypunct<_CharT, _Intl>
01325     {
01326     public:
01327       typedef _CharT            char_type;
01328       typedef basic_string<_CharT>  string_type;
01329 
01330       static const bool intl = _Intl;
01331 
01332       explicit
01333       moneypunct_byname(const char* __s, size_t __refs = 0)
01334       : moneypunct<_CharT, _Intl>(__refs)
01335       {
01336     if (__builtin_strcmp(__s, "C") != 0
01337         && __builtin_strcmp(__s, "POSIX") != 0)
01338       {
01339         __c_locale __tmp;
01340         this->_S_create_c_locale(__tmp, __s);
01341         this->_M_initialize_moneypunct(__tmp);
01342         this->_S_destroy_c_locale(__tmp);
01343       }
01344       }
01345 
01346     protected:
01347       virtual
01348       ~moneypunct_byname() { }
01349     };
01350 
01351   template<typename _CharT, bool _Intl>
01352     const bool moneypunct_byname<_CharT, _Intl>::intl;
01353 
01354 _GLIBCXX_BEGIN_NAMESPACE_LDBL
01355 
01356   /**
01357    *  @brief  Primary class template money_get.
01358    *  @ingroup locales
01359    *
01360    *  This facet encapsulates the code to parse and return a monetary
01361    *  amount from a string.
01362    *
01363    *  The money_get template uses protected virtual functions to
01364    *  provide the actual results.  The public accessors forward the
01365    *  call to the virtual functions.  These virtual functions are
01366    *  hooks for developers to implement the behavior they require from
01367    *  the money_get facet.
01368   */
01369   template<typename _CharT, typename _InIter>
01370     class money_get : public locale::facet
01371     {
01372     public:
01373       // Types:
01374       //@{
01375       /// Public typedefs
01376       typedef _CharT            char_type;
01377       typedef _InIter           iter_type;
01378       typedef basic_string<_CharT>  string_type;
01379       //@}
01380 
01381       /// Numpunct facet id.
01382       static locale::id         id;
01383 
01384       /**
01385        *  @brief  Constructor performs initialization.
01386        *
01387        *  This is the constructor provided by the standard.
01388        *
01389        *  @param refs  Passed to the base facet class.
01390       */
01391       explicit
01392       money_get(size_t __refs = 0) : facet(__refs) { }
01393 
01394       /**
01395        *  @brief  Read and parse a monetary value.
01396        *
01397        *  This function reads characters from @a s, interprets them as a
01398        *  monetary value according to moneypunct and ctype facets retrieved
01399        *  from io.getloc(), and returns the result in @a units as an integral
01400        *  value moneypunct::frac_digits() * the actual amount.  For example,
01401        *  the string $10.01 in a US locale would store 1001 in @a units.
01402        *
01403        *  Any characters not part of a valid money amount are not consumed.
01404        *
01405        *  If a money value cannot be parsed from the input stream, sets
01406        *  err=(err|io.failbit).  If the stream is consumed before finishing
01407        *  parsing,  sets err=(err|io.failbit|io.eofbit).  @a units is
01408        *  unchanged if parsing fails.
01409        *
01410        *  This function works by returning the result of do_get().
01411        *
01412        *  @param  s  Start of characters to parse.
01413        *  @param  end  End of characters to parse.
01414        *  @param  intl  Parameter to use_facet<moneypunct<CharT,intl> >.
01415        *  @param  io  Source of facets and io state.
01416        *  @param  err  Error field to set if parsing fails.
01417        *  @param  units  Place to store result of parsing.
01418        *  @return  Iterator referencing first character beyond valid money
01419        *       amount.
01420        */
01421       iter_type
01422       get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
01423       ios_base::iostate& __err, long double& __units) const
01424       { return this->do_get(__s, __end, __intl, __io, __err, __units); }
01425 
01426       /**
01427        *  @brief  Read and parse a monetary value.
01428        *
01429        *  This function reads characters from @a s, interprets them as
01430        *  a monetary value according to moneypunct and ctype facets
01431        *  retrieved from io.getloc(), and returns the result in @a
01432        *  digits.  For example, the string $10.01 in a US locale would
01433        *  store <code>1001</code> in @a digits.
01434        *
01435        *  Any characters not part of a valid money amount are not consumed.
01436        *
01437        *  If a money value cannot be parsed from the input stream, sets
01438        *  err=(err|io.failbit).  If the stream is consumed before finishing
01439        *  parsing,  sets err=(err|io.failbit|io.eofbit).
01440        *
01441        *  This function works by returning the result of do_get().
01442        *
01443        *  @param  s  Start of characters to parse.
01444        *  @param  end  End of characters to parse.
01445        *  @param  intl  Parameter to use_facet<moneypunct<CharT,intl> >.
01446        *  @param  io  Source of facets and io state.
01447        *  @param  err  Error field to set if parsing fails.
01448        *  @param  digits  Place to store result of parsing.
01449        *  @return  Iterator referencing first character beyond valid money
01450        *       amount.
01451        */
01452       iter_type
01453       get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
01454       ios_base::iostate& __err, string_type& __digits) const
01455       { return this->do_get(__s, __end, __intl, __io, __err, __digits); }
01456 
01457     protected:
01458       /// Destructor.
01459       virtual
01460       ~money_get() { }
01461 
01462       /**
01463        *  @brief  Read and parse a monetary value.
01464        *
01465        *  This function reads and parses characters representing a monetary
01466        *  value.  This function is a hook for derived classes to change the
01467        *  value returned.  @see get() for details.
01468        */
01469       // XXX GLIBCXX_ABI Deprecated
01470 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
01471       virtual iter_type
01472       __do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
01473            ios_base::iostate& __err, double& __units) const;
01474 #else
01475       virtual iter_type
01476       do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
01477          ios_base::iostate& __err, long double& __units) const;
01478 #endif
01479 
01480       /**
01481        *  @brief  Read and parse a monetary value.
01482        *
01483        *  This function reads and parses characters representing a monetary
01484        *  value.  This function is a hook for derived classes to change the
01485        *  value returned.  @see get() for details.
01486        */
01487       virtual iter_type
01488       do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
01489          ios_base::iostate& __err, string_type& __digits) const;
01490 
01491       // XXX GLIBCXX_ABI Deprecated
01492 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
01493       virtual iter_type
01494       do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
01495          ios_base::iostate& __err, long double& __units) const;
01496 #endif
01497 
01498       template<bool _Intl>
01499         iter_type
01500         _M_extract(iter_type __s, iter_type __end, ios_base& __io,
01501            ios_base::iostate& __err, string& __digits) const;     
01502     };
01503 
01504   template<typename _CharT, typename _InIter>
01505     locale::id money_get<_CharT, _InIter>::id;
01506 
01507   /**
01508    *  @brief  Primary class template money_put.
01509    *  @ingroup locales
01510    *
01511    *  This facet encapsulates the code to format and output a monetary
01512    *  amount.
01513    *
01514    *  The money_put template uses protected virtual functions to
01515    *  provide the actual results.  The public accessors forward the
01516    *  call to the virtual functions.  These virtual functions are
01517    *  hooks for developers to implement the behavior they require from
01518    *  the money_put facet.
01519   */
01520   template<typename _CharT, typename _OutIter>
01521     class money_put : public locale::facet
01522     {
01523     public:
01524       //@{
01525       /// Public typedefs
01526       typedef _CharT            char_type;
01527       typedef _OutIter          iter_type;
01528       typedef basic_string<_CharT>  string_type;
01529       //@}
01530 
01531       /// Numpunct facet id.
01532       static locale::id         id;
01533 
01534       /**
01535        *  @brief  Constructor performs initialization.
01536        *
01537        *  This is the constructor provided by the standard.
01538        *
01539        *  @param refs  Passed to the base facet class.
01540       */
01541       explicit
01542       money_put(size_t __refs = 0) : facet(__refs) { }
01543 
01544       /**
01545        *  @brief  Format and output a monetary value.
01546        *
01547        *  This function formats @a units as a monetary value according to
01548        *  moneypunct and ctype facets retrieved from io.getloc(), and writes
01549        *  the resulting characters to @a s.  For example, the value 1001 in a
01550        *  US locale would write <code>$10.01</code> to @a s.
01551        *
01552        *  This function works by returning the result of do_put().
01553        *
01554        *  @param  s  The stream to write to.
01555        *  @param  intl  Parameter to use_facet<moneypunct<CharT,intl> >.
01556        *  @param  io  Source of facets and io state.
01557        *  @param  fill  char_type to use for padding.
01558        *  @param  units  Place to store result of parsing.
01559        *  @return  Iterator after writing.
01560        */
01561       iter_type
01562       put(iter_type __s, bool __intl, ios_base& __io,
01563       char_type __fill, long double __units) const
01564       { return this->do_put(__s, __intl, __io, __fill, __units); }
01565 
01566       /**
01567        *  @brief  Format and output a monetary value.
01568        *
01569        *  This function formats @a digits as a monetary value
01570        *  according to moneypunct and ctype facets retrieved from
01571        *  io.getloc(), and writes the resulting characters to @a s.
01572        *  For example, the string <code>1001</code> in a US locale
01573        *  would write <code>$10.01</code> to @a s.
01574        *
01575        *  This function works by returning the result of do_put().
01576        *
01577        *  @param  s  The stream to write to.
01578        *  @param  intl  Parameter to use_facet<moneypunct<CharT,intl> >.
01579        *  @param  io  Source of facets and io state.
01580        *  @param  fill  char_type to use for padding.
01581        *  @param  units  Place to store result of parsing.
01582        *  @return  Iterator after writing.
01583        */
01584       iter_type
01585       put(iter_type __s, bool __intl, ios_base& __io,
01586       char_type __fill, const string_type& __digits) const
01587       { return this->do_put(__s, __intl, __io, __fill, __digits); }
01588 
01589     protected:
01590       /// Destructor.
01591       virtual
01592       ~money_put() { }
01593 
01594       /**
01595        *  @brief  Format and output a monetary value.
01596        *
01597        *  This function formats @a units as a monetary value according to
01598        *  moneypunct and ctype facets retrieved from io.getloc(), and writes
01599        *  the resulting characters to @a s.  For example, the value 1001 in a
01600        *  US locale would write <code>$10.01</code> to @a s.
01601        *
01602        *  This function is a hook for derived classes to change the value
01603        *  returned.  @see put().
01604        *
01605        *  @param  s  The stream to write to.
01606        *  @param  intl  Parameter to use_facet<moneypunct<CharT,intl> >.
01607        *  @param  io  Source of facets and io state.
01608        *  @param  fill  char_type to use for padding.
01609        *  @param  units  Place to store result of parsing.
01610        *  @return  Iterator after writing.
01611        */
01612       // XXX GLIBCXX_ABI Deprecated
01613 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
01614       virtual iter_type
01615       __do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
01616            double __units) const;
01617 #else
01618       virtual iter_type
01619       do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
01620          long double __units) const;
01621 #endif
01622 
01623       /**
01624        *  @brief  Format and output a monetary value.
01625        *
01626        *  This function formats @a digits as a monetary value
01627        *  according to moneypunct and ctype facets retrieved from
01628        *  io.getloc(), and writes the resulting characters to @a s.
01629        *  For example, the string <code>1001</code> in a US locale
01630        *  would write <code>$10.01</code> to @a s.
01631        *
01632        *  This function is a hook for derived classes to change the value
01633        *  returned.  @see put().
01634        *
01635        *  @param  s  The stream to write to.
01636        *  @param  intl  Parameter to use_facet<moneypunct<CharT,intl> >.
01637        *  @param  io  Source of facets and io state.
01638        *  @param  fill  char_type to use for padding.
01639        *  @param  units  Place to store result of parsing.
01640        *  @return  Iterator after writing.
01641        */
01642       virtual iter_type
01643       do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
01644          const string_type& __digits) const;
01645 
01646       // XXX GLIBCXX_ABI Deprecated
01647 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
01648       virtual iter_type
01649       do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
01650          long double __units) const;
01651 #endif
01652 
01653       template<bool _Intl>
01654         iter_type
01655         _M_insert(iter_type __s, ios_base& __io, char_type __fill,
01656           const string_type& __digits) const;
01657     };
01658 
01659   template<typename _CharT, typename _OutIter>
01660     locale::id money_put<_CharT, _OutIter>::id;
01661 
01662 _GLIBCXX_END_NAMESPACE_LDBL
01663 
01664   /**
01665    *  @brief  Messages facet base class providing catalog typedef.
01666    *  @ingroup locales
01667    */
01668   struct messages_base
01669   {
01670     typedef int catalog;
01671   };
01672 
01673   /**
01674    *  @brief  Primary class template messages.
01675    *  @ingroup locales
01676    *
01677    *  This facet encapsulates the code to retrieve messages from
01678    *  message catalogs.  The only thing defined by the standard for this facet
01679    *  is the interface.  All underlying functionality is
01680    *  implementation-defined.
01681    *
01682    *  This library currently implements 3 versions of the message facet.  The
01683    *  first version (gnu) is a wrapper around gettext, provided by libintl.
01684    *  The second version (ieee) is a wrapper around catgets.  The final
01685    *  version (default) does no actual translation.  These implementations are
01686    *  only provided for char and wchar_t instantiations.
01687    *
01688    *  The messages template uses protected virtual functions to
01689    *  provide the actual results.  The public accessors forward the
01690    *  call to the virtual functions.  These virtual functions are
01691    *  hooks for developers to implement the behavior they require from
01692    *  the messages facet.
01693   */
01694   template<typename _CharT>
01695     class messages : public locale::facet, public messages_base
01696     {
01697     public:
01698       // Types:
01699       //@{
01700       /// Public typedefs
01701       typedef _CharT            char_type;
01702       typedef basic_string<_CharT>  string_type;
01703       //@}
01704 
01705     protected:
01706       // Underlying "C" library locale information saved from
01707       // initialization, needed by messages_byname as well.
01708       __c_locale            _M_c_locale_messages;
01709       const char*           _M_name_messages;
01710 
01711     public:
01712       /// Numpunct facet id.
01713       static locale::id         id;
01714 
01715       /**
01716        *  @brief  Constructor performs initialization.
01717        *
01718        *  This is the constructor provided by the standard.
01719        *
01720        *  @param refs  Passed to the base facet class.
01721       */
01722       explicit
01723       messages(size_t __refs = 0);
01724 
01725       // Non-standard.
01726       /**
01727        *  @brief  Internal constructor.  Not for general use.
01728        *
01729        *  This is a constructor for use by the library itself to set up new
01730        *  locales.
01731        *
01732        *  @param  cloc  The C locale.
01733        *  @param  s  The name of a locale.
01734        *  @param  refs  Refcount to pass to the base class.
01735        */
01736       explicit
01737       messages(__c_locale __cloc, const char* __s, size_t __refs = 0);
01738 
01739       /*
01740        *  @brief  Open a message catalog.
01741        *
01742        *  This function opens and returns a handle to a message catalog by
01743        *  returning do_open(s, loc).
01744        *
01745        *  @param  s  The catalog to open.
01746        *  @param  loc  Locale to use for character set conversions.
01747        *  @return  Handle to the catalog or value < 0 if open fails.
01748       */
01749       catalog
01750       open(const basic_string<char>& __s, const locale& __loc) const
01751       { return this->do_open(__s, __loc); }
01752 
01753       // Non-standard and unorthodox, yet effective.
01754       /*
01755        *  @brief  Open a message catalog.
01756        *
01757        *  This non-standard function opens and returns a handle to a message
01758        *  catalog by returning do_open(s, loc).  The third argument provides a
01759        *  message catalog root directory for gnu gettext and is ignored
01760        *  otherwise.
01761        *
01762        *  @param  s  The catalog to open.
01763        *  @param  loc  Locale to use for character set conversions.
01764        *  @param  dir  Message catalog root directory.
01765        *  @return  Handle to the catalog or value < 0 if open fails.
01766       */
01767       catalog
01768       open(const basic_string<char>&, const locale&, const char*) const;
01769 
01770       /*
01771        *  @brief  Look up a string in a message catalog.
01772        *
01773        *  This function retrieves and returns a message from a catalog by
01774        *  returning do_get(c, set, msgid, s).
01775        *
01776        *  For gnu, @a set and @a msgid are ignored.  Returns gettext(s).
01777        *  For default, returns s. For ieee, returns catgets(c,set,msgid,s).
01778        *
01779        *  @param  c  The catalog to access.
01780        *  @param  set  Implementation-defined.
01781        *  @param  msgid  Implementation-defined.
01782        *  @param  s  Default return value if retrieval fails.
01783        *  @return  Retrieved message or @a s if get fails.
01784       */
01785       string_type
01786       get(catalog __c, int __set, int __msgid, const string_type& __s) const
01787       { return this->do_get(__c, __set, __msgid, __s); }
01788 
01789       /*
01790        *  @brief  Close a message catalog.
01791        *
01792        *  Closes catalog @a c by calling do_close(c).
01793        *
01794        *  @param  c  The catalog to close.
01795       */
01796       void
01797       close(catalog __c) const
01798       { return this->do_close(__c); }
01799 
01800     protected:
01801       /// Destructor.
01802       virtual
01803       ~messages();
01804 
01805       /*
01806        *  @brief  Open a message catalog.
01807        *
01808        *  This function opens and returns a handle to a message catalog in an
01809        *  implementation-defined manner.  This function is a hook for derived
01810        *  classes to change the value returned.
01811        *
01812        *  @param  s  The catalog to open.
01813        *  @param  loc  Locale to use for character set conversions.
01814        *  @return  Handle to the opened catalog, value < 0 if open failed.
01815       */
01816       virtual catalog
01817       do_open(const basic_string<char>&, const locale&) const;
01818 
01819       /*
01820        *  @brief  Look up a string in a message catalog.
01821        *
01822        *  This function retrieves and returns a message from a catalog in an
01823        *  implementation-defined manner.  This function is a hook for derived
01824        *  classes to change the value returned.
01825        *
01826        *  For gnu, @a set and @a msgid are ignored.  Returns gettext(s).
01827        *  For default, returns s. For ieee, returns catgets(c,set,msgid,s).
01828        *
01829        *  @param  c  The catalog to access.
01830        *  @param  set  Implementation-defined.
01831        *  @param  msgid  Implementation-defined.
01832        *  @param  s  Default return value if retrieval fails.
01833        *  @return  Retrieved message or @a s if get fails.
01834       */
01835       virtual string_type
01836       do_get(catalog, int, int, const string_type& __dfault) const;
01837 
01838       /*
01839        *  @brief  Close a message catalog.
01840        *
01841        *  @param  c  The catalog to close.
01842       */
01843       virtual void
01844       do_close(catalog) const;
01845 
01846       // Returns a locale and codeset-converted string, given a char* message.
01847       char*
01848       _M_convert_to_char(const string_type& __msg) const
01849       {
01850     // XXX
01851     return reinterpret_cast<char*>(const_cast<_CharT*>(__msg.c_str()));
01852       }
01853 
01854       // Returns a locale and codeset-converted string, given a char* message.
01855       string_type
01856       _M_convert_from_char(char*) const
01857       {
01858 #if 0
01859     // Length of message string without terminating null.
01860     size_t __len = char_traits<char>::length(__msg) - 1;
01861 
01862     // "everybody can easily convert the string using
01863     // mbsrtowcs/wcsrtombs or with iconv()"
01864 
01865     // Convert char* to _CharT in locale used to open catalog.
01866     // XXX need additional template parameter on messages class for this..
01867     // typedef typename codecvt<char, _CharT, _StateT> __codecvt_type;
01868     typedef typename codecvt<char, _CharT, mbstate_t> __codecvt_type;
01869 
01870     __codecvt_type::state_type __state;
01871     // XXX may need to initialize state.
01872     //initialize_state(__state._M_init());
01873 
01874     char* __from_next;
01875     // XXX what size for this string?
01876     _CharT* __to = static_cast<_CharT*>(__builtin_alloca(__len + 1));
01877     const __codecvt_type& __cvt = use_facet<__codecvt_type>(_M_locale_conv);
01878     __cvt.out(__state, __msg, __msg + __len, __from_next,
01879           __to, __to + __len + 1, __to_next);
01880     return string_type(__to);
01881 #endif
01882 #if 0
01883     typedef ctype<_CharT> __ctype_type;
01884     // const __ctype_type& __cvt = use_facet<__ctype_type>(_M_locale_msg);
01885     const __ctype_type& __cvt = use_facet<__ctype_type>(locale());
01886     // XXX Again, proper length of converted string an issue here.
01887     // For now, assume the converted length is not larger.
01888     _CharT* __dest = static_cast<_CharT*>(__builtin_alloca(__len + 1));
01889     __cvt.widen(__msg, __msg + __len, __dest);
01890     return basic_string<_CharT>(__dest);
01891 #endif
01892     return string_type();
01893       }
01894      };
01895 
01896   template<typename _CharT>
01897     locale::id messages<_CharT>::id;
01898 
01899   /// Specializations for required instantiations.
01900   template<>
01901     string
01902     messages<char>::do_get(catalog, int, int, const string&) const;
01903 
01904 #ifdef _GLIBCXX_USE_WCHAR_T
01905   template<>
01906     wstring
01907     messages<wchar_t>::do_get(catalog, int, int, const wstring&) const;
01908 #endif
01909 
01910    /// class messages_byname [22.2.7.2].
01911    template<typename _CharT>
01912     class messages_byname : public messages<_CharT>
01913     {
01914     public:
01915       typedef _CharT            char_type;
01916       typedef basic_string<_CharT>  string_type;
01917 
01918       explicit
01919       messages_byname(const char* __s, size_t __refs = 0);
01920 
01921     protected:
01922       virtual
01923       ~messages_byname()
01924       { }
01925     };
01926 
01927 _GLIBCXX_END_NAMESPACE_VERSION
01928 } // namespace
01929 
01930 // Include host and configuration specific messages functions.
01931 #include <bits/messages_members.h>
01932 
01933 // 22.2.1.5  Template class codecvt
01934 #include <bits/codecvt.h>
01935 
01936 #include <bits/locale_facets_nonio.tcc>
01937 
01938 #endif