diff --git a/include/burst/iterator/symmetric_difference_iterator.hpp b/include/burst/iterator/symmetric_difference_iterator.hpp index d637b5b2..eba4743c 100644 --- a/include/burst/iterator/symmetric_difference_iterator.hpp +++ b/include/burst/iterator/symmetric_difference_iterator.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -22,6 +23,7 @@ #include #include #include +#include #include namespace burst @@ -266,10 +268,11 @@ namespace burst template auto make_symmetric_difference_iterator (std::tuple ranges, Compare compare) { + auto common_ranges = detail::uniform_range_tuple_please(ranges); return make_symmetric_difference_iterator ( - burst::own_as_range(burst::apply(burst::make_range_vector, ranges)), + burst::own_as_range(burst::apply(burst::make_range_vector, common_ranges)), std::move(compare) ); } @@ -313,10 +316,11 @@ namespace burst template auto make_symmetric_difference_iterator (std::tuple ranges) { + auto common_ranges = detail::uniform_range_tuple_please(ranges); return make_symmetric_difference_iterator ( - burst::own_as_range(burst::apply(burst::make_range_vector, ranges)) + burst::own_as_range(burst::apply(burst::make_range_vector, common_ranges)) ); } diff --git a/test/burst/range/adaptor/symmetric_differenced.cpp b/test/burst/range/adaptor/symmetric_differenced.cpp index b352e946..63b62385 100644 --- a/test/burst/range/adaptor/symmetric_differenced.cpp +++ b/test/burst/range/adaptor/symmetric_differenced.cpp @@ -1,4 +1,6 @@ +#include #include +#include #include #include #include @@ -61,4 +63,20 @@ TEST_SUITE("symmetric_differenced") const auto expected = {5, 4, 3, 2}; CHECK(symmetric_differenced == expected); } + + TEST_CASE("Может работать с кортежем диапазонов") + { + const auto first = burst::make_forward_list({ 4, 3, 2, 1}); + const auto second = burst::make_list ({5, 5, 3, 2, 1}); + const auto third = burst::make_vector ({5, 4, 3, 1}); + const auto fourth = burst::make_deque ({ 4, 2, 1}); + // ^ ^ ^ ^ + + const auto symmetric_differenced = + std::tie(first, second, third, fourth) + | burst::symmetric_differenced(std::greater<>{}); + + const auto expected = {5, 4, 3, 2}; + CHECK(symmetric_differenced == expected); + } } diff --git a/test/burst/range/symmetric_difference.cpp b/test/burst/range/symmetric_difference.cpp index e61845ac..3d39dde3 100644 --- a/test/burst/range/symmetric_difference.cpp +++ b/test/burst/range/symmetric_difference.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -154,4 +155,31 @@ TEST_SUITE("symmetric_difference") const auto expected = {0, 1, 1, 3}; CHECK(symmetric_difference == expected); } + + TEST_CASE("Возможно вычисление симметрической разности диапазонов разных типов") + { + auto one = burst::make_vector({1, 2, 3, 4, 5, 6, 7 }); + auto two = burst::make_list ({1, 3, 5, 7, 9 }); + auto three = burst::make_deque ({1, 4, 7, 10}); + // ^ ^ ^ ^ ^ ^ + + auto symmetric_difference = burst::symmetric_difference(std::tie(one, two, three)); + + auto expected = {1, 2, 6, 7, 9, 10}; + CHECK(symmetric_difference == expected); + } + + TEST_CASE("Возможно вычисление симметрической разности с предикатом диапазонов разных типов") + { + auto one = burst::make_vector({ 7, 6, 5, 4, 3, 2, 1, 0}); + auto two = burst::make_list ({ 8, 6, 4, 2, 0}); + auto three = burst::make_deque ({9, 6, 3, 0}); + // ^ ^ ^ ^ ^ ^ ^ + + auto symmetric_difference = + burst::symmetric_difference(std::tie(one, two, three), std::greater<>{}); + + auto expected = {9, 8, 7, 6, 5, 1, 0}; + CHECK(symmetric_difference == expected); + } }