Skip to content

Commit

Permalink
refs #121 Симметрическая разность разнотипных диапазонов
Browse files Browse the repository at this point in the history
  • Loading branch information
izvolov committed Jul 19, 2020
1 parent 8053533 commit 25d84a4
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 2 deletions.
8 changes: 6 additions & 2 deletions include/burst/iterator/symmetric_difference_iterator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <burst/container/access/front.hpp>
#include <burst/functional/each.hpp>
#include <burst/iterator/detail/prevent_writing.hpp>
#include <burst/iterator/detail/uniform_range_tuple_please.hpp>
#include <burst/iterator/end_tag.hpp>
#include <burst/range/make_range_vector.hpp>
#include <burst/range/own_as_range.hpp>
Expand All @@ -22,6 +23,7 @@
#include <algorithm>
#include <functional>
#include <iterator>
#include <tuple>
#include <utility>

namespace burst
Expand Down Expand Up @@ -266,10 +268,11 @@ namespace burst
template <typename ... Ranges, typename Compare>
auto make_symmetric_difference_iterator (std::tuple<Ranges &...> 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)
);
}
Expand Down Expand Up @@ -313,10 +316,11 @@ namespace burst
template <typename ... Ranges>
auto make_symmetric_difference_iterator (std::tuple<Ranges &...> 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))
);
}

Expand Down
18 changes: 18 additions & 0 deletions test/burst/range/adaptor/symmetric_differenced.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#include <burst/container/make_deque.hpp>
#include <burst/container/make_forward_list.hpp>
#include <burst/container/make_list.hpp>
#include <burst/container/make_vector.hpp>
#include <burst/range/adaptor/symmetric_differenced.hpp>
#include <burst/range/make_range_vector.hpp>
Expand Down Expand Up @@ -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);
}
}
28 changes: 28 additions & 0 deletions test/burst/range/symmetric_difference.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include <burst/container/make_list.hpp>
#include <burst/container/make_vector.hpp>
#include <burst/container/make_deque.hpp>
#include <burst/range/make_range_vector.hpp>
#include <burst/range/symmetric_difference.hpp>

Expand Down Expand Up @@ -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);
}
}

0 comments on commit 25d84a4

Please sign in to comment.