VCCC  2024.05
VisualCamp Common C++ library
range_mapped_t.hpp
Go to the documentation of this file.
1 //
2 // Created by yonggyulee on 2024/01/13.
3 //
4 
5 #ifndef VCCC_RANGES_RANGE_MAPPED_T_HPP
6 #define VCCC_RANGES_RANGE_MAPPED_T_HPP
7 
8 #include <tuple>
9 #include <type_traits>
10 
14 
15 namespace vccc {
16 namespace ranges {
17 namespace detail {
18 
19 template<typename T, typename = void>
20 struct has_second_type : std::false_type {};
21 template<typename T>
22 struct has_second_type<T, void_t<typename T::second_type>> : std::true_type {};
23 
24 template<typename T, typename = void>
25 struct has_second_tuple_element : std::false_type {};
26 template<typename T>
27 struct has_second_tuple_element<T, void_t<std::tuple_element_t<1, T>>> : std::true_type {};
28 
30 struct guide_map {};
31 template<typename RV, bool v>
32 struct guide_map<RV, true, v> {
33  using type = typename RV::second_type;
34 };
35 template<typename RV>
36 struct guide_map<RV, false, true> {
37  using type = std::tuple_element_t<1, RV>;
38 };
39 
41 struct range_mapped_impl {};
42 template<typename R>
43 struct range_mapped_impl<R, true> : guide_map<range_value_t<R>> {};
44 
45 } // namespace ranges
46 
47 template<typename R>
48 struct range_mapped : detail::range_mapped_impl<R> {};
49 
52 
54 template<typename R>
56 
58 
59 } // namespace vccc
60 } // namespace ranges
61 
62 #endif // VCCC_RANGES_RANGE_MAPPED_T_HPP
typename range_mapped< R >::type range_mapped_t
Definition: range_mapped_t.hpp:55
void void_t
Definition: void_t.hpp:19
Definition: matrix.hpp:495
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
Definition: range_mapped_t.hpp:48