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); }