reverse iterator almost done

This commit is contained in:
kinou-p 2022-11-22 06:16:48 +01:00
parent 435dac1965
commit 9656f9e55a
3 changed files with 235 additions and 40 deletions

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/10/30 16:14:35 by apommier #+# #+# */ /* Created: 2022/10/30 16:14:35 by apommier #+# #+# */
/* Updated: 2022/11/19 12:42:38 by apommier ### ########.fr */ /* Updated: 2022/11/21 15:54:44 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -22,10 +22,11 @@ namespace ft
{ {
public: public:
typedef T value_type; typedef T value_type;
typedef std::ptrdiff_t difference_type; typedef std::ptrdiff_t difference_type;
typedef T* pointer; typedef T* pointer;
typedef T& reference; typedef T& reference;
typedef random_access_iterator iterator_category;
private: private:
@ -59,16 +60,7 @@ namespace ft
// return (*this); // return (*this);
// } // }
//---------------------------------------
//-------------COMPARAISON---------------
//---------------------------------------
friend bool operator ==(random_access_iterator const& a, random_access_iterator const& b) { return (a._ptr == b._ptr); }
friend bool operator !=(random_access_iterator const& a, random_access_iterator const& b) { return (a._ptr != b._ptr); }
friend bool operator <(random_access_iterator const& a, random_access_iterator const& b) { return (a._ptr < b._ptr); }
friend bool operator >(random_access_iterator const& a, random_access_iterator const& b) { return (a._ptr > b._ptr); }
friend bool operator <=(random_access_iterator const& a, random_access_iterator const& b) { return (a._ptr <= b._ptr); }
friend bool operator >=(random_access_iterator const& a, random_access_iterator const& b) { return (a._ptr >= b._ptr); }
//--------------------------------------- //---------------------------------------
//-------------INCREMENTERS-------------- //-------------INCREMENTERS--------------
@ -118,7 +110,7 @@ namespace ft
// addition | soustraction // addition | soustraction
random_access_iterator operator +(difference_type const nbr) const { return (random_access_iterator(_ptr + nbr)); } // a + n random_access_iterator operator +(difference_type const nbr) const { return (random_access_iterator(_ptr + nbr)); } // a + n
friend random_access_iterator operator +(int const lhs, random_access_iterator const& rhs) { return (rhs + lhs); } // n + a friend random_access_iterator operator +(int const lhs, random_access_iterator const& rhs) { return (rhs + lhs); } // n + a
random_access_iterator operator -(difference_type nbr) { return random_access_iterator(_ptr - nbr); } // a - n random_access_iterator operator -(difference_type nbr) const { return random_access_iterator(_ptr - nbr); } // a - n
difference_type operator -(random_access_iterator const &rhs) const { return (_ptr - rhs._ptr) ; } // a - b difference_type operator -(random_access_iterator const &rhs) const { return (_ptr - rhs._ptr) ; } // a - b
//friend difference_type &operator -(random_access_iterator const& lhs, random_access_iterator const& rhs) { return ((difference_type)(lhs._ptr - rhs._ptr)); } // a - b //friend difference_type &operator -(random_access_iterator const& lhs, random_access_iterator const& rhs) { return ((difference_type)(lhs._ptr - rhs._ptr)); } // a - b
//random_access_iterator operator -(const random_access_iterator &b) { return random_access_iterator(_ptr + b); } // a - b 2? //random_access_iterator operator -(const random_access_iterator &b) { return random_access_iterator(_ptr + b); } // a - b 2?
@ -143,9 +135,52 @@ namespace ft
{ {
return (_ptr); return (_ptr);
} }
//---------------------------------------
//-------------COMPARAISON---------------
//---------------------------------------
// bool operator ==(const random_access_iterator &b) { return (this->_ptr == b._ptr); }
// bool operator !=(const random_access_iterator &b) { return (this->_ptr != b._ptr); }
// bool operator <(const random_access_iterator &b) { return (this->_ptr < b._ptr); }
// bool operator >(const random_access_iterator &b) { return (this->_ptr > b._ptr); }
// bool operator <=(const random_access_iterator &b) { return (this->_ptr <= b._ptr); }
// bool operator >=(const random_access_iterator &b) { return (this->_ptr >= b._ptr); }
friend bool operator ==(random_access_iterator const& a, random_access_iterator const& b) { return (a._ptr == b._ptr); }
friend bool operator !=(random_access_iterator const& a, random_access_iterator const& b) { return (a._ptr != b._ptr); }
friend bool operator <(random_access_iterator const& a, random_access_iterator const& b) { return (a._ptr < b._ptr); }
friend bool operator >(random_access_iterator const& a, random_access_iterator const& b) { return (a._ptr > b._ptr); }
friend bool operator <=(random_access_iterator const& a, random_access_iterator const& b) { return (a._ptr <= b._ptr); }
friend bool operator >=(random_access_iterator const& a, random_access_iterator const& b) { return (a._ptr >= b._ptr); }
}; };
//---------------------------------------
//-------------COMPARAISON---------------
//---------------------------------------
// template<typename _Ite>
// bool operator ==(const random_access_iterator<_Ite> &a, const random_access_iterator<_Ite> &b) { return (a._ptr == b._ptr); }
// template<typename _Ite>
// bool operator !=(const random_access_iterator<_Ite> &a, const random_access_iterator<_Ite> &b) { return (a._ptr != b._ptr); }
// template<typename _Ite>
// bool operator <(const random_access_iterator<_Ite> &a, const random_access_iterator<_Ite> &b) { return (a._ptr < b._ptr); }
// template<typename _Ite>
// bool operator >(const random_access_iterator<_Ite> &a, const random_access_iterator<_Ite> &b) { return (a._ptr > b._ptr); }
// template<typename _Ite>
// bool operator <=(const random_access_iterator<_Ite> &a, const random_access_iterator<_Ite> &b) { return (a._ptr <= b._ptr); }
// template<typename _Ite>
// bool operator >=(const random_access_iterator<_Ite> &a, const random_access_iterator<_Ite> &b) { return (a._ptr >= b._ptr); }
} }
// template <typename U>
// ft::random_access_iterator<U> operator +(std::ptrdiff_t const nbr, ft::random_access_iterator<U> const& rhs)
// {
// return (rhs + nbr);
// } // n + a
// template<class _Iterator>
// ft::random_access_iterator<_Iterator> operator+(typename ft::random_access_iterator<_Iterator>::difference_type n, ft::random_access_iterator<_Iterator> const &lhs)
// {
// return (lhs + n);
// }
#endif #endif

View File

@ -6,14 +6,14 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/11/19 05:14:31 by apommier #+# #+# */ /* Created: 2022/11/19 05:14:31 by apommier #+# #+# */
/* Updated: 2022/11/19 05:49:52 by apommier ### ########.fr */ /* Updated: 2022/11/22 06:15:05 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#ifndef REVERSE_ITERATOR_HPP #pragma once
# define REVERSE_ITERATOR_HPP
# include <cstddef> # include <cstddef>
# include "./iterator_traits.hpp"
namespace ft namespace ft
{ {
@ -31,7 +31,7 @@ namespace ft
private: private:
Iter _Ite; iterator_type _Ite;
public: public:
@ -39,45 +39,121 @@ namespace ft
//--------CONSTRUCTOR DESTRUCTOR--------- //--------CONSTRUCTOR DESTRUCTOR---------
//--------------------------------------- //---------------------------------------
reverse_iterator(){} reverse_iterator() : _Ite() {}
reverse_iterator(pointer Ite){} explicit reverse_iterator (iterator_type it) { _Ite = iterator_type(it); }
reverse_iterator(reverse_iterator const &cpy) {}
~reverse_iterator(){} template<typename It>
reverse_iterator(const reverse_iterator<It> &rev_it)
{
_Ite = rev_it.base();
}
reverse_iterator &operator=(reverse_iterator const &cpy) reverse_iterator &operator=(reverse_iterator const &cpy)
{ {
_Ite = cpy._Ite; _Ite = iterator_type(cpy._Ite);
return (*this); return (*this);
} }
virtual ~reverse_iterator(){}
//--------------------------------------- //---------------------------------------
//-------------COMPARAISON--------------- //-------------COMPARAISON---------------
//--------------------------------------- //---------------------------------------
bool operator== (reverse_iterator const &rhs) const { return (_Ite == rhs._Ite); }
bool operator!= (reverse_iterator const &rhs) const { return (_Ite != rhs._Ite); }
bool operator< (reverse_iterator const &rhs) const { return (_Ite > rhs._Ite); }
bool operator<= (reverse_iterator const &rhs) const { return (_Ite >= rhs._Ite); }
bool operator> (reverse_iterator const &rhs) const { return (_Ite < rhs._Ite); }
bool operator>= (reverse_iterator const &rhs) const { return (_Ite <= rhs._Ite); }
//--------------------------------------- //---------------------------------------
//-------------INCREMENTERS-------------- //-------------INCREMENTERS--------------
//--------------------------------------- //---------------------------------------
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----------------- //----------------ADRESS-----------------
//--------------------------------------- //---------------------------------------
reference operator *() { return (*_Ite); } reference operator *() { return (*_Ite); }
const reference operator *() const { return (*_Ite); } const reference operator *() const { return (*_Ite); }
pointer operator ->() { return (_Ite); } pointer operator ->() { return (_Ite.getPointer()); }
const pointer operator ->() const { return (_Ite); } const pointer operator ->() const { return (_Ite.getPointer()); }
reference operator [](difference_type nbr) const { return (*(_Ite + nbr)); } reference operator [](difference_type nbr) const { return (*(_Ite + nbr)); }
//--------------------------------------- //---------------------------------------
//--------------OPERATION---------------- //--------------OPERATION----------------
//--------------------------------------- //---------------------------------------
// reverse_iterator operator+ (difference_type n) const { return reverse_iterator<iterator_type>(_Ite - n); }
// reverse_iterator& operator+= (difference_type n) { return reverse_iterator<iterator_type>(_Ite -= n); }
// reverse_iterator operator- (difference_type n) const { return reverse_iterator<iterator_type>(_Ite + n); }
// reverse_iterator& operator-= (difference_type n) { return reverse_iterator<iterator_type>(_Ite += n); }
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 (_Ite - lhs._Ite); }
reverse_iterator& operator-= (difference_type n)
{
//std::cout << "its me\n";
_Ite += n;
return (*this);
}
// template <class Iterator>
// reverse_iterator<Iterator> operator+ (typename reverse_iterator<Iterator>::difference_type n, const reverse_iterator<Iterator>& rev_it)
// {
// }
// template <class Iterator>
// typename reverse_iterator<Iterator>::difference_type operator- ( const reverse_iterator<Iterator>& lhs, const reverse_iterator<Iterator>& rhs)
// {
// }
//--------------------------------- //---------------------------------
//--------------GET---------------- //--------------GET----------------
//--------------------------------- //---------------------------------
iterator_type base() const { return iterator_category(_Ite); }
}; };
} }

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/10/12 19:46:32 by apommier #+# #+# */ /* Created: 2022/10/12 19:46:32 by apommier #+# #+# */
/* Updated: 2022/11/20 02:57:45 by apommier ### ########.fr */ /* Updated: 2022/11/21 18:48:56 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -16,6 +16,7 @@
# include "./iterators/random_access_iterator.hpp" # include "./iterators/random_access_iterator.hpp"
# include "./iterators/enable_if.hpp" # include "./iterators/enable_if.hpp"
# include "./iterators/is_integral.hpp" # include "./iterators/is_integral.hpp"
# include "./iterators/reverse_iterator.hpp"
# include <cstddef> # include <cstddef>
# include <memory> # include <memory>
@ -40,8 +41,8 @@ class vector
typedef const T* const_pointer; typedef const T* const_pointer;
typedef ft::random_access_iterator<value_type> iterator; typedef ft::random_access_iterator<value_type> iterator;
typedef ft::random_access_iterator<const value_type> const_iterator; typedef ft::random_access_iterator<const value_type> const_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator; typedef ft::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator; typedef ft::reverse_iterator<const_iterator> const_reverse_iterator;
typedef std::ptrdiff_t difference_type; typedef std::ptrdiff_t difference_type;
typedef std::size_t size_type; typedef std::size_t size_type;
@ -90,12 +91,18 @@ class vector
~vector() ~vector()
{ {
if (_capacity) //std::cout << "destct" << std::endl;
if (_capacity == 0)
{
_alloc.deallocate(_tab, _capacity); _alloc.deallocate(_tab, _capacity);
_capacity = 0;
}
//std::cout << "destct end" << std::endl;
} }
vector& operator= (const vector& x)//assignation operator vector& operator= (const vector& x)//assignation operator
{ {
//this->~vector();
_alloc = x._alloc; _alloc = x._alloc;
_size = x._size; _size = x._size;
_capacity = x._size; _capacity = x._size;
@ -134,22 +141,22 @@ class vector
reverse_iterator rbegin() reverse_iterator rbegin()
{ {
return iterator(_tab + _size); return reverse_iterator(_tab);
} }
const_reverse_iterator rbegin() const const_reverse_iterator rbegin() const
{ {
return iterator(_tab + _size); return const_reverse_iterator(_tab);
} }
reverse_iterator rend() reverse_iterator rend()
{ {
return (_tab); return reverse_iterator(_tab + _size);
} }
const_reverse_iterator rend() const const_reverse_iterator rend() const
{ {
return (_tab); return const_reverse_iterator(_tab + _size);
} }
//------------------------ //------------------------
@ -167,7 +174,7 @@ class vector
void resize (size_type n, value_type val = value_type()) //Resizes the container so that it contains n elements. void resize (size_type n, value_type val = value_type()) //Resizes the container so that it contains n elements.
{ {
//std::cout << "resize------val = " << val << std::endl;
if (n < _size) if (n < _size)
{ {
while (n < _size) while (n < _size)
@ -186,8 +193,9 @@ class vector
_size++; _size++;
//_end++; //_end++;
} }
//_size = n;
} }
//_size = n;
} }
size_type capacity() const size_type capacity() const
@ -450,6 +458,30 @@ class vector
return (_alloc); return (_alloc);
} }
//-------------------------
//-------Comparaison-------
//-------------------------
// bool operator ==(const random_access_iterator &b) { return (this->_tab == b); }
// bool operator !=(const random_access_iterator &b) { return (this->_tab != b); }
// bool operator <(const random_access_iterator &b) { return (this->_tab < b); }
// bool operator >(const random_access_iterator &b) { return (this->_tab > b); }
// bool operator <=(const random_access_iterator &b) { return (this->_tab <= b); }
// bool operator >=(const random_access_iterator &b) { return (this->_tab >= b); }
template <class Temp, class Alloc>
friend bool operator== (const vector<Temp,Alloc>& lhs, const vector<Temp,Alloc>& rhs);
template <class Temp, class Alloc>
friend bool operator!= (const vector<Temp,Alloc>& lhs, const vector<Temp,Alloc>& rhs);
template <class Temp, class Alloc>
friend bool operator< (const vector<Temp,Alloc>& lhs, const vector<Temp,Alloc>& rhs);
template <class Temp, class Alloc>
friend bool operator<= (const vector<Temp,Alloc>& lhs, const vector<Temp,Alloc>& rhs);
template <class Temp, class Alloc>
friend bool operator> (const vector<Temp,Alloc>& lhs, const vector<Temp,Alloc>& rhs);
template <class Temp, class Alloc>
friend bool operator>= (const vector<Temp,Alloc>& lhs, const vector<Temp,Alloc>& rhs);
//--------------------------------------------- //---------------------------------------------
//---------OPERATOR OVERLOAD FUNCTION---------- //---------OPERATOR OVERLOAD FUNCTION----------
//--------------------------------------------- //---------------------------------------------
@ -491,5 +523,57 @@ class vector
// } // }
}; };
template <class T, class Alloc>
bool operator== (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs)
{
if (lhs._size != rhs._size)
return (lhs._size == rhs._size);
int i = 0;
while (lhs._size - i && lhs._tab[i] == rhs._tab[i])
i++;
return (lhs._tab[i] == rhs._tab[i]);
}
template <class T, class Alloc>
bool operator!= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs)
{
return (!(lhs == rhs));
}
template <class T, class Alloc>
bool operator< (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs)
{
int i = 0;
while (lhs._size - i && rhs._size - i && lhs._tab[i] == rhs._tab[i])
i++;
if (!(lhs._size - i) && rhs._size - i)
return true;
if (!(rhs._size - i) && lhs._size - i)
return false;
if (!(lhs._size - i) && !(rhs._size - i))
return false;
return (lhs._tab[i] < rhs._tab[i]);
}
template <class T, class Alloc>
bool operator<= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs)
{
return (!(rhs < lhs));
}
template <class T, class Alloc>
bool operator> (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs)
{
return (rhs < lhs);
}
template <class T, class Alloc>
bool operator>= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs)
{
return (!(lhs < rhs));
}
} }
#endif #endif