From c98b797c38a14d545ca339ef66256459909da09a Mon Sep 17 00:00:00 2001 From: Charles Date: Mon, 27 Apr 2020 14:01:11 +0200 Subject: Added ReverseIterator --- ReverseIterator.hpp | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 ReverseIterator.hpp (limited to 'ReverseIterator.hpp') diff --git a/ReverseIterator.hpp b/ReverseIterator.hpp new file mode 100644 index 0000000..504c0c1 --- /dev/null +++ b/ReverseIterator.hpp @@ -0,0 +1,80 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ReverseIterator.hpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/27 09:33:16 by charles #+# #+# */ +/* Updated: 2020/04/27 11:32:22 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef REVERSEITERATOR_HPP +# define REVERSEITERATOR_HPP + +namespace ft +{ + template + class ReverseIterator + { + public: + typedef Iterator iterator_type; + typedef typename iterator_type::value_type value_type; + typedef int difference_type; + + ReverseIterator() : m_it(iterator_type()) {} + ReverseIterator(const ReverseIterator& other) { *this = other; } + ReverseIterator& operator=(const ReverseIterator& other) { m_it = other.m_it; return *this; } + ~ReverseIterator() {} + + explicit ReverseIterator(iterator_type it) : m_it(it) {} + + iterator_type base() const { return m_it; } + + value_type& operator*() { return (m_it--).operator*(); } + value_type* operator->() { return &(operator*()); } + + ReverseIterator operator+(difference_type n) { m_it - n; return *this; } + ReverseIterator operator-(difference_type n) { m_it + n; return *this; } + + ReverseIterator& operator++() { --m_it; return *this; } + ReverseIterator& operator--() { --m_it; return *this; } + ReverseIterator operator++(int) { ReverseIterator copy(*this); m_it++; return copy; } + ReverseIterator operator--(int) { ReverseIterator copy(*this); m_it--; return copy; } + + ReverseIterator& operator+=(difference_type n) { return m_it -= n; } + ReverseIterator& operator-=(difference_type n) { return m_it += n; } + + value_type& operator[](difference_type n) { return m_it[-n - 1]; } + + bool operator==(const ReverseIterator& other) const { return m_it == other.m_it; } + bool operator!=(const ReverseIterator& other) const { return m_it != other.m_it; } + + bool operator<(const ReverseIterator& other) const { return m_it < other.m_it; } + bool operator>(const ReverseIterator& other) const { return m_it > other.m_it; } + bool operator<=(const ReverseIterator& other) const { return m_it <= other.m_it; } + bool operator>=(const ReverseIterator& other) const { return m_it >= other.m_it; } + + private: + iterator_type m_it; + }; +} + +template +ft::ReverseIterator operator+( + typename ft::ReverseIterator::difference_type n, + const ft::ReverseIterator& rev_it) +{ + return rev_it + n; +} + +template +typename ft::ReverseIterator::difference_type operator-( + const ft::ReverseIterator& lhs, + const ft::ReverseIterator& rhs) +{ + return lhs.base() - rhs.base(); +} + +#endif -- cgit