source: NonGTP/Boost/boost/date_time/date_names_put.hpp @ 857

Revision 857, 10.8 KB checked in by igarcia, 19 years ago (diff)
Line 
1#ifndef DATE_TIME_DATE_NAMES_PUT_HPP___
2#define DATE_TIME_DATE_NAMES_PUT_HPP___
3
4/* Copyright (c) 2002-2005 CrystalClear Software, Inc.
5 * Use, modification and distribution is subject to the
6 * Boost Software License, Version 1.0. (See accompanying
7 * file LICENSE-1.0 or http://www.boost.org/LICENSE-1.0)
8 * Author: Jeff Garland, Bart Garst
9 * $Date: 2005/04/16 18:59:51 $
10 */
11
12
13#include "boost/date_time/locale_config.hpp" // set BOOST_DATE_TIME_NO_LOCALE
14
15#ifndef BOOST_DATE_TIME_NO_LOCALE
16
17#include "boost/date_time/special_defs.hpp"
18#include "boost/date_time/date_defs.hpp"
19#include "boost/date_time/parse_format_base.hpp"
20#include "boost/lexical_cast.hpp"
21#include <locale>
22
23
24namespace boost {
25namespace date_time {
26
27    //! Output facet base class for gregorian dates.
28    /*! This class is a base class for date facets used to localize the
29     *  names of months and the names of days in the week.
30     *
31     * Requirements of Config
32     *  - define an enumeration month_enum that enumerates the months.
33     *    The enumeration should be '1' based eg: Jan==1
34     *  - define as_short_string and as_long_string
35     *
36     * (see langer & kreft p334).
37     *
38     */
39    template<class Config,
40             class charT = char,
41             class OutputIterator = std::ostreambuf_iterator<charT> >
42    class date_names_put : public std::locale::facet
43    {
44    public:
45      date_names_put() {};
46      typedef OutputIterator iter_type;
47      typedef typename Config::month_type month_type;
48      typedef typename Config::month_enum month_enum;
49      typedef typename Config::weekday_enum weekday_enum;
50      typedef typename Config::special_value_enum special_value_enum;
51      //typedef typename Config::format_type format_type;
52      typedef std::basic_string<charT> string_type;
53      typedef charT char_type;
54      static const char_type default_special_value_names[3][17];
55      static const char_type separator[2];
56
57      static std::locale::id id;
58
59#if defined (__SUNPRO_CC) && defined (_RWSTD_VER)
60      std::locale::id& __get_id (void) const { return id; }
61#endif
62
63      void put_special_value(iter_type& oitr, special_value_enum sv) const
64      {
65        do_put_special_value(oitr, sv);
66      }
67      void put_month_short(iter_type& oitr, month_enum moy) const
68      {
69        do_put_month_short(oitr, moy);
70      }
71      void put_month_long(iter_type& oitr, month_enum moy) const
72      {
73        do_put_month_long(oitr, moy);
74      }
75      void put_weekday_short(iter_type& oitr, weekday_enum wd) const
76      {
77        do_put_weekday_short(oitr, wd);
78      }
79      void put_weekday_long(iter_type& oitr, weekday_enum wd) const
80      {
81        do_put_weekday_long(oitr, wd);
82      }
83      bool has_date_sep_chars() const
84      {
85        return do_has_date_sep_chars();
86      }
87      void year_sep_char(iter_type& oitr) const
88      {
89        do_year_sep_char(oitr);
90      }
91      //! char between year-month
92      void month_sep_char(iter_type& oitr) const
93      {
94        do_month_sep_char(oitr);
95      }
96      //! Char to separate month-day
97      void day_sep_char(iter_type& oitr) const
98      {
99        do_day_sep_char(oitr);
100      }
101      //! Determines the order to put the date elements
102      ymd_order_spec date_order() const
103      {
104        return do_date_order();
105      }
106      //! Determines if month is displayed as integer, short or long string
107      month_format_spec month_format() const
108      {
109        return do_month_format();
110      }
111
112    protected:
113      //! Default facet implementation uses month_type defaults
114      virtual void do_put_month_short(iter_type& oitr, month_enum moy) const
115      {
116        month_type gm(moy);
117        charT c = '\0';
118        put_string(oitr, gm.as_short_string(c));
119      }
120      //! Default facet implementation uses month_type defaults
121      virtual void do_put_month_long(iter_type& oitr,
122                                     month_enum moy) const
123      {
124        month_type gm(moy);
125        charT c = '\0';
126        put_string(oitr, gm.as_long_string(c));
127      }
128      //! Default facet implementation for special value types
129      virtual void do_put_special_value(iter_type& oitr, special_value_enum sv) const
130      {
131        if(sv <= 2) { // only output not_a_date_time, neg_infin, or pos_infin
132          string_type s(default_special_value_names[sv]);
133          put_string(oitr, s);
134        }
135      }
136      virtual void do_put_weekday_short(iter_type&, weekday_enum) const
137      {
138      }
139      virtual void do_put_weekday_long(iter_type&, weekday_enum) const
140      {
141      }
142      virtual bool do_has_date_sep_chars() const
143      {
144        return true;
145      }
146      virtual void do_year_sep_char(iter_type& oitr) const
147      {
148        string_type s(separator);
149        put_string(oitr, s);
150      }
151      //! char between year-month
152      virtual void do_month_sep_char(iter_type& oitr) const
153      {
154        string_type s(separator);
155        put_string(oitr, s);
156      }
157      //! Char to separate month-day
158      virtual void do_day_sep_char(iter_type& oitr) const
159      {
160        string_type s(separator); //put in '-'
161        put_string(oitr, s);
162      }
163      //! Default for date order
164      virtual ymd_order_spec do_date_order() const
165      {
166        return ymd_order_iso;
167      }
168      //! Default month format
169      virtual month_format_spec do_month_format() const
170      {
171        return month_as_short_string;
172      }
173      void put_string(iter_type& oi, const charT* const s) const
174      {
175        string_type s1(boost::lexical_cast<string_type>(s));
176        typename string_type::iterator si,end;
177        for (si=s1.begin(), end=s1.end(); si!=end; si++, oi++) {
178          *oi = *si;
179        }
180      }
181      void put_string(iter_type& oi, const string_type& s1) const
182      {
183        typename string_type::const_iterator si,end;
184        for (si=s1.begin(), end=s1.end(); si!=end; si++, oi++) {
185          *oi = *si;
186        }
187      }
188    };
189   
190    template<class Config, class charT, class OutputIterator>
191    const typename date_names_put<Config, charT, OutputIterator>::char_type
192    date_names_put<Config, charT, OutputIterator>::default_special_value_names[3][17] = {
193      {'n','o','t','-','a','-','d','a','t','e','-','t','i','m','e'},
194      {'-','i','n','f','i','n','i','t','y'},
195      {'+','i','n','f','i','n','i','t','y'} };
196
197    template<class Config, class charT, class OutputIterator>
198    const typename date_names_put<Config, charT, OutputIterator>::char_type
199    date_names_put<Config, charT, OutputIterator>::separator[2] =
200      {'-', '\0'} ;
201   
202
203    //! Generate storage location for a std::locale::id
204    template<class Config, class charT, class OutputIterator>
205    std::locale::id date_names_put<Config, charT, OutputIterator>::id;
206
207    //! A date name output facet that takes an array of char* to define strings
208    template<class Config,
209             class charT = char,
210             class OutputIterator = std::ostreambuf_iterator<charT> >
211    class all_date_names_put : public date_names_put<Config, charT, OutputIterator>
212    {
213    public:
214      all_date_names_put(const charT* const month_short_names[],
215                         const charT* const month_long_names[],
216                         const charT* const special_value_names[],
217                         const charT* const weekday_short_names[],
218                         const charT* const weekday_long_names[],
219                         charT separator_char = '-',
220                         ymd_order_spec order_spec = ymd_order_iso,
221                         month_format_spec month_format = month_as_short_string) :
222        month_short_names_(month_short_names),
223        month_long_names_(month_long_names),
224        special_value_names_(special_value_names),
225        weekday_short_names_(weekday_short_names),
226        weekday_long_names_(weekday_long_names),
227        order_spec_(order_spec),
228        month_format_spec_(month_format)
229      {
230        separator_char_[0] = separator_char;
231        separator_char_[1] = '\0';
232
233      };
234      typedef OutputIterator iter_type;
235      typedef typename Config::month_enum month_enum;
236      typedef typename Config::weekday_enum weekday_enum;
237      typedef typename Config::special_value_enum special_value_enum;
238
239      const charT* const* get_short_month_names() const
240      {
241        return month_short_names_;
242      }
243      const charT* const* get_long_month_names() const
244      {
245        return month_long_names_;
246      }
247      const charT* const* get_special_value_names() const
248      {
249        return special_value_names_;
250      }
251      const charT* const* get_short_weekday_names()const 
252      {
253        return weekday_short_names_;
254      }
255      const charT* const* get_long_weekday_names()const
256      {
257        return weekday_long_names_;
258      }
259
260    protected:
261      //! Generic facet that takes array of chars
262      virtual void do_put_month_short(iter_type& oitr, month_enum moy) const
263      {
264        this->put_string(oitr, month_short_names_[moy-1]);
265      }
266      //! Long month names
267      virtual void do_put_month_long(iter_type& oitr, month_enum moy) const
268      {
269        this->put_string(oitr, month_long_names_[moy-1]);
270      }
271      //! Special values names
272      virtual void do_put_special_value(iter_type& oitr, special_value_enum sv) const
273      {
274        this->put_string(oitr, special_value_names_[sv]);
275      }
276      virtual void do_put_weekday_short(iter_type& oitr, weekday_enum wd) const
277      {
278        this->put_string(oitr, weekday_short_names_[wd]);
279      }
280      virtual void do_put_weekday_long(iter_type& oitr, weekday_enum wd) const
281      {
282        this->put_string(oitr, weekday_long_names_[wd]);
283      }
284      //! char between year-month
285      virtual void do_month_sep_char(iter_type& oitr) const
286      {
287        this->put_string(oitr, separator_char_);
288      }
289      //! Char to separate month-day
290      virtual void do_day_sep_char(iter_type& oitr) const
291      {
292        this->put_string(oitr, separator_char_);
293      }
294      //! Set the date ordering
295      virtual ymd_order_spec do_date_order() const
296      {
297        return order_spec_;
298      }
299      //! Set the date ordering
300      virtual month_format_spec do_month_format() const
301      {
302        return month_format_spec_;
303      }
304
305    private:
306      const charT* const* month_short_names_;
307      const charT* const* month_long_names_;
308      const charT* const* special_value_names_;
309      const charT* const* weekday_short_names_;
310      const charT* const* weekday_long_names_;
311      charT separator_char_[2];
312      ymd_order_spec order_spec_;
313      month_format_spec month_format_spec_;     
314    };
315
316} } //namespace boost::date_time
317
318#endif //BOOST_NO_STD_LOCALE
319
320#endif
Note: See TracBrowser for help on using the repository browser.