namespace detail
{template<class It>constexpr// required since C++17typenamestd::iterator_traits<It>::difference_type
do_distance(It first, It last, std::input_iterator_tag){typenamestd::iterator_traits<It>::difference_type result =0;while(first != last){++first;++result;}return result;}template<class It>constexpr// required since C++17typenamestd::iterator_traits<It>::difference_type
do_distance(It first, It last, std::random_access_iterator_tag){return last - first;}}// namespace detailtemplate<class It>constexpr// since C++17typenamestd::iterator_traits<It>::difference_type
distance(It first, It last){return detail::do_distance(first, last,
typenamestd::iterator_traits<It>::iterator_category());}