#pragma once #include #include "../../common/specialized.hpp" #include "../../common/compat.hpp" namespace sprawl { template class VectorIterator; } template class sprawl::VectorIterator : public std::iterator { public: VectorIterator(ValueType* item, ParentType const* parent) : m_currentItem(item) , m_parent(parent) { // } ValueType& operator*() { return *m_currentItem; } ValueType* operator->() { return m_currentItem; } ValueType const& operator*() const { return *m_currentItem; } ValueType const* operator->() const { return m_currentItem; } ValueType& Value() { return *m_currentItem; } ValueType const& Value() const { return *m_currentItem; } ssize_t Index() const { return m_currentItem - m_parent->begin().m_currentItem; } VectorIterator& operator++() { ++m_currentItem; return *this; } VectorIterator operator++(int) { return VectorIterator(m_currentItem++, m_parent); } VectorIterator const& operator++() const { ++m_currentItem; return *this; } VectorIterator const operator++(int) const { return VectorIterator(m_currentItem++, m_parent); } VectorIterator operator+(int steps) { return VectorIterator(m_currentItem+steps, m_parent); } VectorIterator const operator+(int steps) const { return VectorIterator(m_currentItem+steps, m_parent); } VectorIterator& operator--() { --m_currentItem; return *this; } VectorIterator operator--(int) { return VectorIterator(m_currentItem--, m_parent); } VectorIterator const& operator--() const { --m_currentItem; return *this; } VectorIterator const operator--(int) const { return VectorIterator(m_currentItem--, m_parent); } VectorIterator operator-(int steps) { return VectorIterator(m_currentItem - steps, m_parent); } VectorIterator const operator-(int steps) const { return VectorIterator(m_currentItem - steps, m_parent); } bool operator==(VectorIterator const& rhs) const { return m_currentItem == rhs.m_currentItem; } bool operator!=(VectorIterator const& rhs) const { return !this->operator==(rhs); } operator bool() const { return Valid(); } bool operator!() const { return !Valid(); } bool Valid() const { return operator>=(m_parent->begin()) && operator<(m_parent->end()); } bool More() const { return Valid() && Next().Valid(); } VectorIterator Next() { return VectorIterator(m_currentItem + 1, m_parent); } VectorIterator const Next() const { return VectorIterator(m_currentItem + 1, m_parent); } size_t operator-(VectorIterator const& other) { return m_currentItem - other.m_currentItem; } ValueType& operator[](size_t index) { return m_currentItem[index]; } ValueType const& operator[](size_t index) const { return m_currentItem[index]; } bool operator<(VectorIterator const& rhs) const { return m_currentItem < rhs.m_currentItem; } bool operator>(VectorIterator const& rhs) const { return m_currentItem > rhs.m_currentItem; } bool operator<=(VectorIterator const& rhs) const { return m_currentItem <= rhs.m_currentItem; } bool operator>=(VectorIterator const& rhs) const { return m_currentItem >= rhs.m_currentItem; } protected: mutable ValueType* m_currentItem; ParentType const* m_parent; };