Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Conditionally Borrowed Ranges #1877

Merged
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions stl/inc/ranges
Original file line number Diff line number Diff line change
Expand Up @@ -1988,6 +1988,9 @@ namespace ranges {
template <class _Rng>
take_view(_Rng&&, range_difference_t<_Rng>) -> take_view<views::all_t<_Rng>>;

template <class _Rng>
inline constexpr bool enable_borrowed_range<take_view<_Rng>> = enable_borrowed_range<_Rng>;

namespace views {
// VARIABLE views::take
template <class>
Expand Down Expand Up @@ -2394,6 +2397,9 @@ namespace ranges {
template <class _Rng>
drop_view(_Rng&&, range_difference_t<_Rng>) -> drop_view<views::all_t<_Rng>>;

template <class _Rng>
inline constexpr bool enable_borrowed_range<drop_view<_Rng>> = enable_borrowed_range<_Rng>;

namespace views {
// VARIABLE views::drop
class _Drop_fn {
Expand Down Expand Up @@ -2550,6 +2556,9 @@ namespace ranges {
template <class _Rng, class _Pr>
drop_while_view(_Rng&&, _Pr) -> drop_while_view<views::all_t<_Rng>, _Pr>;

template <class _Rng, class _Pr>
inline constexpr bool enable_borrowed_range<drop_while_view<_Rng, _Pr>> = enable_borrowed_range<_Rng>;

namespace views {
// VARIABLE views::drop_while
class _Drop_while_fn {
Expand Down Expand Up @@ -3502,6 +3511,9 @@ namespace ranges {
template <class _Rng>
common_view(_Rng&&) -> common_view<views::all_t<_Rng>>;

template <class _Rng>
inline constexpr bool enable_borrowed_range<common_view<_Rng>> = enable_borrowed_range<_Rng>;

namespace views {
// VARIABLE views::common
class _Common_fn : public _Pipe::_Base<_Common_fn> {
Expand Down Expand Up @@ -3614,6 +3626,9 @@ namespace ranges {
template <class _Rng>
reverse_view(_Rng&&) -> reverse_view<views::all_t<_Rng>>;

template <class _Rng>
inline constexpr bool enable_borrowed_range<reverse_view<_Rng>> = enable_borrowed_range<_Rng>;

namespace views {
// VARIABLE views::reverse
template <class _Rng>
Expand Down Expand Up @@ -4042,6 +4057,9 @@ namespace ranges {
}
};

template <class _Rng, size_t _Index>
inline constexpr bool enable_borrowed_range<elements_view<_Rng, _Index>> = enable_borrowed_range<_Rng>;

template <class _Rng>
using keys_view = elements_view<views::all_t<_Rng>, 0>;
template <class _Rng>
Expand Down
1 change: 1 addition & 0 deletions stl/inc/yvals_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,7 @@
// P1976R2 Explicit Constructors For Fixed-Extent span From Dynamic-Extent Ranges
// P1983R0 Fixing Minor Ranges Issues
// P1994R1 elements_view Needs Its Own sentinel
// P2017R1 Conditionally Borrowed Ranges
// P2091R0 Fixing Issues With Range Access CPOs
// P2102R0 Making "Implicit Expression Variations" More Explicit
// P2106R0 Range Algorithm Result Types
Expand Down
9 changes: 6 additions & 3 deletions tests/std/tests/P0896R4_views_common/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) {
using ranges::common_view, ranges::bidirectional_range, ranges::common_range, ranges::contiguous_range,
ranges::enable_borrowed_range, ranges::forward_range, ranges::input_range, ranges::iterator_t, ranges::prev,
ranges::random_access_range, ranges::range, ranges::range_reference_t, ranges::size, ranges::sized_range,
ranges::range_size_t;
ranges::range_size_t, ranges::borrowed_range;

constexpr bool is_view = ranges::view<remove_cvref_t<Rng>>;
using V = views::all_t<Rng>;
Expand Down Expand Up @@ -316,8 +316,8 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) {
}

// Validate view_interface::data
static_assert(!CanData<R>);
static_assert(!CanData<const R>);
static_assert(CanData<R> == contiguous_range<R>);
static_assert(CanData<const R> == contiguous_range<const R>);
if (!is_constant_evaluated() && !is_empty) {
// Validate view_interface::operator[]
if constexpr (CanIndex<R>) {
Expand Down Expand Up @@ -362,6 +362,9 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) {
if (!is_empty) {
assert(*b2.begin() == *begin(expected));
}

// Validate borrowed_range
static_assert(borrowed_range<R> == borrowed_range<V>);
}

return true;
Expand Down
16 changes: 15 additions & 1 deletion tests/std/tests/P0896R4_views_drop/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ concept CanViewDrop = requires(Rng&& r) {
template <ranges::input_range Rng, ranges::random_access_range Expected>
constexpr bool test_one(Rng&& rng, Expected&& expected) {
using ranges::drop_view, ranges::common_range, ranges::enable_borrowed_range, ranges::iterator_t, ranges::prev,
ranges::range, ranges::sentinel_t, ranges::sized_range;
ranges::range, ranges::sentinel_t, ranges::sized_range, ranges::borrowed_range;
using ranges::input_range, ranges::forward_range, ranges::bidirectional_range, ranges::random_access_range,
ranges::contiguous_range;

Expand Down Expand Up @@ -209,6 +209,7 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) {
STATIC_ASSERT(bidirectional_range<R> == bidirectional_range<Rng>);
STATIC_ASSERT(random_access_range<R> == random_access_range<Rng>);
STATIC_ASSERT(contiguous_range<R> == contiguous_range<Rng>);
STATIC_ASSERT(borrowed_range<R> == borrowed_range<V>);

// Validate drop_view::size
STATIC_ASSERT(CanMemberSize<R> == CanSize<Rng>);
Expand Down Expand Up @@ -516,4 +517,17 @@ int main() {

STATIC_ASSERT((instantiation_test(), true));
instantiation_test();

{
// Validate a non-view borrowed range
constexpr span s{some_ints};
STATIC_ASSERT(test_one(s, only_four_ints));
test_one(s, only_four_ints);

// Validate a view borrowed range
constexpr auto v =
views::iota(0ull, ranges::size(some_ints)) | views::transform([](auto i) { return some_ints[i]; });
STATIC_ASSERT(test_one(v, only_four_ints));
test_one(v, only_four_ints);
}
}
3 changes: 2 additions & 1 deletion tests/std/tests/P0896R4_views_drop_while/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ template <ranges::input_range Rng, ranges::random_access_range Expected>
constexpr bool test_one(Rng&& rng, Expected&& expected) {
using ranges::drop_while_view, ranges::bidirectional_range, ranges::common_range, ranges::contiguous_range,
ranges::enable_borrowed_range, ranges::forward_range, ranges::iterator_t, ranges::prev,
ranges::random_access_range;
ranges::random_access_range, ranges::borrowed_range;

constexpr bool is_view = ranges::view<remove_cvref_t<Rng>>;

Expand All @@ -48,6 +48,7 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) {
STATIC_ASSERT(bidirectional_range<R> == bidirectional_range<Rng>);
STATIC_ASSERT(random_access_range<R> == random_access_range<Rng>);
STATIC_ASSERT(contiguous_range<R> == contiguous_range<Rng>);
STATIC_ASSERT(borrowed_range<R> == borrowed_range<Rng>);

// Validate range adaptor object and range adaptor closure
constexpr auto closure = views::drop_while(is_less_than<3>);
Expand Down
4 changes: 3 additions & 1 deletion tests/std/tests/P0896R4_views_elements/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ template <ranges::input_range Rng>
constexpr bool test_one(Rng&& rng) {
using ranges::elements_view, ranges::bidirectional_range, ranges::common_range, ranges::contiguous_range,
ranges::enable_borrowed_range, ranges::forward_range, ranges::input_range, ranges::iterator_t, ranges::prev,
ranges::random_access_range, ranges::range, ranges::range_reference_t, ranges::sentinel_t;
ranges::random_access_range, ranges::range, ranges::range_reference_t, ranges::sentinel_t,
ranges::borrowed_range;

using V = views::all_t<Rng>;
using R = elements_view<V, 0>;
Expand All @@ -46,6 +47,7 @@ constexpr bool test_one(Rng&& rng) {
STATIC_ASSERT(bidirectional_range<R> == bidirectional_range<Rng>);
STATIC_ASSERT(random_access_range<R> == random_access_range<Rng>);
STATIC_ASSERT(!contiguous_range<R>);
STATIC_ASSERT(borrowed_range<R> == borrowed_range<Rng>);

// ... with lvalue argument
STATIC_ASSERT(CanViewElements<Rng&>);
Expand Down
3 changes: 2 additions & 1 deletion tests/std/tests/P0896R4_views_reverse/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ template <ranges::bidirectional_range Rng, class Expected>
constexpr bool test_one(Rng&& rng, Expected&& expected) {
using ranges::common_range, ranges::reverse_view, ranges::sized_range, ranges::begin, ranges::end, ranges::size,
ranges::iterator_t, ranges::range_size_t, ranges::random_access_range, ranges::prev,
ranges::enable_borrowed_range;
ranges::enable_borrowed_range, ranges::borrowed_range;
constexpr bool is_view = ranges::view<remove_cvref_t<Rng>>;

using V = views::all_t<Rng>;
Expand All @@ -35,6 +35,7 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) {
static_assert(ranges::bidirectional_range<R>);
static_assert(random_access_range<R> == random_access_range<Rng>);
static_assert(!ranges::contiguous_range<R>);
static_assert(borrowed_range<R> == borrowed_range<Rng>);

// Validate range adapter object
// ...with lvalue argument
Expand Down
16 changes: 15 additions & 1 deletion tests/std/tests/P0896R4_views_take/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ concept CanViewTake = requires(Rng&& r) {
template <ranges::input_range Rng, ranges::random_access_range Expected>
constexpr bool test_one(Rng&& rng, Expected&& expected) {
using ranges::input_range, ranges::forward_range, ranges::bidirectional_range, ranges::random_access_range,
ranges::contiguous_range;
ranges::contiguous_range, ranges::borrowed_range;
using ranges::take_view, ranges::common_range, ranges::enable_borrowed_range, ranges::iterator_t, ranges::prev,
ranges::range, ranges::sentinel_t, ranges::sized_range;

Expand Down Expand Up @@ -208,6 +208,7 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) {
STATIC_ASSERT(bidirectional_range<R> == bidirectional_range<Rng>);
STATIC_ASSERT(random_access_range<R> == random_access_range<Rng>);
STATIC_ASSERT(contiguous_range<R> == contiguous_range<Rng>);
STATIC_ASSERT(borrowed_range<R> == borrowed_range<V>);

// Validate take_view::size
STATIC_ASSERT(CanMemberSize<R> == CanSize<Rng>);
Expand Down Expand Up @@ -558,4 +559,17 @@ int main() {

STATIC_ASSERT((instantiation_test(), true));
instantiation_test();

{
// Validate a non-view borrowed range
constexpr span s{some_ints};
STATIC_ASSERT(test_one(s, only_four_ints));
test_one(s, only_four_ints);

// Validate a view borrowed range
constexpr auto v =
views::iota(0ull, ranges::size(some_ints)) | views::transform([](auto i) { return some_ints[i]; });
STATIC_ASSERT(test_one(v, only_four_ints));
test_one(v, only_four_ints);
}
}