1 | #ifndef DATE_TIME_STRINGS_FROM_FACET__HPP___ |
2 | #define DATE_TIME_STRINGS_FROM_FACET__HPP___ |
3 | |
4 | /* Copyright (c) 2004 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 |
9 | * $Date$ |
10 | */ |
11 | |
12 | #include <sstream> |
13 | #include <string> |
14 | #include <vector> |
15 | #include <locale> |
16 | |
17 | namespace boost { namespace date_time { |
18 | |
19 | //! This function gathers up all the month strings from a std::locale |
20 | /*! Using the time_put facet, this function creates a collection of |
21 | * all the month strings from a locale. This is handy when building |
22 | * custom date parsers or formatters that need to be localized. |
23 | * |
24 | *@param charT The type of char to use when gathering typically char |
25 | * or wchar_t. |
26 | *@param locale The locale to use when gathering the strings |
27 | *@param short_strings True(default) to gather short strings, |
28 | * false for long strings. |
29 | *@return A vector of strings containing the strings in order. eg: |
30 | * Jan, Feb, Mar, etc. |
31 | */ |
32 | template<typename charT> |
33 | std::vector<std::basic_string<charT> > |
34 | gather_month_strings(const std::locale& locale, bool short_strings=true) |
35 | { |
36 | typedef std::basic_string<charT> string_type; |
37 | typedef std::vector<string_type> collection_type; |
38 | typedef std::ostreambuf_iterator<charT> ostream_iter_type; |
39 | typedef std::basic_ostringstream<charT> stringstream_type; |
40 | typedef std::time_put<charT> time_put_facet_type; |
41 | charT short_fmt[3] = { '%', 'b' }; |
42 | charT long_fmt[3] = { '%', 'B' }; |
43 | collection_type months; |
44 | string_type outfmt(short_fmt); |
45 | if (!short_strings) { |
46 | outfmt = long_fmt; |
47 | } |
48 | { |
49 | //grab the needed strings by using the locale to |
50 | //output each month |
51 | const charT* p_outfmt = outfmt.c_str(), *p_outfmt_end = p_outfmt + outfmt.size(); |
52 | tm tm_value; |
53 | memset(s: &tm_value, c: 0, n: sizeof(tm_value)); |
54 | for (int m=0; m < 12; m++) { |
55 | tm_value.tm_mon = m; |
56 | stringstream_type ss; |
57 | ostream_iter_type oitr(ss); |
58 | std::use_facet<time_put_facet_type>(locale).put(oitr, ss, ss.fill(), |
59 | &tm_value, |
60 | p_outfmt, |
61 | p_outfmt_end); |
62 | months.push_back(ss.str()); |
63 | } |
64 | } |
65 | return months; |
66 | } |
67 | |
68 | //! This function gathers up all the weekday strings from a std::locale |
69 | /*! Using the time_put facet, this function creates a collection of |
70 | * all the weekday strings from a locale starting with the string for |
71 | * 'Sunday'. This is handy when building custom date parsers or |
72 | * formatters that need to be localized. |
73 | * |
74 | *@param charT The type of char to use when gathering typically char |
75 | * or wchar_t. |
76 | *@param locale The locale to use when gathering the strings |
77 | *@param short_strings True(default) to gather short strings, |
78 | * false for long strings. |
79 | *@return A vector of strings containing the weekdays in order. eg: |
80 | * Sun, Mon, Tue, Wed, Thu, Fri, Sat |
81 | */ |
82 | template<typename charT> |
83 | std::vector<std::basic_string<charT> > |
84 | gather_weekday_strings(const std::locale& locale, bool short_strings=true) |
85 | { |
86 | typedef std::basic_string<charT> string_type; |
87 | typedef std::vector<string_type> collection_type; |
88 | typedef std::ostreambuf_iterator<charT> ostream_iter_type; |
89 | typedef std::basic_ostringstream<charT> stringstream_type; |
90 | typedef std::time_put<charT> time_put_facet_type; |
91 | charT short_fmt[3] = { '%', 'a' }; |
92 | charT long_fmt[3] = { '%', 'A' }; |
93 | |
94 | collection_type weekdays; |
95 | |
96 | |
97 | string_type outfmt(short_fmt); |
98 | if (!short_strings) { |
99 | outfmt = long_fmt; |
100 | } |
101 | { |
102 | //grab the needed strings by using the locale to |
103 | //output each month / weekday |
104 | const charT* p_outfmt = outfmt.c_str(), *p_outfmt_end = p_outfmt + outfmt.size(); |
105 | tm tm_value; |
106 | memset(s: &tm_value, c: 0, n: sizeof(tm_value)); |
107 | for (int i=0; i < 7; i++) { |
108 | tm_value.tm_wday = i; |
109 | stringstream_type ss; |
110 | ostream_iter_type oitr(ss); |
111 | std::use_facet<time_put_facet_type>(locale).put(oitr, ss, ss.fill(), |
112 | &tm_value, |
113 | p_outfmt, |
114 | p_outfmt_end); |
115 | |
116 | weekdays.push_back(ss.str()); |
117 | } |
118 | } |
119 | return weekdays; |
120 | } |
121 | |
122 | } } //namespace |
123 | |
124 | |
125 | #endif |
126 | |