summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2017-07-18 10:37:51 +0100
committerCarl Hetherington <cth@carlh.net>2017-07-18 10:38:17 +0100
commita25cc3fda26e2bbc6b1c3786cc7f2ed7141a29f0 (patch)
tree763e292124b43b8c652bb4d34eaae5e14e8236f6 /src
parent4f6f03dc72d9cd24f3e4b2d856c5ccb66bda3930 (diff)
Fix Time::add which was broken when adding times with different rates.
Diffstat (limited to 'src')
-rw-r--r--src/rational.cc10
-rw-r--r--src/rational.h1
-rw-r--r--src/stl_binary_writer.cc2
-rw-r--r--src/sub_assert.h2
-rw-r--r--src/sub_time.cc17
5 files changed, 17 insertions, 15 deletions
diff --git a/src/rational.cc b/src/rational.cc
index 09dadab..47d57ad 100644
--- a/src/rational.cc
+++ b/src/rational.cc
@@ -31,3 +31,13 @@ Rational::integer () const
{
return (numerator % denominator) == 0;
}
+
+Rational
+sub::max (Rational const & a, Rational const & b)
+{
+ if (a.fraction() > b.fraction()) {
+ return a;
+ }
+
+ return b;
+}
diff --git a/src/rational.h b/src/rational.h
index 7ff71c0..adc40f9 100644
--- a/src/rational.h
+++ b/src/rational.h
@@ -41,5 +41,6 @@ public:
};
bool operator== (Rational const & a, Rational const & b);
+Rational max (Rational const & a, Rational const & b);
}
diff --git a/src/stl_binary_writer.cc b/src/stl_binary_writer.cc
index 7ae7509..60adda4 100644
--- a/src/stl_binary_writer.cc
+++ b/src/stl_binary_writer.cc
@@ -179,7 +179,7 @@ sub::write_stl_binary (
for (list<Block>::const_iterator k = j->blocks.begin(); k != j->blocks.end(); ++k) {
t += k->text.size ();
}
- longest = max (longest, t);
+ longest = std::max (longest, t);
}
}
diff --git a/src/sub_assert.h b/src/sub_assert.h
index 67c8abe..4c75d70 100644
--- a/src/sub_assert.h
+++ b/src/sub_assert.h
@@ -19,4 +19,4 @@
#include "exceptions.h"
-#define SUB_ASSERT(x) if (!(x)) throw ProgrammingError (__FILE__, __LINE__);
+#define SUB_ASSERT(x) if (!(x)) throw sub::ProgrammingError (__FILE__, __LINE__);
diff --git a/src/sub_time.cc b/src/sub_time.cc
index c4e00ba..adaab31 100644
--- a/src/sub_time.cc
+++ b/src/sub_time.cc
@@ -172,24 +172,15 @@ Time::all_as_seconds () const
return _seconds + double(milliseconds ()) / 1000;
}
-/** Add a time to this one. This time must have an integer _rate
- * and t must have the same rate.
- */
+/** Add a time to this one. Both *this and t must have a specified _rate */
void
Time::add (Time t)
{
SUB_ASSERT (_rate);
+ SUB_ASSERT (t._rate);
- _seconds += t._seconds;
- _frames += t._frames;
-
- SUB_ASSERT (_rate.get().denominator != 0);
- SUB_ASSERT (_rate.get().integer ());
-
- if (_frames >= _rate.get().integer_fraction()) {
- _frames -= _rate.get().integer_fraction();
- ++_seconds;
- }
+ Rational result_rate = max (*_rate, *t._rate);
+ *this = Time::from_frames((all_as_seconds() + t.all_as_seconds()) * result_rate.fraction(), result_rate);
}
void