Chris@16
|
1 //
|
Chris@16
|
2 // Copyright (c) 2009-2011 Artyom Beilis (Tonkikh)
|
Chris@16
|
3 //
|
Chris@16
|
4 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
5 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
6 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
7 //
|
Chris@16
|
8 #ifndef BOOST_LOCALE_FORMATTING_HPP_INCLUDED
|
Chris@16
|
9 #define BOOST_LOCALE_FORMATTING_HPP_INCLUDED
|
Chris@16
|
10
|
Chris@16
|
11 #include <boost/locale/config.hpp>
|
Chris@16
|
12 #ifdef BOOST_MSVC
|
Chris@16
|
13 # pragma warning(push)
|
Chris@16
|
14 # pragma warning(disable : 4275 4251 4231 4660)
|
Chris@16
|
15 #endif
|
Chris@16
|
16 #include <boost/cstdint.hpp>
|
Chris@16
|
17 #include <boost/locale/time_zone.hpp>
|
Chris@16
|
18 #include <ostream>
|
Chris@16
|
19 #include <istream>
|
Chris@16
|
20 #include <string>
|
Chris@16
|
21 #include <string.h>
|
Chris@16
|
22 #include <typeinfo>
|
Chris@16
|
23
|
Chris@16
|
24 namespace boost {
|
Chris@16
|
25 namespace locale {
|
Chris@16
|
26 ///
|
Chris@16
|
27 /// \brief This namespace holds additional formatting
|
Chris@16
|
28 /// flags that can be set using ios_info.
|
Chris@16
|
29 ///
|
Chris@16
|
30 namespace flags {
|
Chris@16
|
31 ///
|
Chris@16
|
32 /// Formatting flags, each one of them has corresponding manipulation
|
Chris@16
|
33 /// in namespace \a as
|
Chris@16
|
34 ///
|
Chris@16
|
35 typedef enum {
|
Chris@16
|
36 posix = 0,
|
Chris@16
|
37 number = 1,
|
Chris@16
|
38 currency = 2,
|
Chris@16
|
39 percent = 3,
|
Chris@16
|
40 date = 4,
|
Chris@16
|
41 time = 5,
|
Chris@16
|
42 datetime = 6,
|
Chris@16
|
43 strftime = 7,
|
Chris@16
|
44 spellout = 8,
|
Chris@16
|
45 ordinal = 9,
|
Chris@16
|
46
|
Chris@16
|
47 display_flags_mask = 31,
|
Chris@16
|
48
|
Chris@16
|
49 currency_default = 0 << 5,
|
Chris@16
|
50 currency_iso = 1 << 5,
|
Chris@16
|
51 currency_national = 2 << 5,
|
Chris@16
|
52
|
Chris@16
|
53 currency_flags_mask = 3 << 5,
|
Chris@16
|
54
|
Chris@16
|
55 time_default = 0 << 7,
|
Chris@16
|
56 time_short = 1 << 7,
|
Chris@16
|
57 time_medium = 2 << 7,
|
Chris@16
|
58 time_long = 3 << 7,
|
Chris@16
|
59 time_full = 4 << 7,
|
Chris@16
|
60 time_flags_mask = 7 << 7,
|
Chris@16
|
61
|
Chris@16
|
62 date_default = 0 << 10,
|
Chris@16
|
63 date_short = 1 << 10,
|
Chris@16
|
64 date_medium = 2 << 10,
|
Chris@16
|
65 date_long = 3 << 10,
|
Chris@16
|
66 date_full = 4 << 10,
|
Chris@16
|
67 date_flags_mask = 7 << 10,
|
Chris@16
|
68
|
Chris@16
|
69 datetime_flags_mask = date_flags_mask | time_flags_mask
|
Chris@16
|
70
|
Chris@16
|
71 } display_flags_type;
|
Chris@16
|
72
|
Chris@16
|
73 ///
|
Chris@16
|
74 /// Special string patters that can be used
|
Chris@16
|
75 /// for text formatting
|
Chris@16
|
76 ///
|
Chris@16
|
77 typedef enum {
|
Chris@16
|
78 datetime_pattern, ///< strftime like formatting
|
Chris@16
|
79 time_zone_id ///< time zone name
|
Chris@16
|
80 } pattern_type;
|
Chris@16
|
81
|
Chris@16
|
82 ///
|
Chris@16
|
83 /// Special integer values that can be used for formatting
|
Chris@16
|
84 ///
|
Chris@16
|
85 typedef enum {
|
Chris@16
|
86 domain_id ///< Domain code - for message formatting
|
Chris@16
|
87 } value_type;
|
Chris@16
|
88
|
Chris@16
|
89
|
Chris@16
|
90 } // flags
|
Chris@16
|
91
|
Chris@16
|
92 ///
|
Chris@16
|
93 /// \brief This class holds an external data - beyond existing fmtflags that std::ios_base holds
|
Chris@16
|
94 ///
|
Chris@16
|
95 /// You should almost never create this object directly. Instead, you should access it via ios_info::get(stream_object)
|
Chris@16
|
96 /// static member function. It automatically creates default formatting data for that stream
|
Chris@16
|
97 ///
|
Chris@16
|
98 class BOOST_LOCALE_DECL ios_info {
|
Chris@16
|
99 public:
|
Chris@16
|
100
|
Chris@16
|
101 /// \cond INTERNAL
|
Chris@16
|
102
|
Chris@16
|
103 ios_info();
|
Chris@16
|
104 ios_info(ios_info const &);
|
Chris@16
|
105 ios_info const &operator=(ios_info const &);
|
Chris@16
|
106 ~ios_info();
|
Chris@16
|
107
|
Chris@16
|
108 /// \endcond
|
Chris@16
|
109
|
Chris@16
|
110 ///
|
Chris@16
|
111 /// Get ios_info instance for specific stream object
|
Chris@16
|
112 ///
|
Chris@16
|
113 static ios_info &get(std::ios_base &ios);
|
Chris@16
|
114
|
Chris@16
|
115 ///
|
Chris@16
|
116 /// Set a flags that define a way for format data like number, spell, currency etc.
|
Chris@16
|
117 ///
|
Chris@16
|
118 void display_flags(uint64_t flags);
|
Chris@16
|
119
|
Chris@16
|
120 ///
|
Chris@16
|
121 /// Set a flags that define how to format currency
|
Chris@16
|
122 ///
|
Chris@16
|
123 void currency_flags(uint64_t flags);
|
Chris@16
|
124
|
Chris@16
|
125 ///
|
Chris@16
|
126 /// Set a flags that define how to format date
|
Chris@16
|
127 ///
|
Chris@16
|
128 void date_flags(uint64_t flags);
|
Chris@16
|
129
|
Chris@16
|
130 ///
|
Chris@16
|
131 /// Set a flags that define how to format time
|
Chris@16
|
132 ///
|
Chris@16
|
133 void time_flags(uint64_t flags);
|
Chris@16
|
134
|
Chris@16
|
135 ///
|
Chris@16
|
136 /// Set a flags that define how to format both date and time
|
Chris@16
|
137 ///
|
Chris@16
|
138 void datetime_flags(uint64_t flags);
|
Chris@16
|
139
|
Chris@16
|
140 ///
|
Chris@16
|
141 /// Set special message domain identification
|
Chris@16
|
142 ///
|
Chris@16
|
143 void domain_id(int);
|
Chris@16
|
144
|
Chris@16
|
145 ///
|
Chris@16
|
146 /// Set time zone for formatting dates and time
|
Chris@16
|
147 ///
|
Chris@16
|
148 void time_zone(std::string const &);
|
Chris@16
|
149
|
Chris@16
|
150
|
Chris@16
|
151 ///
|
Chris@16
|
152 /// Set date/time pattern (strftime like)
|
Chris@16
|
153 ///
|
Chris@16
|
154 template<typename CharType>
|
Chris@16
|
155 void date_time_pattern(std::basic_string<CharType> const &str)
|
Chris@16
|
156 {
|
Chris@16
|
157 string_set &s = date_time_pattern_set();
|
Chris@16
|
158 s.set<CharType>(str.c_str());
|
Chris@16
|
159 }
|
Chris@16
|
160
|
Chris@16
|
161
|
Chris@16
|
162 ///
|
Chris@16
|
163 /// Get a flags that define a way for format data like number, spell, currency etc.
|
Chris@16
|
164 ///
|
Chris@16
|
165 uint64_t display_flags() const;
|
Chris@16
|
166
|
Chris@16
|
167 ///
|
Chris@16
|
168 /// Get a flags that define how to format currency
|
Chris@16
|
169 ///
|
Chris@16
|
170 uint64_t currency_flags() const;
|
Chris@16
|
171
|
Chris@16
|
172
|
Chris@16
|
173 ///
|
Chris@16
|
174 /// Get a flags that define how to format date
|
Chris@16
|
175 ///
|
Chris@16
|
176 uint64_t date_flags() const;
|
Chris@16
|
177
|
Chris@16
|
178 ///
|
Chris@16
|
179 /// Get a flags that define how to format time
|
Chris@16
|
180 ///
|
Chris@16
|
181 uint64_t time_flags() const;
|
Chris@16
|
182
|
Chris@16
|
183 ///
|
Chris@16
|
184 /// Get a flags that define how to format both date and time
|
Chris@16
|
185 ///
|
Chris@16
|
186 uint64_t datetime_flags() const;
|
Chris@16
|
187
|
Chris@16
|
188 ///
|
Chris@16
|
189 /// Get special message domain identification
|
Chris@16
|
190 ///
|
Chris@16
|
191 int domain_id() const;
|
Chris@16
|
192
|
Chris@16
|
193 ///
|
Chris@16
|
194 /// Get time zone for formatting dates and time
|
Chris@16
|
195 ///
|
Chris@16
|
196 std::string time_zone() const;
|
Chris@16
|
197
|
Chris@16
|
198 ///
|
Chris@16
|
199 /// Get date/time pattern (strftime like)
|
Chris@16
|
200 ///
|
Chris@16
|
201 template<typename CharType>
|
Chris@16
|
202 std::basic_string<CharType> date_time_pattern() const
|
Chris@16
|
203 {
|
Chris@16
|
204 string_set const &s = date_time_pattern_set();
|
Chris@16
|
205 return s.get<CharType>();
|
Chris@16
|
206 }
|
Chris@16
|
207
|
Chris@16
|
208 /// \cond INTERNAL
|
Chris@16
|
209 void on_imbue();
|
Chris@16
|
210 /// \endcond
|
Chris@16
|
211
|
Chris@16
|
212 private:
|
Chris@16
|
213
|
Chris@16
|
214 class string_set;
|
Chris@16
|
215
|
Chris@16
|
216 string_set const &date_time_pattern_set() const;
|
Chris@16
|
217 string_set &date_time_pattern_set();
|
Chris@16
|
218
|
Chris@16
|
219 class BOOST_LOCALE_DECL string_set {
|
Chris@16
|
220 public:
|
Chris@16
|
221 string_set();
|
Chris@16
|
222 ~string_set();
|
Chris@16
|
223 string_set(string_set const &other);
|
Chris@16
|
224 string_set const &operator=(string_set const &other);
|
Chris@16
|
225 void swap(string_set &other);
|
Chris@16
|
226
|
Chris@16
|
227 template<typename Char>
|
Chris@16
|
228 void set(Char const *s)
|
Chris@16
|
229 {
|
Chris@16
|
230 delete [] ptr;
|
Chris@16
|
231 ptr = 0;
|
Chris@16
|
232 type=&typeid(Char);
|
Chris@16
|
233 Char const *end = s;
|
Chris@16
|
234 while(*end!=0) end++;
|
Chris@16
|
235 // if ptr = 0 it does not matter what is value of size
|
Chris@16
|
236 size = sizeof(Char)*(end - s+1);
|
Chris@16
|
237 ptr = new char[size];
|
Chris@16
|
238 memcpy(ptr,s,size);
|
Chris@16
|
239 }
|
Chris@16
|
240
|
Chris@16
|
241 template<typename Char>
|
Chris@16
|
242 std::basic_string<Char> get() const
|
Chris@16
|
243 {
|
Chris@16
|
244 if(type==0 || *type!=typeid(Char))
|
Chris@16
|
245 throw std::bad_cast();
|
Chris@16
|
246 std::basic_string<Char> result = reinterpret_cast<Char const *>(ptr);
|
Chris@16
|
247 return result;
|
Chris@16
|
248 }
|
Chris@16
|
249
|
Chris@16
|
250 private:
|
Chris@16
|
251 std::type_info const *type;
|
Chris@16
|
252 size_t size;
|
Chris@16
|
253 char *ptr;
|
Chris@16
|
254 };
|
Chris@16
|
255
|
Chris@16
|
256 uint64_t flags_;
|
Chris@16
|
257 int domain_id_;
|
Chris@16
|
258 std::string time_zone_;
|
Chris@16
|
259 string_set datetime_;
|
Chris@16
|
260
|
Chris@16
|
261 struct data;
|
Chris@16
|
262 data *d;
|
Chris@16
|
263
|
Chris@16
|
264 };
|
Chris@16
|
265
|
Chris@16
|
266
|
Chris@16
|
267 ///
|
Chris@16
|
268 /// \brief This namespace includes all manipulators that can be used on IO streams
|
Chris@16
|
269 ///
|
Chris@16
|
270 namespace as {
|
Chris@16
|
271 ///
|
Chris@16
|
272 /// \defgroup manipulators I/O Stream manipulators
|
Chris@16
|
273 ///
|
Chris@16
|
274 /// @{
|
Chris@16
|
275 ///
|
Chris@16
|
276
|
Chris@16
|
277 ///
|
Chris@16
|
278 /// Format values with "POSIX" or "C" locale. Note, if locale was created with additional non-classic locale then
|
Chris@16
|
279 /// These numbers may be localized
|
Chris@16
|
280 ///
|
Chris@16
|
281
|
Chris@16
|
282 inline std::ios_base & posix(std::ios_base & ios)
|
Chris@16
|
283 {
|
Chris@16
|
284 ios_info::get(ios).display_flags(flags::posix);
|
Chris@16
|
285 return ios;
|
Chris@16
|
286 }
|
Chris@16
|
287
|
Chris@16
|
288 ///
|
Chris@16
|
289 /// Format a number. Note, unlike standard number formatting, integers would be treated like real numbers when std::fixed or
|
Chris@16
|
290 /// std::scientific manipulators were applied
|
Chris@16
|
291 ///
|
Chris@16
|
292 inline std::ios_base & number(std::ios_base & ios)
|
Chris@16
|
293 {
|
Chris@16
|
294 ios_info::get(ios).display_flags(flags::number);
|
Chris@16
|
295 return ios;
|
Chris@16
|
296 }
|
Chris@16
|
297
|
Chris@16
|
298 ///
|
Chris@16
|
299 /// Format currency, number is treated like amount of money
|
Chris@16
|
300 ///
|
Chris@16
|
301 inline std::ios_base & currency(std::ios_base & ios)
|
Chris@16
|
302 {
|
Chris@16
|
303 ios_info::get(ios).display_flags(flags::currency);
|
Chris@16
|
304 return ios;
|
Chris@16
|
305 }
|
Chris@16
|
306
|
Chris@16
|
307 ///
|
Chris@16
|
308 /// Format percent, value 0.3 is treated as 30%.
|
Chris@16
|
309 ///
|
Chris@16
|
310 inline std::ios_base & percent(std::ios_base & ios)
|
Chris@16
|
311 {
|
Chris@16
|
312 ios_info::get(ios).display_flags(flags::percent);
|
Chris@16
|
313 return ios;
|
Chris@16
|
314 }
|
Chris@16
|
315
|
Chris@16
|
316 ///
|
Chris@16
|
317 /// Format a date, number is treated as POSIX time
|
Chris@16
|
318 ///
|
Chris@16
|
319 inline std::ios_base & date(std::ios_base & ios)
|
Chris@16
|
320 {
|
Chris@16
|
321 ios_info::get(ios).display_flags(flags::date);
|
Chris@16
|
322 return ios;
|
Chris@16
|
323 }
|
Chris@16
|
324
|
Chris@16
|
325 ///
|
Chris@16
|
326 /// Format a time, number is treated as POSIX time
|
Chris@16
|
327 ///
|
Chris@16
|
328 inline std::ios_base & time(std::ios_base & ios)
|
Chris@16
|
329 {
|
Chris@16
|
330 ios_info::get(ios).display_flags(flags::time);
|
Chris@16
|
331 return ios;
|
Chris@16
|
332 }
|
Chris@16
|
333
|
Chris@16
|
334 ///
|
Chris@16
|
335 /// Format a date and time, number is treated as POSIX time
|
Chris@16
|
336 ///
|
Chris@16
|
337 inline std::ios_base & datetime(std::ios_base & ios)
|
Chris@16
|
338 {
|
Chris@16
|
339 ios_info::get(ios).display_flags(flags::datetime);
|
Chris@16
|
340 return ios;
|
Chris@16
|
341 }
|
Chris@16
|
342
|
Chris@16
|
343 ///
|
Chris@16
|
344 /// Create formatted date time, Please note, this manipulator only changes formatting mode,
|
Chris@16
|
345 /// and not format itself, so you are probably looking for ftime manipulator
|
Chris@16
|
346 ///
|
Chris@16
|
347 inline std::ios_base & strftime(std::ios_base & ios)
|
Chris@16
|
348 {
|
Chris@16
|
349 ios_info::get(ios).display_flags(flags::strftime);
|
Chris@16
|
350 return ios;
|
Chris@16
|
351 }
|
Chris@16
|
352
|
Chris@16
|
353 ///
|
Chris@16
|
354 /// Spell the number, like "one hundred and ten"
|
Chris@16
|
355 ///
|
Chris@16
|
356 inline std::ios_base & spellout(std::ios_base & ios)
|
Chris@16
|
357 {
|
Chris@16
|
358 ios_info::get(ios).display_flags(flags::spellout);
|
Chris@16
|
359 return ios;
|
Chris@16
|
360 }
|
Chris@16
|
361
|
Chris@16
|
362 ///
|
Chris@16
|
363 /// Write an order of the number like 4th.
|
Chris@16
|
364 ///
|
Chris@16
|
365 inline std::ios_base & ordinal(std::ios_base & ios)
|
Chris@16
|
366 {
|
Chris@16
|
367 ios_info::get(ios).display_flags(flags::ordinal);
|
Chris@16
|
368 return ios;
|
Chris@16
|
369 }
|
Chris@16
|
370
|
Chris@16
|
371 ///
|
Chris@16
|
372 /// Set default currency formatting style -- national, like "$"
|
Chris@16
|
373 ///
|
Chris@16
|
374 inline std::ios_base & currency_default(std::ios_base & ios)
|
Chris@16
|
375 {
|
Chris@16
|
376 ios_info::get(ios).currency_flags(flags::currency_default);
|
Chris@16
|
377 return ios;
|
Chris@16
|
378 }
|
Chris@16
|
379
|
Chris@16
|
380 ///
|
Chris@16
|
381 /// Set ISO currency formatting style, like "USD", (requires ICU >= 4.2)
|
Chris@16
|
382 ///
|
Chris@16
|
383 inline std::ios_base & currency_iso(std::ios_base & ios)
|
Chris@16
|
384 {
|
Chris@16
|
385 ios_info::get(ios).currency_flags(flags::currency_iso);
|
Chris@16
|
386 return ios;
|
Chris@16
|
387 }
|
Chris@16
|
388
|
Chris@16
|
389 ///
|
Chris@16
|
390 /// Set national currency formatting style, like "$"
|
Chris@16
|
391 ///
|
Chris@16
|
392 inline std::ios_base & currency_national(std::ios_base & ios)
|
Chris@16
|
393 {
|
Chris@16
|
394 ios_info::get(ios).currency_flags(flags::currency_national);
|
Chris@16
|
395 return ios;
|
Chris@16
|
396 }
|
Chris@16
|
397
|
Chris@16
|
398 ///
|
Chris@16
|
399 /// set default (medium) time formatting style
|
Chris@16
|
400 ///
|
Chris@16
|
401 inline std::ios_base & time_default(std::ios_base & ios)
|
Chris@16
|
402 {
|
Chris@16
|
403 ios_info::get(ios).time_flags(flags::time_default);
|
Chris@16
|
404 return ios;
|
Chris@16
|
405 }
|
Chris@16
|
406
|
Chris@16
|
407 ///
|
Chris@16
|
408 /// set short time formatting style
|
Chris@16
|
409 ///
|
Chris@16
|
410 inline std::ios_base & time_short(std::ios_base & ios)
|
Chris@16
|
411 {
|
Chris@16
|
412 ios_info::get(ios).time_flags(flags::time_short);
|
Chris@16
|
413 return ios;
|
Chris@16
|
414 }
|
Chris@16
|
415
|
Chris@16
|
416 ///
|
Chris@16
|
417 /// set medium time formatting style
|
Chris@16
|
418 ///
|
Chris@16
|
419 inline std::ios_base & time_medium(std::ios_base & ios)
|
Chris@16
|
420 {
|
Chris@16
|
421 ios_info::get(ios).time_flags(flags::time_medium);
|
Chris@16
|
422 return ios;
|
Chris@16
|
423 }
|
Chris@16
|
424
|
Chris@16
|
425 ///
|
Chris@16
|
426 /// set long time formatting style
|
Chris@16
|
427 ///
|
Chris@16
|
428 inline std::ios_base & time_long(std::ios_base & ios)
|
Chris@16
|
429 {
|
Chris@16
|
430 ios_info::get(ios).time_flags(flags::time_long);
|
Chris@16
|
431 return ios;
|
Chris@16
|
432 }
|
Chris@16
|
433
|
Chris@16
|
434 ///
|
Chris@16
|
435 /// set full time formatting style
|
Chris@16
|
436 ///
|
Chris@16
|
437 inline std::ios_base & time_full(std::ios_base & ios)
|
Chris@16
|
438 {
|
Chris@16
|
439 ios_info::get(ios).time_flags(flags::time_full);
|
Chris@16
|
440 return ios;
|
Chris@16
|
441 }
|
Chris@16
|
442
|
Chris@16
|
443 ///
|
Chris@16
|
444 /// set default (medium) date formatting style
|
Chris@16
|
445 ///
|
Chris@16
|
446 inline std::ios_base & date_default(std::ios_base & ios)
|
Chris@16
|
447 {
|
Chris@16
|
448 ios_info::get(ios).date_flags(flags::date_default);
|
Chris@16
|
449 return ios;
|
Chris@16
|
450 }
|
Chris@16
|
451
|
Chris@16
|
452 ///
|
Chris@16
|
453 /// set short date formatting style
|
Chris@16
|
454 ///
|
Chris@16
|
455 inline std::ios_base & date_short(std::ios_base & ios)
|
Chris@16
|
456 {
|
Chris@16
|
457 ios_info::get(ios).date_flags(flags::date_short);
|
Chris@16
|
458 return ios;
|
Chris@16
|
459 }
|
Chris@16
|
460
|
Chris@16
|
461 ///
|
Chris@16
|
462 /// set medium date formatting style
|
Chris@16
|
463 ///
|
Chris@16
|
464 inline std::ios_base & date_medium(std::ios_base & ios)
|
Chris@16
|
465 {
|
Chris@16
|
466 ios_info::get(ios).date_flags(flags::date_medium);
|
Chris@16
|
467 return ios;
|
Chris@16
|
468 }
|
Chris@16
|
469
|
Chris@16
|
470 ///
|
Chris@16
|
471 /// set long date formatting style
|
Chris@16
|
472 ///
|
Chris@16
|
473 inline std::ios_base & date_long(std::ios_base & ios)
|
Chris@16
|
474 {
|
Chris@16
|
475 ios_info::get(ios).date_flags(flags::date_long);
|
Chris@16
|
476 return ios;
|
Chris@16
|
477 }
|
Chris@16
|
478
|
Chris@16
|
479 ///
|
Chris@16
|
480 /// set full date formatting style
|
Chris@16
|
481 ///
|
Chris@16
|
482 inline std::ios_base & date_full(std::ios_base & ios)
|
Chris@16
|
483 {
|
Chris@16
|
484 ios_info::get(ios).date_flags(flags::date_full);
|
Chris@16
|
485 return ios;
|
Chris@16
|
486 }
|
Chris@16
|
487
|
Chris@16
|
488
|
Chris@16
|
489 /// \cond INTERNAL
|
Chris@16
|
490 namespace details {
|
Chris@16
|
491 template<typename CharType>
|
Chris@16
|
492 struct add_ftime {
|
Chris@16
|
493
|
Chris@16
|
494 std::basic_string<CharType> ftime;
|
Chris@16
|
495
|
Chris@16
|
496 void apply(std::basic_ios<CharType> &ios) const
|
Chris@16
|
497 {
|
Chris@16
|
498 ios_info::get(ios).date_time_pattern(ftime);
|
Chris@16
|
499 as::strftime(ios);
|
Chris@16
|
500 }
|
Chris@16
|
501
|
Chris@16
|
502 };
|
Chris@16
|
503
|
Chris@16
|
504 template<typename CharType>
|
Chris@16
|
505 std::basic_ostream<CharType> &operator<<(std::basic_ostream<CharType> &out,add_ftime<CharType> const &fmt)
|
Chris@16
|
506 {
|
Chris@16
|
507 fmt.apply(out);
|
Chris@16
|
508 return out;
|
Chris@16
|
509 }
|
Chris@16
|
510
|
Chris@16
|
511 template<typename CharType>
|
Chris@16
|
512 std::basic_istream<CharType> &operator>>(std::basic_istream<CharType> &in,add_ftime<CharType> const &fmt)
|
Chris@16
|
513 {
|
Chris@16
|
514 fmt.apply(in);
|
Chris@16
|
515 return in;
|
Chris@16
|
516 }
|
Chris@16
|
517
|
Chris@16
|
518 }
|
Chris@16
|
519 /// \endcond
|
Chris@16
|
520
|
Chris@16
|
521 ///
|
Chris@16
|
522 /// Set strftime like formatting string
|
Chris@16
|
523 ///
|
Chris@16
|
524 /// Please note, formatting flags are very similar but not exactly the same as flags for C function strftime.
|
Chris@16
|
525 /// Differences: some flags as "%e" do not add blanks to fill text up to two spaces, not all flags supported.
|
Chris@16
|
526 ///
|
Chris@16
|
527 /// Flags:
|
Chris@16
|
528 /// - "%a" -- Abbreviated weekday (Sun.)
|
Chris@16
|
529 /// - "%A" -- Full weekday (Sunday)
|
Chris@16
|
530 /// - "%b" -- Abbreviated month (Jan.)
|
Chris@16
|
531 /// - "%B" -- Full month (January)
|
Chris@16
|
532 /// - "%c" -- Locale date-time format. **Note:** prefer using "as::datetime"
|
Chris@16
|
533 /// - "%d" -- Day of Month [01,31]
|
Chris@16
|
534 /// - "%e" -- Day of Month [1,31]
|
Chris@16
|
535 /// - "%h" -- Same as "%b"
|
Chris@16
|
536 /// - "%H" -- 24 clock hour [00,23]
|
Chris@16
|
537 /// - "%I" -- 12 clock hour [01,12]
|
Chris@16
|
538 /// - "%j" -- Day of year [1,366]
|
Chris@16
|
539 /// - "%m" -- Month [01,12]
|
Chris@16
|
540 /// - "%M" -- Minute [00,59]
|
Chris@16
|
541 /// - "%n" -- New Line
|
Chris@16
|
542 /// - "%p" -- AM/PM in locale representation
|
Chris@16
|
543 /// - "%r" -- Time with AM/PM, same as "%I:%M:%S %p"
|
Chris@16
|
544 /// - "%R" -- Same as "%H:%M"
|
Chris@16
|
545 /// - "%S" -- Second [00,61]
|
Chris@16
|
546 /// - "%t" -- Tab character
|
Chris@16
|
547 /// - "%T" -- Same as "%H:%M:%S"
|
Chris@16
|
548 /// - "%x" -- Local date representation. **Note:** prefer using "as::date"
|
Chris@16
|
549 /// - "%X" -- Local time representation. **Note:** prefer using "as::time"
|
Chris@16
|
550 /// - "%y" -- Year [00,99]
|
Chris@16
|
551 /// - "%Y" -- 4 digits year. (2009)
|
Chris@16
|
552 /// - "%Z" -- Time Zone
|
Chris@16
|
553 /// - "%%" -- Percent symbol
|
Chris@16
|
554 ///
|
Chris@16
|
555
|
Chris@16
|
556
|
Chris@16
|
557 template<typename CharType>
|
Chris@16
|
558 #ifdef BOOST_LOCALE_DOXYGEN
|
Chris@16
|
559 unspecified_type
|
Chris@16
|
560 #else
|
Chris@16
|
561 details::add_ftime<CharType>
|
Chris@16
|
562 #endif
|
Chris@16
|
563 ftime(std::basic_string<CharType> const &format)
|
Chris@16
|
564 {
|
Chris@16
|
565 details::add_ftime<CharType> fmt;
|
Chris@16
|
566 fmt.ftime=format;
|
Chris@16
|
567 return fmt;
|
Chris@16
|
568 }
|
Chris@16
|
569
|
Chris@16
|
570 ///
|
Chris@16
|
571 /// See ftime(std::basic_string<CharType> const &format)
|
Chris@16
|
572 ///
|
Chris@16
|
573 template<typename CharType>
|
Chris@16
|
574 #ifdef BOOST_LOCALE_DOXYGEN
|
Chris@16
|
575 unspecified_type
|
Chris@16
|
576 #else
|
Chris@16
|
577 details::add_ftime<CharType>
|
Chris@16
|
578 #endif
|
Chris@16
|
579 ftime(CharType const *format)
|
Chris@16
|
580 {
|
Chris@16
|
581 details::add_ftime<CharType> fmt;
|
Chris@16
|
582 fmt.ftime=format;
|
Chris@16
|
583 return fmt;
|
Chris@16
|
584 }
|
Chris@16
|
585
|
Chris@16
|
586 /// \cond INTERNAL
|
Chris@16
|
587 namespace details {
|
Chris@16
|
588 struct set_timezone {
|
Chris@16
|
589 std::string id;
|
Chris@16
|
590 };
|
Chris@16
|
591 template<typename CharType>
|
Chris@16
|
592 std::basic_ostream<CharType> &operator<<(std::basic_ostream<CharType> &out,set_timezone const &fmt)
|
Chris@16
|
593 {
|
Chris@16
|
594 ios_info::get(out).time_zone(fmt.id);
|
Chris@16
|
595 return out;
|
Chris@16
|
596 }
|
Chris@16
|
597
|
Chris@16
|
598 template<typename CharType>
|
Chris@16
|
599 std::basic_istream<CharType> &operator>>(std::basic_istream<CharType> &in,set_timezone const &fmt)
|
Chris@16
|
600 {
|
Chris@16
|
601 ios_info::get(in).time_zone(fmt.id);
|
Chris@16
|
602 return in;
|
Chris@16
|
603 }
|
Chris@16
|
604 }
|
Chris@16
|
605 /// \endcond
|
Chris@16
|
606
|
Chris@16
|
607 ///
|
Chris@16
|
608 /// Set GMT time zone to stream
|
Chris@16
|
609 ///
|
Chris@16
|
610 inline std::ios_base &gmt(std::ios_base &ios)
|
Chris@16
|
611 {
|
Chris@16
|
612 ios_info::get(ios).time_zone("GMT");
|
Chris@16
|
613 return ios;
|
Chris@16
|
614 }
|
Chris@16
|
615
|
Chris@16
|
616 ///
|
Chris@16
|
617 /// Set local time zone to stream
|
Chris@16
|
618 ///
|
Chris@16
|
619 inline std::ios_base &local_time(std::ios_base &ios)
|
Chris@16
|
620 {
|
Chris@16
|
621 ios_info::get(ios).time_zone(time_zone::global());
|
Chris@16
|
622 return ios;
|
Chris@16
|
623 }
|
Chris@16
|
624
|
Chris@16
|
625 ///
|
Chris@16
|
626 /// Set time zone using \a id
|
Chris@16
|
627 ///
|
Chris@16
|
628 inline
|
Chris@16
|
629 #ifdef BOOST_LOCALE_DOXYGEN
|
Chris@16
|
630 unspecified_type
|
Chris@16
|
631 #else
|
Chris@16
|
632 details::set_timezone
|
Chris@16
|
633 #endif
|
Chris@16
|
634 time_zone(char const *id)
|
Chris@16
|
635 {
|
Chris@16
|
636 details::set_timezone tz;
|
Chris@16
|
637 tz.id=id;
|
Chris@16
|
638 return tz;
|
Chris@16
|
639 }
|
Chris@16
|
640
|
Chris@16
|
641 ///
|
Chris@16
|
642 /// Set time zone using \a id
|
Chris@16
|
643 ///
|
Chris@16
|
644 inline
|
Chris@16
|
645 #ifdef BOOST_LOCALE_DOXYGEN
|
Chris@16
|
646 unspecified_type
|
Chris@16
|
647 #else
|
Chris@16
|
648 details::set_timezone
|
Chris@16
|
649 #endif
|
Chris@16
|
650 time_zone(std::string const &id)
|
Chris@16
|
651 {
|
Chris@16
|
652 details::set_timezone tz;
|
Chris@16
|
653 tz.id=id;
|
Chris@16
|
654 return tz;
|
Chris@16
|
655 }
|
Chris@16
|
656
|
Chris@16
|
657
|
Chris@16
|
658 ///
|
Chris@16
|
659 /// @}
|
Chris@16
|
660 ///
|
Chris@16
|
661
|
Chris@16
|
662 } // as manipulators
|
Chris@16
|
663
|
Chris@16
|
664 } // locale
|
Chris@16
|
665 } // boost
|
Chris@16
|
666
|
Chris@16
|
667 #ifdef BOOST_MSVC
|
Chris@16
|
668 #pragma warning(pop)
|
Chris@16
|
669 #endif
|
Chris@16
|
670
|
Chris@16
|
671
|
Chris@16
|
672 #endif
|
Chris@16
|
673 // vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
|