[libc++] Implements ranges::enable_borrowed_range
This is the initial patch to implement ranges in libc++.
Implements parts of:
- P0896R4 One Ranges Proposal
- P1870 forwarding-range is too subtle
- LWG3379 in several library names is misleading
Reviewed By: ldionne, #libc, cjdb, zoecarver, Quuxplusone
Differential Revision: https://reviews.llvm.org/D90999
GitOrigin-RevId: 01ace074fcb6a497fc16b1578fc10480dc7d563d
diff --git a/include/span b/include/span
index 4f63d0a..b475740 100644
--- a/include/span
+++ b/include/span
@@ -22,6 +22,9 @@
template <class ElementType, size_t Extent = dynamic_extent>
class span;
+template<class ElementType, size_t Extent>
+ inline constexpr bool ranges::enable_borrowed_range<span<ElementType, Extent>> = true;
+
// [span.objectrep], views of object representation
template <class ElementType, size_t Extent>
span<const byte, ((Extent == dynamic_extent) ? dynamic_extent :
@@ -32,7 +35,6 @@
(sizeof(ElementType) * Extent))> as_writable_bytes(span<ElementType, Extent> s) noexcept;
-namespace std {
template <class ElementType, size_t Extent = dynamic_extent>
class span {
public:
@@ -123,6 +125,7 @@
*/
#include <__config>
+#include <__ranges/enable_borrowed_range.h>
#include <array> // for array
#include <cstddef> // for byte
#include <iterator> // for iterators
@@ -516,6 +519,11 @@
size_type __size;
};
+#if !defined(_LIBCPP_HAS_NO_RANGES)
+template <class _Tp, size_t _Extent>
+inline constexpr bool ranges::enable_borrowed_range<span<_Tp, _Extent> > = true;
+#endif // !defined(_LIBCPP_HAS_NO_RANGES)
+
// as_bytes & as_writable_bytes
template <class _Tp, size_t _Extent>
_LIBCPP_INLINE_VISIBILITY