From ba2eb48d63fbdaf5934a997f119177ae49677979 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Tue, 10 Oct 2017 16:49:56 +1100 Subject: [PATCH] iterator: add numeric_iterator for ostream output --- iterator.hpp | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/iterator.hpp b/iterator.hpp index e9770bec..c288e7af 100644 --- a/iterator.hpp +++ b/iterator.hpp @@ -20,6 +20,7 @@ #include "types/traits.hpp" #include "variadic.hpp" +#include "view.hpp" template @@ -153,6 +154,70 @@ namespace util { }; + /////////////////////////////////////////////////////////////////////////// + // + 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 util::view { + numeric_iterator (std::begin (data)), + numeric_iterator (std::end (data)) + }; + } + + + //------------------------------------------------------------------------- + template + auto + numeric_view (const ContainerT &data) + { + return util::view { + numeric_iterator (std::begin (data)), + numeric_iterator (std::end (data)) + }; + } + + /////////////////////////////////////////////////////////////////////////// template class indices {