Mercurial > hg > vamp-build-and-test
comparison DEPENDENCIES/generic/include/boost/chrono/io/duration_get.hpp @ 101:c530137014c0
Update Boost headers (1.58.0)
author | Chris Cannam |
---|---|
date | Mon, 07 Sep 2015 11:12:49 +0100 |
parents | 2665513ce2d3 |
children |
comparison
equal
deleted
inserted
replaced
100:793467b5e61c | 101:c530137014c0 |
---|---|
12 #include <string> | 12 #include <string> |
13 #include <boost/type_traits/is_scalar.hpp> | 13 #include <boost/type_traits/is_scalar.hpp> |
14 #include <boost/utility/enable_if.hpp> | 14 #include <boost/utility/enable_if.hpp> |
15 #include <boost/type_traits/is_signed.hpp> | 15 #include <boost/type_traits/is_signed.hpp> |
16 #include <boost/mpl/if.hpp> | 16 #include <boost/mpl/if.hpp> |
17 #include <boost/math/common_factor_rt.hpp> | 17 #include <boost/integer/common_factor_rt.hpp> |
18 #include <boost/chrono/detail/scan_keyword.hpp> | 18 #include <boost/chrono/detail/scan_keyword.hpp> |
19 #include <boost/chrono/detail/no_warning/signed_unsigned_cmp.hpp> | 19 #include <boost/chrono/detail/no_warning/signed_unsigned_cmp.hpp> |
20 #include <boost/chrono/process_cpu_clocks.hpp> | |
20 | 21 |
21 #include <boost/assert.hpp> | 22 #include <boost/assert.hpp> |
22 #include <locale> | 23 #include <locale> |
23 | 24 |
24 /** | 25 /** |
42 { | 43 { |
43 typedef typename mpl::if_c<is_floating_point<Rep>::value, long double, typename mpl::if_c< | 44 typedef typename mpl::if_c<is_floating_point<Rep>::value, long double, typename mpl::if_c< |
44 is_signed<Rep>::value, long long, unsigned long long>::type>::type type; | 45 is_signed<Rep>::value, long long, unsigned long long>::type>::type type; |
45 }; | 46 }; |
46 | 47 |
48 template <class Rep> | |
49 struct duration_io_intermediate<process_times<Rep>, false> | |
50 { | |
51 typedef process_times<typename duration_io_intermediate<Rep>::type> type; | |
52 }; | |
53 | |
47 template <typename intermediate_type> | 54 template <typename intermediate_type> |
48 typename enable_if<is_integral<intermediate_type> , bool>::type reduce(intermediate_type& r, | 55 typename enable_if<is_integral<intermediate_type> , bool>::type reduce(intermediate_type& r, |
49 unsigned long long& den, std::ios_base::iostate& err) | 56 unsigned long long& den, std::ios_base::iostate& err) |
50 { | 57 { |
51 typedef typename common_type<intermediate_type, unsigned long long>::type common_type_t; | 58 typedef typename common_type<intermediate_type, unsigned long long>::type common_type_t; |
52 | 59 |
53 // Reduce r * num / den | 60 // Reduce r * num / den |
54 common_type_t t = math::gcd<common_type_t>(common_type_t(r), common_type_t(den)); | 61 common_type_t t = integer::gcd<common_type_t>(common_type_t(r), common_type_t(den)); |
55 r /= t; | 62 r /= t; |
56 den /= t; | 63 den /= t; |
57 if (den != 1) | 64 if (den != 1) |
58 { | 65 { |
59 // Conversion to Period is integral and not exact | 66 // Conversion to Period is integral and not exact |
269 unsigned long long num = rt.num; | 276 unsigned long long num = rt.num; |
270 unsigned long long den = rt.den; | 277 unsigned long long den = rt.den; |
271 | 278 |
272 // r should be multiplied by (num/den) / Period | 279 // r should be multiplied by (num/den) / Period |
273 // Reduce (num/den) / Period to lowest terms | 280 // Reduce (num/den) / Period to lowest terms |
274 unsigned long long gcd_n1_n2 = math::gcd<unsigned long long>(num, Period::num); | 281 unsigned long long gcd_n1_n2 = integer::gcd<unsigned long long>(num, Period::num); |
275 unsigned long long gcd_d1_d2 = math::gcd<unsigned long long>(den, Period::den); | 282 unsigned long long gcd_d1_d2 = integer::gcd<unsigned long long>(den, Period::den); |
276 num /= gcd_n1_n2; | 283 num /= gcd_n1_n2; |
277 den /= gcd_d1_d2; | 284 den /= gcd_d1_d2; |
278 unsigned long long n2 = Period::num / gcd_n1_n2; | 285 unsigned long long n2 = Period::num / gcd_n1_n2; |
279 unsigned long long d2 = Period::den / gcd_d1_d2; | 286 unsigned long long d2 = Period::den / gcd_d1_d2; |
280 if (num > (std::numeric_limits<unsigned long long>::max)() / d2 || den | 287 if (num > (std::numeric_limits<unsigned long long>::max)() / d2 || den |
298 err |= std::ios_base::failbit; | 305 err |= std::ios_base::failbit; |
299 return s; | 306 return s; |
300 } | 307 } |
301 common_type_t t = r * num; | 308 common_type_t t = r * num; |
302 t /= den; | 309 t /= den; |
303 if (t > 0) | 310 if (t > duration_values<common_type_t>::zero()) |
304 { | 311 { |
305 Rep pt = t; | 312 Rep pt = t; |
306 if ( (duration_values<Rep>::max)() < pt) | 313 if ( (duration_values<Rep>::max)() < pt) |
307 { | 314 { |
308 // Conversion to Period overflowed | 315 // Conversion to Period overflowed |
365 template <typename Rep> | 372 template <typename Rep> |
366 iter_type get_value(iter_type s, iter_type end, std::ios_base& ios, std::ios_base::iostate& err, Rep& r) const | 373 iter_type get_value(iter_type s, iter_type end, std::ios_base& ios, std::ios_base::iostate& err, Rep& r) const |
367 { | 374 { |
368 return std::use_facet<std::num_get<CharT, iter_type> >(ios.getloc()).get(s, end, ios, err, r); | 375 return std::use_facet<std::num_get<CharT, iter_type> >(ios.getloc()).get(s, end, ios, err, r); |
369 } | 376 } |
377 template <typename Rep> | |
378 iter_type get_value(iter_type s, iter_type end, std::ios_base& ios, std::ios_base::iostate& err, process_times<Rep>& r) const | |
379 { | |
380 if (s == end) { | |
381 err |= std::ios_base::eofbit; | |
382 return s; | |
383 } else if (*s != '{') { // mandatory '{' | |
384 err |= std::ios_base::failbit; | |
385 return s; | |
386 } | |
387 ++s; | |
388 s = std::use_facet<std::num_get<CharT, iter_type> >(ios.getloc()).get(s, end, ios, err, r.real); | |
389 if (s == end) { | |
390 err |= std::ios_base::eofbit; | |
391 return s; | |
392 } else if (*s != ';') { // mandatory ';' | |
393 err |= std::ios_base::failbit; | |
394 return s; | |
395 } | |
396 ++s; | |
397 s = std::use_facet<std::num_get<CharT, iter_type> >(ios.getloc()).get(s, end, ios, err, r.user); | |
398 if (s == end) { | |
399 err |= std::ios_base::eofbit; | |
400 return s; | |
401 } else if (*s != ';') { // mandatory ';' | |
402 err |= std::ios_base::failbit; | |
403 return s; | |
404 } | |
405 ++s; | |
406 s = std::use_facet<std::num_get<CharT, iter_type> >(ios.getloc()).get(s, end, ios, err, r.system); | |
407 if (s == end) { | |
408 err |= std::ios_base::eofbit; | |
409 return s; | |
410 } else if (*s != '}') { // mandatory '}' | |
411 err |= std::ios_base::failbit; | |
412 return s; | |
413 } | |
414 return s; | |
415 } | |
370 | 416 |
371 /** | 417 /** |
372 * | 418 * |
373 * @param s start input stream iterator | 419 * @param s start input stream iterator |
374 * @param e end input stream iterator | 420 * @param e end input stream iterator |