blob: e754da4562b32b24f5c00e539c447cae9bff031c [file] [log] [blame]
// { dg-do run { target c++20 } }
#include <ranges>
#include <algorithm>
#include <regex>
#include <string_view>
#include <testsuite_hooks.h>
namespace ranges = std::ranges;
namespace views = std::views;
void
test01()
{
// Test case from LWG 3698
char const text[] = "Hello";
std::regex regex{"[a-z]"};
auto lower
= ranges::subrange(std::cregex_iterator(ranges::begin(text),
ranges::end(text),
regex),
std::cregex_iterator{})
| views::join
| views::transform([](auto const& sm) {
return std::string_view(sm.first, sm.second);
});
VERIFY( ranges::equal(lower, (std::string_view[]){"e", "l", "l", "o"}));
}
void
test02()
{
#if __cpp_lib_ranges_join_with
// Analogous test case from LWG 3698 for join_with_view
char const text[] = "Hello";
std::regex regex{"[a-z]"};
auto lower
= ranges::subrange(std::cregex_iterator(ranges::begin(text),
ranges::end(text),
regex),
std::cregex_iterator{})
| views::join_with(views::empty<std::sub_match<const char*>>)
| views::transform([](auto const& sm) {
return std::string_view(sm.first, sm.second);
});
VERIFY( ranges::equal(lower, (std::string_view[]){"e", "l", "l", "o"}));
#endif
}
void
test03()
{
// Test case from LWG 3700
auto r = views::iota(0, 5) | views::split(1);
auto s = views::single(r);
auto j = s | views::join;
auto f = j.front();
}
void
test04()
{
#if __cpp_lib_ranges_join_with
// Analogous test case from LWG 3700 for join_with_view
auto r = views::iota(0, 5) | views::split(1);
auto s = views::single(r);
auto j = s | views::join_with(views::empty<ranges::range_value_t<decltype(r)>>);
auto f = j.front();
#endif
}
void
test05()
{
// Test case from LWG 3791
std::vector<std::vector<int>> v = {{1}};
auto r = v
| views::transform([](auto& x) -> auto&& { return std::move(x); })
| views::join;
auto e = --r.end();
}
void
test06()
{
#if __cpp_lib_ranges_join_with
// Analogous test case from LWG 3791 for join_with_view
std::vector<std::vector<int>> v = {{1}};
auto r = v
| views::transform([](auto& x) -> auto&& { return std::move(x); })
| views::join_with(views::empty<int>);
auto e = --r.end();
#endif
}
int
main()
{
test01();
test02();
test03();
test04();
test05();
test06();
}