VCCC  2024.05
VisualCamp Common C++ library
indirectly_readable.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_HPP_
6 #define VCCC_ITERATOR_INDIRECTLY_READABLE_HPP_
7 
8 #include <type_traits>
9 
19 
20 namespace vccc {
21 namespace detail {
22 
24 struct indirectly_readable_impl : std::false_type {};
25 
26 template<typename In>
27 struct indirectly_readable_impl<In, true>
28  : conjunction<
29  common_reference_with<iter_reference_t<In>&&, iter_value_t<In>&>,
30  common_reference_with<iter_reference_t<In>&&, iter_rvalue_reference_t<In>&&>,
31  common_reference_with<iter_rvalue_reference_t<In>&&, const iter_value_t<In>&>
32  >{};
33 
34 template<
35  typename In,
36  bool = conjunction<
37  dereferenceable<const In>,
38  has_typename_type<iter_value<In>>,
39  has_typename_type<iter_reference<In>>,
40  has_typename_type<iter_rvalue_reference<In>>
41  >::value
42 >
43 struct indirectly_readable_requires : std::false_type {};
44 
45 template<typename In>
46 struct indirectly_readable_requires<In, true>
47  : conjunction<
48  same_as<decltype(*std::declval<const In&>()), iter_reference_t<In>>,
49  same_as<decltype(ranges::iter_move(std::declval<const In&>())), iter_rvalue_reference_t<In>>,
50  indirectly_readable_impl<In>
51  > {};
52 
53 } // namespace detail
54 
57 
58 template<typename In>
59 struct indirectly_readable : detail::indirectly_readable_requires<remove_cvref_t<In>> {};
60 
62 
63 } // namespace vccc
64 
65 #endif // VCCC_ITERATOR_INDIRECTLY_READABLE_HPP_
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
Definition: indirectly_readable.hpp:59