#pragma once #include #include #include #include #include // Section: Non-Dependant Typedef Helpers namespace iterator::detail { template using category_t = typename std::iterator_traits::iterator_category; template using iter = decltype(std::begin(std::declval())); } namespace iterator::detail { // Type Helper for identifying container-like objects template struct is_container : std::false_type {}; template struct is_container>> : std::true_type {}; template struct sentinel_type { using type = void; }; template struct sentinel_type> { using type = typename It::sentinel_type; }; } namespace iterator::detail { template constexpr bool is_container_v = is_container{}; template constexpr bool is_rvalue_iterator_v = !std::is_reference_v; template constexpr bool has_sentinel_type_v = !std::is_void_v::type>; template constexpr bool is_sentinel_v = std::is_same_v::type, S>; } #include