/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* reverse_iterator.hpp :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/11/19 05:14:31 by apommier #+# #+# */ /* Updated: 2022/11/22 11:41:22 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #pragma once # include # include "./iterator_traits.hpp" namespace ft { template class reverse_iterator { public: typedef Iter iterator_type; typedef typename ft::iterator_traits::iterator_category iterator_category; typedef typename ft::iterator_traits::value_type value_type; typedef typename ft::iterator_traits::difference_type difference_type; typedef typename ft::iterator_traits::pointer pointer; typedef typename ft::iterator_traits::reference reference; private: iterator_type _Ite; public: //--------------------------------------- //--------CONSTRUCTOR DESTRUCTOR--------- //--------------------------------------- reverse_iterator() : _Ite() {} explicit reverse_iterator (iterator_type it) { _Ite = it; } template reverse_iterator(const reverse_iterator &rev_it) { _Ite = rev_it.base(); } virtual ~reverse_iterator(){} template reverse_iterator operator=(reverse_iterator const &cpy) { _Ite = cpy.base(); return (*this); } //--------------------------------------- //-------------INCREMENTERS-------------- //--------------------------------------- reverse_iterator& operator++() { //std::cout << "ope0 ++\n"; --_Ite; return (*this); } reverse_iterator operator++(int) { //std::cout << "ope ++\n"; reverse_iterator tmp = *this; _Ite--; return (tmp); } reverse_iterator& operator--() { //std::cout << "ope0 --\n"; ++_Ite; return (*this); } reverse_iterator operator--(int) { //std::cout << "ope --\n"; reverse_iterator tmp = *this; _Ite++; return (tmp); } // reverse_iterator& operator++() { // --_Ite; // return (*this); // } // reverse_iterator operator++(int) { // reverse_iterator tmp = *this; // _Ite--; // return (tmp); // } // reverse_iterator& operator--() { // ++_Ite; // return (*this); // } // reverse_iterator operator--(int) { // reverse_iterator tmp = *this; // _Ite++; // return (tmp); // } //--------------------------------------- //----------------ADRESS----------------- //--------------------------------------- reference operator *() { iterator_type tmp(_Ite); tmp--; return (*tmp); } const reference operator *() const { iterator_type tmp(_Ite); tmp--; return (*tmp); } pointer operator ->() { return (_Ite.getPointer()); } const pointer operator ->() const { return (_Ite.getPointer()); } reference operator [](difference_type nbr) const { return (*(_Ite - nbr - 1)); } //--------------------------------------- //--------------OPERATION---------------- //--------------------------------------- reverse_iterator operator+ (difference_type n) const { return reverse_iterator(_Ite - n); } friend reverse_iterator operator +(difference_type lhs, reverse_iterator const& rhs) { return (rhs + lhs); } // n + a reverse_iterator& operator+= (difference_type n) { _Ite -= n; return (*this); } reverse_iterator operator- (difference_type n) const { return reverse_iterator(_Ite + n); } difference_type operator- (reverse_iterator const &lhs) const { return (lhs._Ite - _Ite); } reverse_iterator& operator-= (difference_type n) { _Ite += n; return (*this); } //--------------------------------- //--------------GET---------------- //--------------------------------- iterator_type base() const { return /*iterator_type*/(_Ite); } }; 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 (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()); } }