diff --git a/sprout/iterator/distance.hpp b/sprout/iterator/distance.hpp index 1187be1c..4a9db58e 100644 --- a/sprout/iterator/distance.hpp +++ b/sprout/iterator/distance.hpp @@ -68,11 +68,22 @@ namespace sprout { } template - inline SPROUT_CONSTEXPR typename std::iterator_traits::difference_type + inline SPROUT_CONSTEXPR typename std::enable_if< + std::is_literal_type::value, + typename std::iterator_traits::difference_type + >::type iterator_distance(InputIterator first, InputIterator last) { typedef typename std::iterator_traits::iterator_category* category; return sprout::iterator_detail::iterator_distance(first, last, category()); } + template + inline SPROUT_CONSTEXPR typename std::enable_if< + !std::is_literal_type::value, + typename std::iterator_traits::difference_type + >::type + iterator_distance(InputIterator first, InputIterator last) { + return std::distance(first, last); + } } // namespace iterator_detail } // namespace sprout @@ -92,7 +103,8 @@ namespace sprout { // // effect: // ADL callable iterator_distance(first, last) -> iterator_distance(first, last) - // [first, last) is RandomAccessIterator && not Pointer -> last - first + // otherwise, [first, last) is LiteralType -> std::distance(first, last) + // otherwise, [first, last) is RandomAccessIterator && not Pointer -> last - first // otherwise -> linearly count: first to last // template