From 8a9252826187085da4db5398a2c30d2c7672223a Mon Sep 17 00:00:00 2001 From: bolero-MURAKAMI Date: Sun, 23 Dec 2012 20:49:45 +0900 Subject: [PATCH] fix distance --- sprout/iterator/distance.hpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) 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