From 435dac19653737f31608cb1ffc066b4c5a629a3c Mon Sep 17 00:00:00 2001 From: kinou-p Date: Sun, 20 Nov 2022 03:00:39 +0100 Subject: [PATCH] correction vector --- Makefile | 6 +- containers/iterators/enable_if.hpp | 24 ++++ containers/iterators/is_integral.hpp | 31 +++++ containers/iterators/iterator.hpp | 28 ---- containers/iterators/iterator_traits.hpp | 27 ++++ .../iterators/random_access_iterator.hpp | 29 ++-- containers/iterators/reverse_iterator.hpp | 83 ++++++++++++ containers/iterators/vector_iterators.hpp | 43 ------ containers/map.hpp | 51 ++++--- containers/vector.hpp | 125 ++++++++++++------ tests/stack_test.cpp | 17 --- 11 files changed, 297 insertions(+), 167 deletions(-) delete mode 100644 containers/iterators/iterator.hpp delete mode 100644 containers/iterators/vector_iterators.hpp delete mode 100644 tests/stack_test.cpp diff --git a/Makefile b/Makefile index d17571b..3c4328e 100644 --- a/Makefile +++ b/Makefile @@ -6,14 +6,14 @@ # By: apommier +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2022/10/12 19:45:18 by apommier #+# #+# # -# Updated: 2022/11/16 21:54:17 by apommier ### ########.fr # +# Updated: 2022/11/19 01:32:23 by apommier ### ########.fr # # # # **************************************************************************** # NAME = a.out SRCS = tests/main.cpp - +INCLUDE = ./containers OBJS = ${SRCS:.cpp=.o} CC = c++ CFLAGS = -g -Wall -Wextra -Werror -std=c++98 @@ -23,7 +23,7 @@ RM = rm -rf $(CC) ${CFLAGS} -c $< -o $(<:.cpp=.o) ${NAME}: ${OBJS} - ${CC} ${LIB} ${OBJS} -o ${NAME} + ${CC} ${LIB} ${OBJS} ${INCLUDE} -o ${NAME} all: ${NAME} diff --git a/containers/iterators/enable_if.hpp b/containers/iterators/enable_if.hpp index e69de29..3d9ebab 100644 --- a/containers/iterators/enable_if.hpp +++ b/containers/iterators/enable_if.hpp @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* enable_if.hpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/11/19 05:59:46 by apommier #+# #+# */ +/* Updated: 2022/11/19 10:55:47 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#pragma once + +namespace ft +{ + template < bool B, class T = void > + struct enable_if {}; + + template < class T > + struct enable_if< true, T > { + typedef T type; + }; +} \ No newline at end of file diff --git a/containers/iterators/is_integral.hpp b/containers/iterators/is_integral.hpp index e69de29..46ef5af 100644 --- a/containers/iterators/is_integral.hpp +++ b/containers/iterators/is_integral.hpp @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* is_integral.hpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/11/19 10:55:07 by apommier #+# #+# */ +/* Updated: 2022/11/19 10:55:51 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#pragma once + +namespace ft +{ + template struct is_integral { static const bool value = false; }; + template <> struct is_integral { static const bool value = true; }; + template <> struct is_integral { static const bool value = true; }; + template <> struct is_integral { static const bool value = true; }; + template <> struct is_integral { static const bool value = true; }; + template <> struct is_integral { static const bool value = true; }; + template <> struct is_integral { static const bool value = true; }; + template <> struct is_integral { static const bool value = true; }; + template <> struct is_integral { static const bool value = true; }; + template <> struct is_integral { static const bool value = true; }; + template <> struct is_integral { static const bool value = true; }; + template <> struct is_integral { static const bool value = true; }; + template <> struct is_integral { static const bool value = true; }; + template <> struct is_integral { static const bool value = true; }; +} diff --git a/containers/iterators/iterator.hpp b/containers/iterators/iterator.hpp deleted file mode 100644 index 9c1ab06..0000000 --- a/containers/iterators/iterator.hpp +++ /dev/null @@ -1,28 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* iterator.hpp :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: apommier +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2022/10/29 16:59:53 by apommier #+# #+# */ -/* Updated: 2022/10/29 17:04:13 by apommier ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#ifndef ITERATOR_HPP -# define ITERATOR_HPP - -template class iterator_traits;template class iterator_traits;template class iterator_traits - -template -class iterator -{ - typedef T value_type; - typedef Distance difference_type; - typedef Pointer pointer; - typedef Reference reference; - typedef Category iterator_category; -}; - -#endif \ No newline at end of file diff --git a/containers/iterators/iterator_traits.hpp b/containers/iterators/iterator_traits.hpp index e69de29..2f9a1b5 100644 --- a/containers/iterators/iterator_traits.hpp +++ b/containers/iterators/iterator_traits.hpp @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* iterator_traits.hpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/11/19 05:07:29 by apommier #+# #+# */ +/* Updated: 2022/11/19 05:09:05 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#pragma once + +namespace ft +{ + template + struct iterator_traits { + + typedef typename Iterator::iterator_category iterator_category; + typedef typename Iterator::value_type value_type; + typedef typename Iterator::difference_type difference_type; + typedef difference_type distance_type; + typedef typename Iterator::pointer pointer; + typedef typename Iterator::reference reference; + }; +} \ No newline at end of file diff --git a/containers/iterators/random_access_iterator.hpp b/containers/iterators/random_access_iterator.hpp index 928fba6..c9fbf71 100644 --- a/containers/iterators/random_access_iterator.hpp +++ b/containers/iterators/random_access_iterator.hpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/30 16:14:35 by apommier #+# #+# */ -/* Updated: 2022/11/16 19:21:41 by apommier ### ########.fr */ +/* Updated: 2022/11/19 12:42:38 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,12 +21,12 @@ namespace ft class random_access_iterator { public: - + typedef T value_type; typedef std::ptrdiff_t difference_type; typedef T* pointer; typedef T& reference; - + private: pointer _ptr; @@ -40,7 +40,7 @@ namespace ft random_access_iterator(){ _ptr = NULL;} random_access_iterator(pointer ptr){ _ptr = ptr;} random_access_iterator(random_access_iterator const &cpy) {*this = cpy;} - + ~random_access_iterator(){} random_access_iterator &operator=(random_access_iterator const &cpy) @@ -49,6 +49,10 @@ namespace ft return (*this); } + operator random_access_iterator() const + { + return (random_access_iterator(_ptr)); + } // random_access_iterator &operator=(pointer &ptr) // { // _ptr = ptr; @@ -70,20 +74,20 @@ namespace ft //-------------INCREMENTERS-------------- //--------------------------------------- - random_access_iterator &operator ++() + random_access_iterator &operator ++() { _ptr++; return (*this); } - random_access_iterator operator ++(int) + random_access_iterator operator ++(int) { random_access_iterator tmp(*this); ++(*this); return (tmp); } - random_access_iterator &operator --() + random_access_iterator &operator --() { _ptr--; return (*this); @@ -99,10 +103,13 @@ namespace ft //--------------------------------------- //----------------ADRESS----------------- //--------------------------------------- - - value_type operator *() { return (*_ptr); } + + reference operator *() { return (*_ptr); } + reference operator *() const { return (*_ptr); } pointer operator ->() { return (_ptr); } - value_type operator [](difference_type nbr) { return (*(_ptr + nbr)); } + pointer operator ->() const { return (_ptr); } + // reference operator [](difference_type nbr) { return (*(_ptr + nbr)); } const + reference operator [](difference_type nbr) const { return (*(_ptr + nbr)); } //--------------------------------------- //--------------OPERATION---------------- @@ -111,7 +118,7 @@ namespace ft // addition | soustraction 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 - random_access_iterator &operator -(difference_type nbr) { return random_access_iterator(_ptr - nbr); } // a - n + random_access_iterator operator -(difference_type nbr) { return random_access_iterator(_ptr - nbr); } // a - n 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 //random_access_iterator operator -(const random_access_iterator &b) { return random_access_iterator(_ptr + b); } // a - b 2? diff --git a/containers/iterators/reverse_iterator.hpp b/containers/iterators/reverse_iterator.hpp index e69de29..ce8c2e6 100644 --- a/containers/iterators/reverse_iterator.hpp +++ b/containers/iterators/reverse_iterator.hpp @@ -0,0 +1,83 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* reverse_iterator.hpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/11/19 05:14:31 by apommier #+# #+# */ +/* Updated: 2022/11/19 05:49:52 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef REVERSE_ITERATOR_HPP +# define REVERSE_ITERATOR_HPP + +# include + +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: + + Iter _Ite; + + public: + + //--------------------------------------- + //--------CONSTRUCTOR DESTRUCTOR--------- + //--------------------------------------- + + reverse_iterator(){} + reverse_iterator(pointer Ite){} + reverse_iterator(reverse_iterator const &cpy) {} + + ~reverse_iterator(){} + + reverse_iterator &operator=(reverse_iterator const &cpy) + { + _Ite = cpy._Ite; + return (*this); + } + + //--------------------------------------- + //-------------COMPARAISON--------------- + //--------------------------------------- + + //--------------------------------------- + //-------------INCREMENTERS-------------- + //--------------------------------------- + + //--------------------------------------- + //----------------ADRESS----------------- + //--------------------------------------- + + reference operator *() { return (*_Ite); } + const reference operator *() const { return (*_Ite); } + pointer operator ->() { return (_Ite); } + const pointer operator ->() const { return (_Ite); } + reference operator [](difference_type nbr) const { return (*(_Ite + nbr)); } + + //--------------------------------------- + //--------------OPERATION---------------- + //--------------------------------------- + + //--------------------------------- + //--------------GET---------------- + //--------------------------------- + + }; + + +} \ No newline at end of file diff --git a/containers/iterators/vector_iterators.hpp b/containers/iterators/vector_iterators.hpp deleted file mode 100644 index ff06dac..0000000 --- a/containers/iterators/vector_iterators.hpp +++ /dev/null @@ -1,43 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* vector_iterators.hpp :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: apommier +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2022/10/30 16:03:53 by apommier #+# #+# */ -/* Updated: 2022/10/30 16:12:03 by apommier ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#ifndef VECTOR_ITERATORS_HPP -# define VECTOR_ITERATORS_HPP - -namespace ft -{ -template -class random_access_iterator -{ - public : - - random_access_iterator() - { - - } - - random_access_iterator(random_access_iterator cpy) - { - - } - - ~random_access_iterator() - { - - } - - - private : -}; -} - -#endif \ No newline at end of file diff --git a/containers/map.hpp b/containers/map.hpp index 1d31c89..716f8d0 100644 --- a/containers/map.hpp +++ b/containers/map.hpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/12 19:46:25 by apommier #+# #+# */ -/* Updated: 2022/11/17 07:41:22 by apommier ### ########.fr */ +/* Updated: 2022/11/18 11:58:52 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,19 +30,19 @@ class map //---------MEMBER TYPE--------- //----------------------------- - typedef Key key_type; - typedef T mapped_type; - typedef std::pair value_type; - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - typedef Compare key_compare; - typedef Allocator allocator_type; - typedef value_type& reference; - typedef const value_type& const_reference; - typedef Allocator::pointer pointer; - typedef Allocator::const_pointer const_pointer; - typedef LegacyBidirectionalIterator iterator; - typedef LegacyBidirectionalIterator const_iterator; + typedef Key key_type; + typedef T mapped_type; + typedef std::pair value_type; + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + typedef Compare key_compare; + typedef Allocator allocator_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef Allocator::pointer pointer; + typedef Allocator::const_pointer const_pointer; + typedef LegacyBidirectionalIterator iterator; + typedef LegacyBidirectionalIterator const_iterator; typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; @@ -51,27 +51,38 @@ class map //----------------------------- private : - pointer _start; + pointer _start; + pointer _end; + size_type _size; + size_type _capacity; + allocator_type _alloc; public : //--------------------------------------- //---------COPLIEN FORM FUNCTION--------- //--------------------------------------- - map(); + map() + { + _start = 0; + _end = 0; + _size = 0; + _capacity = 0; + _alloc = 0; + + } + explicit map( const Compare& comp, const Allocator& alloc = Allocator() ) { } - template< class InputIt > map( InputIt first, InputIt last, const Compare& comp = Compare(), const Allocator& alloc = Allocator() ) { } - map( const map& x) { @@ -81,14 +92,12 @@ class map { } - map& operator=( const map& x ) { } - //---------------------------------- //---------MEMBER FUNCTION---------- //---------------------------------- @@ -218,7 +227,6 @@ class map } - //------------------------- //--------Observers-------- //------------------------- @@ -282,7 +290,6 @@ class map } - }; } diff --git a/containers/vector.hpp b/containers/vector.hpp index ba4f6aa..45da700 100644 --- a/containers/vector.hpp +++ b/containers/vector.hpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/12 19:46:32 by apommier #+# #+# */ -/* Updated: 2022/11/17 06:53:12 by apommier ### ########.fr */ +/* Updated: 2022/11/20 02:57:45 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,8 @@ # define VECTOR_HPP # include "./iterators/random_access_iterator.hpp" +# include "./iterators/enable_if.hpp" +# include "./iterators/is_integral.hpp" # include # include @@ -37,7 +39,7 @@ class vector typedef T* pointer; typedef const T* const_pointer; typedef ft::random_access_iterator iterator; - typedef const ft::random_access_iterator const_iterator; + typedef ft::random_access_iterator const_iterator; typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; typedef std::ptrdiff_t difference_type; @@ -49,7 +51,7 @@ class vector //----------------------------- private: - value_type *_tab; + pointer _tab; size_type _size; size_type _capacity; @@ -74,35 +76,32 @@ class vector explicit vector (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type()): _alloc(alloc) //fill constructor { - _tab = 0; - _size = 0; - _capacity = 0; - - _alloc = alloc; _tab = _alloc.allocate(n); _size = n; _capacity = n; while (n--) _alloc.construct(_tab + n, val); } - + vector (const vector& x)//copy constructor { *this = x; } - + ~vector() { - if (_tab && _capacity) + if (_capacity) _alloc.deallocate(_tab, _capacity); } vector& operator= (const vector& x)//assignation operator { - _tab = x._tab; + _alloc = x._alloc; _size = x._size; - _capacity = x._capacity; - _alloc = x._alloc; + _capacity = x._size; + _tab = _alloc.allocate(_size); + for (size_type i = 0; i < _size; i++) + _alloc.construct(_tab + i, x._tab[i]); return (*this); } @@ -115,23 +114,43 @@ class vector //------------------------- iterator begin() { - return (_tab); + return (iterator(_tab)); } + const_iterator begin() const + { + return const_iterator(_tab); + } + iterator end() { - return (_tab + _size); + return iterator(_tab + _size); + } + + const_iterator end() const + { + return const_iterator(_tab + _size); } reverse_iterator rbegin() { - return (_tab + _size); + return iterator(_tab + _size); + } + + const_reverse_iterator rbegin() const + { + return iterator(_tab + _size); } reverse_iterator rend() { return (_tab); } + + const_reverse_iterator rend() const + { + return (_tab); + } //------------------------ //--------Capacity-------- @@ -164,9 +183,10 @@ class vector while (n > _size) { _alloc.construct(_tab + _size, val); + _size++; //_end++; } - _size = n; + //_size = n; } } @@ -214,13 +234,17 @@ class vector reference at (size_type n) { //exception - return (_tab[n]); + if (n >= _size) + throw (std::out_of_range("ft::vector::at")); + return (*(_tab + n)); } const_reference at (size_type n) const { //exception - return (_tab[n]); + if (n >= _size) + throw (std::out_of_range("ft::vector::at")); + return (*(_tab + n)); } reference front() @@ -235,12 +259,12 @@ class vector reference back() { - return (*(_tab + _size)); + return (*(_tab + _size - 1)); } const_reference back() const { - return (*(_tab + _size)); + return (*(_tab + _size - 1)); } value_type* data() @@ -256,8 +280,10 @@ class vector //------------------------- //--------Modifiers-------- //------------------------- + template - void assign (InputIterator first, InputIterator last) //range + //void assign (InputIterator first, InputIterator last) //range + void assign (InputIterator first, InputIterator last, typename ft::enable_if::value, InputIterator>::type* = 0) { this->clear(); while (first < last) @@ -277,12 +303,13 @@ class vector _alloc.construct(_tab + n, val); } - void push_back (const value_type& val) + void push_back (const_reference val) { if (!_capacity) this->reserve(1); else if (_size == _capacity) - this->reserve(_size); + this->reserve(_size * 2); + //std::cout << "coucou1\n"; _alloc.construct(_tab + _size, val); _size++; } @@ -299,6 +326,7 @@ class vector iterator insert (iterator position, const value_type& val) //single element { this->insert(position, 1, val); + return (position); } void insert (iterator position, size_type n, const value_type& val) //fill @@ -335,11 +363,11 @@ class vector if (_size + (last - first) > this->max_size()) throw (std::length_error("vector::resize")); tmp = _alloc.allocate(_size + (last - first)); - for (i = 0; i < position; i++) + for (i = 0; i < position - _tab; i++) tmp[i] = _tab[i]; while (first + j != last) { - tmp[i + j] = *(first + j); + tmp[i + j] = *(j + first); j++; } while (_size - i) @@ -352,31 +380,42 @@ class vector iterator erase (iterator position) { - iterator ret = position; - _alloc.destroy(position); - while (_tab + _size - 1 > position + _tab) + _alloc.destroy(&(*position)); + // while (_tab + _size - 1 > _tab + (position - _tab)) + // { + // *position = *(position + 1); + // position++; + // _alloc.destroy(&(*position)); + // } + for (size_type i = 0; _tab + _size - 1 > _tab + (position - _tab + i); i++) { - *position = *(position + 1); - position++; - _alloc.destroy(position); + _alloc.construct(&(*(position + i)), *(position + i + 1)); + _alloc.destroy(&(*(position + i + 1))); } _size--; - return (ret + 1); + return (position); } iterator erase (iterator first, iterator last) { difference_type lenght = last - first; - - for (int i = 0; lenght - i; i++) - _alloc.destroy(first + i); - while (_tab + _size - 1 != _tab + lenght) + //std::cout << "diff = " << lenght << std::endl; + + int i; + for (i = 0; lenght - i - 1; i++) + _alloc.destroy(&(*(first + i))); + for (i = 0; _size - i - 1; i++) { - *first = *(first + lenght); - first++; - _alloc.destroy(first + lenght); - } - return (last + 1); + _alloc.construct(&(*(first + i)), *(first + lenght + i)); + _alloc.destroy(&(*(first + lenght + i ))); + } + // for (; _size - lenght - i; i++) + // { + // _alloc.construct(&(*(first + i)), *(first + lenght + i)); + // _alloc.destroy(&(*(first + _size - lenght + i ))); + // } + _size -= lenght; + return (first); } void swap (vector& x) diff --git a/tests/stack_test.cpp b/tests/stack_test.cpp deleted file mode 100644 index dcadbef..0000000 --- a/tests/stack_test.cpp +++ /dev/null @@ -1,17 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* stack_test.cpp :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: apommier +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2022/10/19 14:04:13 by apommier #+# #+# */ -/* Updated: 2022/10/19 14:29:06 by apommier ### ########.fr */ -/* */ -/* ************************************************************************** */ - -// void tester() -// { -// //ft::stack first() -// return; -// } \ No newline at end of file