17 #ifndef OPENKALMAN_COMPATIBILITY_ITERATOR_HPP 18 #define OPENKALMAN_COMPATIBILITY_ITERATOR_HPP 20 #ifndef __cpp_lib_ranges 32 namespace detail_indirectly_readable
36 template<
typename,
typename =
void>
40 struct cond_value_type<T,
std::enable_if_t<std::is_object_v<T>>> {
using value_type = std::remove_cv_t<T>; };
42 template<
typename,
typename =
void>
51 template<
typename,
typename =
void>
62 template<
typename I,
typename =
void>
70 {
using value_type = std::remove_cv_t<std::remove_extent_t<I>>; };
77 detail_indirectly_readable::has_member_value_type<T> and
78 not detail_indirectly_readable::has_member_element_type<T>>>
83 not detail_indirectly_readable::has_member_value_type<T> and
84 detail_indirectly_readable::has_member_element_type<T>>>
89 detail_indirectly_readable::has_member_value_type<T> and
90 detail_indirectly_readable::has_member_element_type<T>>>
92 std::is_same_v<std::remove_cv_t<typename T::element_type>, std::remove_cv_t<typename T::value_type>>,
93 detail_indirectly_readable::cond_value_type<typename T::value_type>,
94 detail_indirectly_readable::no_value_type> {};
103 template<
typename,
typename =
void>
111 template<
typename I,
typename =
void>
117 using difference_type = std::ptrdiff_t;
126 using difference_type =
typename T::difference_type;
131 std::is_integral_v<decltype(std::declval<const T&>() - std::declval<const T&>())>>>
133 using difference_type = std::make_signed_t<decltype(std::declval<T>() - std::declval<T>())>;
143 template<
typename T,
typename =
void>
147 struct iter_value_impl<T, std::void_t<typename std::iterator_traits<T>::value_type>> : std::iterator_traits<T> {};
150 template<
typename T,
typename =
void>
154 struct iter_difference_impl<T, std::void_t<typename std::iterator_traits<T>::difference_type>> : std::iterator_traits<T> {};
162 using iter_reference_t = decltype(*std::declval<I&>());
168 using iter_rvalue_reference_t = decltype(std::move(*std::declval<I&>()));
177 template<
typename I,
typename =
void,
typename =
void>
182 std::void_t<iter_value_t<I>, iter_reference_t<I>, iter_rvalue_reference_t<I>>,
183 std::enable_if_t<std::is_same<decltype(*std::declval<I>()), iter_reference_t<I>>::value>> : std::true_type {};
191 template<
typename T, std::enable_if_t<indirectly_readable<T>,
int > = 0>
192 using iter_const_reference_t = common_reference_t<const iter_value_t<T>&&, iter_reference_t<T>>;
194 template<
typename T, std::enable_if_t<indirectly_readable<T>,
int > = 0>
195 using iter_common_reference_t = common_reference_t<iter_reference_t<T>, iter_value_t<T>&>;
204 template<
typename Out,
typename T,
typename =
void>
207 template<
typename Out,
typename T>
210 decltype(*std::declval<Out&>() = std::declval<T&&>()),
211 decltype(*std::declval<Out&&>() = std::declval<T&&>()),
212 decltype(const_cast<const iter_reference_t<Out>&&>(*std::declval<Out&>()) = std::declval<T&&>()),
213 decltype(const_cast<const iter_reference_t<Out>&&>(*std::declval<Out&&>()) = std::declval<T&&>())
214 >> : std::true_type {};
218 template<
typename Out,
typename T>
228 template<
typename I,
typename =
void,
typename =
void>
233 std::enable_if_t<std::is_same<decltype(++std::declval<I&>()), I&>::value>> : std::true_type {};
247 template<
typename I,
typename =
void,
typename =
void>
252 std::void_t<iter_value_t<I>, iter_reference_t<I>, iter_rvalue_reference_t<I>>,
253 std::enable_if_t<std::is_same<decltype(*std::declval<I>()), iter_reference_t<I>>::value>> : std::true_type {};
266 inline constexpr
bool input_iterator =
267 input_or_output_iterator<I> and
268 indirectly_readable<I>;
277 template<
typename I,
typename T,
typename =
void>
280 template<
typename I,
typename T>
281 struct output_iterator_impl<I, T, std::void_t<decltype(*std::declval<I&>()++ = std::declval<T&&>())>> : std::true_type {};
285 template<
typename I,
typename T>
286 inline constexpr
bool output_iterator =
287 input_or_output_iterator<I> and
288 indirectly_writable<I, T> and
298 template<
typename I,
typename =
void>
302 struct is_incrementable<I, std::enable_if_t<std::is_same<decltype(std::declval<I&>()++), I>::value>> : std::true_type {};
307 inline constexpr
bool incrementable =
308 std::is_copy_constructible_v<I> and
309 std::is_object_v<I> and
310 std::is_move_constructible_v<I> and
311 std::is_assignable_v<I&, I> and
312 std::is_assignable_v<I&, I&> and
313 std::is_assignable_v<I&, const I&> and
314 std::is_assignable_v<I&, const I> and
315 std::is_default_constructible_v<I> and
316 weakly_incrementable<I> and
325 inline constexpr
bool forward_iterator =
326 input_iterator<I> and
336 template<
typename I,
typename =
void>
341 std::is_same<decltype(--std::declval<I&>()), I&>::value and
342 std::is_same<decltype(std::declval<I&>()--), I>::value>> : std::true_type {};
347 inline constexpr
bool bidirectional_iterator =
348 forward_iterator<I> and
358 template<
typename I,
typename =
void>
363 std::is_same_v<decltype(std::declval<I&>() += std::declval<iter_difference_t<I>>()), I&> and
364 std::is_same_v<decltype(std::declval<const I&>() + std::declval<iter_difference_t<I>>()), I> and
365 std::is_same_v<decltype(std::declval<iter_difference_t<I>>() + std::declval<const I&>()), I> and
366 std::is_same_v<decltype(std::declval<I&>() -= std::declval<iter_difference_t<I>>()), I&> and
367 std::is_same_v<decltype(std::declval<const I&>() - std::declval<iter_difference_t<I>>()), I> and
368 std::is_same_v<decltype(std::declval<const I&>()[std::declval<iter_difference_t<I>>()]), iter_reference_t<I>>
369 >> : std::true_type {};
374 inline constexpr
bool random_access_iterator =
375 bidirectional_iterator<I> and
385 template<
typename T,
typename U,
typename =
void>
388 template<
typename T,
typename U>
390 std::is_convertible_v<decltype(std::declval<const T&>() == std::declval<const U&>()), bool> and
391 std::is_convertible_v<decltype(std::declval<const T&>() != std::declval<const U&>()), bool> and
392 std::is_convertible_v<decltype(std::declval<const U&>() == std::declval<const T&>()), bool> and
393 std::is_convertible_v<decltype(std::declval<const U&>() != std::declval<const T&>()), bool>
394 >> : std::true_type {};
396 template<
typename T,
typename U,
typename =
void>
399 template<
typename I,
typename S>
401 std::is_same_v<decltype(std::declval<const S&>() - std::declval<const I&>()), iter_difference_t<I>> and
402 std::is_same_v<decltype(std::declval<const I&>() - std::declval<const S&>()), iter_difference_t<I>>
403 >> : std::true_type {};
408 template<
typename S,
typename I>
409 inline constexpr
bool sentinel_for =
413 template<
typename S,
typename I>
414 inline constexpr
bool sized_sentinel_for = sentinel_for<S, I> and
425 template<
typename I, std::enable_if_t<weakly_incrementable<I>,
int> = 0>
426 friend constexpr
bool 429 template<
typename I, std::enable_if_t<weakly_incrementable<I>,
int> = 0>
430 friend constexpr
bool 433 template<
typename I, std::enable_if_t<weakly_incrementable<I>,
int> = 0>
434 friend constexpr
bool 446 #endif //OPENKALMAN_COMPATIBILITY_ITERATOR_HPP Definition: iterator.hpp:63
Definition: iterator.hpp:278
Definition: iterator.hpp:43
Definition: iterator.hpp:52
Definition: iterator.hpp:386
Definition: tuple_reverse.hpp:103
Definition: iterator.hpp:359
Definition: iterator.hpp:37
constexpr bool value
T is numerical value or is reducible to a numerical value.
Definition: value.hpp:31
Definition: iterator.hpp:423
Definition: iterator.hpp:151
The root namespace for OpenKalman.
Definition: basics.hpp:34
Definitions relating to the availability of c++ language features.
Definition: iterator.hpp:205
Definition: iterator.hpp:104
Definition: iterator.hpp:34
Definition: iterator.hpp:112
Definition: iterator.hpp:229
Definition: iterator.hpp:178
Definition: iterator.hpp:299
Definition: iterator.hpp:144
Definition: iterator.hpp:337
Definition: iterator.hpp:397