#pragma once #define _val(type) std::declval() #define exists(expr) std::void_t #include namespace iterator::detail { template struct reference_helper { using type = decltype(*std::declval()); }; template struct reference_helper> { using type = typename T::reference; }; template struct value_type_helper { using reference = typename reference_helper::type; using type = std::remove_cv_t>; }; template struct value_type_helper> { using type = typename T::value_type; }; template using value_type = typename value_type_helper::type; template using reference = typename reference_helper::type; template struct is_container : std::false_type {}; template struct is_container>> : std::true_type {}; template constexpr bool is_container_v = is_container{}; template constexpr bool is_rvalue_iterator_v = !std::is_reference_v())>; }