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 //===----------------------------------------------------------------------===// 9bdd1243dSDimitry Andric 10fe6060f1SDimitry Andric #ifndef _LIBCPP___RANGES_CONCEPTS_H 11fe6060f1SDimitry Andric #define _LIBCPP___RANGES_CONCEPTS_H 12fe6060f1SDimitry Andric 1304eeddc0SDimitry Andric #include <__concepts/constructible.h> 1404eeddc0SDimitry Andric #include <__concepts/movable.h> 1504eeddc0SDimitry Andric #include <__concepts/same_as.h> 16fe6060f1SDimitry Andric #include <__config> 17fe6060f1SDimitry Andric #include <__iterator/concepts.h> 18fe6060f1SDimitry Andric #include <__iterator/incrementable_traits.h> 19fe6060f1SDimitry Andric #include <__iterator/iter_move.h> 20fe6060f1SDimitry Andric #include <__iterator/iterator_traits.h> 21fe6060f1SDimitry Andric #include <__iterator/readable_traits.h> 22fe6060f1SDimitry Andric #include <__ranges/access.h> 23fe6060f1SDimitry Andric #include <__ranges/data.h> 244824e7fdSDimitry Andric #include <__ranges/enable_borrowed_range.h> 25fe6060f1SDimitry Andric #include <__ranges/enable_view.h> 26fe6060f1SDimitry Andric #include <__ranges/size.h> 27bdd1243dSDimitry Andric #include <__type_traits/add_pointer.h> 28bdd1243dSDimitry Andric #include <__type_traits/is_reference.h> 29bdd1243dSDimitry Andric #include <__type_traits/remove_cvref.h> 30bdd1243dSDimitry Andric #include <__type_traits/remove_reference.h> 31bdd1243dSDimitry Andric #include <__utility/declval.h> 3204eeddc0SDimitry Andric #include <initializer_list> 33fe6060f1SDimitry Andric 34fe6060f1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 35fe6060f1SDimitry Andric # pragma GCC system_header 36fe6060f1SDimitry Andric #endif 37fe6060f1SDimitry Andric 38fe6060f1SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 39fe6060f1SDimitry Andric 40*06c3fb27SDimitry Andric #if _LIBCPP_STD_VER >= 20 41fe6060f1SDimitry Andric 42fe6060f1SDimitry Andric namespace ranges { 43d56accc7SDimitry Andric 44fe6060f1SDimitry Andric // [range.range] 45d56accc7SDimitry Andric 46fe6060f1SDimitry Andric template <class _Tp> 47fe6060f1SDimitry Andric concept range = requires(_Tp& __t) { 48fe6060f1SDimitry Andric ranges::begin(__t); // sometimes equality-preserving 49fe6060f1SDimitry Andric ranges::end(__t); 50fe6060f1SDimitry Andric }; 51fe6060f1SDimitry Andric 52d56accc7SDimitry Andric template <class _Tp> 53d56accc7SDimitry Andric concept input_range = range<_Tp> && input_iterator<iterator_t<_Tp>>; 54d56accc7SDimitry Andric 55fe6060f1SDimitry Andric template<class _Range> 56fe6060f1SDimitry Andric concept borrowed_range = range<_Range> && 57fe6060f1SDimitry Andric (is_lvalue_reference_v<_Range> || enable_borrowed_range<remove_cvref_t<_Range>>); 58fe6060f1SDimitry Andric 59fe6060f1SDimitry Andric // `iterator_t` defined in <__ranges/access.h> 60fe6060f1SDimitry Andric 61fe6060f1SDimitry Andric template <range _Rp> 62bdd1243dSDimitry Andric using sentinel_t = decltype(ranges::end(std::declval<_Rp&>())); 63fe6060f1SDimitry Andric 64fe6060f1SDimitry Andric template <range _Rp> 65fe6060f1SDimitry Andric using range_difference_t = iter_difference_t<iterator_t<_Rp>>; 66fe6060f1SDimitry Andric 67fe6060f1SDimitry Andric template <range _Rp> 68fe6060f1SDimitry Andric using range_value_t = iter_value_t<iterator_t<_Rp>>; 69fe6060f1SDimitry Andric 70fe6060f1SDimitry Andric template <range _Rp> 71fe6060f1SDimitry Andric using range_reference_t = iter_reference_t<iterator_t<_Rp>>; 72fe6060f1SDimitry Andric 73fe6060f1SDimitry Andric template <range _Rp> 74fe6060f1SDimitry Andric using range_rvalue_reference_t = iter_rvalue_reference_t<iterator_t<_Rp>>; 75fe6060f1SDimitry Andric 76*06c3fb27SDimitry Andric template <range _Rp> 77*06c3fb27SDimitry Andric using range_common_reference_t = iter_common_reference_t<iterator_t<_Rp>>; 78*06c3fb27SDimitry Andric 79fe6060f1SDimitry Andric // [range.sized] 80fe6060f1SDimitry Andric template <class _Tp> 81fe6060f1SDimitry Andric concept sized_range = range<_Tp> && requires(_Tp& __t) { ranges::size(__t); }; 82fe6060f1SDimitry Andric 83fe6060f1SDimitry Andric template<sized_range _Rp> 84bdd1243dSDimitry Andric using range_size_t = decltype(ranges::size(std::declval<_Rp&>())); 85fe6060f1SDimitry Andric 86fe6060f1SDimitry Andric // `disable_sized_range` defined in `<__ranges/size.h>` 87fe6060f1SDimitry Andric 88fe6060f1SDimitry Andric // [range.view], views 89fe6060f1SDimitry Andric 90fe6060f1SDimitry Andric // `enable_view` defined in <__ranges/enable_view.h> 91fe6060f1SDimitry Andric // `view_base` defined in <__ranges/enable_view.h> 92fe6060f1SDimitry Andric 93fe6060f1SDimitry Andric template <class _Tp> 94fe6060f1SDimitry Andric concept view = 95fe6060f1SDimitry Andric range<_Tp> && 96fe6060f1SDimitry Andric movable<_Tp> && 97fe6060f1SDimitry Andric enable_view<_Tp>; 98fe6060f1SDimitry Andric 99fe6060f1SDimitry Andric template <class _Range> 100fe6060f1SDimitry Andric concept __simple_view = 101fe6060f1SDimitry Andric view<_Range> && range<const _Range> && 102fe6060f1SDimitry Andric same_as<iterator_t<_Range>, iterator_t<const _Range>> && 10304eeddc0SDimitry Andric same_as<sentinel_t<_Range>, sentinel_t<const _Range>>; 104fe6060f1SDimitry Andric 105fe6060f1SDimitry Andric // [range.refinements], other range refinements 106fe6060f1SDimitry Andric template <class _Rp, class _Tp> 107fe6060f1SDimitry Andric concept output_range = range<_Rp> && output_iterator<iterator_t<_Rp>, _Tp>; 108fe6060f1SDimitry Andric 109fe6060f1SDimitry Andric template <class _Tp> 110fe6060f1SDimitry Andric concept forward_range = input_range<_Tp> && forward_iterator<iterator_t<_Tp>>; 111fe6060f1SDimitry Andric 112fe6060f1SDimitry Andric template <class _Tp> 113fe6060f1SDimitry Andric concept bidirectional_range = forward_range<_Tp> && bidirectional_iterator<iterator_t<_Tp>>; 114fe6060f1SDimitry Andric 115fe6060f1SDimitry Andric template <class _Tp> 116fe6060f1SDimitry Andric concept random_access_range = 117fe6060f1SDimitry Andric bidirectional_range<_Tp> && random_access_iterator<iterator_t<_Tp>>; 118fe6060f1SDimitry Andric 119fe6060f1SDimitry Andric template<class _Tp> 120fe6060f1SDimitry Andric concept contiguous_range = 121fe6060f1SDimitry Andric random_access_range<_Tp> && 122fe6060f1SDimitry Andric contiguous_iterator<iterator_t<_Tp>> && 123fe6060f1SDimitry Andric requires(_Tp& __t) { 124fe6060f1SDimitry Andric { ranges::data(__t) } -> same_as<add_pointer_t<range_reference_t<_Tp>>>; 125fe6060f1SDimitry Andric }; 126fe6060f1SDimitry Andric 127fe6060f1SDimitry Andric template <class _Tp> 128fe6060f1SDimitry Andric concept common_range = range<_Tp> && same_as<iterator_t<_Tp>, sentinel_t<_Tp>>; 129fe6060f1SDimitry Andric 130fe6060f1SDimitry Andric template <class _Tp> 13104eeddc0SDimitry Andric inline constexpr bool __is_std_initializer_list = false; 13204eeddc0SDimitry Andric 13304eeddc0SDimitry Andric template <class _Ep> 13404eeddc0SDimitry Andric inline constexpr bool __is_std_initializer_list<initializer_list<_Ep>> = true; 13504eeddc0SDimitry Andric 13604eeddc0SDimitry Andric template <class _Tp> 137fe6060f1SDimitry Andric concept viewable_range = 13804eeddc0SDimitry Andric range<_Tp> && 13904eeddc0SDimitry Andric ((view<remove_cvref_t<_Tp>> && constructible_from<remove_cvref_t<_Tp>, _Tp>) || 14004eeddc0SDimitry Andric (!view<remove_cvref_t<_Tp>> && 14104eeddc0SDimitry Andric (is_lvalue_reference_v<_Tp> || 14204eeddc0SDimitry Andric (movable<remove_reference_t<_Tp>> && !__is_std_initializer_list<remove_cvref_t<_Tp>>)))); 14304eeddc0SDimitry Andric 144fe6060f1SDimitry Andric } // namespace ranges 145fe6060f1SDimitry Andric 146*06c3fb27SDimitry Andric #endif // _LIBCPP_STD_VER >= 20 147fe6060f1SDimitry Andric 148fe6060f1SDimitry Andric _LIBCPP_END_NAMESPACE_STD 149fe6060f1SDimitry Andric 150fe6060f1SDimitry Andric #endif // _LIBCPP___RANGES_CONCEPTS_H 151