// ============================================================================ // Copyright (C) 2001-2016 by Jozef Starosczyk // ixen@copyhandler.com // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU Library General Public License // (version 2) as published by the Free Software Foundation; // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this program; if not, write to the // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // ============================================================================ #ifndef __RANDOMACCESSITERATORS_H__ #define __RANDOMACCESSITERATORS_H__ template class RandomAccessIteratorWrapper { protected: explicit RandomAccessIteratorWrapper(typename std::vector::iterator iterArray); public: using iterator_category = std::random_access_iterator_tag; using value_type = T; using difference_type = std::ptrdiff_t; using pointer = T*; using reference = T&; RandomAccessIteratorWrapper(); ~RandomAccessIteratorWrapper(); RandomAccessIteratorWrapper& operator+=(const int& rhs); RandomAccessIteratorWrapper& operator-=(const int& rhs); T& operator*(); T* operator->(); T& operator[](const int& rhs) const; RandomAccessIteratorWrapper& operator++(); RandomAccessIteratorWrapper& operator--(); RandomAccessIteratorWrapper operator++(int); RandomAccessIteratorWrapper operator--(int); RandomAccessIteratorWrapper operator+(const int& rhs) const; RandomAccessIteratorWrapper operator-(const int& rhs) const; bool operator==(const RandomAccessIteratorWrapper& rhs) const; bool operator!=(const RandomAccessIteratorWrapper& rhs) const; bool operator>(const RandomAccessIteratorWrapper& rhs) const; bool operator<(const RandomAccessIteratorWrapper& rhs) const; bool operator>=(const RandomAccessIteratorWrapper& rhs) const; bool operator<=(const RandomAccessIteratorWrapper& rhs) const; private: #pragma warning(push) #pragma warning(disable: 4251) typename std::vector::iterator m_iterArray; #pragma warning(pop) template friend class RandomAccessConstIteratorWrapper; template friend class RandomAccessContainerWrapper; }; template class RandomAccessConstIteratorWrapper { protected: explicit RandomAccessConstIteratorWrapper(typename std::vector::const_iterator iterArray); public: using iterator_category = std::random_access_iterator_tag; using value_type = T; using difference_type = std::ptrdiff_t; using pointer = T*; using reference = T&; RandomAccessConstIteratorWrapper(); explicit RandomAccessConstIteratorWrapper(const RandomAccessIteratorWrapper& rIterator); ~RandomAccessConstIteratorWrapper(); RandomAccessConstIteratorWrapper& operator=(const RandomAccessIteratorWrapper& rIterator); RandomAccessConstIteratorWrapper& operator+=(const int& rhs); RandomAccessConstIteratorWrapper& operator-=(const int& rhs); const T& operator*(); const T* operator->(); const T& operator[](const int& rhs) const; RandomAccessConstIteratorWrapper& operator++(); RandomAccessConstIteratorWrapper& operator--(); RandomAccessConstIteratorWrapper operator++(int); RandomAccessConstIteratorWrapper operator--(int); RandomAccessConstIteratorWrapper operator+(const int& rhs) const; RandomAccessConstIteratorWrapper operator-(const int& rhs) const; bool operator==(const RandomAccessConstIteratorWrapper& rhs) const; bool operator!=(const RandomAccessConstIteratorWrapper& rhs) const; bool operator>(const RandomAccessConstIteratorWrapper& rhs) const; bool operator<(const RandomAccessConstIteratorWrapper& rhs) const; bool operator>=(const RandomAccessConstIteratorWrapper& rhs) const; bool operator<=(const RandomAccessConstIteratorWrapper& rhs) const; private: #pragma warning(push) #pragma warning(disable: 4251) typename std::vector::const_iterator m_iterArray; #pragma warning(pop) template friend class RandomAccessContainerWrapper; }; /////////////////////////////////////////////////////////////////////////////////////////////////////// // class RandomAccessIteratorWrapper template RandomAccessIteratorWrapper::RandomAccessIteratorWrapper(typename std::vector::iterator iterArray) : m_iterArray(iterArray) { } template RandomAccessIteratorWrapper::RandomAccessIteratorWrapper() { } template RandomAccessIteratorWrapper::~RandomAccessIteratorWrapper() { } template RandomAccessIteratorWrapper& RandomAccessIteratorWrapper::operator+=(const int& rhs) { m_iterArray += rhs; return *this; } template bool RandomAccessIteratorWrapper::operator<=(const RandomAccessIteratorWrapper& rhs) const { return m_iterArray <= rhs.m_iterArray; } template bool RandomAccessIteratorWrapper::operator<(const RandomAccessIteratorWrapper& rhs) const { return m_iterArray < rhs.m_iterArray; } template bool RandomAccessIteratorWrapper::operator!=(const RandomAccessIteratorWrapper& rhs) const { return m_iterArray != rhs.m_iterArray; } template bool RandomAccessIteratorWrapper::operator==(const RandomAccessIteratorWrapper& rhs) const { return m_iterArray == rhs.m_iterArray; } template RandomAccessIteratorWrapper RandomAccessIteratorWrapper::operator--(int) { RandomAccessIteratorWrapper tmp(*this); --m_iterArray; return tmp; } template RandomAccessIteratorWrapper& RandomAccessIteratorWrapper::operator--() { --m_iterArray; return *this; } template RandomAccessIteratorWrapper& RandomAccessIteratorWrapper::operator-=(const int& rhs) { m_iterArray -= rhs; return *this; } template T& RandomAccessIteratorWrapper::operator*() { return *m_iterArray; } template T* RandomAccessIteratorWrapper::operator->() { return &(*m_iterArray); } template T& RandomAccessIteratorWrapper::operator[](const int& rhs) const { return m_iterArray[rhs]; } template RandomAccessIteratorWrapper RandomAccessIteratorWrapper::operator++(int) { RandomAccessIteratorWrapper tmp(*this); ++m_iterArray; return tmp; } template RandomAccessIteratorWrapper& RandomAccessIteratorWrapper::operator++() { ++m_iterArray; return *this; } template RandomAccessIteratorWrapper RandomAccessIteratorWrapper::operator+(const int& rhs) const { return RandomAccessIteratorWrapper(m_iterArray + rhs); } template RandomAccessIteratorWrapper RandomAccessIteratorWrapper::operator-(const int& rhs) const { return RandomAccessIteratorWrapper(m_iterArray - rhs); } template bool RandomAccessIteratorWrapper::operator>=(const RandomAccessIteratorWrapper& rhs) const { return m_iterArray >= rhs.m_iterArray; } template bool RandomAccessIteratorWrapper::operator>(const RandomAccessIteratorWrapper& rhs) const { return m_iterArray > rhs.m_iterArray; } /////////////////////////////////////////////////////////////////////////////////////////////////////// // class RandomAccessConstIteratorWrapper template RandomAccessConstIteratorWrapper::RandomAccessConstIteratorWrapper(typename std::vector::const_iterator iterArray) : m_iterArray(iterArray) { } template RandomAccessConstIteratorWrapper::RandomAccessConstIteratorWrapper() { } template RandomAccessConstIteratorWrapper::RandomAccessConstIteratorWrapper(const RandomAccessIteratorWrapper& rIterator) : m_iterArray(rIterator.m_iterArray) { } template RandomAccessConstIteratorWrapper::~RandomAccessConstIteratorWrapper() { } template RandomAccessConstIteratorWrapper& RandomAccessConstIteratorWrapper::operator=(const RandomAccessIteratorWrapper& rIterator) { m_iterArray = rIterator.m_iterArray; return *this; } template RandomAccessConstIteratorWrapper& RandomAccessConstIteratorWrapper::operator+=(const int& rhs) { m_iterArray += rhs; return *this; } template bool RandomAccessConstIteratorWrapper::operator<=(const RandomAccessConstIteratorWrapper& rhs) const { return m_iterArray <= rhs.m_iterArray; } template bool RandomAccessConstIteratorWrapper::operator<(const RandomAccessConstIteratorWrapper& rhs) const { return m_iterArray < rhs.m_iterArray; } template bool RandomAccessConstIteratorWrapper::operator!=(const RandomAccessConstIteratorWrapper& rhs) const { return m_iterArray != rhs.m_iterArray; } template bool RandomAccessConstIteratorWrapper::operator==(const RandomAccessConstIteratorWrapper& rhs) const { return m_iterArray == rhs.m_iterArray; } template RandomAccessConstIteratorWrapper RandomAccessConstIteratorWrapper::operator--(int) { RandomAccessConstIteratorWrapper tmp(*this); --m_iterArray; return tmp; } template RandomAccessConstIteratorWrapper& RandomAccessConstIteratorWrapper::operator--() { --m_iterArray; return *this; } template RandomAccessConstIteratorWrapper& RandomAccessConstIteratorWrapper::operator-=(const int& rhs) { m_iterArray -= rhs; return *this; } template const T& RandomAccessConstIteratorWrapper::operator*() { return *m_iterArray; } template const T* RandomAccessConstIteratorWrapper::operator->() { return &(*m_iterArray); } template const T& RandomAccessConstIteratorWrapper::operator[](const int& rhs) const { return m_iterArray[rhs]; } template RandomAccessConstIteratorWrapper RandomAccessConstIteratorWrapper::operator++(int) { RandomAccessConstIteratorWrapper tmp(*this); ++m_iterArray; return tmp; } template RandomAccessConstIteratorWrapper& RandomAccessConstIteratorWrapper::operator++() { ++m_iterArray; return *this; } template RandomAccessConstIteratorWrapper RandomAccessConstIteratorWrapper::operator+(const int& rhs) const { return RandomAccessConstIteratorWrapper(m_iterArray + rhs); } template RandomAccessConstIteratorWrapper RandomAccessConstIteratorWrapper::operator-(const int& rhs) const { return RandomAccessConstIteratorWrapper(m_iterArray - rhs); } template bool RandomAccessConstIteratorWrapper::operator>=(const RandomAccessConstIteratorWrapper& rhs) const { return m_iterArray >= rhs.m_iterArray; } template bool RandomAccessConstIteratorWrapper::operator>(const RandomAccessConstIteratorWrapper& rhs) const { return m_iterArray > rhs.m_iterArray; } #endif