1 #ifndef ISO_FORMAT_HPP___
2 #define ISO_FORMAT_HPP___
3 
4 /* Copyright (c) 2002,2003 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.txt or http://www.boost.org/LICENSE_1_0.txt)
8  * Author: Jeff Garland, Bart Garst
9  * $Date$
10  */
11 
12 #include "boost/date_time/parse_format_base.hpp"
13 
14 namespace boost {
15 namespace date_time {
16 
17 //! Class to provide common iso formatting spec
18 template<class charT>
19 class iso_format_base {
20 public:
21   //! Describe month format -- its an integer in iso format
month_format()22   static month_format_spec month_format()
23   {
24     return month_as_integer;
25   }
26 
27   //! String used printed is date is invalid
not_a_date()28   static const charT* not_a_date()
29   {
30     return "not-a-date-time";
31   }
32   //! String used to for positive infinity value
pos_infinity()33   static const charT* pos_infinity()
34   {
35     return "+infinity";
36   }
37   //! String used to for positive infinity value
neg_infinity()38   static const charT* neg_infinity()
39   {
40     return "-infinity";
41   }
42 
43   //! ISO char for a year -- used in durations
year_sep_char()44   static charT year_sep_char()
45   {
46     return 'Y';
47   }
48   //! ISO char for a month
month_sep_char()49   static charT month_sep_char()
50   {
51     return '-';
52   }
53   //! ISO char for a day
day_sep_char()54   static charT day_sep_char()
55   {
56     return '-';
57   }
58   //! char for minute
hour_sep_char()59   static charT hour_sep_char()
60   {
61     return ':';
62   }
63   //! char for minute
minute_sep_char()64   static charT minute_sep_char()
65   {
66     return ':';
67   }
68   //! char for second
second_sep_char()69   static charT second_sep_char()
70   {
71     return ':';
72   }
73   //! ISO char for a period
period_start_char()74   static charT period_start_char()
75   {
76     return 'P';
77   }
78   //! Used in time in mixed strings to set start of time
time_start_char()79   static charT time_start_char()
80   {
81     return 'T';
82   }
83 
84   //! Used in mixed strings to identify start of a week number
week_start_char()85   static charT week_start_char()
86   {
87     return 'W';
88   }
89 
90   //! Separators for periods
period_sep_char()91   static charT period_sep_char()
92   {
93     return '/';
94   }
95   //! Separator for hh:mm:ss
time_sep_char()96   static charT time_sep_char()
97   {
98     return ':';
99   }
100   //! Preferred Separator for hh:mm:ss,decimal_fraction
fractional_time_sep_char()101   static charT fractional_time_sep_char()
102   {
103     return ',';
104   }
105 
is_component_sep(charT sep)106   static bool is_component_sep(charT sep)
107   {
108     switch(sep) {
109     case 'H':
110     case 'M':
111     case 'S':
112     case 'W':
113     case 'T':
114     case 'Y':
115     case 'D':return true;
116     default:
117       return false;
118     }
119   }
120 
is_fractional_time_sep(charT sep)121   static bool is_fractional_time_sep(charT sep)
122   {
123     switch(sep) {
124     case ',':
125     case '.': return true;
126     default: return false;
127     }
128   }
is_timezone_sep(charT sep)129   static bool is_timezone_sep(charT sep)
130   {
131     switch(sep) {
132     case '+':
133     case '-': return true;
134     default: return false;
135     }
136   }
element_sep_char()137   static charT element_sep_char()
138   {
139     return '-';
140   }
141 
142 };
143 
144 #ifndef BOOST_NO_STD_WSTRING
145 
146 //! Class to provide common iso formatting spec
147 template<>
148 class iso_format_base<wchar_t> {
149 public:
150   //! Describe month format -- its an integer in iso format
month_format()151   static month_format_spec month_format()
152   {
153     return month_as_integer;
154   }
155 
156   //! String used printed is date is invalid
not_a_date()157   static const wchar_t* not_a_date()
158   {
159     return L"not-a-date-time";
160   }
161   //! String used to for positive infinity value
pos_infinity()162   static const wchar_t* pos_infinity()
163   {
164     return L"+infinity";
165   }
166   //! String used to for positive infinity value
neg_infinity()167   static const wchar_t* neg_infinity()
168   {
169     return L"-infinity";
170   }
171 
172   //! ISO char for a year -- used in durations
year_sep_char()173   static wchar_t year_sep_char()
174   {
175     return 'Y';
176   }
177   //! ISO char for a month
month_sep_char()178   static wchar_t month_sep_char()
179   {
180     return '-';
181   }
182   //! ISO char for a day
day_sep_char()183   static wchar_t day_sep_char()
184   {
185     return '-';
186   }
187   //! char for minute
hour_sep_char()188   static wchar_t hour_sep_char()
189   {
190     return ':';
191   }
192   //! char for minute
minute_sep_char()193   static wchar_t minute_sep_char()
194   {
195     return ':';
196   }
197   //! char for second
second_sep_char()198   static wchar_t second_sep_char()
199   {
200     return ':';
201   }
202   //! ISO char for a period
period_start_char()203   static wchar_t period_start_char()
204   {
205     return 'P';
206   }
207   //! Used in time in mixed strings to set start of time
time_start_char()208   static wchar_t time_start_char()
209   {
210     return 'T';
211   }
212 
213   //! Used in mixed strings to identify start of a week number
week_start_char()214   static wchar_t week_start_char()
215   {
216     return 'W';
217   }
218 
219   //! Separators for periods
period_sep_char()220   static wchar_t period_sep_char()
221   {
222     return '/';
223   }
224   //! Separator for hh:mm:ss
time_sep_char()225   static wchar_t time_sep_char()
226   {
227     return ':';
228   }
229   //! Preferred Separator for hh:mm:ss,decimal_fraction
fractional_time_sep_char()230   static wchar_t fractional_time_sep_char()
231   {
232     return ',';
233   }
234 
is_component_sep(wchar_t sep)235   static bool is_component_sep(wchar_t sep)
236   {
237     switch(sep) {
238     case 'H':
239     case 'M':
240     case 'S':
241     case 'W':
242     case 'T':
243     case 'Y':
244     case 'D':return true;
245     default:
246       return false;
247     }
248   }
249 
is_fractional_time_sep(wchar_t sep)250   static bool is_fractional_time_sep(wchar_t sep)
251   {
252     switch(sep) {
253     case ',':
254     case '.': return true;
255     default: return false;
256     }
257   }
is_timezone_sep(wchar_t sep)258   static bool is_timezone_sep(wchar_t sep)
259   {
260     switch(sep) {
261     case '+':
262     case '-': return true;
263     default: return false;
264     }
265   }
element_sep_char()266   static wchar_t element_sep_char()
267   {
268     return '-';
269   }
270 
271 };
272 
273 #endif // BOOST_NO_STD_WSTRING
274 
275 //! Format description for iso normal YYYYMMDD
276 template<class charT>
277 class iso_format : public iso_format_base<charT> {
278 public:
279   //! The ios standard format doesn't use char separators
has_date_sep_chars()280   static bool has_date_sep_chars()
281   {
282     return false;
283   }
284 };
285 
286 //! Extended format uses seperators YYYY-MM-DD
287 template<class charT>
288 class iso_extended_format : public iso_format_base<charT> {
289 public:
290   //! Extended format needs char separators
has_date_sep_chars()291   static bool has_date_sep_chars()
292   {
293     return true;
294   }
295 
296 };
297 
298 } } //namespace date_time
299 
300 
301 
302 
303 #endif
304