diff options
Diffstat (limited to 'Vector.hpp')
| -rw-r--r-- | Vector.hpp | 117 |
1 files changed, 109 insertions, 8 deletions
@@ -6,7 +6,7 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/24 16:19:04 by charles #+# #+# */ -/* Updated: 2020/04/24 16:19:05 by charles ### ########.fr */ +/* Updated: 2020/04/24 19:16:17 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -78,6 +78,16 @@ namespace ft delete [] m_under; } + iterator begin() { return iterator(*this, 0, 1); } + const_iterator begin() const { return iterator(*this, 0, 1); } + iterator end() { return const_iterator(*this, m_size, 1); } + const_iterator end() const { return const_iterator(*this, m_size, 1); } + iterator rbegin() { return iterator(*this, m_size - 1, -1); } + const_iterator rbegin() const { return iterator(*this, m_size - 1, -1); } + iterator rend() { return const_iterator(*this, -1, -1); } + const_iterator rend() const { return const_iterator(*this, -1, -1); } + + size_type size() const { return m_size; } size_type max_size() const { return UINT_MAX; } size_type capacity() const { return m_capacity; } @@ -144,10 +154,8 @@ namespace ft void assign(InputIterator first, InputIterator last) { size_type count; - InputIterator copy; - copy = first; - count = 0; - for (; copy != last; copy++) + InputIterator copy(first); + for (count = 0; copy != last; copy++) count++; reserve(count); for (size_type i = 0; first != last; first++, i++) @@ -172,12 +180,45 @@ namespace ft { m_size--; ~value_type(m_under[m_size]); - m_under[m_size] = value_type(); } - // insert + iterator insert(iterator position, const value_type& val) + { + m_size++; + reserve(m_size); + for (iterator it = rbegin(); it != position; ++it) + *it = *(it - 1); + *position = val; + } + + void insert(iterator position, size_type n, const value_type& val) + { + reserve(m_size + n); + while (n-- > 0) + insert(position, val); + } + + template <typename InputIterator> + void insert(iterator position, InputIterator first, InputIterator last) + { + for (; first != last; ++first) + insert(position, *first); + } + + iterator erase(iterator position) + { + for (; position != end(); ++position) + *position = *(position + 1); + m_size--; + } - // erase + iterator erase(iterator first, iterator last) + { + size_type i; + for (i = 0; first != last && last + i != end(); ++first, i++) + *first = *(last + i); + m_size -= i; + } void swap(Vector& x) { @@ -202,6 +243,66 @@ namespace ft m_capacity = 0; } + class iterator + { + public: + iterator() : m_pos(-1) {} + + iterator(const iterator& other) { *this = other; } + + iterator& operator=(const iterator& other) + { + if (this == &other) + return *this; + m_ref = other.m_ref; + m_pos = other.m_pos; + m_inc = other.m_inc; + return *this; + } + + ~iterator() {} + + value_type& operator*() { return m_ref[m_pos]; } + value_type& operator->() { return m_ref[m_pos]; } + + bool operator==(const iterator& other) { return m_pos == other.m_pos; } + bool operator!=(const iterator& other) { return !(operator==(other)); } + + bool operator<(const iterator& other) { return m_pos < other.m_pos; } + bool operator>(const iterator& other) { return !(this <= other); } + bool operator<=(const iterator& other) { return !(this > other); } + bool operator>=(const iterator& other) { return !(this < other); } + + iterator& operator++() { m_pos += m_inc; return *this; } + iterator& operator--() { m_pos -= m_inc; return *this; } + iterator& operator++(int) { iterator copy(this); m_pos += m_inc; return copy; } + iterator& operator--(int) { iterator copy(this); m_pos -= m_inc; return copy; } + + iterator operator+(int n) { iterator copy(this); return copy += n; } + iterator operator-(int n) { iterator copy(this); return copy -= n; } + iterator operator+(iterator& it) { iterator copy(this); return copy += it.m_pos; } + iterator operator-(iterator& it) { iterator copy(this); return copy -= it.m_pos; } + + iterator& operator+=(int n) { m_pos += n; return *this; } + iterator& operator-=(int n) { m_pos -= n; return *this; } + + value_type& operator[](size_type n) { return m_ref[m_pos + n]; } + + private: + iterator(Vector* ref, size_type pos, int inc) + : m_pos(pos), m_ref(ref), m_inc(int) {} + + Vector& m_ref; + size_type m_pos; + int inc; + } + + class const_iterator : public iterator + { + const value_type& operator*() { return m_ref[m_pos]; } + const value_type& operator->() { return m_ref[m_pos]; } + } + private: value_type* m_under; size_type m_size; |
