#ifndef _STD_ITERATOR_H #define _STD_ITERATOR_H // from rb3 decomp // clang-format off: too excessive with splitting things into multiple lines // Based on https://github.com/SwareJonge/mkdd/blob/main/libs/PowerPC_EABI_Support/include/iterator #include #include namespace std { struct input_iterator_tag {}; struct output_iterator_tag {}; struct forward_iterator_tag : public input_iterator_tag {}; struct bidirectional_iterator_tag : public forward_iterator_tag {}; struct random_access_iterator_tag : public bidirectional_iterator_tag {}; template struct iterator_traits { typedef typename Iterator::difference_type difference_type; typedef typename Iterator::value_type value_type; typedef typename Iterator::pointer pointer; typedef typename Iterator::reference reference; typedef typename Iterator::iterator_category iterator_category; }; template struct iterator { typedef IteratorTag iterator_category; typedef ValueType value_type; typedef DifferenceType difference_type; typedef Pointer pointer; typedef Reference reference; }; template class insert_iterator : public iterator { typedef iterator _Base; public: typedef Container container_type; typedef typename _Base::iterator_category iterator_category; typedef typename _Base::value_type value_type; typedef typename _Base::difference_type difference_type; typedef typename _Base::pointer pointer; typedef typename _Base::reference reference; insert_iterator() {} insert_iterator(Container& c, typename Container::iterator i) : container(&c), iter(i) { } insert_iterator& operator=(typename Container::const_reference value) { iter = container->insert(iter, value); ++iter; return *this; } insert_iterator& operator*() { return *this; } insert_iterator& operator++() { return *this; } insert_iterator& operator++(int) { return *this; } protected: Container* container; typename Container::iterator iter; }; template insert_iterator inserter(Container& c, typename Container::iterator i) { return insert_iterator(c, i); } template class front_insert_iterator : public iterator { typedef iterator _Base; public: typedef Container container_type; typedef typename _Base::iterator_category iterator_category; typedef typename _Base::value_type value_type; typedef typename _Base::difference_type difference_type; typedef typename _Base::pointer pointer; typedef typename _Base::reference reference; explicit front_insert_iterator(Container& c) : container(&c) { } front_insert_iterator& operator=(typename Container::const_reference value) { typename Container::iterator iter = container->push_front(iter, value); ++iter; return *this; } front_insert_iterator& operator*() { return *this; } front_insert_iterator& operator++() { return *this; } front_insert_iterator& operator++(int) { return *this; } protected: Container* container; }; template front_insert_iterator front_inserter(Container& c) { return front_insert_iterator(c); } template class back_insert_iterator : public iterator { typedef iterator _Base; public: typedef Container container_type; typedef typename _Base::iterator_category iterator_category; typedef typename _Base::value_type value_type; typedef typename _Base::difference_type difference_type; typedef typename _Base::pointer pointer; typedef typename _Base::reference reference; explicit back_insert_iterator(Container& c) : container(&c) { } back_insert_iterator& operator=(typename Container::const_reference value) { typename Container::iterator iter = container->push_back(iter, value); ++iter; return *this; } back_insert_iterator& operator*() { return *this; } back_insert_iterator& operator++() { return *this; } back_insert_iterator& operator++(int) { return *this; } protected: Container* container; }; template back_insert_iterator back_inserter(Container& c) { return back_insert_iterator(c); } template class reverse_iterator : public iterator< typename iterator_traits::iterator_category, typename iterator_traits::value_type, typename iterator_traits::difference_type, typename iterator_traits::pointer, typename iterator_traits::reference > { typedef iterator< typename iterator_traits::iterator_category, typename iterator_traits::value_type, typename iterator_traits::difference_type, typename iterator_traits::pointer, typename iterator_traits::reference > _Base; public: typedef Iter iterator_type; typedef typename _Base::iterator_category iterator_category; typedef typename _Base::value_type value_type; typedef typename _Base::difference_type difference_type; typedef typename _Base::pointer pointer; typedef typename _Base::reference reference; reverse_iterator() {} explicit reverse_iterator(Iter itr) : current(itr) {} template reverse_iterator(const reverse_iterator& other) : current(other.current) {} template reverse_iterator& operator=(const reverse_iterator& other) { current = other.current; } Iter base() { return current; } reference operator*() const { Iter it = current; --it; return *it; } pointer operator->() const { return &(operator*()); } reverse_iterator& operator++() { --current; return *this; } reverse_iterator operator++(int) { reverse_iterator tmp = *this; ++*this; return tmp; } reverse_iterator& operator--() { ++current; return *this; } reverse_iterator operator--(int) { reverse_iterator tmp = *this; --*this; return tmp; } reverse_iterator operator+(difference_type n) const { return reverse_iterator(current - n); } reverse_iterator& operator+=(difference_type n) { current -= n; return *this; } reverse_iterator operator-(difference_type n) const { return reverse_iterator(current + n); } reverse_iterator& operator-=(difference_type n) { current += n; return *this; } reference operator[](difference_type n) const { return current[-n - 1]; } protected: Iter current; }; template bool operator==(const reverse_iterator &lhs, const reverse_iterator &rhs) { return lhs.base() == rhs.base(); } template bool operator<(const reverse_iterator &lhs, const reverse_iterator &rhs) { return lhs.base() < rhs.base(); } template bool operator!=(const reverse_iterator &lhs, const reverse_iterator &rhs) { return !(lhs.base() == rhs.base()); } template bool operator>(const reverse_iterator &lhs, const reverse_iterator &rhs) { return rhs.base() < lhs.base(); } template bool operator<=(const reverse_iterator &lhs, const reverse_iterator &rhs) { return !(rhs.base() < lhs.base()); } template bool operator>=(const reverse_iterator &lhs, const reverse_iterator &rhs) { return !(lhs.base() < rhs.base()); } template reverse_iterator operator+( typename reverse_iterator::difference_type lhs, const reverse_iterator& rhs ) { return rhs + lhs; } template typename reverse_iterator::difference_type operator-( const reverse_iterator& lhs, const reverse_iterator& rhs ) { return rhs.base() - lhs.base(); } template reverse_iterator make_reverse_iterator(Iter itr) { return reverse_iterator(itr); } template , class Distance = ptrdiff_t> class istream_iterator : public iterator {}; template bool operator==(const istream_iterator &lhs, const istream_iterator &rhs); template bool operator!=(const istream_iterator &lhs, const istream_iterator &rhs); template > class ostream_iterator : public iterator {}; template bool operator==(const ostream_iterator &lhs, const ostream_iterator &rhs); template bool operator!=(const ostream_iterator &lhs, const ostream_iterator &rhs); template */ > class istreambuf_iterator : public iterator {}; template bool operator==(const istreambuf_iterator &lhs, const istreambuf_iterator &rhs); template bool operator!=(const istreambuf_iterator &lhs, const istreambuf_iterator &rhs); template */ > class ostreambuf_iterator : public iterator {}; template bool operator==(const ostreambuf_iterator &lhs, const ostreambuf_iterator &rhs); template bool operator!=(const ostreambuf_iterator &lhs, const ostreambuf_iterator &rhs); template void __advance(Iterator &it, Distance n, input_iterator_tag) { for (; n > 0; --n) ++it; } template void __advance(Iterator &it, Distance n, bidirectional_iterator_tag) { // positive value for (; n > 0; --n) ++it; // negative value for (; n < 0; ++n) --it; } template void __advance(Iterator &it, Distance n, random_access_iterator_tag) { it += n; } template void advance(Iterator &it, Distance n) { return __advance(it, n, iterator_traits::iterator_category()); } template typename iterator_traits::difference_type __distance(Iterator first, Iterator last, input_iterator_tag) { typename iterator_traits::difference_type result = 0; for (; first != last; ++first) ++result; return result; } template typename iterator_traits::difference_type __distance(Iterator first, Iterator last, random_access_iterator_tag) { return last - first; } template typename iterator_traits::difference_type distance(Iterator first, Iterator last) { return __distance(first, last, iterator_traits::iterator_category()); } } // clang-format on #endif