is_random_access_iterator

Description

A random access iterator is a bidirectional iterator that can be moved to point to any element in constant time.

Requirements

The type It satisfies is_random_access_iterator if

And, given

  • value_type, the type denoted by std::iterator_traits<It>::value_type
  • difference_type, the type denoted by std::iterator_traits<It>::difference_type
  • reference, the type denoted by std::iterator_traits<It>::reference
  • i, a, b, objects of type It or const It
  • r, a value of type It&
  • n, an integer of type difference_type

The following expressions must be valid and have their specified effects

Expression Return type
r += n It&
a + n, n + a It
r -= n It&
i - n It
b - a difference_type
i[n] convertible to reference

Synopsis

TICK_TRAIT(is_random_access_iterator, 
    is_bidirectional_iterator<_>, 
    is_totally_ordered<_>
)
{
    template<class I, class Number>
    auto require(I&& i, Number n) -> valid<
        decltype(returns<typename std::add_lvalue_reference<I>::type>(i += n)),
        decltype(returns<typename std::add_lvalue_reference<I>::type>(i -= n)),
        decltype(returns<I>(i + n)),
        decltype(returns<I>(i - n)),
        decltype(returns<I>(n + i)),
        decltype(returns<typename iterator_traits<I>::difference_type>(i - i)),
        decltype(returns<typename iterator_traits<I>::reference>(i[n])),
        decltype(returns<typename iterator_traits<I>::reference>(*(i + n)))
    >;

    template<class I>
    auto require(I&& i) -> valid<
        decltype(require(std::forward<I>(i), 0))
    >;
};