321 lines
10 KiB
C++
321 lines
10 KiB
C++
#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: 2012-09-22 15:33:33 -0700 (Sat, 22 Sep 2012) $
|
|
*/
|
|
|
|
|
|
#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
|