xref: /llvm-project/libcxx/include/ranges (revision b9a2658a3e8bd13b0f9e7a8a440832a95b377216)
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