// { dg-do run { target c++23 } } #include #include #include #include #include template constexpr void do_test() { // The vector's value_type. using V = typename std::allocator_traits::value_type; using CT = std::char_traits; // The range's value_type. using T = std::ranges::range_value_t; T a[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}; auto eq = [](const std::basic_string& l, std::span r) { if (l.size() != r.size()) return false; for (auto i = 0u; i < l.size(); ++i) if (l[i] != r[i]) return false; return true; }; std::basic_string v; auto it = v.insert_range(v.end(), Range(a, a)); VERIFY( v.empty() ); VERIFY( it == v.begin() ); it = v.insert_range(v.end(), Range(a, a+4)); VERIFY( eq(v, {a, 4}) ); VERIFY( it == v.begin() ); it = v.insert_range(v.end(), Range(a+4, a+9)); VERIFY( eq(v, {a, 9}) ); VERIFY( it == v.begin()+4 ); std::basic_string s = v; it = v.insert_range(v.end(), Range(a+9, a+20)); VERIFY( eq(v, {a, 20}) ); VERIFY( it == v.begin()+9 ); v = std::basic_string(); it = v.insert_range(v.begin(), Range(a, a+5)); VERIFY( it == v.begin() ); s = v; it = v.insert_range(v.begin() + 5, Range(a+5, a+20)); VERIFY( eq(v, {a, 20}) ); VERIFY( it == v.begin()+5 ); } template constexpr void do_test_a() { do_test>(); do_test>(); do_test>(); do_test>(); } constexpr bool test_ranges() { using namespace __gnu_test; do_test_a>(); do_test_a>(); do_test_a>(); do_test_a>(); do_test_a>(); do_test_a>(); do_test_a>(); do_test_a>(); do_test_a>(); // Not lvalue-convertible to char struct C { constexpr C(char v) : val(v) { } constexpr operator char() && { return val; } constexpr bool operator==(char b) const { return b == val; } char val; }; using rvalue_input_range = test_range; do_test>(); return true; } void test_overlapping() { std::string const s = "1234abcd"; std::string c = s; c.insert_range(c.end(), std::string_view(c)); VERIFY( c == "1234abcd1234abcd" ); c = s; c.insert_range(c.begin()+4, std::string_view(c).substr(4, 4)); VERIFY( c == "1234abcdabcd" ); c = s; c.reserve(12); c.insert_range(c.begin()+2, std::string_view(c).substr(0, 4)); VERIFY( c == "12123434abcd" ); } int main() { test_ranges(); test_overlapping(); #if _GLIBCXX_USE_CXX11_ABI static_assert( test_ranges() ); #endif // _GLIBCXX_USE_CXX11_ABI }