Add more comparision operators to Timestamp

svn-id: r47071
This commit is contained in:
Max Horn 2010-01-06 12:15:05 +00:00
parent 5b635fd610
commit 1c6ccf8000
3 changed files with 73 additions and 8 deletions

View File

@ -72,12 +72,40 @@ Timestamp Timestamp::convertToFramerate(int newFramerate) const {
}
bool Timestamp::operator==(const Timestamp &ts) const {
return (ts._secs == _secs) &&
(ts._numberOfFrames * _framerate == _numberOfFrames * ts._framerate);
return cmp(ts) == 0;
}
bool Timestamp::operator!=(const Timestamp &ts) const {
return !(*this == ts);
return cmp(ts) != 0;
}
bool Timestamp::operator<(const Timestamp &ts) const {
return cmp(ts) < 0;
}
bool Timestamp::operator<=(const Timestamp &ts) const {
return cmp(ts) <= 0;
}
bool Timestamp::operator>(const Timestamp &ts) const {
return cmp(ts) > 0;
}
bool Timestamp::operator>=(const Timestamp &ts) const {
return cmp(ts) >= 0;
}
int Timestamp::cmp(const Timestamp &ts) const {
int delta = _secs - ts._secs;
if (!delta) {
const uint g = gcd(_framerate, ts._framerate);
const uint p = _framerate / g;
const uint q = ts._framerate / g;
delta = (_numberOfFrames * q - ts._numberOfFrames * p);
}
return delta;
}

View File

@ -90,12 +90,11 @@ public:
* as equal even if they use different framerates.
*/
bool operator==(const Timestamp &ts) const;
bool operator!=(const Timestamp &ts) const;
// bool operator<(const Timestamp &ts) const;
// bool operator<=(const Timestamp &ts) const;
// bool operator>(const Timestamp &ts) const;
// bool operator>=(const Timestamp &ts) const;
bool operator<(const Timestamp &ts) const;
bool operator<=(const Timestamp &ts) const;
bool operator>(const Timestamp &ts) const;
bool operator>=(const Timestamp &ts) const;
/**
* Returns a new timestamp, which corresponds to the time encoded
@ -129,6 +128,10 @@ public:
/** Return the framerate used by this timestamp. */
int getFramerate() const { return _framerate / _framerateFactor; }
protected:
int cmp(const Timestamp &ts) const;
};

View File

@ -103,6 +103,40 @@ class TimestampTestSuite : public CxxTest::TestSuite
}
void test_compare() {
const Audio::Timestamp a = Audio::Timestamp(60, 1000);
Audio::Timestamp b = Audio::Timestamp(60, 60);
Audio::Timestamp c = Audio::Timestamp(60, 44100);
TS_ASSERT(a <= b);
TS_ASSERT(b <= c);
TS_ASSERT(a <= c);
TS_ASSERT(b >= a);
TS_ASSERT(c >= b);
TS_ASSERT(c >= a);
b = b.addFrames(60 / 12);
c = c.addFrames(44100 / 10);
TS_ASSERT(a < b);
TS_ASSERT(b < c);
TS_ASSERT(a < c);
TS_ASSERT(b > a);
TS_ASSERT(c > b);
TS_ASSERT(c > a);
TS_ASSERT(a <= b);
TS_ASSERT(b <= c);
TS_ASSERT(a <= c);
TS_ASSERT(b >= a);
TS_ASSERT(c >= b);
TS_ASSERT(c >= a);
}
void test_framerate() {
const Audio::Timestamp a = Audio::Timestamp(500, 1000);
const Audio::Timestamp b = Audio::Timestamp(500, 67);