VCCC  2024.05
VisualCamp Common C++ library
iter_concept.hpp
Go to the documentation of this file.
1 //
2 // Created by yonggyulee on 2023/12/25.
3 //
4 
5 #ifndef VCCC_ITERATOR_DETAIL_ITER_CONCEPT_HPP_
6 #define VCCC_ITERATOR_DETAIL_ITER_CONCEPT_HPP_
7 
10 
11 namespace vccc {
12 namespace detail {
13 
14 template<typename I>
15 struct ITER_TRAITS_T {
16  using type = std::conditional_t<
17  is_primary_iterator_traits< cxx20_iterator_traits<I> >::value,
18  I,
19  cxx20_iterator_traits<I>>;
20 };
21 
22 template<typename I>
23 using ITER_TRAITS = typename ITER_TRAITS_T<I>::type;
24 
25 
26 template<typename I, bool = is_primary_iterator_traits< cxx20_iterator_traits<I> >::value /* false */>
27 struct ITER_CONCEPT_IMPL_3 {};
28 template<typename I>
29 struct ITER_CONCEPT_IMPL_3<I, true> {
30  using type = random_access_iterator_tag;
31 };
32 
33 template<typename I, bool = has_typename_iterator_category<ITER_TRAITS<I>>::value /* false */>
34 struct ITER_CONCEPT_IMPL_2 : ITER_CONCEPT_IMPL_3<I> {};
35 template<typename I>
36 struct ITER_CONCEPT_IMPL_2<I, true> {
37  using type = typename ITER_TRAITS<I>::iterator_category;
38 };
39 
40 template<typename I, bool = has_typename_iterator_concept<ITER_TRAITS<I>>::value /* false */>
41 struct ITER_CONCEPT_IMPL_1 : ITER_CONCEPT_IMPL_2<I> {};
42 template<typename I>
43 struct ITER_CONCEPT_IMPL_1<I, true> {
44  using type = typename ITER_TRAITS<I>::iterator_concept;
45 };
46 
47 template<typename I>
48 struct ITER_CONCEPT_T : ITER_CONCEPT_IMPL_1<I> {};
49 
50 template<typename I>
51 using ITER_CONCEPT = typename ITER_CONCEPT_T<I>::type;
52 
53 } // namespace detail
54 } // namespace vccc
55 
56 #endif // VCCC_ITERATOR_DETAIL_ITER_CONCEPT_HPP_
std::random_access_iterator_tag random_access_iterator_tag
Definition: iterator_tag.hpp:19
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35