VCCC  2024.05
VisualCamp Common C++ library
legacy_bidirectional_iterator.hpp
Go to the documentation of this file.
1 //
2 // Created by yonggyulee on 2023/12/25.
3 //
4 
5 #ifndef VCCC_ITERATOR_ITERATOR_TRAITS_LEGACY_BIDIRECTIONAL_ITERATOR_HPP_
6 #define VCCC_ITERATOR_ITERATOR_TRAITS_LEGACY_BIDIRECTIONAL_ITERATOR_HPP_
7 
8 #include <type_traits>
9 
18 
19 namespace vccc {
20 namespace detail {
21 
22 template<typename T, typename = void>
23 struct is_pre_decrementable : std::false_type {};
24 
25 template<typename T>
26 struct is_pre_decrementable<T, void_t<decltype( --std::declval<T&>() )>>
27  : same_as<decltype( --std::declval<T&>() ), T&> {};
28 
29 template<typename T, typename = void>
30 struct is_post_decrementable : std::false_type {};
31 
32 template<typename T>
33 struct is_post_decrementable<T, void_t<decltype( std::declval<T&>()-- )>>
34  : convertible_to<decltype(std::declval<T&>()--), const T&> {};
35 
36 template<
37  typename It,
38  bool = dereferenceable<decltype(std::declval<It&>()--)>::value
39 >
40 struct LegacyBidirectionalIteratorRequireStage2 : std::false_type {};
41 
42 template<typename It>
43 struct LegacyBidirectionalIteratorRequireStage2<It, true> // vvvvvvvvvvvvv already satisfied
44  : same_as<decltype(*std::declval<It&>()--), iter_reference_t<It>> {};
45 // iter_reference_t<It> already satisfied in LegacyInputIterator ^^^^^^^^^
46 
47 template<
48  typename It,
49  bool =
50  conjunction<
51  is_pre_decrementable<It>,
52  is_post_decrementable<It>
53  >::value
54 >
55 struct LegacyBidirectionalIteratorRequireStage1 : std::false_type {};
56 
57 template<typename It>
58 struct LegacyBidirectionalIteratorRequireStage1<It, true> : LegacyBidirectionalIteratorRequireStage2<It> {};
59 
60 } // namespace detail
61 
70 struct LegacyBidirectionalIterator : std::false_type {};
71 
72 template<typename It>
73 struct LegacyBidirectionalIterator<It, true> : detail::LegacyBidirectionalIteratorRequireStage1<It> {};
74 
77 
78 } // namespace vccc
79 
80 #endif // VCCC_ITERATOR_ITERATOR_TRAITS_LEGACY_BIDIRECTIONAL_ITERATOR_HPP_
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: legacy_bidirectional_iterator.hpp:70