From: Vadim Zeitlin Date: Wed, 8 May 2013 11:21:32 +0000 (+0000) Subject: Add wxVector<>::const_reverse_iterator. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/f7ef20685fb2a98f963aeae040c8bd4961f32ff7 Add wxVector<>::const_reverse_iterator. Provide this type too for compatibility with std::vector<>. Closes #15192. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73947 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index c8f9466d11..11fb2bf55c 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -590,6 +590,7 @@ All: - Add wx[F]File{Input,Output}Stream::GetFile() (troelsk). - Add wxSocketBase::GetSocket() (Laurent Poujoulat). - Add IEEE 754 single/double precision support to wxDataStream classes (net147). +- Add wxVector<>::const_reverse_iterator (troelsk). - Add Nepali translation (Him Prasad Gautam). All (GUI): diff --git a/include/wx/vector.h b/include/wx/vector.h index b56b42e52d..e33f523d1c 100644 --- a/include/wx/vector.h +++ b/include/wx/vector.h @@ -139,9 +139,11 @@ public: typedef size_t difference_type; typedef T value_type; typedef value_type* pointer; + typedef const value_type* const_pointer; typedef value_type* iterator; typedef const value_type* const_iterator; typedef value_type& reference; + typedef const value_type& const_reference; class reverse_iterator { @@ -183,6 +185,51 @@ public: private: value_type *m_ptr; + + friend class const_reverse_iterator; + }; + + class const_reverse_iterator + { + public: + const_reverse_iterator() : m_ptr(NULL) { } + wxEXPLICIT const_reverse_iterator(const_iterator it) : m_ptr(it) { } + const_reverse_iterator(const reverse_iterator& it) : m_ptr(it.m_ptr) { } + const_reverse_iterator(const const_reverse_iterator& it) : m_ptr(it.m_ptr) { } + + const_reference operator*() const { return *m_ptr; } + const_pointer operator->() const { return m_ptr; } + + const_iterator base() const { return m_ptr; } + + const_reverse_iterator& operator++() + { --m_ptr; return *this; } + const_reverse_iterator operator++(int) + { const_reverse_iterator tmp = *this; --m_ptr; return tmp; } + const_reverse_iterator& operator--() + { ++m_ptr; return *this; } + const_reverse_iterator operator--(int) + { const_reverse_iterator tmp = *this; ++m_ptr; return tmp; } + + const_reverse_iterator operator+(difference_type n) const + { return const_reverse_iterator(m_ptr - n); } + const_reverse_iterator& operator+=(difference_type n) + { m_ptr -= n; return *this; } + const_reverse_iterator operator-(difference_type n) const + { return const_reverse_iterator(m_ptr + n); } + const_reverse_iterator& operator-=(difference_type n) + { m_ptr += n; return *this; } + + const_reference operator[](difference_type n) const + { return *(*this + n); } + + bool operator ==(const const_reverse_iterator& it) const + { return m_ptr == it.m_ptr; } + bool operator !=(const const_reverse_iterator& it) const + { return m_ptr != it.m_ptr; } + + protected: + const value_type *m_ptr; }; wxVector() : m_size(0), m_capacity(0), m_values(NULL) {} @@ -353,6 +400,9 @@ public: reverse_iterator rbegin() { return reverse_iterator(end() - 1); } reverse_iterator rend() { return reverse_iterator(begin() - 1); } + const_reverse_iterator rbegin() const { return const_reverse_iterator(end() - 1); } + const_reverse_iterator rend() const { return const_reverse_iterator(begin() - 1); } + iterator insert(iterator it, const value_type& v = value_type()) { // NB: this must be done before reserve(), because reserve()