diff --git a/libcxx/include/__ranges/concepts.h b/libcxx/include/__ranges/concepts.h --- a/libcxx/include/__ranges/concepts.h +++ b/libcxx/include/__ranges/concepts.h @@ -12,6 +12,7 @@ #include <__config> #include <__iterator/concepts.h> #include <__ranges/access.h> +#include <__ranges/data.h> #include <__ranges/enable_view.h> #include <__ranges/size.h> #include @@ -95,6 +96,14 @@ concept random_access_range = bidirectional_range<_Tp> && random_access_iterator >; + template + concept contiguous_range = + random_access_range<_Tp> && + contiguous_iterator> && + requires(_Tp& __t) { + { ranges::data(__t) } -> same_as>>; + }; + template concept common_range = range<_Tp> && same_as, sentinel_t<_Tp> >; } // namespace ranges diff --git a/libcxx/include/__ranges/ref_view.h b/libcxx/include/__ranges/ref_view.h --- a/libcxx/include/__ranges/ref_view.h +++ b/libcxx/include/__ranges/ref_view.h @@ -58,9 +58,8 @@ requires sized_range<_Range> { return ranges::size(*__range_); } - // TODO: This needs to use contiguous_range. constexpr auto data() const - requires contiguous_iterator> + requires contiguous_range<_Range> { return ranges::data(*__range_); } }; diff --git a/libcxx/include/ranges b/libcxx/include/ranges --- a/libcxx/include/ranges +++ b/libcxx/include/ranges @@ -76,6 +76,12 @@ template concept bidirectional_range = see below; + template + concept random_access_range = see below; + + template + concept contiguous_range = see below; + template concept common_range = see below; diff --git a/libcxx/test/std/containers/sequences/array/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/array/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/array/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/array/range_concept_conformance.compile.pass.cpp @@ -24,6 +24,7 @@ static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); static_assert(stdr::random_access_range); +static_assert(stdr::contiguous_range); static_assert(stdr::sized_range); static_assert(!stdr::borrowed_range); @@ -31,5 +32,6 @@ static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); static_assert(stdr::random_access_range); +static_assert(stdr::contiguous_range); static_assert(stdr::sized_range); static_assert(!stdr::borrowed_range); diff --git a/libcxx/test/std/containers/sequences/deque/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/deque/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/deque/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/deque/range_concept_conformance.compile.pass.cpp @@ -23,6 +23,7 @@ static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); static_assert(stdr::random_access_range); +static_assert(!stdr::contiguous_range); static_assert(!stdr::view); static_assert(stdr::sized_range); static_assert(!stdr::borrowed_range); @@ -30,6 +31,7 @@ static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); static_assert(stdr::random_access_range); +static_assert(!stdr::contiguous_range); static_assert(!stdr::view); static_assert(stdr::sized_range); static_assert(!stdr::borrowed_range); diff --git a/libcxx/test/std/containers/sequences/vector.bool/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/vector.bool/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/vector.bool/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/vector.bool/range_concept_conformance.compile.pass.cpp @@ -23,6 +23,7 @@ static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); static_assert(stdr::random_access_range); +static_assert(!stdr::contiguous_range); static_assert(!stdr::view); static_assert(stdr::sized_range); static_assert(!stdr::borrowed_range); @@ -30,6 +31,7 @@ static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); static_assert(stdr::random_access_range); +static_assert(!stdr::contiguous_range); static_assert(!stdr::view); static_assert(stdr::sized_range); static_assert(!stdr::borrowed_range); diff --git a/libcxx/test/std/containers/sequences/vector/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/vector/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/vector/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/vector/range_concept_conformance.compile.pass.cpp @@ -23,6 +23,7 @@ static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); static_assert(stdr::random_access_range); +static_assert(stdr::contiguous_range); static_assert(!stdr::view); static_assert(stdr::sized_range); static_assert(!stdr::borrowed_range); @@ -30,6 +31,7 @@ static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); static_assert(stdr::random_access_range); +static_assert(stdr::contiguous_range); static_assert(!stdr::view); static_assert(stdr::sized_range); static_assert(!stdr::borrowed_range); diff --git a/libcxx/test/std/containers/views/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/views/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/views/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/views/range_concept_conformance.compile.pass.cpp @@ -23,6 +23,7 @@ static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); static_assert(stdr::random_access_range); +static_assert(stdr::contiguous_range); static_assert(stdr::view && stdr::enable_view); static_assert(stdr::sized_range); static_assert(stdr::borrowed_range); @@ -30,6 +31,7 @@ static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); static_assert(stdr::random_access_range); +static_assert(stdr::contiguous_range); static_assert(!stdr::view && !stdr::enable_view); static_assert(stdr::sized_range); static_assert(stdr::borrowed_range); diff --git a/libcxx/test/std/ranges/range.req/range.refinements/contiguous_range.compile.pass.cpp b/libcxx/test/std/ranges/range.req/range.refinements/contiguous_range.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/ranges/range.req/range.refinements/contiguous_range.compile.pass.cpp @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: libcpp-no-concepts +// UNSUPPORTED: gcc-10 + +// template +// concept contiguous_range; + +#include + +#include "test_range.h" +#include "test_iterators.h" + +namespace ranges = std::ranges; + +template