1fe6060f1SDimitry Andric// -*- C++ -*- 2*349cc55cSDimitry Andric//===----------------------------------------------------------------------===// 3fe6060f1SDimitry Andric// 4fe6060f1SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5fe6060f1SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 6fe6060f1SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7fe6060f1SDimitry Andric// 8fe6060f1SDimitry Andric//===----------------------------------------------------------------------===// 9fe6060f1SDimitry Andric 10fe6060f1SDimitry Andric#ifndef _LIBCPP_RANGES 11fe6060f1SDimitry Andric#define _LIBCPP_RANGES 12fe6060f1SDimitry Andric 13fe6060f1SDimitry Andric/* 14fe6060f1SDimitry Andric 15fe6060f1SDimitry Andric#include <compare> // see [compare.syn] 16fe6060f1SDimitry Andric#include <initializer_list> // see [initializer.list.syn] 17fe6060f1SDimitry Andric#include <iterator> // see [iterator.synopsis] 18fe6060f1SDimitry Andric 19fe6060f1SDimitry Andricnamespace std::ranges { 20fe6060f1SDimitry Andric inline namespace unspecified { 21fe6060f1SDimitry Andric // [range.access], range access 22fe6060f1SDimitry Andric inline constexpr unspecified begin = unspecified; 23fe6060f1SDimitry Andric inline constexpr unspecified end = unspecified; 24fe6060f1SDimitry Andric inline constexpr unspecified cbegin = unspecified; 25fe6060f1SDimitry Andric inline constexpr unspecified cend = unspecified; 26fe6060f1SDimitry Andric 27fe6060f1SDimitry Andric inline constexpr unspecified size = unspecified; 28fe6060f1SDimitry Andric inline constexpr unspecified ssize = unspecified; 29fe6060f1SDimitry Andric } 30fe6060f1SDimitry Andric 31fe6060f1SDimitry Andric // [range.range], ranges 32fe6060f1SDimitry Andric template<class T> 33fe6060f1SDimitry Andric concept range = see below; 34fe6060f1SDimitry Andric 35fe6060f1SDimitry Andric template<class T> 36fe6060f1SDimitry Andric inline constexpr bool enable_borrowed_range = false; 37fe6060f1SDimitry Andric 38fe6060f1SDimitry Andric template<class T> 39fe6060f1SDimitry Andric using iterator_t = decltype(ranges::begin(declval<R&>())); 40fe6060f1SDimitry Andric template<range R> 41fe6060f1SDimitry Andric using sentinel_t = decltype(ranges::end(declval<R&>())); 42fe6060f1SDimitry Andric template<range R> 43fe6060f1SDimitry Andric using range_difference_t = iter_difference_t<iterator_t<R>>; 44fe6060f1SDimitry Andric template<sized_range R> 45fe6060f1SDimitry Andric using range_size_t = decltype(ranges::size(declval<R&>())); 46fe6060f1SDimitry Andric template<range R> 47fe6060f1SDimitry Andric using range_value_t = iter_value_t<iterator_t<R>>; 48fe6060f1SDimitry Andric template<range R> 49fe6060f1SDimitry Andric using range_reference_t = iter_reference_t<iterator_t<R>>; 50fe6060f1SDimitry Andric template<range R> 51fe6060f1SDimitry Andric using range_rvalue_reference_t = iter_rvalue_reference_t<iterator_t<R>>; 52fe6060f1SDimitry Andric 53fe6060f1SDimitry Andric // [range.sized], sized ranges 54fe6060f1SDimitry Andric template<class> 55fe6060f1SDimitry Andric inline constexpr bool disable_sized_range = false; 56fe6060f1SDimitry Andric 57fe6060f1SDimitry Andric template<class T> 58fe6060f1SDimitry Andric concept sized_range = ...; 59fe6060f1SDimitry Andric 60fe6060f1SDimitry Andric // [range.view], views 61fe6060f1SDimitry Andric template<class T> 62fe6060f1SDimitry Andric inline constexpr bool enable_view = ...; 63fe6060f1SDimitry Andric 64fe6060f1SDimitry Andric struct view_base { }; 65fe6060f1SDimitry Andric 66fe6060f1SDimitry Andric template<class T> 67fe6060f1SDimitry Andric concept view = ...; 68fe6060f1SDimitry Andric 69fe6060f1SDimitry Andric // [range.refinements], other range refinements 70fe6060f1SDimitry Andric template<class R, class T> 71fe6060f1SDimitry Andric concept output_range = see below; 72fe6060f1SDimitry Andric 73fe6060f1SDimitry Andric template<class T> 74fe6060f1SDimitry Andric concept input_range = see below; 75fe6060f1SDimitry Andric 76fe6060f1SDimitry Andric template<class T> 77fe6060f1SDimitry Andric concept forward_range = see below; 78fe6060f1SDimitry Andric 79fe6060f1SDimitry Andric template<class T> 80fe6060f1SDimitry Andric concept bidirectional_range = see below; 81fe6060f1SDimitry Andric 82fe6060f1SDimitry Andric template<class T> 83fe6060f1SDimitry Andric concept random_access_range = see below; 84fe6060f1SDimitry Andric 85fe6060f1SDimitry Andric template<class T> 86fe6060f1SDimitry Andric concept contiguous_range = see below; 87fe6060f1SDimitry Andric 88fe6060f1SDimitry Andric template <class _Tp> 89fe6060f1SDimitry Andric concept common_range = see below; 90fe6060f1SDimitry Andric 91fe6060f1SDimitry Andric template<class T> 92fe6060f1SDimitry Andric concept viewable_range = see below; 93fe6060f1SDimitry Andric 94fe6060f1SDimitry Andric // [view.interface], class template view_interface 95fe6060f1SDimitry Andric template<class D> 96fe6060f1SDimitry Andric requires is_class_v<D> && same_as<D, remove_cv_t<D>> 97fe6060f1SDimitry Andric class view_interface; 98fe6060f1SDimitry Andric 99fe6060f1SDimitry Andric // [range.subrange], sub-ranges 100fe6060f1SDimitry Andric enum class subrange_kind : bool { unsized, sized }; 101fe6060f1SDimitry Andric 102fe6060f1SDimitry Andric template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K = see below> 103fe6060f1SDimitry Andric requires (K == subrange_kind::sized || !sized_sentinel_for<S, I>) 104fe6060f1SDimitry Andric class subrange; 105fe6060f1SDimitry Andric 106fe6060f1SDimitry Andric template<class I, class S, subrange_kind K> 107fe6060f1SDimitry Andric inline constexpr bool enable_borrowed_range<subrange<I, S, K>> = true; 108fe6060f1SDimitry Andric 109fe6060f1SDimitry Andric // [range.dangling], dangling iterator handling 110fe6060f1SDimitry Andric struct dangling; 111fe6060f1SDimitry Andric 112fe6060f1SDimitry Andric template<range R> 113fe6060f1SDimitry Andric using borrowed_iterator_t = see below; 114fe6060f1SDimitry Andric 115fe6060f1SDimitry Andric template<range R> 116fe6060f1SDimitry Andric using borrowed_subrange_t = see below; 117fe6060f1SDimitry Andric 118fe6060f1SDimitry Andric // [range.empty], empty view 119fe6060f1SDimitry Andric template<class T> 120fe6060f1SDimitry Andric requires is_object_v<T> 121fe6060f1SDimitry Andric class empty_view; 122fe6060f1SDimitry Andric 123fe6060f1SDimitry Andric // [range.all], all view 124fe6060f1SDimitry Andric namespace views { 125fe6060f1SDimitry Andric inline constexpr unspecified all = unspecified; 126fe6060f1SDimitry Andric 127fe6060f1SDimitry Andric template<viewable_range R> 128fe6060f1SDimitry Andric using all_t = decltype(all(declval<R>())); 129fe6060f1SDimitry Andric } 130fe6060f1SDimitry Andric 131fe6060f1SDimitry Andric template<range R> 132fe6060f1SDimitry Andric requires is_object_v<R> 133fe6060f1SDimitry Andric class ref_view; 134fe6060f1SDimitry Andric 135fe6060f1SDimitry Andric template<class T> 136fe6060f1SDimitry Andric inline constexpr bool enable_borrowed_range<ref_view<T>> = true; 137fe6060f1SDimitry Andric 138fe6060f1SDimitry Andric // [range.drop], drop view 139fe6060f1SDimitry Andric template<view V> 140fe6060f1SDimitry Andric class drop_view; 141fe6060f1SDimitry Andric 142fe6060f1SDimitry Andric template<class T> 143fe6060f1SDimitry Andric inline constexpr bool enable_borrowed_range<drop_view<T>> = enable_borrowed_range<T>; 144fe6060f1SDimitry Andric 145fe6060f1SDimitry Andric // [range.transform], transform view 146fe6060f1SDimitry Andric template<input_range V, copy_constructible F> 147fe6060f1SDimitry Andric requires view<V> && is_object_v<F> && 148fe6060f1SDimitry Andric regular_invocable<F&, range_reference_t<V>> && 149fe6060f1SDimitry Andric can-reference<invoke_result_t<F&, range_reference_t<V>>> 150fe6060f1SDimitry Andric class transform_view; 151fe6060f1SDimitry Andric 152*349cc55cSDimitry Andric // [range.counted], counted view 153*349cc55cSDimitry Andric namespace views { inline constexpr unspecified counted = unspecified; } 154*349cc55cSDimitry Andric 155fe6060f1SDimitry Andric // [range.common], common view 156fe6060f1SDimitry Andric template<view V> 157fe6060f1SDimitry Andric requires (!common_range<V> && copyable<iterator_t<V>>) 158fe6060f1SDimitry Andric class common_view; 159fe6060f1SDimitry Andric 160*349cc55cSDimitry Andric // [range.reverse], reverse view 161*349cc55cSDimitry Andric template<view V> 162*349cc55cSDimitry Andric requires bidirectional_range<V> 163*349cc55cSDimitry Andric class reverse_view; 164*349cc55cSDimitry Andric 165*349cc55cSDimitry Andric template<class T> 166*349cc55cSDimitry Andric inline constexpr bool enable_borrowed_range<reverse_view<T>> = enable_borrowed_range<T>; 167*349cc55cSDimitry Andric 168fe6060f1SDimitry Andric template<class T> 169fe6060f1SDimitry Andric inline constexpr bool enable_borrowed_range<common_view<T>> = enable_borrowed_range<T>; 170*349cc55cSDimitry Andric 171*349cc55cSDimitry Andric // [range.take], take view 172*349cc55cSDimitry Andric template<view> class take_view; 173*349cc55cSDimitry Andric 174*349cc55cSDimitry Andric template<class T> 175*349cc55cSDimitry Andric inline constexpr bool enable_borrowed_range<take_view<T>> = enable_borrowed_range<T>; 176*349cc55cSDimitry Andric 177*349cc55cSDimitry Andric template<copy_constructible T> 178*349cc55cSDimitry Andric requires is_object_v<T> 179*349cc55cSDimitry Andric class single_view; 180*349cc55cSDimitry Andric 181*349cc55cSDimitry Andric template<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t> 182*349cc55cSDimitry Andric requires weakly-equality-comparable-with<W, Bound> && copyable<W> 183*349cc55cSDimitry Andric class iota_view; 184*349cc55cSDimitry Andric 185*349cc55cSDimitry Andric template<class W, class Bound> 186*349cc55cSDimitry Andric inline constexpr bool enable_borrowed_range<iota_view<W, Bound>> = true; 187*349cc55cSDimitry Andric 188*349cc55cSDimitry Andric // [range.join], join view 189*349cc55cSDimitry Andric template<input_range V> 190*349cc55cSDimitry Andric requires view<V> && input_range<range_reference_t<V>> 191*349cc55cSDimitry Andric class join_view; 192fe6060f1SDimitry Andric} 193fe6060f1SDimitry Andric 194fe6060f1SDimitry Andric*/ 195fe6060f1SDimitry Andric 196*349cc55cSDimitry Andric// Make sure all feature-test macros are available. 1976e75b2fbSDimitry Andric#include <version> 198*349cc55cSDimitry Andric// Enable the contents of the header only when libc++ was built with LIBCXX_ENABLE_INCOMPLETE_FEATURES. 1996e75b2fbSDimitry Andric#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES) 2006e75b2fbSDimitry Andric 201fe6060f1SDimitry Andric#include <__config> 202fe6060f1SDimitry Andric#include <__ranges/access.h> 203fe6060f1SDimitry Andric#include <__ranges/all.h> 204fe6060f1SDimitry Andric#include <__ranges/common_view.h> 205fe6060f1SDimitry Andric#include <__ranges/concepts.h> 206*349cc55cSDimitry Andric#include <__ranges/counted.h> 207fe6060f1SDimitry Andric#include <__ranges/dangling.h> 208fe6060f1SDimitry Andric#include <__ranges/data.h> 209fe6060f1SDimitry Andric#include <__ranges/drop_view.h> 210fe6060f1SDimitry Andric#include <__ranges/empty_view.h> 211*349cc55cSDimitry Andric#include <__ranges/empty.h> 212fe6060f1SDimitry Andric#include <__ranges/enable_borrowed_range.h> 213fe6060f1SDimitry Andric#include <__ranges/enable_view.h> 214*349cc55cSDimitry Andric#include <__ranges/iota_view.h> 215*349cc55cSDimitry Andric#include <__ranges/join_view.h> 216fe6060f1SDimitry Andric#include <__ranges/ref_view.h> 217*349cc55cSDimitry Andric#include <__ranges/reverse_view.h> 218*349cc55cSDimitry Andric#include <__ranges/single_view.h> 219fe6060f1SDimitry Andric#include <__ranges/size.h> 220fe6060f1SDimitry Andric#include <__ranges/subrange.h> 221*349cc55cSDimitry Andric#include <__ranges/take_view.h> 222fe6060f1SDimitry Andric#include <__ranges/transform_view.h> 223fe6060f1SDimitry Andric#include <__ranges/view_interface.h> 224fe6060f1SDimitry Andric#include <compare> // Required by the standard. 225fe6060f1SDimitry Andric#include <initializer_list> // Required by the standard. 226fe6060f1SDimitry Andric#include <iterator> // Required by the standard. 227fe6060f1SDimitry Andric#include <type_traits> 228fe6060f1SDimitry Andric 229fe6060f1SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 230fe6060f1SDimitry Andric#pragma GCC system_header 231fe6060f1SDimitry Andric#endif 232fe6060f1SDimitry Andric 233fe6060f1SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 234fe6060f1SDimitry Andric 235fe6060f1SDimitry Andric#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_RANGES) 236fe6060f1SDimitry Andric 237*349cc55cSDimitry Andricnamespace views = ranges::views; 238*349cc55cSDimitry Andric 239fe6060f1SDimitry Andric#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_RANGES) 240fe6060f1SDimitry Andric 241fe6060f1SDimitry Andric_LIBCPP_END_NAMESPACE_STD 242fe6060f1SDimitry Andric 2436e75b2fbSDimitry Andric#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES) 2446e75b2fbSDimitry Andric 245fe6060f1SDimitry Andric#endif // _LIBCPP_RANGES 246