#ifndef DATE_TIME_DATE_NAMES_PUT_HPP___ #define DATE_TIME_DATE_NAMES_PUT_HPP___ /* Copyright (c) 2002-2005 CrystalClear Software, Inc. * Use, modification and distribution is subject to the * Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) * Author: Jeff Garland, Bart Garst * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $ */ #include "boost/date_time/locale_config.hpp" // set BOOST_DATE_TIME_NO_LOCALE #ifndef BOOST_DATE_TIME_NO_LOCALE #include "boost/date_time/special_defs.hpp" #include "boost/date_time/date_defs.hpp" #include "boost/date_time/parse_format_base.hpp" #include "boost/lexical_cast.hpp" #include <locale> namespace boost { namespace date_time { //! Output facet base class for gregorian dates. /*! This class is a base class for date facets used to localize the * names of months and the names of days in the week. * * Requirements of Config * - define an enumeration month_enum that enumerates the months. * The enumeration should be '1' based eg: Jan==1 * - define as_short_string and as_long_string * * (see langer & kreft p334). * */ template<class Config, class charT = char, class OutputIterator = std::ostreambuf_iterator<charT> > class date_names_put : public std::locale::facet { public: date_names_put() {}; typedef OutputIterator iter_type; typedef typename Config::month_type month_type; typedef typename Config::month_enum month_enum; typedef typename Config::weekday_enum weekday_enum; typedef typename Config::special_value_enum special_value_enum; //typedef typename Config::format_type format_type; typedef std::basic_string<charT> string_type; typedef charT char_type; static const char_type default_special_value_names[3][17]; static const char_type separator[2]; static std::locale::id id; #if defined (__SUNPRO_CC) && defined (_RWSTD_VER) std::locale::id& __get_id (void) const { return id; } #endif void put_special_value(iter_type& oitr, special_value_enum sv) const { do_put_special_value(oitr, sv); } void put_month_short(iter_type& oitr, month_enum moy) const { do_put_month_short(oitr, moy); } void put_month_long(iter_type& oitr, month_enum moy) const { do_put_month_long(oitr, moy); } void put_weekday_short(iter_type& oitr, weekday_enum wd) const { do_put_weekday_short(oitr, wd); } void put_weekday_long(iter_type& oitr, weekday_enum wd) const { do_put_weekday_long(oitr, wd); } bool has_date_sep_chars() const { return do_has_date_sep_chars(); } void year_sep_char(iter_type& oitr) const { do_year_sep_char(oitr); } //! char between year-month void month_sep_char(iter_type& oitr) const { do_month_sep_char(oitr); } //! Char to separate month-day void day_sep_char(iter_type& oitr) const { do_day_sep_char(oitr); } //! Determines the order to put the date elements ymd_order_spec date_order() const { return do_date_order(); } //! Determines if month is displayed as integer, short or long string month_format_spec month_format() const { return do_month_format(); } protected: //! Default facet implementation uses month_type defaults virtual void do_put_month_short(iter_type& oitr, month_enum moy) const { month_type gm(moy); charT c = '\0'; put_string(oitr, gm.as_short_string(c)); } //! Default facet implementation uses month_type defaults virtual void do_put_month_long(iter_type& oitr, month_enum moy) const { month_type gm(moy); charT c = '\0'; put_string(oitr, gm.as_long_string(c)); } //! Default facet implementation for special value types virtual void do_put_special_value(iter_type& oitr, special_value_enum sv) const { if(sv <= 2) { // only output not_a_date_time, neg_infin, or pos_infin string_type s(default_special_value_names[sv]); put_string(oitr, s); } } virtual void do_put_weekday_short(iter_type&, weekday_enum) const { } virtual void do_put_weekday_long(iter_type&, weekday_enum) const { } virtual bool do_has_date_sep_chars() const { return true; } virtual void do_year_sep_char(iter_type& oitr) const { string_type s(separator); put_string(oitr, s); } //! char between year-month virtual void do_month_sep_char(iter_type& oitr) const { string_type s(separator); put_string(oitr, s); } //! Char to separate month-day virtual void do_day_sep_char(iter_type& oitr) const { string_type s(separator); //put in '-' put_string(oitr, s); } //! Default for date order virtual ymd_order_spec do_date_order() const { return ymd_order_iso; } //! Default month format virtual month_format_spec do_month_format() const { return month_as_short_string; } void put_string(iter_type& oi, const charT* const s) const { string_type s1(boost::lexical_cast<string_type>(s)); typename string_type::iterator si,end; for (si=s1.begin(), end=s1.end(); si!=end; si++, oi++) { *oi = *si; } } void put_string(iter_type& oi, const string_type& s1) const { typename string_type::const_iterator si,end; for (si=s1.begin(), end=s1.end(); si!=end; si++, oi++) { *oi = *si; } } }; template<class Config, class charT, class OutputIterator> const typename date_names_put<Config, charT, OutputIterator>::char_type date_names_put<Config, charT, OutputIterator>::default_special_value_names[3][17] = { {'n','o','t','-','a','-','d','a','t','e','-','t','i','m','e'}, {'-','i','n','f','i','n','i','t','y'}, {'+','i','n','f','i','n','i','t','y'} }; template<class Config, class charT, class OutputIterator> const typename date_names_put<Config, charT, OutputIterator>::char_type date_names_put<Config, charT, OutputIterator>::separator[2] = {'-', '\0'} ; //! Generate storage location for a std::locale::id template<class Config, class charT, class OutputIterator> std::locale::id date_names_put<Config, charT, OutputIterator>::id; //! A date name output facet that takes an array of char* to define strings template<class Config, class charT = char, class OutputIterator = std::ostreambuf_iterator<charT> > class all_date_names_put : public date_names_put<Config, charT, OutputIterator> { public: all_date_names_put(const charT* const month_short_names[], const charT* const month_long_names[], const charT* const special_value_names[], const charT* const weekday_short_names[], const charT* const weekday_long_names[], charT separator_char = '-', ymd_order_spec order_spec = ymd_order_iso, month_format_spec month_format = month_as_short_string) : month_short_names_(month_short_names), month_long_names_(month_long_names), special_value_names_(special_value_names), weekday_short_names_(weekday_short_names), weekday_long_names_(weekday_long_names), order_spec_(order_spec), month_format_spec_(month_format) { separator_char_[0] = separator_char; separator_char_[1] = '\0'; }; typedef OutputIterator iter_type; typedef typename Config::month_enum month_enum; typedef typename Config::weekday_enum weekday_enum; typedef typename Config::special_value_enum special_value_enum; const charT* const* get_short_month_names() const { return month_short_names_; } const charT* const* get_long_month_names() const { return month_long_names_; } const charT* const* get_special_value_names() const { return special_value_names_; } const charT* const* get_short_weekday_names()const { return weekday_short_names_; } const charT* const* get_long_weekday_names()const { return weekday_long_names_; } protected: //! Generic facet that takes array of chars virtual void do_put_month_short(iter_type& oitr, month_enum moy) const { this->put_string(oitr, month_short_names_[moy-1]); } //! Long month names virtual void do_put_month_long(iter_type& oitr, month_enum moy) const { this->put_string(oitr, month_long_names_[moy-1]); } //! Special values names virtual void do_put_special_value(iter_type& oitr, special_value_enum sv) const { this->put_string(oitr, special_value_names_[sv]); } virtual void do_put_weekday_short(iter_type& oitr, weekday_enum wd) const { this->put_string(oitr, weekday_short_names_[wd]); } virtual void do_put_weekday_long(iter_type& oitr, weekday_enum wd) const { this->put_string(oitr, weekday_long_names_[wd]); } //! char between year-month virtual void do_month_sep_char(iter_type& oitr) const { this->put_string(oitr, separator_char_); } //! Char to separate month-day virtual void do_day_sep_char(iter_type& oitr) const { this->put_string(oitr, separator_char_); } //! Set the date ordering virtual ymd_order_spec do_date_order() const { return order_spec_; } //! Set the date ordering virtual month_format_spec do_month_format() const { return month_format_spec_; } private: const charT* const* month_short_names_; const charT* const* month_long_names_; const charT* const* special_value_names_; const charT* const* weekday_short_names_; const charT* const* weekday_long_names_; charT separator_char_[2]; ymd_order_spec order_spec_; month_format_spec month_format_spec_; }; } } //namespace boost::date_time #endif //BOOST_NO_STD_LOCALE #endif