Header file range/v3/utility/iterator_traits.hpp

#include <meta/meta.hpp>

#include <range/v3/range_fwd.hpp>

#include <range/v3/utility/iterator_concepts.hpp>

namespace ranges
{
    inline namespace v3
    {
        template <typename I>
        using iterator_value_t = concepts::Readable::value_t<I>;
        
        template <typename I>
        using iterator_reference_t = concepts::Readable::reference_t<I>;
        
        template <typename I>
        using iterator_rvalue_reference_t = concepts::Readable::rvalue_reference_t<I>;
        
        template <typename I>
        using iterator_common_reference_t = concepts::Readable::common_reference_t<I>;
        
        template <typename I>
        using iterator_category_t = concepts::InputIterator::category_t<I>;
        
        template <typename I>
        using iterator_difference_t = concepts::WeaklyIncrementable::difference_t<I>;
        
        template <typename I>
        using iterator_size_t = meta::_t<std::make_unsigned<iterator_difference_t<I>>>;
        
        template <typename I>
        using iterator_value = meta::defer<iterator_value_t, I>;
        
        template <typename I>
        using iterator_difference = meta::defer<iterator_difference_t, I>;
        
        template <typename I>
        using iterator_reference = meta::defer<iterator_reference_t, I>;
        
        template <typename I>
        using iterator_rvalue_reference = meta::defer<iterator_rvalue_reference_t, I>;
        
        template <typename I>
        using iterator_common_reference = meta::defer<iterator_common_reference_t, I>;
        
        template <typename I>
        using iterator_size = meta::defer<iterator_size_t, I>;
    }
}

Alias template ranges::v3::iterator_value_t<I>

template <typename I>
using iterator_value_t = concepts::Readable::value_t<I>;

@{ /////////////////////////////////////////////////////////////////////////////////////////