diff options
| author | Carl Hetherington <cth@carlh.net> | 2014-05-24 17:38:46 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2014-05-24 17:38:46 +0100 |
| commit | 208f598e2af83fe7be465680806c79af3da825d3 (patch) | |
| tree | 295a1c34e7f11a8c6f2a0aee0ab57036a55f809f /src | |
| parent | 7002892583b9e008a1bd3469c6db859292927286 (diff) | |
More tests and fix MetricTime.
Diffstat (limited to 'src')
| -rw-r--r-- | src/convert_time.cc | 1 | ||||
| -rw-r--r-- | src/frame_time.h | 3 | ||||
| -rw-r--r-- | src/metric_time.cc | 50 | ||||
| -rw-r--r-- | src/metric_time.h | 9 |
4 files changed, 45 insertions, 18 deletions
diff --git a/src/convert_time.cc b/src/convert_time.cc index 95cad64..3ae165b 100644 --- a/src/convert_time.cc +++ b/src/convert_time.cc @@ -21,6 +21,7 @@ #include "frame_time.h" #include "convert_time.h" +using std::cout; using namespace sub; FrameTime diff --git a/src/frame_time.h b/src/frame_time.h index 9443676..aa24931 100644 --- a/src/frame_time.h +++ b/src/frame_time.h @@ -24,6 +24,9 @@ namespace sub { +/** @class FrameTime + * @brief A time in hours, minutes, seconds and frames. + */ class FrameTime { public: diff --git a/src/metric_time.cc b/src/metric_time.cc index d505a97..d0755c3 100644 --- a/src/metric_time.cc +++ b/src/metric_time.cc @@ -24,67 +24,85 @@ using std::ostream; using std::string; +using std::cout; using namespace sub; MetricTime::MetricTime (int h, int m, int s, int ms) - : _milliseconds ((h * 3600 + m * 60 + s) * 1000 + ms) + /* cast up to int64_t to force a 64-bit calculation */ + : _ms ((int64_t (h) * 3600 + m * 60 + s) * 1000 + ms) { } +void +MetricTime::split (int& h, int &m, int& s, int& ms) const +{ + int64_t w = _ms; + h = floor (w / (3600 * 1000)); + /* this multiply could overflow 32 bits so cast to make sure it is done as 64-bit */ + w -= int64_t (h) * (3600 * 1000); + m = floor (w / (60 * 1000)); + w -= m * (60 * 1000); + s = floor (w / 1000); + w -= s * 1000; + ms = w; +} + int MetricTime::hours () const { - return floor (_milliseconds / (3600 * 1000)); + int h, m, s, ms; + split (h, m, s, ms); + return h; } int MetricTime::minutes () const { - return int64_t (floor (_milliseconds / (60 * 1000))) % 60; + int h, m, s, ms; + split (h, m, s, ms); + return m; } int MetricTime::seconds () const { - return int64_t (floor (_milliseconds / (1000))) % 3600; + int h, m, s, ms; + split (h, m, s, ms); + return s; } int MetricTime::milliseconds () const { - return _milliseconds % (3600 * 1000); + int h, m, s, ms; + split (h, m, s, ms); + return ms; } bool sub::operator== (MetricTime const & a, MetricTime const & b) { - return a._milliseconds == b._milliseconds; + return a._ms == b._ms; } bool sub::operator> (MetricTime const & a, MetricTime const & b) { - return a._milliseconds > b._milliseconds; + return a._ms > b._ms; } bool sub::operator< (MetricTime const & a, MetricTime const & b) { - return a._milliseconds < b._milliseconds; + return a._ms < b._ms; } ostream& sub::operator<< (ostream& st, MetricTime const & t) { - int64_t ms = t._milliseconds; - int const h = ms / (3600 * 1000); - ms -= h * 3600 * 1000; - int const m = ms / (60 * 1000); - ms -= m * 60 * 1000; - int const s = ms / 1000; - ms -= s * 1000; - + int h, m, s, ms; + t.split (h, m, s, ms); st << h << ":" << m << ":" << s << ":" << ms; return st; } diff --git a/src/metric_time.h b/src/metric_time.h index 4cea7f7..226c0a1 100644 --- a/src/metric_time.h +++ b/src/metric_time.h @@ -25,11 +25,14 @@ namespace sub { +/** @class MetricTime + * @brief A time held in milliseconds. + */ class MetricTime { public: MetricTime () - : _milliseconds (0) + : _ms (0) {} MetricTime (int h, int m, int s, int ms); @@ -40,12 +43,14 @@ public: int milliseconds () const; private: + void split (int& h, int& m, int& s, int& ms) const; + friend bool operator== (MetricTime const & a, MetricTime const & b); friend bool operator> (MetricTime const & a, MetricTime const & b); friend bool operator< (MetricTime const & a, MetricTime const & b); friend std::ostream& operator<< (std::ostream&, MetricTime const & t); - int64_t _milliseconds; + int64_t _ms; }; bool operator== (MetricTime const & a, MetricTime const & b); |
