Ugly, not-to-be-pushed sucking in of all of Boost to get windows to work.
[dyninst.git] / external / boost / date_time / date_names_put.hpp
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
24 namespace boost {
25 namespace 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