VCCC  2024.05
VisualCamp Common C++ library
indirectly_writable.hpp
Go to the documentation of this file.
1 //
2 // Created by yonggyulee on 2023/12/31.
3 //
4 
5 #ifndef VCCC_ITERATOR_INDIRECTLY_WRITABLE_HPP
6 #define VCCC_ITERATOR_INDIRECTLY_WRITABLE_HPP
7 
8 #include <type_traits>
9 #include <utility>
10 
17 
18 namespace vccc {
19 namespace detail {
20 
21 template<
22  typename Out,
23  typename T,
24  bool = conjunction<
25  dereferenceable<decltype(std::forward<Out>(std::declval<Out&&>()))>,
26  is_referencable<iter_reference_t<Out>>
27  >::value /* true */
28 >
29 struct indirectly_writable_impl_2
30  : conjunction<
31  std::is_assignable<decltype(*std::declval<Out&&>()), decltype(std::forward<T>(std::declval<T&&>()))>,
32  std::is_assignable<decltype(*std::forward<Out>(std::declval<Out&&>())), decltype(std::forward<T>(std::declval<T&&>()))>,
33  std::is_assignable<decltype(const_cast<const iter_reference_t<Out>&&>(*std::declval<Out>())), decltype(std::forward<T>(std::declval<T&&>()))>,
34  std::is_assignable<decltype(const_cast<const iter_reference_t<Out>&&>(*std::forward<Out>(std::declval<Out>()))), decltype(std::forward<T>(std::declval<T&&>()))>
35  >{};
36 
37 template<typename Out, typename T>
38 struct indirectly_writable_impl_2<Out, T, false> : std::false_type {};
39 
40 template<
41  typename Out,
42  typename T,
43  bool = conjunction<
44  dereferenceable<Out>,
45  is_referencable<T>,
46  has_typename_type<iter_reference<Out>>
47  >::value /* true */
48 >
49 struct indirectly_writable_impl : indirectly_writable_impl_2<Out, T> {};
50 template<typename Out, typename T>
51 struct indirectly_writable_impl<Out, T, false> : std::false_type {};
52 
53 } // namespace detail
54 
57 
66 template<typename Out, typename T>
67 struct indirectly_writable : detail::indirectly_writable_impl<Out, T> {};
68 
70 
71 } // namespace vccc
72 
73 #endif // VCCC_ITERATOR_INDIRECTLY_WRITABLE_HPP
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
specifies that a value can be written to an iterator's referenced object
Definition: indirectly_writable.hpp:67