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 {