VCCC  2024.05
VisualCamp Common C++ library
indirectly_readable_traits.hpp
Go to the documentation of this file.
1 //
2 // Created by yonggyulee on 2023/12/24.
3 //
4 
5 #ifndef VCCC_ITERATOR_INDIRECTLY_READABLE_TRAITS_HPP_
6 #define VCCC_ITERATOR_INDIRECTLY_READABLE_TRAITS_HPP_
7 
8 #include <type_traits>
9 
15 
16 namespace vccc {
17 namespace detail {
18 
19 template<typename T>
20 struct value_typer {
21  using value_type = T;
22 };
23 
24 template<
25  typename T,
28 >
29 struct indirectly_readable_traits_impl {};
30 
31 template<typename T>
32 struct indirectly_readable_traits_impl<T, true, false>
33  : std::conditional_t<
34  std::is_object<typename T::value_type>::value,
35  value_typer<std::remove_cv_t<typename T::value_type>>,
36  empty
37  > {};
38 
39 template<typename T>
40 struct indirectly_readable_traits_impl<T, false, true>
41  : std::conditional_t<
42  std::is_object<typename T::element_type>::value,
43  value_typer<std::remove_cv_t<typename T::element_type>>,
44  empty
45  > {};
46 
47 template<typename T>
48 struct indirectly_readable_traits_impl<T, true, true>
49  : std::conditional_t<
50  conjunction<
51  std::is_object<typename T::value_type>, std::is_object<typename T::element_type>,
52  std::is_same<std::remove_cv_t<typename T::value_type>, std::remove_cv_t<typename T::element_type>>
53  >::value,
54  value_typer<std::remove_cv_t<typename T::value_type>>,
55  empty
56  > {};
57 
58 } // namespace detail
59 
62 
63 template<typename I>
64 struct indirectly_readable_traits : detail::indirectly_readable_traits_impl<I> {};
65 
67 
68 template<typename T>
70  : std::conditional_t<
72  detail::value_typer<remove_cvref_t<T>>,
73  empty
74  > {};
75 
76 template<typename T>
78 
79 } // namespace vccc
80 
81 #endif // VCCC_ITERATOR_INDIRECTLY_READABLE_TRAITS_HPP_
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
Definition: empty.hpp:10
Definition: indirectly_readable_traits.hpp:64