From 4d30ce40c7bd681f1719a97a1eae8987dea39955 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Mon, 9 Jan 2017 01:33:01 +0000 Subject: [PATCH] refs #852 Added reverse iterators to CRange and CSequence. --- src/blackmisc/range.h | 13 +++++++++++++ src/blackmisc/sequence.h | 20 ++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/blackmisc/range.h b/src/blackmisc/range.h index 7c0b3c806..2d43d3881 100644 --- a/src/blackmisc/range.h +++ b/src/blackmisc/range.h @@ -180,6 +180,8 @@ namespace BlackMisc typedef const value_type *const_pointer; typedef I const_iterator; typedef I iterator; + typedef std::reverse_iterator const_reverse_iterator; + typedef std::reverse_iterator reverse_iterator; typedef typename std::iterator_traits::difference_type difference_type; //! @} @@ -194,6 +196,17 @@ namespace BlackMisc const_iterator cend() const { return m_end; } //! @} + //! Reverse begin and end iterators. + //! @{ + const_reverse_iterator rbegin() const { return const_reverse_iterator(m_end); } + const_reverse_iterator crbegin() const { return const_reverse_iterator(m_end); } + const_reverse_iterator rend() const { return const_reverse_iterator(m_begin); } + const_reverse_iterator crend() const { return const_reverse_iterator(m_begin); } + //! @} + + //! Create a range from reverse iterators. + CRange reverse() const { return { rbegin(), rend() }; } + //! Implicit conversion to any container of value_type which supports push_back. This will copy elements. template ::value>> operator T() const diff --git a/src/blackmisc/sequence.h b/src/blackmisc/sequence.h index 8756f13c2..b476fcc75 100644 --- a/src/blackmisc/sequence.h +++ b/src/blackmisc/sequence.h @@ -57,6 +57,8 @@ namespace BlackMisc typedef const T *const_pointer; typedef typename Iterators::ConstRandomAccessIterator const_iterator; typedef typename Iterators::RandomAccessIterator iterator; + typedef std::reverse_iterator const_reverse_iterator; + typedef std::reverse_iterator reverse_iterator; typedef ptrdiff_t difference_type; typedef int size_type; //! @} @@ -113,6 +115,24 @@ namespace BlackMisc //! Returns const iterator one past the end of the sequence. const_iterator cend() const { return pimpl() ? pimpl()->cend() : const_iterator(); } + //! Returns iterator at the beginning of the reversed sequence. + reverse_iterator rbegin() { return reverse_iterator(end()); } + + //! Returns const iterator at the beginning of the reversed sequence. + const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } + + //! Returns const iterator at the beginning of the reversed sequence. + const_reverse_iterator crbegin() const { return const_reverse_iterator(cend()); } + + //! Returns iterator at the end of the reversed sequence. + reverse_iterator rend() { return reverse_iterator(begin()); } + + //! Returns const iterator at the end of the reversed sequence. + const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } + + //! Returns const iterator at the end of the reversed sequence. + const_reverse_iterator crend() const { return const_reverse_iterator(cbegin()); } + //! Swap this sequence with another. void swap(CSequence &other) noexcept { m_pimpl.swap(other.m_pimpl); }