| 1234567891011121314151617181920212223242526272829303132333435363738 |
- #pragma once
- #define _val(type) std::declval<type>()
- #define exists(expr) std::void_t<decltype(expr)>
- #include <iterator/iterator_fwd.hpp>
- namespace iterator::detail {
- template <typename T, typename = void> struct reference_helper {
- using type = decltype(*std::declval<T>());
- };
- template <typename T>
- struct reference_helper<T, std::void_t<typename T::reference>> {
- using type = typename T::reference;
- };
- template <typename T, typename = void> struct value_type_helper {
- using reference = typename reference_helper<T>::type;
- using type = std::remove_cv_t<std::remove_reference_t<reference>>;
- };
- template <typename T>
- struct value_type_helper<T, std::void_t<typename T::value_type>> {
- using type = typename T::value_type;
- };
- template <typename T> using value_type = typename value_type_helper<T>::type;
- template <typename T> using reference = typename reference_helper<T>::type;
- template <typename C, typename = void> struct is_container : std::false_type {};
- template <typename C>
- struct is_container<C, std::void_t<iter<C>>> : std::true_type {};
- template <typename C> constexpr bool is_container_v = is_container<C>{};
- template <typename Iter>
- constexpr bool is_rvalue_iterator_v =
- !std::is_reference_v<decltype(*std::declval<Iter>())>;
- }
|