#pragma once #include <iterator> #include "../../common/specialized.hpp" namespace sprawl { namespace collections { template<typename T> class List; template<typename T> class ForwardList; } template<typename ValueType, typename WrapperType, typename tag> class ListIterator : public std::iterator<tag, ValueType, std::ptrdiff_t, ValueType*, ValueType&> { public: typedef WrapperType* accessor_type; ListIterator(WrapperType* item) : m_currentItem(item) { // } ValueType& operator*() { return m_currentItem->m_value; } ValueType* operator->() { return &m_currentItem->m_value; } ValueType const& operator*() const { return m_currentItem->m_value; } ValueType const* operator->() const { return &m_currentItem->m_value; } ValueType& Value() { return m_currentItem->m_value; } ValueType const& Value() const { return m_currentItem->m_value; } ListIterator<ValueType, WrapperType, tag>& operator++() { m_currentItem = m_currentItem ? m_currentItem->next : nullptr; return *this; } ListIterator<ValueType, WrapperType, tag> operator++(int) { ListIterator<ValueType, WrapperType, tag> tmp(*this); ++(*this); return tmp; } ListIterator<ValueType, WrapperType, tag> const& operator++() const { m_currentItem = m_currentItem ? m_currentItem->next : nullptr; return *this; } ListIterator<ValueType, WrapperType, tag> const operator++(int) const { ListIterator<ValueType, WrapperType, tag> tmp(*this); ++(*this); return tmp; } ListIterator<ValueType, WrapperType, tag> operator+(int steps) { WrapperType* item = m_currentItem; for(int i = 0; i < steps; ++i) { if(!item) { break; } item = item->next; } return ListIterator<ValueType, WrapperType, tag>(item); } ListIterator<ValueType, WrapperType, tag> const operator+(int steps) const { WrapperType* item = m_currentItem; for(int i = 0; i < steps; ++i) { if(!item) { break; } item = item->next; } return ListIterator<ValueType, WrapperType, tag>(item); } ListIterator<ValueType, WrapperType, tag>& operator--() { m_currentItem = m_currentItem ? m_currentItem->prev : nullptr; return *this; } ListIterator<ValueType, WrapperType, tag> operator--(int) { ListIterator<ValueType, WrapperType, tag> tmp(*this); --(*this); return tmp; } ListIterator<ValueType, WrapperType, tag> const& operator--() const { m_currentItem = m_currentItem ? m_currentItem->prev : nullptr; return *this; } ListIterator<ValueType, WrapperType, tag> const operator--(int) const { ListIterator<ValueType, WrapperType, tag> tmp(*this); --(*this); return tmp; } ListIterator<ValueType, WrapperType, tag> operator-(int steps) { WrapperType* item = m_currentItem; for(int i = 0; i < steps; ++i) { if(!item) { break; } item = item->prev; } return ListIterator<ValueType, WrapperType, tag>(item); } ListIterator<ValueType, WrapperType, tag> const operator-(int steps) const { WrapperType* item = m_currentItem; for(int i = 0; i < steps; ++i) { if(!item) { break; } item = item->prev; } return ListIterator<ValueType, WrapperType, tag>(item); } bool operator==(ListIterator<ValueType, WrapperType, tag> const& rhs) const { return m_currentItem == rhs.m_currentItem; } bool operator!=(ListIterator<ValueType, WrapperType, tag> 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; } ListIterator<ValueType, WrapperType, tag> Next() { return ListIterator<ValueType, WrapperType, tag>(m_currentItem ? m_currentItem->next : nullptr); } ListIterator<ValueType, WrapperType, tag> const Next() const { return ListIterator<ValueType, WrapperType, tag>(m_currentItem ? m_currentItem->next : nullptr); } operator bool() { return m_currentItem != nullptr; } protected: friend class sprawl::collections::List<ValueType>; friend class sprawl::collections::ForwardList<ValueType>; mutable WrapperType* m_currentItem; }; }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 23398 | ququlala | "Forking branch Mainline of shadauxcat-libsprawl to ququlala-libsprawl." | ||
//guest/ShadauxCat/Sprawl/Mainline/collections/iterator/ListIterator.hpp | |||||
#3 | 14091 | ShadauxCat |
-Created Vector class, iterator, and unit test -Made list iterator a bidirectional iterator when created from a doubly-linked list. (It still has operator-- when created from singly-linked list, but it won't compile if it's used.) -Changed front() and back() in list classes to Front() and Back() #review-14083 |
||
#2 | 12508 | ShadauxCat |
-Added threading library. Currently only functional for Linux; Windows will fail to link. (I will fix this soon.) -Fixed missing move and copy constructors in List and ForwardList -Fixed broken move constructor in HashMap -Fixed missing const get() in HashMap -Fixed broken operator-> in ListIterator -Added sprawl::noncopyable -Added sketch headers for filesystem library -Made StringLiteral hashable, added special hashes for pointers and integers in murmur3 -Fixed compiler warning in async_network -Updated memory allocators to use new threading library for mutexes -Added accessibility to sprawl::StringLiteral to be able toa ccess its pointer and length and perform pointer comparisons #review-12504 |
||
#1 | 11496 | ShadauxCat | Initial checkin: Current states for csbuild and libSprawl |