1*8ed702b8SKonstantin Varlamov //===----------------------------------------------------------------------===//
2*8ed702b8SKonstantin Varlamov //
3*8ed702b8SKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*8ed702b8SKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information.
5*8ed702b8SKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*8ed702b8SKonstantin Varlamov //
7*8ed702b8SKonstantin Varlamov //===----------------------------------------------------------------------===//
8*8ed702b8SKonstantin Varlamov 
9*8ed702b8SKonstantin Varlamov #ifndef _LIBCPP___ALGORITHM_RANGES_ITERATOR_CONCEPT_H
10*8ed702b8SKonstantin Varlamov #define _LIBCPP___ALGORITHM_RANGES_ITERATOR_CONCEPT_H
11*8ed702b8SKonstantin Varlamov 
12*8ed702b8SKonstantin Varlamov #include <__config>
13*8ed702b8SKonstantin Varlamov #include <__iterator/concepts.h>
14*8ed702b8SKonstantin Varlamov #include <__iterator/iterator_traits.h>
15*8ed702b8SKonstantin Varlamov #include <type_traits>
16*8ed702b8SKonstantin Varlamov 
17*8ed702b8SKonstantin Varlamov #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
18*8ed702b8SKonstantin Varlamov #  pragma GCC system_header
19*8ed702b8SKonstantin Varlamov #endif
20*8ed702b8SKonstantin Varlamov 
21*8ed702b8SKonstantin Varlamov #if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
22*8ed702b8SKonstantin Varlamov 
23*8ed702b8SKonstantin Varlamov _LIBCPP_BEGIN_NAMESPACE_STD
24*8ed702b8SKonstantin Varlamov 
25*8ed702b8SKonstantin Varlamov namespace ranges {
26*8ed702b8SKonstantin Varlamov 
27*8ed702b8SKonstantin Varlamov template <class _IterMaybeQualified>
__get_iterator_concept()28*8ed702b8SKonstantin Varlamov consteval auto __get_iterator_concept() {
29*8ed702b8SKonstantin Varlamov   using _Iter = __uncvref_t<_IterMaybeQualified>;
30*8ed702b8SKonstantin Varlamov 
31*8ed702b8SKonstantin Varlamov   if constexpr (contiguous_iterator<_Iter>)
32*8ed702b8SKonstantin Varlamov     return contiguous_iterator_tag();
33*8ed702b8SKonstantin Varlamov   else if constexpr (random_access_iterator<_Iter>)
34*8ed702b8SKonstantin Varlamov     return random_access_iterator_tag();
35*8ed702b8SKonstantin Varlamov   else if constexpr (bidirectional_iterator<_Iter>)
36*8ed702b8SKonstantin Varlamov     return bidirectional_iterator_tag();
37*8ed702b8SKonstantin Varlamov   else if constexpr (forward_iterator<_Iter>)
38*8ed702b8SKonstantin Varlamov     return forward_iterator_tag();
39*8ed702b8SKonstantin Varlamov   else if constexpr (input_iterator<_Iter>)
40*8ed702b8SKonstantin Varlamov     return input_iterator_tag();
41*8ed702b8SKonstantin Varlamov }
42*8ed702b8SKonstantin Varlamov 
43*8ed702b8SKonstantin Varlamov template <class _Iter>
44*8ed702b8SKonstantin Varlamov using __iterator_concept = decltype(__get_iterator_concept<_Iter>());
45*8ed702b8SKonstantin Varlamov 
46*8ed702b8SKonstantin Varlamov } // namespace ranges
47*8ed702b8SKonstantin Varlamov _LIBCPP_END_NAMESPACE_STD
48*8ed702b8SKonstantin Varlamov 
49*8ed702b8SKonstantin Varlamov #endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
50*8ed702b8SKonstantin Varlamov 
51*8ed702b8SKonstantin Varlamov #endif // _LIBCPP___ALGORITHM_RANGES_ITERATOR_CONCEPT_H
52