Mercurial > hg > vamp-plugin-sdk
comparison src/vamp-sdk/RealTime.cpp @ 499:8ede825a54f6
Rework canonicalisation so as to avoid theoretical possibility of integer overflow. (This is unit tested in svcore, not here - tests pass)
author | Chris Cannam |
---|---|
date | Mon, 11 Dec 2017 09:27:57 +0000 |
parents | ea8e56f0796a |
children |
comparison
equal
deleted
inserted
replaced
498:a87e1bcce7b0 | 499:8ede825a54f6 |
---|---|
40 This file copyright 2000-2006 Chris Cannam. | 40 This file copyright 2000-2006 Chris Cannam. |
41 Relicensed by the author as detailed above. | 41 Relicensed by the author as detailed above. |
42 */ | 42 */ |
43 | 43 |
44 #include <iostream> | 44 #include <iostream> |
45 #include <limits.h> | |
45 | 46 |
46 #if (defined(__GNUC__)) && (__GNUC__ < 3) | 47 #if (defined(__GNUC__)) && (__GNUC__ < 3) |
47 #include <strstream> | 48 #include <strstream> |
48 #define stringstream strstream | 49 #define stringstream strstream |
49 #else | 50 #else |
75 #define ONE_BILLION 1000000000 | 76 #define ONE_BILLION 1000000000 |
76 | 77 |
77 RealTime::RealTime(int s, int n) : | 78 RealTime::RealTime(int s, int n) : |
78 sec(s), nsec(n) | 79 sec(s), nsec(n) |
79 { | 80 { |
80 if (sec == 0) { | 81 while (nsec <= -ONE_BILLION && sec > INT_MIN) { nsec += ONE_BILLION; --sec; } |
81 while (nsec <= -ONE_BILLION) { nsec += ONE_BILLION; --sec; } | 82 while (nsec >= ONE_BILLION && sec < INT_MAX) { nsec -= ONE_BILLION; ++sec; } |
82 while (nsec >= ONE_BILLION) { nsec -= ONE_BILLION; ++sec; } | 83 while (nsec > 0 && sec < 0) { nsec -= ONE_BILLION; ++sec; } |
83 } else if (sec < 0) { | 84 while (nsec < 0 && sec > 0) { nsec += ONE_BILLION; --sec; } |
84 while (nsec <= -ONE_BILLION) { nsec += ONE_BILLION; --sec; } | |
85 while (nsec > 0 && sec < 0) { nsec -= ONE_BILLION; ++sec; } | |
86 } else { | |
87 while (nsec >= ONE_BILLION) { nsec -= ONE_BILLION; ++sec; } | |
88 while (nsec < 0 && sec > 0) { nsec += ONE_BILLION; --sec; } | |
89 } | |
90 } | 85 } |
91 | 86 |
92 RealTime | 87 RealTime |
93 RealTime::fromSeconds(double sec) | 88 RealTime::fromSeconds(double sec) |
94 { | 89 { |