]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // (C) Copyright Howard Hinnant |
2 | // (C) Copyright 2011 Vicente J. Botet Escriba | |
3 | // Copyright (c) Microsoft Corporation 2014 | |
4 | // Use, modification and distribution are subject to the Boost Software License, | |
5 | // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at | |
6 | // http://www.boost.org/LICENSE_1_0.txt). | |
7 | // | |
8 | ||
9 | #ifndef BOOST_CHRONO_IO_TIME_POINT_UNITS_HPP | |
10 | #define BOOST_CHRONO_IO_TIME_POINT_UNITS_HPP | |
11 | ||
12 | #include <boost/chrono/config.hpp> | |
13 | #include <boost/chrono/process_cpu_clocks.hpp> | |
14 | #include <boost/chrono/system_clocks.hpp> | |
15 | #include <boost/chrono/thread_clock.hpp> | |
16 | #include <boost/chrono/io/ios_base_state.hpp> | |
17 | #include <string> | |
18 | #include <iostream> | |
19 | #include <ios> | |
20 | #include <locale> | |
21 | #include <algorithm> | |
22 | ||
23 | namespace boost | |
24 | { | |
25 | namespace chrono | |
26 | { | |
27 | /** | |
28 | * customization point to the epoch associated to the clock @c Clock | |
29 | * The default calls @c f.do_get_epoch(Clock()). The user can overload this function. | |
30 | * @return the string epoch associated to the @c Clock | |
31 | */ | |
32 | template <typename CharT, typename Clock, typename TPUFacet> | |
33 | std::basic_string<CharT> get_epoch_custom(Clock, TPUFacet& f) | |
34 | { | |
35 | return f.do_get_epoch(Clock()); | |
36 | } | |
37 | ||
38 | /** | |
39 | * @c time_point_units facet gives useful information about the time_point pattern, | |
40 | * the text associated to a time_point's epoch, | |
41 | */ | |
42 | template <typename CharT=char> | |
43 | class time_point_units: public std::locale::facet | |
44 | { | |
45 | public: | |
46 | /** | |
47 | * Type of character the facet is instantiated on. | |
48 | */ | |
49 | typedef CharT char_type; | |
50 | /** | |
51 | * Type of character string used by member functions. | |
52 | */ | |
53 | typedef std::basic_string<char_type> string_type; | |
54 | ||
55 | /** | |
56 | * Unique identifier for this type of facet. | |
57 | */ | |
58 | static std::locale::id id; | |
59 | ||
60 | /** | |
61 | * Construct a @c time_point_units facet. | |
62 | * @param refs | |
63 | * @Effects Construct a @c time_point_units facet. | |
64 | * If the @c refs argument is @c 0 then destruction of the object is | |
65 | * delegated to the @c locale, or locales, containing it. This allows | |
66 | * the user to ignore lifetime management issues. On the other had, | |
67 | * if @c refs is @c 1 then the object must be explicitly deleted; | |
68 | * the @c locale will not do so. In this case, the object can be | |
69 | * maintained across the lifetime of multiple locales. | |
70 | */ | |
71 | explicit time_point_units(size_t refs = 0) : | |
72 | std::locale::facet(refs) | |
73 | { | |
74 | } | |
75 | ||
76 | /** | |
77 | * @return the pattern to be used by default. | |
78 | */ | |
79 | virtual string_type get_pattern() const =0; | |
80 | ||
81 | /** | |
82 | * @return the epoch associated to the clock @c Clock calling @c do_get_epoch(Clock()) | |
83 | */ | |
84 | template <typename Clock> | |
85 | string_type get_epoch() const | |
86 | { | |
87 | return get_epoch_custom<CharT>(Clock(), *this); | |
88 | } | |
89 | ||
90 | protected: | |
91 | /** | |
92 | * Destroy the facet. | |
93 | */ | |
94 | virtual ~time_point_units() {} | |
95 | ||
96 | public: | |
97 | ||
98 | /** | |
99 | * | |
100 | * @param c a dummy instance of @c system_clock. | |
101 | * @return The epoch string associated to the @c system_clock. | |
102 | */ | |
103 | virtual string_type do_get_epoch(system_clock) const=0; | |
104 | ||
105 | /** | |
106 | * | |
107 | * @param c a dummy instance of @c steady_clock. | |
108 | * @return The epoch string associated to the @c steady_clock. | |
109 | */ | |
110 | virtual string_type do_get_epoch(steady_clock) const=0; | |
111 | ||
112 | #if defined(BOOST_CHRONO_HAS_PROCESS_CLOCKS) | |
113 | /** | |
114 | * | |
115 | * @param c a dummy instance of @c process_real_cpu_clock. | |
116 | * @return The epoch string associated to the @c process_real_cpu_clock. | |
117 | */ | |
118 | virtual string_type do_get_epoch(process_real_cpu_clock) const=0; | |
119 | #if ! BOOST_OS_WINDOWS || BOOST_PLAT_WINDOWS_DESKTOP | |
120 | /** | |
121 | * | |
122 | * @param c a dummy instance of @c process_user_cpu_clock. | |
123 | * @return The epoch string associated to the @c process_user_cpu_clock. | |
124 | */ | |
125 | virtual string_type do_get_epoch(process_user_cpu_clock) const=0; | |
126 | /** | |
127 | * | |
128 | * @param c a dummy instance of @c process_system_cpu_clock. | |
129 | * @return The epoch string associated to the @c process_system_cpu_clock. | |
130 | */ | |
131 | virtual string_type do_get_epoch(process_system_cpu_clock) const=0; | |
132 | /** | |
133 | * | |
134 | * @param c a dummy instance of @c process_cpu_clock. | |
135 | * @return The epoch string associated to the @c process_cpu_clock. | |
136 | */ | |
137 | virtual string_type do_get_epoch(process_cpu_clock) const=0; | |
138 | #endif | |
139 | #endif | |
140 | #if defined(BOOST_CHRONO_HAS_THREAD_CLOCK) | |
141 | /** | |
142 | * | |
143 | * @param c a dummy instance of @c thread_clock. | |
144 | * @return The epoch string associated to the @c thread_clock. | |
145 | */ | |
146 | virtual string_type do_get_epoch(thread_clock) const=0; | |
147 | #endif | |
148 | ||
149 | }; | |
150 | ||
151 | template <typename CharT> | |
152 | std::locale::id time_point_units<CharT>::id; | |
153 | ||
154 | ||
155 | // This class is used to define the strings for the default English | |
156 | template <typename CharT=char> | |
157 | class time_point_units_default: public time_point_units<CharT> | |
158 | { | |
159 | public: | |
160 | /** | |
161 | * Type of character the facet is instantiated on. | |
162 | */ | |
163 | typedef CharT char_type; | |
164 | /** | |
165 | * Type of character string returned by member functions. | |
166 | */ | |
167 | typedef std::basic_string<char_type> string_type; | |
168 | ||
169 | explicit time_point_units_default(size_t refs = 0) : | |
170 | time_point_units<CharT> (refs) | |
171 | { | |
172 | } | |
173 | ~time_point_units_default() {} | |
174 | ||
175 | /** | |
176 | * @return the default pattern "%d%e". | |
177 | */ | |
178 | string_type get_pattern() const | |
179 | { | |
180 | static const CharT t[] = | |
181 | { '%', 'd', '%', 'e' }; | |
182 | static const string_type pattern(t, t + sizeof (t) / sizeof (t[0])); | |
183 | ||
184 | return pattern; | |
185 | } | |
186 | ||
187 | //protected: | |
188 | /** | |
189 | * @param c a dummy instance of @c system_clock. | |
190 | * @return The epoch string returned by @c clock_string<system_clock,CharT>::since(). | |
191 | */ | |
192 | string_type do_get_epoch(system_clock ) const | |
193 | { | |
194 | return clock_string<system_clock,CharT>::since(); | |
195 | } | |
196 | /** | |
197 | * @param c a dummy instance of @c steady_clock. | |
198 | * @return The epoch string returned by @c clock_string<steady_clock,CharT>::since(). | |
199 | */ | |
200 | string_type do_get_epoch(steady_clock ) const | |
201 | { | |
202 | return clock_string<steady_clock,CharT>::since(); | |
203 | } | |
204 | ||
205 | #if defined(BOOST_CHRONO_HAS_PROCESS_CLOCKS) | |
206 | /** | |
207 | * @param c a dummy instance of @c process_real_cpu_clock. | |
208 | * @return The epoch string returned by @c clock_string<process_real_cpu_clock,CharT>::since(). | |
209 | */ | |
210 | string_type do_get_epoch(process_real_cpu_clock ) const | |
211 | { | |
212 | return clock_string<process_real_cpu_clock,CharT>::since(); | |
213 | } | |
214 | #if ! BOOST_OS_WINDOWS || BOOST_PLAT_WINDOWS_DESKTOP | |
215 | /** | |
216 | * @param c a dummy instance of @c process_user_cpu_clock. | |
217 | * @return The epoch string returned by @c clock_string<process_user_cpu_clock,CharT>::since(). | |
218 | */ | |
219 | string_type do_get_epoch(process_user_cpu_clock ) const | |
220 | { | |
221 | return clock_string<process_user_cpu_clock,CharT>::since(); | |
222 | } | |
223 | /** | |
224 | * @param c a dummy instance of @c process_system_cpu_clock. | |
225 | * @return The epoch string returned by @c clock_string<process_system_cpu_clock,CharT>::since(). | |
226 | */ | |
227 | string_type do_get_epoch(process_system_cpu_clock ) const | |
228 | { | |
229 | return clock_string<process_system_cpu_clock,CharT>::since(); | |
230 | } | |
231 | /** | |
232 | * @param c a dummy instance of @c process_cpu_clock. | |
233 | * @return The epoch string returned by @c clock_string<process_cpu_clock,CharT>::since(). | |
234 | */ | |
235 | string_type do_get_epoch(process_cpu_clock ) const | |
236 | { | |
237 | return clock_string<process_cpu_clock,CharT>::since(); | |
238 | } | |
239 | ||
240 | #endif | |
241 | #endif | |
242 | #if defined(BOOST_CHRONO_HAS_THREAD_CLOCK) | |
243 | /** | |
244 | * @param c a dummy instance of @c thread_clock. | |
245 | * @return The epoch string returned by @c clock_string<thread_clock,CharT>::since(). | |
246 | */ | |
247 | string_type do_get_epoch(thread_clock ) const | |
248 | { | |
249 | return clock_string<thread_clock,CharT>::since(); | |
250 | } | |
251 | #endif | |
252 | ||
253 | }; | |
254 | ||
255 | ||
256 | } // chrono | |
257 | ||
258 | } // boost | |
259 | ||
260 | #endif // header |