Give subtract() lists for both parameters.
authorCarl Hetherington <cth@carlh.net>
Sun, 15 May 2022 22:36:43 +0000 (00:36 +0200)
committerCarl Hetherington <cth@carlh.net>
Mon, 16 May 2022 19:39:01 +0000 (21:39 +0200)
src/lib/audio_merger.cc
src/lib/dcpomatic_time.h
src/lib/empty_audio.cc
test/dcpomatic_time_test.cc

index 0bc1ad008ef9339b95f28e799e6fe88677129427..836da7da31b4cebf1437490ca709cf1d33f2b598 100644 (file)
@@ -132,7 +132,7 @@ AudioMerger::push (std::shared_ptr<const AudioBuffers> audio, DCPTime time)
        }
 
        /* Add the non-overlapping parts */
-       for (auto i: subtract(period, periods)) {
+       for (auto i: subtract({period}, periods)) {
                auto before = _buffers.end();
                auto after = _buffers.end();
                for (auto j = _buffers.begin(); j != _buffers.end(); ++j) {
index 9e7191b1eb7dc239a890aebc2d6efa5fe81d3f75..57ffb1faf9ca7d2796222c8fc57d4e15b887d8ae 100644 (file)
@@ -342,14 +342,13 @@ public:
 };
 
 
-/** @param A Period which is subtracted from.
+/** @param A Periods which are subtracted from, must be in ascending order of start time and must not overlap.
  *  @param B Periods to subtract from `A', must be in ascending order of start time and must not overlap.
  */
 template <class T>
-std::list<TimePeriod<T>> subtract (TimePeriod<T> A, std::list<TimePeriod<T>> const & B)
+std::list<TimePeriod<T>> subtract (std::list<TimePeriod<T>> const & A, std::list<TimePeriod<T>> const & B)
 {
-       std::list<TimePeriod<T>> result;
-       result.push_back (A);
+       std::list<TimePeriod<T>> result = A;
 
        for (auto i: B) {
                std::list<TimePeriod<T>> new_result;
index a2d914bf9b15a669bbc722a220805e0fcce45b48..8f905abd9bed6bbb227f9a6840b94d7fb79c2d38 100644 (file)
@@ -47,7 +47,7 @@ EmptyAudio::EmptyAudio (shared_ptr<const Film> film, shared_ptr<const Playlist>
                }
        }
 
-       _periods = subtract (DCPTimePeriod(DCPTime(), length), coalesce(full));
+       _periods = subtract ({DCPTimePeriod(DCPTime(), length)}, coalesce(full));
 
        if (!_periods.empty()) {
                _position = _periods.front().from;
index 00e28b91a71df129eb0654ea07e5f508e87c6167..21739d1850490cb9bef1c1f8fafd77f59fe7c951 100644 (file)
@@ -99,7 +99,7 @@ BOOST_AUTO_TEST_CASE (dcpomatic_time_period_subtract_test1)
                DCPTimePeriod(DCPTime(52), DCPTime(91)),
                DCPTimePeriod(DCPTime(94), DCPTime(106))
        };
-       auto r = subtract (A, B);
+       auto r = subtract ({A}, B);
        auto i = r.begin ();
        BOOST_REQUIRE (i != r.end ());
        BOOST_CHECK (i->from == DCPTime (42));
@@ -121,7 +121,7 @@ BOOST_AUTO_TEST_CASE (dcpomatic_time_period_subtract_test2)
                DCPTimePeriod(DCPTime(52), DCPTime(91)),
                DCPTimePeriod(DCPTime(94), DCPTime(106))
        };
-       auto r = subtract (A, B);
+       auto r = subtract ({A}, B);
        auto i = r.begin ();
        BOOST_REQUIRE (i != r.end ());
        BOOST_CHECK (i->from == DCPTime (0));
@@ -147,7 +147,7 @@ BOOST_AUTO_TEST_CASE (dcpomatic_time_period_subtract_test3)
                DCPTimePeriod(DCPTime(52), DCPTime(91)),
                DCPTimePeriod(DCPTime(94), DCPTime(99))
        };
-       auto r = subtract (A, B);
+       auto r = subtract ({A}, B);
        auto i = r.begin ();
        BOOST_REQUIRE (i != r.end ());
        BOOST_CHECK (i->from == DCPTime (0));
@@ -173,7 +173,7 @@ BOOST_AUTO_TEST_CASE (dcpomatic_time_period_subtract_test4)
 {
        DCPTimePeriod A (DCPTime (0), DCPTime (106));
        list<DCPTimePeriod> B;
-       auto r = subtract (A, B);
+       auto r = subtract ({A}, B);
        auto i = r.begin ();
        BOOST_REQUIRE (i != r.end ());
        BOOST_CHECK (i->from == DCPTime (0));
@@ -191,7 +191,7 @@ BOOST_AUTO_TEST_CASE (dcpomatic_time_period_subtract_test5)
                DCPTimePeriod(DCPTime(42), DCPTime(91)),
                DCPTimePeriod(DCPTime(94), DCPTime(99))
        };
-       auto r = subtract (A, B);
+       auto r = subtract ({A}, B);
        auto i = r.begin ();
        BOOST_REQUIRE (i != r.end ());
        BOOST_CHECK (i->from == DCPTime (0));
@@ -217,7 +217,7 @@ BOOST_AUTO_TEST_CASE (dcpomatic_time_period_subtract_test6)
                DCPTimePeriod(DCPTime(42), DCPTime(91)),
                DCPTimePeriod(DCPTime(91), DCPTime(106))
        };
-       auto r = subtract (A, B);
+       auto r = subtract ({A}, B);
        BOOST_CHECK (r.empty());
 }
 
@@ -228,7 +228,7 @@ BOOST_AUTO_TEST_CASE (dcpomatic_time_period_subtract_test7)
        list<DCPTimePeriod> B = {
                DCPTimePeriod(DCPTime(34), DCPTime(162))
        };
-       auto r = subtract (A, B);
+       auto r = subtract ({A}, B);
        auto i = r.begin ();
        BOOST_REQUIRE (i != r.end ());
        BOOST_CHECK (i->from == DCPTime (228));
@@ -245,7 +245,7 @@ BOOST_AUTO_TEST_CASE (dcpomatic_time_period_subtract_test8)
                DCPTimePeriod(DCPTime(8000), DCPTime(20000)),
                DCPTimePeriod(DCPTime(28000), DCPTime(32000))
        };
-       auto r = subtract (A, B);
+       auto r = subtract ({A}, B);
        auto i = r.begin ();
        BOOST_REQUIRE (i != r.end ());
        BOOST_CHECK (*i == DCPTimePeriod(DCPTime(0), DCPTime(8000)));
@@ -257,6 +257,69 @@ BOOST_AUTO_TEST_CASE (dcpomatic_time_period_subtract_test8)
 }
 
 
+BOOST_AUTO_TEST_CASE (dcpomatic_time_period_subtract_list_from_list_test1)
+{
+       list<DCPTimePeriod> A = {
+               DCPTimePeriod(DCPTime(0),    DCPTime(2000)),
+               DCPTimePeriod(DCPTime(4000), DCPTime(6000))
+       };
+
+       list<DCPTimePeriod> B = {
+               DCPTimePeriod(DCPTime(1000), DCPTime(3000)),
+               DCPTimePeriod(DCPTime(5000), DCPTime(7000))
+       };
+
+       auto result = subtract(A, B);
+       list<DCPTimePeriod> reference = {
+               DCPTimePeriod(DCPTime(0),    DCPTime(1000)),
+               DCPTimePeriod(DCPTime(4000), DCPTime(5000))
+       };
+
+       BOOST_CHECK (result == reference);
+}
+
+
+BOOST_AUTO_TEST_CASE (dcpomatic_time_period_subtract_list_from_list_test2)
+{
+       list<DCPTimePeriod> A = {
+               DCPTimePeriod(DCPTime(0),    DCPTime(2000)),
+               DCPTimePeriod(DCPTime(4000), DCPTime(6000))
+       };
+
+       list<DCPTimePeriod> B = {
+               DCPTimePeriod(DCPTime(500),  DCPTime(1500)),
+               DCPTimePeriod(DCPTime(4500), DCPTime(5500))
+       };
+
+       auto result = subtract(A, B);
+       list<DCPTimePeriod> reference = {
+               DCPTimePeriod(DCPTime(0),    DCPTime(500)),
+               DCPTimePeriod(DCPTime(1500), DCPTime(2000)),
+               DCPTimePeriod(DCPTime(4000), DCPTime(4500)),
+               DCPTimePeriod(DCPTime(5500), DCPTime(6000)),
+       };
+
+       BOOST_CHECK (result == reference);
+}
+
+
+BOOST_AUTO_TEST_CASE (dcpomatic_time_period_subtract_list_from_list_test3)
+{
+       list<DCPTimePeriod> A = {
+               DCPTimePeriod(DCPTime(500),  DCPTime(1500)),
+               DCPTimePeriod(DCPTime(4500), DCPTime(5500))
+       };
+
+       list<DCPTimePeriod> B = {
+               DCPTimePeriod(DCPTime(0),    DCPTime(2000)),
+               DCPTimePeriod(DCPTime(4000), DCPTime(6000))
+       };
+
+       auto result = subtract(A, B);
+       BOOST_CHECK (result.empty());
+}
+
+
 BOOST_AUTO_TEST_CASE (dcpomatic_time_period_coalesce_test1)
 {
        DCPTimePeriod A (DCPTime(14), DCPTime(29));