101ace074SMark de Wever// -*- C++ -*- 2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===// 301ace074SMark de Wever// 401ace074SMark de Wever// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 501ace074SMark de Wever// See https://llvm.org/LICENSE.txt for license information. 601ace074SMark de Wever// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 701ace074SMark de Wever// 801ace074SMark de Wever//===----------------------------------------------------------------------===// 901ace074SMark de Wever 1001ace074SMark de Wever#ifndef _LIBCPP_RANGES 1101ace074SMark de Wever#define _LIBCPP_RANGES 1201ace074SMark de Wever 1301ace074SMark de Wever/* 1401ace074SMark de Wever 1501ace074SMark de Wever#include <compare> // see [compare.syn] 1601ace074SMark de Wever#include <initializer_list> // see [initializer.list.syn] 1701ace074SMark de Wever#include <iterator> // see [iterator.synopsis] 1801ace074SMark de Wever 1901ace074SMark de Wevernamespace std::ranges { 205a3309f8SChristopher Di Bella inline namespace unspecified { 215a3309f8SChristopher Di Bella // [range.access], range access 225a3309f8SChristopher Di Bella inline constexpr unspecified begin = unspecified; 235a3309f8SChristopher Di Bella inline constexpr unspecified end = unspecified; 245a3309f8SChristopher Di Bella inline constexpr unspecified cbegin = unspecified; 255a3309f8SChristopher Di Bella inline constexpr unspecified cend = unspecified; 26600686d7Szoecarver 27600686d7Szoecarver inline constexpr unspecified size = unspecified; 286f1b10dfSzoecarver inline constexpr unspecified ssize = unspecified; 295a3309f8SChristopher Di Bella } 305a3309f8SChristopher Di Bella 3101ace074SMark de Wever // [range.range], ranges 3201ace074SMark de Wever template<class T> 337c177315SChristopher Di Bella concept range = see below; 347c177315SChristopher Di Bella 357c177315SChristopher Di Bella template<class T> 3601ace074SMark de Wever inline constexpr bool enable_borrowed_range = false; 375a3309f8SChristopher Di Bella 385a3309f8SChristopher Di Bella template<class T> 39dca681feSJoe Loser using iterator_t = decltype(ranges::begin(declval<T&>())); 407c177315SChristopher Di Bella template<range R> 417c177315SChristopher Di Bella using sentinel_t = decltype(ranges::end(declval<R&>())); 427c177315SChristopher Di Bella template<range R> 437c177315SChristopher Di Bella using range_difference_t = iter_difference_t<iterator_t<R>>; 44fbaf7f0bSLouis Dionne template<sized_range R> 45fbaf7f0bSLouis Dionne using range_size_t = decltype(ranges::size(declval<R&>())); 467c177315SChristopher Di Bella template<range R> 477c177315SChristopher Di Bella using range_value_t = iter_value_t<iterator_t<R>>; 487c177315SChristopher Di Bella template<range R> 497c177315SChristopher Di Bella using range_reference_t = iter_reference_t<iterator_t<R>>; 507c177315SChristopher Di Bella template<range R> 517c177315SChristopher Di Bella using range_rvalue_reference_t = iter_rvalue_reference_t<iterator_t<R>>; 527c177315SChristopher Di Bella 533001b48dSLouis Dionne // [range.sized], sized ranges 54d8fad661SChristopher Di Bella template<class> 55d8fad661SChristopher Di Bella inline constexpr bool disable_sized_range = false; 56d8fad661SChristopher Di Bella 57d8fad661SChristopher Di Bella template<class T> 58d8fad661SChristopher Di Bella concept sized_range = ...; 59d8fad661SChristopher Di Bella 602021d272SLouis Dionne // [range.view], views 612021d272SLouis Dionne template<class T> 622021d272SLouis Dionne inline constexpr bool enable_view = ...; 632021d272SLouis Dionne 642021d272SLouis Dionne struct view_base { }; 652021d272SLouis Dionne 662021d272SLouis Dionne template<class T> 672021d272SLouis Dionne concept view = ...; 682021d272SLouis Dionne 697c177315SChristopher Di Bella // [range.refinements], other range refinements 707b28c5d3SLouis Dionne template<class R, class T> 717b28c5d3SLouis Dionne concept output_range = see below; 727b28c5d3SLouis Dionne 73c05d1eedSChristopher Di Bella template<class T> 74c05d1eedSChristopher Di Bella concept input_range = see below; 75c05d1eedSChristopher Di Bella 76fa3e2626SChristopher Di Bella template<class T> 77fa3e2626SChristopher Di Bella concept forward_range = see below; 78fa3e2626SChristopher Di Bella 799c5d86aaSChristopher Di Bella template<class T> 809c5d86aaSChristopher Di Bella concept bidirectional_range = see below; 819c5d86aaSChristopher Di Bella 8234503987Szoecarver template<class T> 8334503987Szoecarver concept random_access_range = see below; 8434503987Szoecarver 8534503987Szoecarver template<class T> 8634503987Szoecarver concept contiguous_range = see below; 8734503987Szoecarver 887c177315SChristopher Di Bella template <class _Tp> 897c177315SChristopher Di Bella concept common_range = see below; 905671ff20Szoecarver 913001b48dSLouis Dionne template<class T> 923001b48dSLouis Dionne concept viewable_range = see below; 933001b48dSLouis Dionne 945671ff20Szoecarver // [view.interface], class template view_interface 955671ff20Szoecarver template<class D> 965671ff20Szoecarver requires is_class_v<D> && same_as<D, remove_cv_t<D>> 975671ff20Szoecarver class view_interface; 98d31a2e75Szoecarver 99182ba8abSChristopher Di Bella // [range.subrange], sub-ranges 100182ba8abSChristopher Di Bella enum class subrange_kind : bool { unsized, sized }; 101182ba8abSChristopher Di Bella 102182ba8abSChristopher Di Bella template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K = see below> 103182ba8abSChristopher Di Bella requires (K == subrange_kind::sized || !sized_sentinel_for<S, I>) 104182ba8abSChristopher Di Bella class subrange; 105182ba8abSChristopher Di Bella 106182ba8abSChristopher Di Bella template<class I, class S, subrange_kind K> 107182ba8abSChristopher Di Bella inline constexpr bool enable_borrowed_range<subrange<I, S, K>> = true; 108182ba8abSChristopher Di Bella 10974fd3cb8SChristopher Di Bella // [range.dangling], dangling iterator handling 11074fd3cb8SChristopher Di Bella struct dangling; 11174fd3cb8SChristopher Di Bella 11274fd3cb8SChristopher Di Bella template<range R> 11374fd3cb8SChristopher Di Bella using borrowed_iterator_t = see below; 11474fd3cb8SChristopher Di Bella 11574fd3cb8SChristopher Di Bella template<range R> 11674fd3cb8SChristopher Di Bella using borrowed_subrange_t = see below; 11774fd3cb8SChristopher Di Bella 118d31a2e75Szoecarver // [range.empty], empty view 119d31a2e75Szoecarver template<class T> 120d31a2e75Szoecarver requires is_object_v<T> 121d31a2e75Szoecarver class empty_view; 12246afddecSzoecarver 123c00df57bSHui Xie template<class T> 124c00df57bSHui Xie inline constexpr bool enable_borrowed_range<empty_view<T>> = true; 125c00df57bSHui Xie 126c00df57bSHui Xie namespace views { 127c00df57bSHui Xie template<class T> 128c00df57bSHui Xie inline constexpr empty_view<T> empty{}; 129c00df57bSHui Xie } 130c00df57bSHui Xie 1313001b48dSLouis Dionne // [range.all], all view 1323001b48dSLouis Dionne namespace views { 1333001b48dSLouis Dionne inline constexpr unspecified all = unspecified; 1343001b48dSLouis Dionne 1353001b48dSLouis Dionne template<viewable_range R> 1363001b48dSLouis Dionne using all_t = decltype(all(declval<R>())); 1373001b48dSLouis Dionne } 1383001b48dSLouis Dionne 1393001b48dSLouis Dionne template<range R> 1403001b48dSLouis Dionne requires is_object_v<R> 1413001b48dSLouis Dionne class ref_view; 1423001b48dSLouis Dionne 1433001b48dSLouis Dionne template<class T> 1443001b48dSLouis Dionne inline constexpr bool enable_borrowed_range<ref_view<T>> = true; 1453001b48dSLouis Dionne 14667151d02SArthur O'Dwyer template<range R> 14767151d02SArthur O'Dwyer requires see below 14867151d02SArthur O'Dwyer class owning_view; 14967151d02SArthur O'Dwyer 15067151d02SArthur O'Dwyer template<class T> 15167151d02SArthur O'Dwyer inline constexpr bool enable_borrowed_range<owning_view<T>> = enable_borrowed_range<T>; 15267151d02SArthur O'Dwyer 1532b424f4eSLouis Dionne // [range.filter], filter view 1542b424f4eSLouis Dionne template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred> 1552b424f4eSLouis Dionne requires view<V> && is_object_v<Pred> 1562b424f4eSLouis Dionne class filter_view; 1572b424f4eSLouis Dionne 1582b424f4eSLouis Dionne namespace views { 1592b424f4eSLouis Dionne inline constexpr unspecified filter = unspecified; 1602b424f4eSLouis Dionne } 1612b424f4eSLouis Dionne 16246afddecSzoecarver // [range.drop], drop view 16346afddecSzoecarver template<view V> 16446afddecSzoecarver class drop_view; 16546afddecSzoecarver 16646afddecSzoecarver template<class T> 16746afddecSzoecarver inline constexpr bool enable_borrowed_range<drop_view<T>> = enable_borrowed_range<T>; 1680e09a41bSzoecarver 1690e09a41bSzoecarver // [range.transform], transform view 1700e09a41bSzoecarver template<input_range V, copy_constructible F> 1710e09a41bSzoecarver requires view<V> && is_object_v<F> && 1720e09a41bSzoecarver regular_invocable<F&, range_reference_t<V>> && 1730e09a41bSzoecarver can-reference<invoke_result_t<F&, range_reference_t<V>>> 1740e09a41bSzoecarver class transform_view; 1750e09a41bSzoecarver 176f9e58f35Szoecarver // [range.counted], counted view 177f9e58f35Szoecarver namespace views { inline constexpr unspecified counted = unspecified; } 178f9e58f35Szoecarver 179e5d8b93eSzoecarver // [range.common], common view 180e5d8b93eSzoecarver template<view V> 181e5d8b93eSzoecarver requires (!common_range<V> && copyable<iterator_t<V>>) 182e5d8b93eSzoecarver class common_view; 183e5d8b93eSzoecarver 1849d982c67Szoecarver // [range.reverse], reverse view 1859d982c67Szoecarver template<view V> 1869d982c67Szoecarver requires bidirectional_range<V> 1879d982c67Szoecarver class reverse_view; 1889d982c67Szoecarver 1899d982c67Szoecarver template<class T> 1909d982c67Szoecarver inline constexpr bool enable_borrowed_range<reverse_view<T>> = enable_borrowed_range<T>; 1919d982c67Szoecarver 192e5d8b93eSzoecarver template<class T> 193e5d8b93eSzoecarver inline constexpr bool enable_borrowed_range<common_view<T>> = enable_borrowed_range<T>; 1940f4b41e0Szoecarver 1950f4b41e0Szoecarver // [range.take], take view 1960f4b41e0Szoecarver template<view> class take_view; 1970f4b41e0Szoecarver 1980f4b41e0Szoecarver template<class T> 1990f4b41e0Szoecarver inline constexpr bool enable_borrowed_range<take_view<T>> = enable_borrowed_range<T>; 200481ad59bSzoecarver 201481ad59bSzoecarver template<copy_constructible T> 202481ad59bSzoecarver requires is_object_v<T> 203481ad59bSzoecarver class single_view; 2047b20e05cSzoecarver 2057b20e05cSzoecarver template<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t> 2067b20e05cSzoecarver requires weakly-equality-comparable-with<W, Bound> && copyable<W> 2077b20e05cSzoecarver class iota_view; 2087b20e05cSzoecarver 2097b20e05cSzoecarver template<class W, class Bound> 2107b20e05cSzoecarver inline constexpr bool enable_borrowed_range<iota_view<W, Bound>> = true; 211df324bbaSzoecarver 212df324bbaSzoecarver // [range.join], join view 213df324bbaSzoecarver template<input_range V> 214df324bbaSzoecarver requires view<V> && input_range<range_reference_t<V>> 215df324bbaSzoecarver class join_view; 216e53c461bSKonstantin Varlamov 217e53c461bSKonstantin Varlamov // [range.lazy.split], lazy split view 218e53c461bSKonstantin Varlamov template<class R> 219e53c461bSKonstantin Varlamov concept tiny-range = see below; // exposition only 220e53c461bSKonstantin Varlamov 221e53c461bSKonstantin Varlamov template<input_range V, forward_range Pattern> 222e53c461bSKonstantin Varlamov requires view<V> && view<Pattern> && 223e53c461bSKonstantin Varlamov indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> && 224e53c461bSKonstantin Varlamov (forward_range<V> || tiny-range<Pattern>) 225e53c461bSKonstantin Varlamov class lazy_split_view; 226e53c461bSKonstantin Varlamov 227e53c461bSKonstantin Varlamov namespace views { 228e53c461bSKonstantin Varlamov inline constexpr unspecified lazy_split = unspecified; 229e53c461bSKonstantin Varlamov } 230*042dc3c4SHui Xie 231*042dc3c4SHui Xie // [range.zip], zip view 232*042dc3c4SHui Xie template<input_range... Views> 233*042dc3c4SHui Xie requires (view<Views> && ...) && (sizeof...(Views) > 0) 234*042dc3c4SHui Xie class zip_view; // C++2b 235*042dc3c4SHui Xie 236*042dc3c4SHui Xie template<class... Views> 237*042dc3c4SHui Xie inline constexpr bool enable_borrowed_range<zip_view<Views...>> = // C++2b 238*042dc3c4SHui Xie (enable_borrowed_range<Views> && ...); 239*042dc3c4SHui Xie 240*042dc3c4SHui Xie namespace views { inline constexpr unspecified zip = unspecified; } // C++2b 24101ace074SMark de Wever} 24201ace074SMark de Wever 243823fa098SKonstantin Varlamovnamespace std { 244823fa098SKonstantin Varlamov namespace views = ranges::views; 245823fa098SKonstantin Varlamov 246823fa098SKonstantin Varlamov template<class T> struct tuple_size; 247823fa098SKonstantin Varlamov template<size_t I, class T> struct tuple_element; 248823fa098SKonstantin Varlamov 249823fa098SKonstantin Varlamov template<class I, class S, ranges::subrange_kind K> 250823fa098SKonstantin Varlamov struct tuple_size<ranges::subrange<I, S, K>> 251823fa098SKonstantin Varlamov : integral_constant<size_t, 2> {}; 252823fa098SKonstantin Varlamov 253823fa098SKonstantin Varlamov template<class I, class S, ranges::subrange_kind K> 254823fa098SKonstantin Varlamov struct tuple_element<0, ranges::subrange<I, S, K>> { 255823fa098SKonstantin Varlamov using type = I; 256823fa098SKonstantin Varlamov }; 257823fa098SKonstantin Varlamov 258823fa098SKonstantin Varlamov template<class I, class S, ranges::subrange_kind K> 259823fa098SKonstantin Varlamov struct tuple_element<1, ranges::subrange<I, S, K>> { 260823fa098SKonstantin Varlamov using type = S; 261823fa098SKonstantin Varlamov }; 262823fa098SKonstantin Varlamov 263823fa098SKonstantin Varlamov template<class I, class S, ranges::subrange_kind K> 264823fa098SKonstantin Varlamov struct tuple_element<0, const ranges::subrange<I, S, K>> { 265823fa098SKonstantin Varlamov using type = I; 266823fa098SKonstantin Varlamov }; 267823fa098SKonstantin Varlamov 268823fa098SKonstantin Varlamov template<class I, class S, ranges::subrange_kind K> 269823fa098SKonstantin Varlamov struct tuple_element<1, const ranges::subrange<I, S, K>> { 270823fa098SKonstantin Varlamov using type = S; 271823fa098SKonstantin Varlamov }; 272823fa098SKonstantin Varlamov} 27301ace074SMark de Wever*/ 27401ace074SMark de Wever 275385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler 27601ace074SMark de Wever#include <__config> 2775a3309f8SChristopher Di Bella#include <__ranges/access.h> 278c820b494Szoecarver#include <__ranges/all.h> 279e5d8b93eSzoecarver#include <__ranges/common_view.h> 2807c177315SChristopher Di Bella#include <__ranges/concepts.h> 28119e806e8SLouis Dionne#include <__ranges/counted.h> 28274fd3cb8SChristopher Di Bella#include <__ranges/dangling.h> 2839db55b31Szoecarver#include <__ranges/data.h> 284560170faSzoecarver#include <__ranges/drop_view.h> 28519e806e8SLouis Dionne#include <__ranges/empty.h> 2864d81a46fSArthur O'Dwyer#include <__ranges/empty_view.h> 28701ace074SMark de Wever#include <__ranges/enable_borrowed_range.h> 288bbb3d03fSChristopher Di Bella#include <__ranges/enable_view.h> 2892b424f4eSLouis Dionne#include <__ranges/filter_view.h> 2907b20e05cSzoecarver#include <__ranges/iota_view.h> 291df324bbaSzoecarver#include <__ranges/join_view.h> 292e53c461bSKonstantin Varlamov#include <__ranges/lazy_split_view.h> 29355bd22f8SKonstantin Varlamov#include <__ranges/rbegin.h> 2947eba4856Szoecarver#include <__ranges/ref_view.h> 29555bd22f8SKonstantin Varlamov#include <__ranges/rend.h> 2969d982c67Szoecarver#include <__ranges/reverse_view.h> 297481ad59bSzoecarver#include <__ranges/single_view.h> 298600686d7Szoecarver#include <__ranges/size.h> 2999106047eSzoecarver#include <__ranges/subrange.h> 300481ad59bSzoecarver#include <__ranges/take_view.h> 3010e09a41bSzoecarver#include <__ranges/transform_view.h> 3025671ff20Szoecarver#include <__ranges/view_interface.h> 30344cdca37SArthur O'Dwyer#include <__ranges/views.h> 304*042dc3c4SHui Xie#include <__ranges/zip_view.h> 3051458458bSNikolas Klauser#include <__tuple> // TODO: <ranges> has to export std::tuple_size. Replace this, once <tuple> is granularized. 30601ace074SMark de Wever#include <compare> // Required by the standard. 30701ace074SMark de Wever#include <initializer_list> // Required by the standard. 30801ace074SMark de Wever#include <iterator> // Required by the standard. 30901ace074SMark de Wever#include <type_traits> 31053406fb6SArthur O'Dwyer#include <version> 31171909de3SMark de Wever 31201ace074SMark de Wever#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 31301ace074SMark de Wever# pragma GCC system_header 31401ace074SMark de Wever#endif 31501ace074SMark de Wever 31601ace074SMark de Wever#endif // _LIBCPP_RANGES 317