aboutsummaryrefslogtreecommitdiff
path: root/ReverseIterator.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'ReverseIterator.hpp')
-rw-r--r--ReverseIterator.hpp80
1 files changed, 80 insertions, 0 deletions
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 <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* 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 <typename Iterator>
+ 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 <typename Iterator>
+ft::ReverseIterator<Iterator> operator+(
+ typename ft::ReverseIterator<Iterator>::difference_type n,
+ const ft::ReverseIterator<Iterator>& rev_it)
+{
+ return rev_it + n;
+}
+
+template <typename Iterator>
+typename ft::ReverseIterator<Iterator>::difference_type operator-(
+ const ft::ReverseIterator<Iterator>& lhs,
+ const ft::ReverseIterator<Iterator>& rhs)
+{
+ return lhs.base() - rhs.base();
+}
+
+#endif