#pragma once #include #include "../../common/specialized.hpp" namespace sprawl { template class MapIterator : public std::iterator { public: typedef AccessorType* accessor_type; MapIterator(AccessorType* item) : m_currentItem(item) { // } AccessorType& operator*() { return *m_currentItem; } AccessorType* operator->() { return m_currentItem; } AccessorType const& operator*() const { return *m_currentItem; } AccessorType const* operator->() const { return m_currentItem; } template auto Key() const -> decltype(accessor_type(nullptr)->Accessor(Specialized()).Key()) { return m_currentItem->Accessor(Specialized()).Key(); } auto Key() const -> decltype(accessor_type(nullptr)->Accessor(Specialized<0>()).Key()) { return m_currentItem->Accessor(Specialized<0>()).Key(); } ValueType& Value() { return m_currentItem->m_value; } ValueType const& Value() const { return m_currentItem->m_value; } MapIterator& operator++() { m_currentItem = m_currentItem ? m_currentItem->next : nullptr; return *this; } MapIterator operator++(int) { MapIterator tmp(*this); ++(*this); return tmp; } MapIterator const& operator++() const { m_currentItem = m_currentItem ? m_currentItem->next : nullptr; return *this; } MapIterator const operator++(int) const { MapIterator tmp(*this); ++(*this); return tmp; } MapIterator operator+(int steps) { AccessorType* item = m_currentItem; for(int i = 0; i < steps; ++i) { if(!item) { break; } item = item->next; } return MapIterator(item); } MapIterator const operator+(int steps) const { AccessorType* item = m_currentItem; for(int i = 0; i < steps; ++i) { if(!item) { break; } item = item->next; } return MapIterator(item); } bool operator==(MapIterator const& rhs) const { return m_currentItem == rhs.m_currentItem; } bool operator!=(MapIterator const& rhs) const { return !this->operator==(rhs); } operator bool() const { return m_currentItem != nullptr; } bool operator!() const { return m_currentItem != nullptr; } bool Valid() const { return m_currentItem != nullptr; } bool More() const { return m_currentItem != nullptr && m_currentItem->next != nullptr; } MapIterator Next() { return MapIterator(m_currentItem ? m_currentItem->next : nullptr); } MapIterator const Next() const { return MapIterator(m_currentItem ? m_currentItem->next : nullptr); } operator bool() { return m_currentItem != nullptr; } protected: mutable AccessorType* m_currentItem; }; }