namespace cruft::iterator { /////////////////////////////////////////////////////////////////////////// // template struct numeric_iterator : public std::iterator< typename std::iterator_traits::iterator_category, decltype (+std::declval::value_type> ()), typename std::iterator_traits::difference_type, typename std::iterator_traits::pointer, typename std::iterator_traits::reference > { static_assert (std::is_arithmetic_v::value_type>); explicit numeric_iterator (IteratorT _inner): m_inner (_inner) { ; } auto operator++ (void) { ++m_inner; return *this; } auto operator- (const numeric_iterator &rhs) const { return typename std::iterator_traits::difference_type { m_inner - rhs.m_inner }; } auto operator* (void) const { return +*m_inner; } auto operator== (const numeric_iterator &rhs) const { return m_inner == rhs.m_inner; } auto operator!= (const numeric_iterator &rhs) const { return m_inner != rhs.m_inner; } private: IteratorT m_inner; }; //------------------------------------------------------------------------- // convenience function that constructs a view of numeric_iterators for a // provided container template auto numeric_view (ContainerT &data) { return cruft::view { numeric_iterator (std::begin (data)), numeric_iterator (std::end (data)) }; } //------------------------------------------------------------------------- template auto numeric_view (const ContainerT &data) { return cruft::view { numeric_iterator (std::begin (data)), numeric_iterator (std::end (data)) }; } }