// Range v3 library // // Copyright Eric Niebler 2014-present // // Use, modification and distribution is subject to the // Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // Project home: https://github.com/ericniebler/range-v3 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../simple_test.hpp" #include "../test_utils.hpp" #include "../test_iterators.hpp" RANGES_DIAGNOSTIC_IGNORE_GLOBAL_CONSTRUCTORS namespace { template struct input_array { T elements_[N]; InputIterator begin() { return InputIterator{elements_ + 0}; } InputIterator end() { return InputIterator{elements_ + N}; } constexpr std::size_t size() const { return N; } }; static int N = 0; auto make_input_rng() { using ranges::views::generate_n; return generate_n([](){ return generate_n([](){ return N++; },3); },3); } template constexpr auto twice(T t) { return ranges::views::concat( ranges::views::single(t), ranges::views::single(t)); } #ifdef __clang__ RANGES_DIAGNOSTIC_IGNORE_PRAGMAS RANGES_DIAGNOSTIC_IGNORE("-Wunneeded-member-function") RANGES_DIAGNOSTIC_IGNORE("-Wunused-member-function") #endif // https://github.com/ericniebler/range-v3/issues/283 void test_issue_283() { const std::vector> nums = { { 1, 2, 3 }, { 4, 5, 6 } }; const auto flat_nums = ranges::views::join( nums ) | ranges::to(); ::check_equal(flat_nums, {1,2,3,4,5,6}); } // https://github.com/ericniebler/range-v3/issues/1414 void test_issue_1414() { std::forward_list u2; // this can also be a vector std::vector i2; auto v2 = u2 | ranges::views::chunk(3) | ranges::views::join(i2); CPP_assert(ranges::input_range); } } int main() { using namespace ranges; // Test that we can join an input range of input ranges: { auto rng0 = make_input_rng() | views::join; static_assert(range_cardinality::value == ranges::finite, ""); CPP_assert(input_range); CPP_assert(!forward_range); CPP_assert(!common_range); CPP_assert(!sized_range); check_equal(rng0, {0,1,2,3,4,5,6,7,8}); } // Joining with a value { N = 0; auto rng1 = make_input_rng() | views::join(42); static_assert(range_cardinality::value == ranges::finite, ""); CPP_assert(input_range); CPP_assert(!forward_range); CPP_assert(!common_range); CPP_assert(!sized_range); check_equal(rng1, {0,1,2,42,3,4,5,42,6,7,8}); } // Joining with a range { N = 0; int rgi[] = {42,43}; auto rng2 = make_input_rng() | views::join(rgi); static_assert(range_cardinality::value == ranges::finite, ""); CPP_assert(input_range); CPP_assert(!forward_range); CPP_assert(!common_range); CPP_assert(!sized_range); check_equal(rng2, {0,1,2,42,43,3,4,5,42,43,6,7,8}); } // Just for fun: { std::string str = "Now,is,the,time,for,all,good,men,to,come,to,the,aid,of,their,country"; auto res = str | views::split(',') | views::join(' ') | to(); CHECK(res == "Now is the time for all good men to come to the aid of their country"); static_assert(range_cardinality::value == ranges::finite, ""); } { std::vector vs{"This","is","his","face"}; auto rng3 = views::join(vs); static_assert(range_cardinality::value == ranges::finite, ""); CPP_assert(!sized_range); CPP_assert(!sized_sentinel_for); CHECK(to(rng3) == "Thisishisface"); auto rng4 = views::join(vs, ' '); static_assert(range_cardinality::value == ranges::finite, ""); CPP_assert(!sized_range); CPP_assert(!sized_sentinel_for); CHECK(to(rng4) == "This is his face"); } { auto rng5 = views::join(twice(twice(42))); static_assert(range_cardinality::value == 4, ""); CPP_assert(sized_range); CHECK(rng5.size() == 4u); check_equal(rng5, {42,42,42,42}); } { auto rng6 = views::join(twice(views::repeat_n(42, 2))); static_assert(range_cardinality::value == ranges::finite, ""); CPP_assert(sized_range); CHECK(rng6.size() == 4u); check_equal(rng6, {42,42,42,42}); } { input_array some_strings = {{"This","is","his","face"}}; CPP_assert(input_range); CPP_assert(sized_range); CPP_assert(!sized_range); } { int const some_int_pairs[3][2] = {{0,1},{2,3},{4,5}}; auto rng = debug_input_view{some_int_pairs} | views::join; check_equal(rng, {0,1,2,3,4,5}); } { std::vector vs{"this","is","his","face"}; join_view>> jv{vs}; check_equal(jv, {'t','h','i','s','i','s','h','i','s','f','a','c','e'}); CPP_assert(bidirectional_range); CPP_assert(bidirectional_range); CPP_assert(common_range); CPP_assert(common_range); } { auto rng = views::iota(0,4) | views::transform([](int i) {return views::iota(0,i);}) | views::join; check_equal(rng, {0,0,1,0,1,2}); CPP_assert(input_range); CPP_assert(!range); CPP_assert(!forward_range); CPP_assert(!common_range); } { auto rng = views::iota(0,4) | views::transform([](int i) {return views::iota(0,i);}) | views::filter([](auto){ return true; }) | views::join; check_equal(rng, {0,0,1,0,1,2}); CPP_assert(input_range); CPP_assert(!range); CPP_assert(!forward_range); CPP_assert(!common_range); } { auto rng = views::iota(0,4) | views::transform([](int i) {return std::string((std::size_t) i, char('a'+i));}) | views::join; check_equal(rng, {'b','c','c','d','d','d'}); CPP_assert(input_range); CPP_assert(!range); CPP_assert(!forward_range); CPP_assert(!common_range); } { auto rng = views::iota(0,4) | views::transform([](int i) {return std::string((std::size_t) i, char('a'+i));}) | views::join('-'); check_equal(rng, {'-','b','-','c','c','-','d','d','d'}); CPP_assert(input_range); CPP_assert(!range); CPP_assert(!forward_range); CPP_assert(!common_range); } // https://github.com/ericniebler/range-v3/issues/1320 { auto op = [](auto & input, int i, auto & ins) { return input | ranges::views::chunk(i) | ranges::views::join(ins); }; std::string input{"foobarbaxbat"}; std::string insert{"X"}; auto rng = op(input, 2, insert); std::cout << rng << '\n'; ::check_equal(rng, {'f','o','X','o','b','X','a','r','X','b','a','X','x','b','X', 'a','t'}); } { auto op = [](auto & input, int i, auto & ins) { return input | ranges::views::chunk(i) | ranges::views::join(ins); }; std::vector input{"foo","bar","bax","bat"}; std::string insert{"XX"}; auto rng = op(input, 2, insert); std::cout << rng << '\n'; ::check_equal(rng, {"foo","bar","XX","bax","bat"}); } test_issue_283(); test_issue_1414(); return ::test_result(); }