// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef _LIBCPP___RANGES_CONCEPTS_H #define _LIBCPP___RANGES_CONCEPTS_H #include <__concepts/constructible.h> #include <__concepts/movable.h> #include <__concepts/same_as.h> #include <__config> #include <__iterator/concepts.h> #include <__iterator/incrementable_traits.h> #include <__iterator/iter_move.h> #include <__iterator/iterator_traits.h> #include <__iterator/readable_traits.h> #include <__ranges/access.h> #include <__ranges/data.h> #include <__ranges/enable_borrowed_range.h> #include <__ranges/enable_view.h> #include <__ranges/size.h> #include <__type_traits/add_pointer.h> #include <__type_traits/is_reference.h> #include <__type_traits/remove_cvref.h> #include <__type_traits/remove_reference.h> #include <__utility/declval.h> #include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER > 17 namespace ranges { // [range.range] template concept range = requires(_Tp& __t) { ranges::begin(__t); // sometimes equality-preserving ranges::end(__t); }; template concept input_range = range<_Tp> && input_iterator>; template concept borrowed_range = range<_Range> && (is_lvalue_reference_v<_Range> || enable_borrowed_range>); // `iterator_t` defined in <__ranges/access.h> template using sentinel_t = decltype(ranges::end(std::declval<_Rp&>())); template using range_difference_t = iter_difference_t>; template using range_value_t = iter_value_t>; template using range_reference_t = iter_reference_t>; template using range_rvalue_reference_t = iter_rvalue_reference_t>; // [range.sized] template concept sized_range = range<_Tp> && requires(_Tp& __t) { ranges::size(__t); }; template using range_size_t = decltype(ranges::size(std::declval<_Rp&>())); // `disable_sized_range` defined in `<__ranges/size.h>` // [range.view], views // `enable_view` defined in <__ranges/enable_view.h> // `view_base` defined in <__ranges/enable_view.h> template concept view = range<_Tp> && movable<_Tp> && enable_view<_Tp>; template concept __simple_view = view<_Range> && range && same_as, iterator_t> && same_as, sentinel_t>; // [range.refinements], other range refinements template concept output_range = range<_Rp> && output_iterator, _Tp>; template concept forward_range = input_range<_Tp> && forward_iterator>; template concept bidirectional_range = forward_range<_Tp> && bidirectional_iterator>; template concept random_access_range = bidirectional_range<_Tp> && random_access_iterator>; template concept contiguous_range = random_access_range<_Tp> && contiguous_iterator> && requires(_Tp& __t) { { ranges::data(__t) } -> same_as>>; }; template concept common_range = range<_Tp> && same_as, sentinel_t<_Tp>>; template inline constexpr bool __is_std_initializer_list = false; template inline constexpr bool __is_std_initializer_list> = true; template concept viewable_range = range<_Tp> && ((view> && constructible_from, _Tp>) || (!view> && (is_lvalue_reference_v<_Tp> || (movable> && !__is_std_initializer_list>)))); } // namespace ranges #endif // _LIBCPP_STD_VER > 17 _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___RANGES_CONCEPTS_H