summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2014-05-24 17:38:46 +0100
committerCarl Hetherington <cth@carlh.net>2014-05-24 17:38:46 +0100
commit208f598e2af83fe7be465680806c79af3da825d3 (patch)
tree295a1c34e7f11a8c6f2a0aee0ab57036a55f809f /src
parent7002892583b9e008a1bd3469c6db859292927286 (diff)
More tests and fix MetricTime.
Diffstat (limited to 'src')
-rw-r--r--src/convert_time.cc1
-rw-r--r--src/frame_time.h3
-rw-r--r--src/metric_time.cc50
-rw-r--r--src/metric_time.h9
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);