diff --git a/experimental/segmented_swap_ranges_test.cpp b/experimental/segmented_swap_ranges_test.cpp index 5794271..bdabdd7 100644 --- a/experimental/segmented_swap_ranges_test.cpp +++ b/experimental/segmented_swap_ranges_test.cpp @@ -218,6 +218,68 @@ void test_swap_ranges_movable_seg2() BOOST_TEST_EQ(other[static_cast(i)].value(), i + 1); } +void test_swap_ranges_segmented_second() +{ + test_detail::seg_vector sv; + int a1[] = {1, 2, 3}; + int a2[] = {4, 5}; + int a3[] = {6, 7, 8, 9}; + sv.add_segment_range(a1, a1 + 3); + sv.add_segment_range(a2, a2 + 2); + sv.add_segment_range(a3, a3 + 4); + + test_detail::seg_vector other; + int b1[] = {10, 20, 30, 40}; + int b2[] = {50, 60, 70}; + int b3[] = {80, 90}; + other.add_segment_range(b1, b1 + 4); + other.add_segment_range(b2, b2 + 3); + other.add_segment_range(b3, b3 + 2); + + typedef test_detail::seg_vector::iterator iter_t; + iter_t result = segmented_swap_ranges(sv.begin(), sv.end(), other.begin()); + + BOOST_TEST(result == other.end()); + + iter_t it = sv.begin(); + for(int i = 0; i < 9; ++i, ++it) + BOOST_TEST_EQ(*it, (i + 1) * 10); + + it = other.begin(); + for(int i = 0; i < 9; ++i, ++it) + BOOST_TEST_EQ(*it, i + 1); +} + +void test_swap_ranges_seg2_to_seg2() +{ + test_detail::seg2_vector sv2; + int a1[] = {1, 2, 3}; + int a2[] = {4, 5}; + int a3[] = {6, 7, 8, 9}; + sv2.add_flat_segment_range(a1, a1 + 3); + sv2.add_flat_segment_range(a2, a2 + 2); + sv2.add_flat_segment_range(a3, a3 + 4); + + test_detail::seg2_vector other; + int b1[] = {10, 20, 30, 40, 50}; + int b2[] = {60, 70, 80, 90}; + other.add_flat_segment_range(b1, b1 + 5); + other.add_flat_segment_range(b2, b2 + 4); + + typedef test_detail::seg2_vector::iterator iter_t; + iter_t result = segmented_swap_ranges(sv2.begin(), sv2.end(), other.begin()); + + BOOST_TEST(result == other.end()); + + iter_t it = sv2.begin(); + for(int i = 0; i < 9; ++i, ++it) + BOOST_TEST_EQ(*it, (i + 1) * 10); + + it = other.begin(); + for(int i = 0; i < 9; ++i, ++it) + BOOST_TEST_EQ(*it, i + 1); +} + int main() { test_swap_ranges_full(); @@ -229,5 +291,7 @@ int main() test_swap_ranges_seg2(); test_swap_ranges_movable_seg(); test_swap_ranges_movable_seg2(); + test_swap_ranges_segmented_second(); + test_swap_ranges_seg2_to_seg2(); return boost::report_errors(); } diff --git a/experimental/segmented_transform_test.cpp b/experimental/segmented_transform_test.cpp index 98b5f38..c667efa 100644 --- a/experimental/segmented_transform_test.cpp +++ b/experimental/segmented_transform_test.cpp @@ -144,6 +144,79 @@ void test_transform_seg2() BOOST_TEST_EQ(out[8], 18); } +void test_transform_segmented_output() +{ + test_detail::seg_vector sv; + int a1[] = {1, 2, 3}; + int a2[] = {4, 5}; + int a3[] = {6, 7, 8, 9}; + sv.add_segment_range(a1, a1 + 3); + sv.add_segment_range(a2, a2 + 2); + sv.add_segment_range(a3, a3 + 4); + + test_detail::seg_vector out; + out.add_segment(4, 0); + out.add_segment(3, 0); + out.add_segment(2, 0); + + typedef test_detail::seg_vector::iterator iter_t; + iter_t result = segmented_transform(sv.begin(), sv.end(), out.begin(), times_two()); + + BOOST_TEST(result == out.end()); + iter_t it = out.begin(); + for(int i = 0; i < 9; ++i, ++it) + BOOST_TEST_EQ(*it, (i + 1) * 2); +} + +void test_transform_seg2_to_seg2() +{ + test_detail::seg2_vector sv2; + int a1[] = {1, 2, 3}; + int a2[] = {4, 5}; + int a3[] = {6, 7, 8, 9}; + sv2.add_flat_segment_range(a1, a1 + 3); + sv2.add_flat_segment_range(a2, a2 + 2); + sv2.add_flat_segment_range(a3, a3 + 4); + + test_detail::seg2_vector out; + { + test_detail::seg_vector s1; s1.add_segment(5, 0); + test_detail::seg_vector s2; s2.add_segment(4, 0); + out.add_segment(s1); + out.add_segment(s2); + } + + typedef test_detail::seg2_vector::iterator iter_t; + iter_t result = segmented_transform(sv2.begin(), sv2.end(), out.begin(), times_two()); + + BOOST_TEST(result == out.end()); + iter_t it = out.begin(); + for(int i = 0; i < 9; ++i, ++it) + BOOST_TEST_EQ(*it, (i + 1) * 2); +} + +void test_transform_seg_to_seg_misaligned() +{ + test_detail::seg_vector sv; + int a1[] = {1, 2, 3, 4, 5}; + int a2[] = {6, 7, 8}; + sv.add_segment_range(a1, a1 + 5); + sv.add_segment_range(a2, a2 + 3); + + test_detail::seg_vector out; + out.add_segment(2, 0); + out.add_segment(3, 0); + out.add_segment(3, 0); + + typedef test_detail::seg_vector::iterator iter_t; + iter_t result = segmented_transform(sv.begin(), sv.end(), out.begin(), negate_val()); + + BOOST_TEST(result == out.end()); + iter_t it = out.begin(); + for(int i = 0; i < 8; ++i, ++it) + BOOST_TEST_EQ(*it, -(i + 1)); +} + int main() { test_transform_full_range(); @@ -153,5 +226,8 @@ int main() test_transform_sentinel_segmented(); test_transform_sentinel_non_segmented(); test_transform_seg2(); + test_transform_segmented_output(); + test_transform_seg2_to_seg2(); + test_transform_seg_to_seg_misaligned(); return boost::report_errors(); }