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>>; 52a8ead919SIgor Zhukov template <range R> 53a8ead919SIgor Zhukov using range_common_reference_t = iter_common_reference_t<iterator_t<R>>; 547c177315SChristopher Di Bella 553001b48dSLouis Dionne // [range.sized], sized ranges 56d8fad661SChristopher Di Bella template<class> 57d8fad661SChristopher Di Bella inline constexpr bool disable_sized_range = false; 58d8fad661SChristopher Di Bella 59d8fad661SChristopher Di Bella template<class T> 60d8fad661SChristopher Di Bella concept sized_range = ...; 61d8fad661SChristopher Di Bella 622021d272SLouis Dionne // [range.view], views 632021d272SLouis Dionne template<class T> 642021d272SLouis Dionne inline constexpr bool enable_view = ...; 652021d272SLouis Dionne 662021d272SLouis Dionne struct view_base { }; 672021d272SLouis Dionne 682021d272SLouis Dionne template<class T> 692021d272SLouis Dionne concept view = ...; 702021d272SLouis Dionne 717c177315SChristopher Di Bella // [range.refinements], other range refinements 727b28c5d3SLouis Dionne template<class R, class T> 737b28c5d3SLouis Dionne concept output_range = see below; 747b28c5d3SLouis Dionne 75c05d1eedSChristopher Di Bella template<class T> 76c05d1eedSChristopher Di Bella concept input_range = see below; 77c05d1eedSChristopher Di Bella 78fa3e2626SChristopher Di Bella template<class T> 79fa3e2626SChristopher Di Bella concept forward_range = see below; 80fa3e2626SChristopher Di Bella 819c5d86aaSChristopher Di Bella template<class T> 829c5d86aaSChristopher Di Bella concept bidirectional_range = see below; 839c5d86aaSChristopher Di Bella 8434503987Szoecarver template<class T> 8534503987Szoecarver concept random_access_range = see below; 8634503987Szoecarver 8734503987Szoecarver template<class T> 8834503987Szoecarver concept contiguous_range = see below; 8934503987Szoecarver 907c177315SChristopher Di Bella template <class _Tp> 917c177315SChristopher Di Bella concept common_range = see below; 925671ff20Szoecarver 933001b48dSLouis Dionne template<class T> 943001b48dSLouis Dionne concept viewable_range = see below; 953001b48dSLouis Dionne 96c1086532SXiaoyang Liu // [range.adaptor.object], range adaptor objects 97c1086532SXiaoyang Liu template<class D> 98c1086532SXiaoyang Liu requires is_class_v<D> && same_as<D, remove_cv_t<D>> 99c1086532SXiaoyang Liu class range_adaptor_closure { }; // Since c++23 100c1086532SXiaoyang Liu 1015671ff20Szoecarver // [view.interface], class template view_interface 1025671ff20Szoecarver template<class D> 1035671ff20Szoecarver requires is_class_v<D> && same_as<D, remove_cv_t<D>> 1045671ff20Szoecarver class view_interface; 105d31a2e75Szoecarver 106182ba8abSChristopher Di Bella // [range.subrange], sub-ranges 107182ba8abSChristopher Di Bella enum class subrange_kind : bool { unsized, sized }; 108182ba8abSChristopher Di Bella 109182ba8abSChristopher Di Bella template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K = see below> 110182ba8abSChristopher Di Bella requires (K == subrange_kind::sized || !sized_sentinel_for<S, I>) 111182ba8abSChristopher Di Bella class subrange; 112182ba8abSChristopher Di Bella 113182ba8abSChristopher Di Bella template<class I, class S, subrange_kind K> 114182ba8abSChristopher Di Bella inline constexpr bool enable_borrowed_range<subrange<I, S, K>> = true; 115182ba8abSChristopher Di Bella 11674fd3cb8SChristopher Di Bella // [range.dangling], dangling iterator handling 11774fd3cb8SChristopher Di Bella struct dangling; 11874fd3cb8SChristopher Di Bella 11974fd3cb8SChristopher Di Bella template<range R> 12074fd3cb8SChristopher Di Bella using borrowed_iterator_t = see below; 12174fd3cb8SChristopher Di Bella 12274fd3cb8SChristopher Di Bella template<range R> 12374fd3cb8SChristopher Di Bella using borrowed_subrange_t = see below; 12474fd3cb8SChristopher Di Bella 12594461822SHui Xie // [range.elements], elements view 12694461822SHui Xie template<input_range V, size_t N> 12794461822SHui Xie requires see below 12894461822SHui Xie class elements_view; 12994461822SHui Xie 13094461822SHui Xie template<class T, size_t N> 13194461822SHui Xie inline constexpr bool enable_borrowed_range<elements_view<T, N>> = 13294461822SHui Xie enable_borrowed_range<T>; 13394461822SHui Xie 13494461822SHui Xie template<class R> 13594461822SHui Xie using keys_view = elements_view<R, 0>; 13694461822SHui Xie template<class R> 13794461822SHui Xie using values_view = elements_view<R, 1>; 13894461822SHui Xie 13994461822SHui Xie namespace views { 14094461822SHui Xie template<size_t N> 14194461822SHui Xie inline constexpr unspecified elements = unspecified; 14294461822SHui Xie inline constexpr auto keys = elements<0>; 14394461822SHui Xie inline constexpr auto values = elements<1>; 14494461822SHui Xie } 14594461822SHui Xie 146c3648f37Svarconst // [range.utility.conv], range conversions 147c3648f37Svarconst template<class C, input_range R, class... Args> requires (!view<C>) 148c3648f37Svarconst constexpr C to(R&& r, Args&&... args); // Since C++23 149c3648f37Svarconst template<template<class...> class C, input_range R, class... Args> 150c3648f37Svarconst constexpr auto to(R&& r, Args&&... args); // Since C++23 151c3648f37Svarconst template<class C, class... Args> requires (!view<C>) 152c3648f37Svarconst constexpr auto to(Args&&... args); // Since C++23 153c3648f37Svarconst template<template<class...> class C, class... Args> 154c3648f37Svarconst constexpr auto to(Args&&... args); // Since C++23 155c3648f37Svarconst 156d31a2e75Szoecarver // [range.empty], empty view 157d31a2e75Szoecarver template<class T> 158d31a2e75Szoecarver requires is_object_v<T> 159d31a2e75Szoecarver class empty_view; 16046afddecSzoecarver 161c00df57bSHui Xie template<class T> 162c00df57bSHui Xie inline constexpr bool enable_borrowed_range<empty_view<T>> = true; 163c00df57bSHui Xie 164c00df57bSHui Xie namespace views { 165c00df57bSHui Xie template<class T> 166c00df57bSHui Xie inline constexpr empty_view<T> empty{}; 167c00df57bSHui Xie } 168c00df57bSHui Xie 1693001b48dSLouis Dionne // [range.all], all view 1703001b48dSLouis Dionne namespace views { 1713001b48dSLouis Dionne inline constexpr unspecified all = unspecified; 1723001b48dSLouis Dionne 1733001b48dSLouis Dionne template<viewable_range R> 1743001b48dSLouis Dionne using all_t = decltype(all(declval<R>())); 1753001b48dSLouis Dionne } 1763001b48dSLouis Dionne 1773001b48dSLouis Dionne template<range R> 1783001b48dSLouis Dionne requires is_object_v<R> 1793001b48dSLouis Dionne class ref_view; 1803001b48dSLouis Dionne 1813001b48dSLouis Dionne template<class T> 1823001b48dSLouis Dionne inline constexpr bool enable_borrowed_range<ref_view<T>> = true; 1833001b48dSLouis Dionne 18467151d02SArthur O'Dwyer template<range R> 18567151d02SArthur O'Dwyer requires see below 18667151d02SArthur O'Dwyer class owning_view; 18767151d02SArthur O'Dwyer 18867151d02SArthur O'Dwyer template<class T> 18967151d02SArthur O'Dwyer inline constexpr bool enable_borrowed_range<owning_view<T>> = enable_borrowed_range<T>; 19067151d02SArthur O'Dwyer 1912b424f4eSLouis Dionne // [range.filter], filter view 1922b424f4eSLouis Dionne template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred> 1932b424f4eSLouis Dionne requires view<V> && is_object_v<Pred> 1942b424f4eSLouis Dionne class filter_view; 1952b424f4eSLouis Dionne 1962b424f4eSLouis Dionne namespace views { 1972b424f4eSLouis Dionne inline constexpr unspecified filter = unspecified; 1982b424f4eSLouis Dionne } 1992b424f4eSLouis Dionne 20046afddecSzoecarver // [range.drop], drop view 20146afddecSzoecarver template<view V> 20246afddecSzoecarver class drop_view; 20346afddecSzoecarver 20446afddecSzoecarver template<class T> 20546afddecSzoecarver inline constexpr bool enable_borrowed_range<drop_view<T>> = enable_borrowed_range<T>; 2060e09a41bSzoecarver 207594fa147SHui Xie // [range.drop.while], drop while view 208594fa147SHui Xie template<view V, class Pred> 209594fa147SHui Xie requires input_range<V> && is_object_v<Pred> && 210594fa147SHui Xie indirect_unary_predicate<const Pred, iterator_t<V>> 211594fa147SHui Xie class drop_while_view; 212594fa147SHui Xie 213594fa147SHui Xie template<class T, class Pred> 214594fa147SHui Xie inline constexpr bool enable_borrowed_range<drop_while_view<T, Pred>> = 215594fa147SHui Xie enable_borrowed_range<T>; 216594fa147SHui Xie 217594fa147SHui Xie namespace views { inline constexpr unspecified drop_while = unspecified; } 218594fa147SHui Xie 2190e09a41bSzoecarver // [range.transform], transform view 2200e09a41bSzoecarver template<input_range V, copy_constructible F> 2210e09a41bSzoecarver requires view<V> && is_object_v<F> && 2220e09a41bSzoecarver regular_invocable<F&, range_reference_t<V>> && 2230e09a41bSzoecarver can-reference<invoke_result_t<F&, range_reference_t<V>>> 2240e09a41bSzoecarver class transform_view; 2250e09a41bSzoecarver 226f9e58f35Szoecarver // [range.counted], counted view 227f9e58f35Szoecarver namespace views { inline constexpr unspecified counted = unspecified; } 228f9e58f35Szoecarver 229e5d8b93eSzoecarver // [range.common], common view 230e5d8b93eSzoecarver template<view V> 231e5d8b93eSzoecarver requires (!common_range<V> && copyable<iterator_t<V>>) 232e5d8b93eSzoecarver class common_view; 233e5d8b93eSzoecarver 2349d982c67Szoecarver // [range.reverse], reverse view 2359d982c67Szoecarver template<view V> 2369d982c67Szoecarver requires bidirectional_range<V> 2379d982c67Szoecarver class reverse_view; 2389d982c67Szoecarver 2399d982c67Szoecarver template<class T> 2409d982c67Szoecarver inline constexpr bool enable_borrowed_range<reverse_view<T>> = enable_borrowed_range<T>; 2419d982c67Szoecarver 242e5d8b93eSzoecarver template<class T> 243e5d8b93eSzoecarver inline constexpr bool enable_borrowed_range<common_view<T>> = enable_borrowed_range<T>; 2440f4b41e0Szoecarver 2450f4b41e0Szoecarver // [range.take], take view 2460f4b41e0Szoecarver template<view> class take_view; 2470f4b41e0Szoecarver 2480f4b41e0Szoecarver template<class T> 2490f4b41e0Szoecarver inline constexpr bool enable_borrowed_range<take_view<T>> = enable_borrowed_range<T>; 250481ad59bSzoecarver 251a2c6a119SHui Xie // [range.take.while], take while view 252a2c6a119SHui Xie template<view V, class Pred> 253a2c6a119SHui Xie requires input_range<V> && is_object_v<Pred> && 254a2c6a119SHui Xie indirect_unary_predicate<const Pred, iterator_t<V>> 255a2c6a119SHui Xie class take_while_view; 256a2c6a119SHui Xie 257a2c6a119SHui Xie namespace views { inline constexpr unspecified take_while = unspecified; } 258a2c6a119SHui Xie 259481ad59bSzoecarver template<copy_constructible T> 260481ad59bSzoecarver requires is_object_v<T> 261481ad59bSzoecarver class single_view; 2627b20e05cSzoecarver 2637b20e05cSzoecarver template<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t> 2647b20e05cSzoecarver requires weakly-equality-comparable-with<W, Bound> && copyable<W> 2657b20e05cSzoecarver class iota_view; 2667b20e05cSzoecarver 2677b20e05cSzoecarver template<class W, class Bound> 2687b20e05cSzoecarver inline constexpr bool enable_borrowed_range<iota_view<W, Bound>> = true; 269df324bbaSzoecarver 270a2160dd3Syrong // [range.repeat], repeat view 271a2160dd3Syrong template<class T> 272a2160dd3Syrong concept integer-like-with-usable-difference-type = // exposition only 273a2160dd3Syrong is-signed-integer-like<T> || (is-integer-like<T> && weakly_incrementable<T>); 274a2160dd3Syrong 275a2160dd3Syrong template<move_constructible T, semiregular Bound = unreachable_sentinel_t> 276a2160dd3Syrong requires (is_object_v<T> && same_as<T, remove_cv_t<T>> && 277a2160dd3Syrong (integer-like-with-usable-difference-type<Bound> || 278a2160dd3Syrong same_as<Bound, unreachable_sentinel_t>)) 279a2160dd3Syrong class repeat_view; 280a2160dd3Syrong 281a2160dd3Syrong namespace views { inline constexpr unspecified repeat = unspecified; } 282a2160dd3Syrong 283df324bbaSzoecarver // [range.join], join view 284df324bbaSzoecarver template<input_range V> 285df324bbaSzoecarver requires view<V> && input_range<range_reference_t<V>> 286df324bbaSzoecarver class join_view; 287e53c461bSKonstantin Varlamov 288e53c461bSKonstantin Varlamov // [range.lazy.split], lazy split view 289e53c461bSKonstantin Varlamov template<class R> 290e53c461bSKonstantin Varlamov concept tiny-range = see below; // exposition only 291e53c461bSKonstantin Varlamov 292e53c461bSKonstantin Varlamov template<input_range V, forward_range Pattern> 293e53c461bSKonstantin Varlamov requires view<V> && view<Pattern> && 294e53c461bSKonstantin Varlamov indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> && 295e53c461bSKonstantin Varlamov (forward_range<V> || tiny-range<Pattern>) 296e53c461bSKonstantin Varlamov class lazy_split_view; 297e53c461bSKonstantin Varlamov 298a2b3ab8fSHui // [range.split], split view 299a2b3ab8fSHui template<forward_range V, forward_range Pattern> 300a2b3ab8fSHui requires view<V> && view<Pattern> && 301a2b3ab8fSHui indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> 302a2b3ab8fSHui class split_view; 303a2b3ab8fSHui 304e53c461bSKonstantin Varlamov namespace views { 305e53c461bSKonstantin Varlamov inline constexpr unspecified lazy_split = unspecified; 306a2b3ab8fSHui inline constexpr unspecified split = unspecified; 307e53c461bSKonstantin Varlamov } 308042dc3c4SHui Xie 30996a509bcSHui Xie // [range.istream], istream view 31096a509bcSHui Xie template<movable Val, class CharT, class Traits = char_traits<CharT>> 31196a509bcSHui Xie requires see below 31296a509bcSHui Xie class basic_istream_view; 31396a509bcSHui Xie 31496a509bcSHui Xie template<class Val> 31596a509bcSHui Xie using istream_view = basic_istream_view<Val, char>; 31696a509bcSHui Xie 31796a509bcSHui Xie template<class Val> 31896a509bcSHui Xie using wistream_view = basic_istream_view<Val, wchar_t>; 31996a509bcSHui Xie 32096a509bcSHui Xie namespace views { template<class T> inline constexpr unspecified istream = unspecified; } 32196a509bcSHui Xie 322042dc3c4SHui Xie // [range.zip], zip view 323042dc3c4SHui Xie template<input_range... Views> 324042dc3c4SHui Xie requires (view<Views> && ...) && (sizeof...(Views) > 0) 32571400505SMark de Wever class zip_view; // C++23 326042dc3c4SHui Xie 327042dc3c4SHui Xie template<class... Views> 32871400505SMark de Wever inline constexpr bool enable_borrowed_range<zip_view<Views...>> = // C++23 329042dc3c4SHui Xie (enable_borrowed_range<Views> && ...); 330042dc3c4SHui Xie 33171400505SMark de Wever namespace views { inline constexpr unspecified zip = unspecified; } // C++23 332b40a3d73SNikolas Klauser 333b40a3d73SNikolas Klauser // [range.as.rvalue] 334b40a3d73SNikolas Klauser template <view V> 335b40a3d73SNikolas Klauser requires input_range<V> 336065dc485SJakub Mazurkiewicz class as_rvalue_view; // C++23 337b40a3d73SNikolas Klauser 338065dc485SJakub Mazurkiewicz namespace views { inline constexpr unspecified as_rvalue ) unspecified; } // C++23 339065dc485SJakub Mazurkiewicz 340065dc485SJakub Mazurkiewicz [range.chunk.by] 341065dc485SJakub Mazurkiewicz template<forward_range V, indirect_binary_predicate<iterator_t<V>, iterator_t<V>> Pred> 342065dc485SJakub Mazurkiewicz requires view<V> && is_object_v<Pred> 343065dc485SJakub Mazurkiewicz class chunk_by_view; // C++23 344065dc485SJakub Mazurkiewicz 345065dc485SJakub Mazurkiewicz namespace views { inline constexpr unspecified chunk_by = unspecified; } // C++23 34601ace074SMark de Wever} 34701ace074SMark de Wever 348823fa098SKonstantin Varlamovnamespace std { 349823fa098SKonstantin Varlamov namespace views = ranges::views; 350823fa098SKonstantin Varlamov 351823fa098SKonstantin Varlamov template<class T> struct tuple_size; 352823fa098SKonstantin Varlamov template<size_t I, class T> struct tuple_element; 353823fa098SKonstantin Varlamov 354823fa098SKonstantin Varlamov template<class I, class S, ranges::subrange_kind K> 355823fa098SKonstantin Varlamov struct tuple_size<ranges::subrange<I, S, K>> 356823fa098SKonstantin Varlamov : integral_constant<size_t, 2> {}; 357823fa098SKonstantin Varlamov 358823fa098SKonstantin Varlamov template<class I, class S, ranges::subrange_kind K> 359823fa098SKonstantin Varlamov struct tuple_element<0, ranges::subrange<I, S, K>> { 360823fa098SKonstantin Varlamov using type = I; 361823fa098SKonstantin Varlamov }; 362823fa098SKonstantin Varlamov 363823fa098SKonstantin Varlamov template<class I, class S, ranges::subrange_kind K> 364823fa098SKonstantin Varlamov struct tuple_element<1, ranges::subrange<I, S, K>> { 365823fa098SKonstantin Varlamov using type = S; 366823fa098SKonstantin Varlamov }; 367823fa098SKonstantin Varlamov 368823fa098SKonstantin Varlamov template<class I, class S, ranges::subrange_kind K> 369823fa098SKonstantin Varlamov struct tuple_element<0, const ranges::subrange<I, S, K>> { 370823fa098SKonstantin Varlamov using type = I; 371823fa098SKonstantin Varlamov }; 372823fa098SKonstantin Varlamov 373823fa098SKonstantin Varlamov template<class I, class S, ranges::subrange_kind K> 374823fa098SKonstantin Varlamov struct tuple_element<1, const ranges::subrange<I, S, K>> { 375823fa098SKonstantin Varlamov using type = S; 376823fa098SKonstantin Varlamov }; 37717bbb224Svarconst 37817bbb224Svarconst struct from_range_t { explicit from_range_t() = default; }; // Since C++23 37917bbb224Svarconst inline constexpr from_range_t from_range{}; // Since C++23 380823fa098SKonstantin Varlamov} 38101ace074SMark de Wever*/ 38201ace074SMark de Wever 383*b9a2658aSNikolas Klauser#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS) 384*b9a2658aSNikolas Klauser# include <__cxx03/ranges> 385*b9a2658aSNikolas Klauser#else 38601ace074SMark de Wever# include <__config> 387dfddc0c4SNikolas Klauser 388dfddc0c4SNikolas Klauser# if _LIBCPP_STD_VER >= 20 3895a3309f8SChristopher Di Bella# include <__ranges/access.h> 390c820b494Szoecarver# include <__ranges/all.h> 391e5d8b93eSzoecarver# include <__ranges/common_view.h> 3927c177315SChristopher Di Bella# include <__ranges/concepts.h> 39319e806e8SLouis Dionne# include <__ranges/counted.h> 39474fd3cb8SChristopher Di Bella# include <__ranges/dangling.h> 3959db55b31Szoecarver# include <__ranges/data.h> 396560170faSzoecarver# include <__ranges/drop_view.h> 397594fa147SHui Xie# include <__ranges/drop_while_view.h> 39894461822SHui Xie# include <__ranges/elements_view.h> 39919e806e8SLouis Dionne# include <__ranges/empty.h> 4004d81a46fSArthur O'Dwyer# include <__ranges/empty_view.h> 40101ace074SMark de Wever# include <__ranges/enable_borrowed_range.h> 402bbb3d03fSChristopher Di Bella# include <__ranges/enable_view.h> 4032b424f4eSLouis Dionne# include <__ranges/filter_view.h> 4047b20e05cSzoecarver# include <__ranges/iota_view.h> 405df324bbaSzoecarver# include <__ranges/join_view.h> 406e53c461bSKonstantin Varlamov# include <__ranges/lazy_split_view.h> 40755bd22f8SKonstantin Varlamov# include <__ranges/rbegin.h> 4087eba4856Szoecarver# include <__ranges/ref_view.h> 40955bd22f8SKonstantin Varlamov# include <__ranges/rend.h> 4109d982c67Szoecarver# include <__ranges/reverse_view.h> 411481ad59bSzoecarver# include <__ranges/single_view.h> 412600686d7Szoecarver# include <__ranges/size.h> 413a2b3ab8fSHui# include <__ranges/split_view.h> 4149106047eSzoecarver# include <__ranges/subrange.h> 415481ad59bSzoecarver# include <__ranges/take_view.h> 416a2c6a119SHui Xie# include <__ranges/take_while_view.h> 4170e09a41bSzoecarver# include <__ranges/transform_view.h> 4185671ff20Szoecarver# include <__ranges/view_interface.h> 41944cdca37SArthur O'Dwyer# include <__ranges/views.h> 42071909de3SMark de Wever 421c6f3b7bcSNikolas Klauser# if _LIBCPP_HAS_LOCALIZATION 42296a509bcSHui Xie# include <__ranges/istream_view.h> 42396a509bcSHui Xie# endif 424dfddc0c4SNikolas Klauser# endif 425dfddc0c4SNikolas Klauser 426dfddc0c4SNikolas Klauser# if _LIBCPP_STD_VER >= 23 427dfddc0c4SNikolas Klauser# include <__ranges/as_rvalue_view.h> 428dfddc0c4SNikolas Klauser# include <__ranges/chunk_by_view.h> 429dfddc0c4SNikolas Klauser# include <__ranges/from_range.h> 430dfddc0c4SNikolas Klauser# include <__ranges/repeat_view.h> 431dfddc0c4SNikolas Klauser# include <__ranges/to.h> 432dfddc0c4SNikolas Klauser# include <__ranges/zip_view.h> 433dfddc0c4SNikolas Klauser# endif 434dfddc0c4SNikolas Klauser 435dfddc0c4SNikolas Klauser# include <version> 43696a509bcSHui Xie 4374004fb64SMark de Wever// standard-mandated includes 4382d52c6bfSNikolas Klauser 4392d52c6bfSNikolas Klauser// [ranges.syn] 4404004fb64SMark de Wever# include <compare> 4414004fb64SMark de Wever# include <initializer_list> 4424004fb64SMark de Wever# include <iterator> 4434004fb64SMark de Wever 4442d52c6bfSNikolas Klauser// [tuple.helper] 445e2b15ec2SNikolas Klauser# include <__tuple/tuple_element.h> 446e2b15ec2SNikolas Klauser# include <__tuple/tuple_size.h> 4472d52c6bfSNikolas Klauser 44801ace074SMark de Wever# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 44901ace074SMark de Wever# pragma GCC system_header 45001ace074SMark de Wever# endif 45101ace074SMark de Wever 4520a4aa8a1SNikolas Klauser# if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 45375196f8eSNikolas Klauser# include <cstdlib> 454a65070a7Sphilnik777# include <iosfwd> 4550a4aa8a1SNikolas Klauser# include <type_traits> 4560a4aa8a1SNikolas Klauser# endif 457*b9a2658aSNikolas Klauser#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS) 4580a4aa8a1SNikolas Klauser 45901ace074SMark de Wever#endif // _LIBCPP_RANGES 460