// { dg-do run { target c++23 } } #include #include #include #include #include #include #include #include struct Gt { template bool operator()(T const& l, U const & r) { return l > r; } }; template> constexpr void do_test(Cmp cmp = Cmp()) { // The queue's value_type. using V = typename Cont::value_type; // The range's value_type. using T = std::ranges::range_value_t; T a[]{1,2,3,4,5,6,7,8,9}; auto eq = [&](std::priority_queue l, std::span r) { if (l.size() != r.size()) return false; std::vector s(r.begin(), r.end()); std::ranges::sort(s, cmp); for (auto const& v : s | std::views::reverse) { if (v != l.top()) return false; l.pop(); } return true; }; std::priority_queue pq(std::from_range, Range(a, a+0)); pq.push_range(Range(a, a+0)); VERIFY( pq.empty() ); pq.push_range(Range(a, a+4)); VERIFY( eq(pq, {a, 4}) ); pq.push_range(Range(a+4, a+9)); VERIFY( eq(pq, {a, 9}) ); } template> struct NoAppendRangeCont : std::vector { template void append_range(R&&) = delete; }; template void do_test_c() { do_test>(); do_test, Gt>(); do_test>(); do_test>(); } bool test_ranges() { using namespace __gnu_test; do_test_c>(); do_test_c>(); do_test_c>(); return true; } int main() { test_ranges(); }