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