diff --git a/sprout/iterator/distance.hpp b/sprout/iterator/distance.hpp index da7d5b33..bed24d2b 100644 --- a/sprout/iterator/distance.hpp +++ b/sprout/iterator/distance.hpp @@ -48,7 +48,7 @@ namespace sprout { sprout::is_constant_distance_iterator::value, typename std::iterator_traits::difference_type >::type - iterator_distance(RandomAccessIterator first, RandomAccessIterator last, std::random_access_iterator_tag*) { + iterator_distance_dispatch(RandomAccessIterator first, RandomAccessIterator last) { return last - first; } @@ -90,27 +90,28 @@ namespace sprout { } template inline SPROUT_CONSTEXPR typename std::enable_if< - std::is_literal_type::value, + !sprout::is_constant_distance_iterator::value && sprout::is_input_iterator::value + && std::is_literal_type::value, typename std::iterator_traits::difference_type >::type - iterator_distance(InputIterator first, InputIterator last, std::input_iterator_tag*) { + iterator_distance_dispatch(InputIterator first, InputIterator last) { typedef sprout::pair::difference_type> type; return sprout::iterator_detail::iterator_distance_impl(type(first, 0), last, 1).second; } template inline SPROUT_CONSTEXPR typename std::enable_if< - !std::is_literal_type::value, + !sprout::is_constant_distance_iterator::value && sprout::is_input_iterator::value + && !std::is_literal_type::value, typename std::iterator_traits::difference_type >::type - iterator_distance(InputIterator first, InputIterator last, std::input_iterator_tag*) { + iterator_distance_dispatch(InputIterator first, InputIterator last) { return sprout::iterator_detail::cxx14_distance(first, last); } template inline SPROUT_CONSTEXPR typename std::iterator_traits::difference_type iterator_distance(InputIterator first, InputIterator last) { - typedef typename std::iterator_traits::iterator_category* category; - return sprout::iterator_detail::iterator_distance(first, last, category()); + return sprout::iterator_detail::iterator_distance_dispatch(first, last); } } // namespace iterator_detail } // namespace sprout