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