#ifndef SPROUT_ITERATOR_DISTANCE_HPP #define SPROUT_ITERATOR_DISTANCE_HPP #include #include #include #include namespace sprout_adl { sprout::adl_not_found iterator_distance(...); } // namespace sprout_adl namespace sprout { namespace iterator_detail { // Copyright (C) 2011 RiSK (sscrisk) template inline SPROUT_CONSTEXPR typename std::iterator_traits::difference_type iterator_distance(InputIterator first, InputIterator last) { return first == last ? 0 : 1 + sprout::iterator_detail::iterator_distance(sprout::next(first), last) ; } } // namespace iterator_detail } // namespace sprout namespace sprout_iterator_detail { template inline SPROUT_CONSTEXPR typename std::iterator_traits::difference_type distance(InputIterator first, InputIterator last) { using sprout::iterator_detail::iterator_distance; using sprout_adl::iterator_distance; return iterator_distance(first, last); } } // namespace sprout_iterator_detail namespace sprout { // // distance // template inline SPROUT_CONSTEXPR typename std::iterator_traits::difference_type distance(InputIterator first, InputIterator last) { return sprout_iterator_detail::distance(first, last); } } // namespace sprout #endif // #ifndef SPROUT_ITERATOR_DISTANCE_HPP