1fe6060f1SDimitry Andric// -*- C++ -*- 2349cc55cSDimitry 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> 394824e7fdSDimitry Andric using iterator_t = decltype(ranges::begin(declval<T&>())); 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 118*bdd1243dSDimitry Andric // [range.elements], elements view 119*bdd1243dSDimitry Andric template<input_range V, size_t N> 120*bdd1243dSDimitry Andric requires see below 121*bdd1243dSDimitry Andric class elements_view; 122*bdd1243dSDimitry Andric 123*bdd1243dSDimitry Andric template<class T, size_t N> 124*bdd1243dSDimitry Andric inline constexpr bool enable_borrowed_range<elements_view<T, N>> = 125*bdd1243dSDimitry Andric enable_borrowed_range<T>; 126*bdd1243dSDimitry Andric 127*bdd1243dSDimitry Andric template<class R> 128*bdd1243dSDimitry Andric using keys_view = elements_view<R, 0>; 129*bdd1243dSDimitry Andric template<class R> 130*bdd1243dSDimitry Andric using values_view = elements_view<R, 1>; 131*bdd1243dSDimitry Andric 132*bdd1243dSDimitry Andric namespace views { 133*bdd1243dSDimitry Andric template<size_t N> 134*bdd1243dSDimitry Andric inline constexpr unspecified elements = unspecified; 135*bdd1243dSDimitry Andric inline constexpr auto keys = elements<0>; 136*bdd1243dSDimitry Andric inline constexpr auto values = elements<1>; 137*bdd1243dSDimitry Andric } 138*bdd1243dSDimitry Andric 139fe6060f1SDimitry Andric // [range.empty], empty view 140fe6060f1SDimitry Andric template<class T> 141fe6060f1SDimitry Andric requires is_object_v<T> 142fe6060f1SDimitry Andric class empty_view; 143fe6060f1SDimitry Andric 14481ad6265SDimitry Andric template<class T> 14581ad6265SDimitry Andric inline constexpr bool enable_borrowed_range<empty_view<T>> = true; 14681ad6265SDimitry Andric 14781ad6265SDimitry Andric namespace views { 14881ad6265SDimitry Andric template<class T> 14981ad6265SDimitry Andric inline constexpr empty_view<T> empty{}; 15081ad6265SDimitry Andric } 15181ad6265SDimitry Andric 152fe6060f1SDimitry Andric // [range.all], all view 153fe6060f1SDimitry Andric namespace views { 154fe6060f1SDimitry Andric inline constexpr unspecified all = unspecified; 155fe6060f1SDimitry Andric 156fe6060f1SDimitry Andric template<viewable_range R> 157fe6060f1SDimitry Andric using all_t = decltype(all(declval<R>())); 158fe6060f1SDimitry Andric } 159fe6060f1SDimitry Andric 160fe6060f1SDimitry Andric template<range R> 161fe6060f1SDimitry Andric requires is_object_v<R> 162fe6060f1SDimitry Andric class ref_view; 163fe6060f1SDimitry Andric 164fe6060f1SDimitry Andric template<class T> 165fe6060f1SDimitry Andric inline constexpr bool enable_borrowed_range<ref_view<T>> = true; 166fe6060f1SDimitry Andric 16704eeddc0SDimitry Andric template<range R> 16804eeddc0SDimitry Andric requires see below 16904eeddc0SDimitry Andric class owning_view; 17004eeddc0SDimitry Andric 17104eeddc0SDimitry Andric template<class T> 17204eeddc0SDimitry Andric inline constexpr bool enable_borrowed_range<owning_view<T>> = enable_borrowed_range<T>; 17304eeddc0SDimitry Andric 17481ad6265SDimitry Andric // [range.filter], filter view 17581ad6265SDimitry Andric template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred> 17681ad6265SDimitry Andric requires view<V> && is_object_v<Pred> 17781ad6265SDimitry Andric class filter_view; 17881ad6265SDimitry Andric 17981ad6265SDimitry Andric namespace views { 18081ad6265SDimitry Andric inline constexpr unspecified filter = unspecified; 18181ad6265SDimitry Andric } 18281ad6265SDimitry Andric 183fe6060f1SDimitry Andric // [range.drop], drop view 184fe6060f1SDimitry Andric template<view V> 185fe6060f1SDimitry Andric class drop_view; 186fe6060f1SDimitry Andric 187fe6060f1SDimitry Andric template<class T> 188fe6060f1SDimitry Andric inline constexpr bool enable_borrowed_range<drop_view<T>> = enable_borrowed_range<T>; 189fe6060f1SDimitry Andric 190*bdd1243dSDimitry Andric // [range.drop.while], drop while view 191*bdd1243dSDimitry Andric template<view V, class Pred> 192*bdd1243dSDimitry Andric requires input_range<V> && is_object_v<Pred> && 193*bdd1243dSDimitry Andric indirect_unary_predicate<const Pred, iterator_t<V>> 194*bdd1243dSDimitry Andric class drop_while_view; 195*bdd1243dSDimitry Andric 196*bdd1243dSDimitry Andric template<class T, class Pred> 197*bdd1243dSDimitry Andric inline constexpr bool enable_borrowed_range<drop_while_view<T, Pred>> = 198*bdd1243dSDimitry Andric enable_borrowed_range<T>; 199*bdd1243dSDimitry Andric 200*bdd1243dSDimitry Andric namespace views { inline constexpr unspecified drop_while = unspecified; } 201*bdd1243dSDimitry Andric 202fe6060f1SDimitry Andric // [range.transform], transform view 203fe6060f1SDimitry Andric template<input_range V, copy_constructible F> 204fe6060f1SDimitry Andric requires view<V> && is_object_v<F> && 205fe6060f1SDimitry Andric regular_invocable<F&, range_reference_t<V>> && 206fe6060f1SDimitry Andric can-reference<invoke_result_t<F&, range_reference_t<V>>> 207fe6060f1SDimitry Andric class transform_view; 208fe6060f1SDimitry Andric 209349cc55cSDimitry Andric // [range.counted], counted view 210349cc55cSDimitry Andric namespace views { inline constexpr unspecified counted = unspecified; } 211349cc55cSDimitry Andric 212fe6060f1SDimitry Andric // [range.common], common view 213fe6060f1SDimitry Andric template<view V> 214fe6060f1SDimitry Andric requires (!common_range<V> && copyable<iterator_t<V>>) 215fe6060f1SDimitry Andric class common_view; 216fe6060f1SDimitry Andric 217349cc55cSDimitry Andric // [range.reverse], reverse view 218349cc55cSDimitry Andric template<view V> 219349cc55cSDimitry Andric requires bidirectional_range<V> 220349cc55cSDimitry Andric class reverse_view; 221349cc55cSDimitry Andric 222349cc55cSDimitry Andric template<class T> 223349cc55cSDimitry Andric inline constexpr bool enable_borrowed_range<reverse_view<T>> = enable_borrowed_range<T>; 224349cc55cSDimitry Andric 225fe6060f1SDimitry Andric template<class T> 226fe6060f1SDimitry Andric inline constexpr bool enable_borrowed_range<common_view<T>> = enable_borrowed_range<T>; 227349cc55cSDimitry Andric 228349cc55cSDimitry Andric // [range.take], take view 229349cc55cSDimitry Andric template<view> class take_view; 230349cc55cSDimitry Andric 231349cc55cSDimitry Andric template<class T> 232349cc55cSDimitry Andric inline constexpr bool enable_borrowed_range<take_view<T>> = enable_borrowed_range<T>; 233349cc55cSDimitry Andric 234*bdd1243dSDimitry Andric // [range.take.while], take while view 235*bdd1243dSDimitry Andric template<view V, class Pred> 236*bdd1243dSDimitry Andric requires input_range<V> && is_object_v<Pred> && 237*bdd1243dSDimitry Andric indirect_unary_predicate<const Pred, iterator_t<V>> 238*bdd1243dSDimitry Andric class take_while_view; 239*bdd1243dSDimitry Andric 240*bdd1243dSDimitry Andric namespace views { inline constexpr unspecified take_while = unspecified; } 241*bdd1243dSDimitry Andric 242349cc55cSDimitry Andric template<copy_constructible T> 243349cc55cSDimitry Andric requires is_object_v<T> 244349cc55cSDimitry Andric class single_view; 245349cc55cSDimitry Andric 246349cc55cSDimitry Andric template<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t> 247349cc55cSDimitry Andric requires weakly-equality-comparable-with<W, Bound> && copyable<W> 248349cc55cSDimitry Andric class iota_view; 249349cc55cSDimitry Andric 250349cc55cSDimitry Andric template<class W, class Bound> 251349cc55cSDimitry Andric inline constexpr bool enable_borrowed_range<iota_view<W, Bound>> = true; 252349cc55cSDimitry Andric 253349cc55cSDimitry Andric // [range.join], join view 254349cc55cSDimitry Andric template<input_range V> 255349cc55cSDimitry Andric requires view<V> && input_range<range_reference_t<V>> 256349cc55cSDimitry Andric class join_view; 25781ad6265SDimitry Andric 25881ad6265SDimitry Andric // [range.lazy.split], lazy split view 25981ad6265SDimitry Andric template<class R> 26081ad6265SDimitry Andric concept tiny-range = see below; // exposition only 26181ad6265SDimitry Andric 26281ad6265SDimitry Andric template<input_range V, forward_range Pattern> 26381ad6265SDimitry Andric requires view<V> && view<Pattern> && 26481ad6265SDimitry Andric indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> && 26581ad6265SDimitry Andric (forward_range<V> || tiny-range<Pattern>) 26681ad6265SDimitry Andric class lazy_split_view; 26781ad6265SDimitry Andric 268*bdd1243dSDimitry Andric // [range.split], split view 269*bdd1243dSDimitry Andric template<forward_range V, forward_range Pattern> 270*bdd1243dSDimitry Andric requires view<V> && view<Pattern> && 271*bdd1243dSDimitry Andric indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> 272*bdd1243dSDimitry Andric class split_view; 273*bdd1243dSDimitry Andric 27481ad6265SDimitry Andric namespace views { 27581ad6265SDimitry Andric inline constexpr unspecified lazy_split = unspecified; 276*bdd1243dSDimitry Andric inline constexpr unspecified split = unspecified; 277fe6060f1SDimitry Andric } 278fe6060f1SDimitry Andric 279*bdd1243dSDimitry Andric // [range.istream], istream view 280*bdd1243dSDimitry Andric template<movable Val, class CharT, class Traits = char_traits<CharT>> 281*bdd1243dSDimitry Andric requires see below 282*bdd1243dSDimitry Andric class basic_istream_view; 283*bdd1243dSDimitry Andric 284*bdd1243dSDimitry Andric template<class Val> 285*bdd1243dSDimitry Andric using istream_view = basic_istream_view<Val, char>; 286*bdd1243dSDimitry Andric 287*bdd1243dSDimitry Andric template<class Val> 288*bdd1243dSDimitry Andric using wistream_view = basic_istream_view<Val, wchar_t>; 289*bdd1243dSDimitry Andric 290*bdd1243dSDimitry Andric namespace views { template<class T> inline constexpr unspecified istream = unspecified; } 291*bdd1243dSDimitry Andric 29281ad6265SDimitry Andric // [range.zip], zip view 29381ad6265SDimitry Andric template<input_range... Views> 29481ad6265SDimitry Andric requires (view<Views> && ...) && (sizeof...(Views) > 0) 29581ad6265SDimitry Andric class zip_view; // C++2b 29681ad6265SDimitry Andric 29781ad6265SDimitry Andric template<class... Views> 29881ad6265SDimitry Andric inline constexpr bool enable_borrowed_range<zip_view<Views...>> = // C++2b 29981ad6265SDimitry Andric (enable_borrowed_range<Views> && ...); 30081ad6265SDimitry Andric 30181ad6265SDimitry Andric namespace views { inline constexpr unspecified zip = unspecified; } // C++2b 302*bdd1243dSDimitry Andric 303*bdd1243dSDimitry Andric // [range.as.rvalue] 304*bdd1243dSDimitry Andric template <view V> 305*bdd1243dSDimitry Andric requires input_range<V> 306*bdd1243dSDimitry Andric class as_rvalue_view; // since C++23 307*bdd1243dSDimitry Andric 308*bdd1243dSDimitry Andric namespace views { inline constexpr unspecified as_rvalue ) unspecified; } // since C++23 30981ad6265SDimitry Andric} 31081ad6265SDimitry Andric 31181ad6265SDimitry Andricnamespace std { 31281ad6265SDimitry Andric namespace views = ranges::views; 31381ad6265SDimitry Andric 31481ad6265SDimitry Andric template<class T> struct tuple_size; 31581ad6265SDimitry Andric template<size_t I, class T> struct tuple_element; 31681ad6265SDimitry Andric 31781ad6265SDimitry Andric template<class I, class S, ranges::subrange_kind K> 31881ad6265SDimitry Andric struct tuple_size<ranges::subrange<I, S, K>> 31981ad6265SDimitry Andric : integral_constant<size_t, 2> {}; 32081ad6265SDimitry Andric 32181ad6265SDimitry Andric template<class I, class S, ranges::subrange_kind K> 32281ad6265SDimitry Andric struct tuple_element<0, ranges::subrange<I, S, K>> { 32381ad6265SDimitry Andric using type = I; 32481ad6265SDimitry Andric }; 32581ad6265SDimitry Andric 32681ad6265SDimitry Andric template<class I, class S, ranges::subrange_kind K> 32781ad6265SDimitry Andric struct tuple_element<1, ranges::subrange<I, S, K>> { 32881ad6265SDimitry Andric using type = S; 32981ad6265SDimitry Andric }; 33081ad6265SDimitry Andric 33181ad6265SDimitry Andric template<class I, class S, ranges::subrange_kind K> 33281ad6265SDimitry Andric struct tuple_element<0, const ranges::subrange<I, S, K>> { 33381ad6265SDimitry Andric using type = I; 33481ad6265SDimitry Andric }; 33581ad6265SDimitry Andric 33681ad6265SDimitry Andric template<class I, class S, ranges::subrange_kind K> 33781ad6265SDimitry Andric struct tuple_element<1, const ranges::subrange<I, S, K>> { 33881ad6265SDimitry Andric using type = S; 33981ad6265SDimitry Andric }; 34081ad6265SDimitry Andric} 341fe6060f1SDimitry Andric*/ 342fe6060f1SDimitry Andric 34381ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler 344fe6060f1SDimitry Andric#include <__config> 345fe6060f1SDimitry Andric#include <__ranges/access.h> 346fe6060f1SDimitry Andric#include <__ranges/all.h> 347*bdd1243dSDimitry Andric#include <__ranges/as_rvalue_view.h> 348fe6060f1SDimitry Andric#include <__ranges/common_view.h> 349fe6060f1SDimitry Andric#include <__ranges/concepts.h> 350349cc55cSDimitry Andric#include <__ranges/counted.h> 351fe6060f1SDimitry Andric#include <__ranges/dangling.h> 352fe6060f1SDimitry Andric#include <__ranges/data.h> 353fe6060f1SDimitry Andric#include <__ranges/drop_view.h> 354*bdd1243dSDimitry Andric#include <__ranges/drop_while_view.h> 355*bdd1243dSDimitry Andric#include <__ranges/elements_view.h> 356349cc55cSDimitry Andric#include <__ranges/empty.h> 35704eeddc0SDimitry Andric#include <__ranges/empty_view.h> 358fe6060f1SDimitry Andric#include <__ranges/enable_borrowed_range.h> 359fe6060f1SDimitry Andric#include <__ranges/enable_view.h> 36081ad6265SDimitry Andric#include <__ranges/filter_view.h> 361349cc55cSDimitry Andric#include <__ranges/iota_view.h> 362349cc55cSDimitry Andric#include <__ranges/join_view.h> 36381ad6265SDimitry Andric#include <__ranges/lazy_split_view.h> 36481ad6265SDimitry Andric#include <__ranges/rbegin.h> 365fe6060f1SDimitry Andric#include <__ranges/ref_view.h> 36681ad6265SDimitry Andric#include <__ranges/rend.h> 367349cc55cSDimitry Andric#include <__ranges/reverse_view.h> 368349cc55cSDimitry Andric#include <__ranges/single_view.h> 369fe6060f1SDimitry Andric#include <__ranges/size.h> 370*bdd1243dSDimitry Andric#include <__ranges/split_view.h> 371fe6060f1SDimitry Andric#include <__ranges/subrange.h> 372349cc55cSDimitry Andric#include <__ranges/take_view.h> 373*bdd1243dSDimitry Andric#include <__ranges/take_while_view.h> 374fe6060f1SDimitry Andric#include <__ranges/transform_view.h> 375fe6060f1SDimitry Andric#include <__ranges/view_interface.h> 37653683b95SDimitry Andric#include <__ranges/views.h> 37781ad6265SDimitry Andric#include <__ranges/zip_view.h> 378fe6060f1SDimitry Andric#include <type_traits> 379d56accc7SDimitry Andric#include <version> 380fe6060f1SDimitry Andric 381*bdd1243dSDimitry Andric#if !defined(_LIBCPP_HAS_NO_LOCALIZATION) 382*bdd1243dSDimitry Andric#include <__ranges/istream_view.h> 383*bdd1243dSDimitry Andric#endif 384*bdd1243dSDimitry Andric 385*bdd1243dSDimitry Andric// standard-mandated includes 386*bdd1243dSDimitry Andric 387*bdd1243dSDimitry Andric// [ranges.syn] 388*bdd1243dSDimitry Andric#include <compare> 389*bdd1243dSDimitry Andric#include <initializer_list> 390*bdd1243dSDimitry Andric#include <iterator> 391*bdd1243dSDimitry Andric 392*bdd1243dSDimitry Andric// [tuple.helper] 393*bdd1243dSDimitry Andric#include <__tuple_dir/tuple_element.h> 394*bdd1243dSDimitry Andric#include <__tuple_dir/tuple_size.h> 395*bdd1243dSDimitry Andric 396fe6060f1SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 397fe6060f1SDimitry Andric# pragma GCC system_header 398fe6060f1SDimitry Andric#endif 399fe6060f1SDimitry Andric 400fe6060f1SDimitry Andric#endif // _LIBCPP_RANGES 401