#pragma once #include template class IndexIterator : public std::iterator { protected: size_t mIndex; ContainerT* mContainer; public: typedef std::random_access_iterator_tag iterator_category; typedef typename iterator::value_type value_type; typedef typename iterator::difference_type difference_type; typedef typename iterator::reference reference; typedef typename iterator::pointer pointer; IndexIterator() : mContainer(NULL), mIndex(0) {} IndexIterator(ContainerT* container) : mContainer(container), mIndex(0) {} IndexIterator(ContainerT* container, size_t index) : mContainer(container), mIndex(index) {} IndexIterator(const IndexIterator& r) : mContainer(r.mContainer), mIndex(r.mIndex) {} IndexIterator& operator=(const IndexIterator& r) { mIndex = r.mIndex; mContainer = r.mContainer; return *this; } IndexIterator& operator++() // PREFIX { ++mIndex; return *this; } IndexIterator& operator--() // PREFIX { --mIndex; return *this; } IndexIterator operator++(int) // POSTFIX { return IndexIterator(mContainer, mIndex++); } IndexIterator operator--(int) // POSTFIX { return IndexIterator(mContainer, mIndex--); } IndexIterator operator+(const difference_type& n) const { return IndexIterator(mContainer, mIndex + n); } IndexIterator& operator+=(const difference_type& n) { mIndex += n; return *this; } IndexIterator operator-(const difference_type& n) const { return IndexIterator(mContainer, mIndex - n); } IndexIterator& operator-=(const difference_type& n) { mIndex -= n; return *this; } reference operator*() const { return mContainer->operator[](mIndex); } pointer operator->() const { return &mContainer->operator[](mIndex); } reference operator[](const difference_type& n) const { return mContainer->operator[](mIndex + n); } template friend bool operator==( const IndexIterator& r1, const IndexIterator& r2); template friend bool operator!=( const IndexIterator& r1, const IndexIterator& r2); template friend bool operator<( const IndexIterator& r1, const IndexIterator& r2); template friend bool operator>( const IndexIterator& r1, const IndexIterator& r2); template friend bool operator<=( const IndexIterator& r1, const IndexIterator& r2); template friend bool operator>=( const IndexIterator& r1, const IndexIterator& r2); template friend typename IndexIterator::difference_type operator+( const IndexIterator& r1, const IndexIterator& r2); template friend typename IndexIterator::difference_type operator-( const IndexIterator& r1, const IndexIterator& r2); }; template bool operator==(const IndexIterator& r1, const IndexIterator& r2) { return (r1.mIndex == r2.mIndex && r1.mContainer == r2.mContainer); } template bool operator!=(const IndexIterator& r1, const IndexIterator& r2) { return ((r1.mIndex != r2.mIndex) || (r1.mContainer != r2.mContainer)); } template bool operator<(const IndexIterator& r1, const IndexIterator& r2) { if (r1.mContainer != r2.mContainer) return r1.mContainer < r2.mContainer; return (r1.mIndex < r2.mIndex); } template bool operator>(const IndexIterator& r1, const IndexIterator& r2) { if (r1.mContainer != r2.mContainer) return r1.mContainer > r2.mContainer; return (r1.mIndex > r2.mIndex); } template bool operator<=(const IndexIterator& r1, const IndexIterator& r2) { if (r1.mContainer != r2.mContainer) return r1.mContainer < r2.mContainer; return (r1.mIndex <= r2.mIndex); } template bool operator>=(const IndexIterator& r1, const IndexIterator& r2) { if (r1.mContainer != r2.mContainer) return r1.mContainer > r2.mContainer; return (r1.mIndex >= r2.mIndex); } template typename IndexIterator::difference_type operator+( const IndexIterator& r1, const IndexIterator& r2) { assert(r1.mContainer == r2.mContainer); return r1.mIndex + r2.mIndex; } template typename IndexIterator::difference_type operator-( const IndexIterator& r1, const IndexIterator& r2) { assert(r1.mContainer == r2.mContainer); return r1.mIndex - r2.mIndex; }