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 Varlamovconsteval 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