diff --git a/src/lib/time/timevalue.hpp b/src/lib/time/timevalue.hpp index dfda0009a..1a230f605 100644 --- a/src/lib/time/timevalue.hpp +++ b/src/lib/time/timevalue.hpp @@ -261,6 +261,8 @@ namespace time { + class TimeSpan; + /** * Duration is the internal Lumiera time metric. * It is an absolute (positive) value, but can be @@ -277,6 +279,12 @@ namespace time { : Offset(distance.abs()) { } + explicit + Duration (Time const& timeSpec) + : Offset(Offset(timeSpec).abs()) + { } + + Duration (TimeSpan const& interval); Duration (ulong count, FrameRate const& fps); static const Duration NIL; @@ -307,13 +315,14 @@ namespace time { { } ///////////TODO creating timespans needs to be more convenient.... - operator Duration() const + Duration + duration() const { return dur_; } Time - getEnd() const + end() const { TimeVar startPoint (*this); return (startPoint + dur_); @@ -381,6 +390,11 @@ namespace time { : raw; } + inline + Duration::Duration (TimeSpan const& interval) + : Offset(interval.duration()) + { } + inline FrameRate::FrameRate (uint fps) : IFrac (__ensure_nonzero(fps)) diff --git a/tests/lib/time/time-value-test.cpp b/tests/lib/time/time-value-test.cpp index d504197d5..ddc026b9d 100644 --- a/tests/lib/time/time-value-test.cpp +++ b/tests/lib/time/time-value-test.cpp @@ -248,6 +248,13 @@ namespace test{ CHECK (distance > zero); CHECK (distance == backwards.abs()); + Duration len1(Time(23,4,5,6)); + CHECK (len1 == Time(FSecs(23,1000)) + Time(4 + 5*60 + 6*3600)); + + Duration len2(Time(-10)); // negative specs... + CHECK (len2 == Time(10));// + CHECK (len2 > zero); // will be taken absolute + Duration unit(50, FrameRate::PAL); CHECK (Time(2) == unit); // duration of 50 frames at 25fps is... (guess what) @@ -275,7 +282,7 @@ namespace test{ TimeValue zero; TimeValue five(5); - TimeSpan interval (Time(org), Duration(Offset (org,five))); /////////////TODO need more convenient constructors + TimeSpan interval (Time(org), Duration(Offset (org,five))); // the time span behaves like a time CHECK (org == interval); @@ -285,11 +292,16 @@ namespace test{ Duration theLength(interval); CHECK (theLength == Offset(org,five).abs()); - Time endpoint = interval.getEnd(); - CHECK (Offset(interval,endpoint) == Offset(org,five).abs()); + Time endpoint = interval.end(); + TimeSpan successor (endpoint, Duration(Time(2))); - cout << "Interval: " << interval - << " Endpoint: " << endpoint << endl; + CHECK (Offset(interval,endpoint) == Offset(org,five).abs()); + CHECK (Offset(endpoint,successor.end()) == Duration(successor)); + + cout << "Interval-1: " << interval + << " Interval-2: " << successor + << " End point: " << successor.end() + << endl; } };