aboutsummaryrefslogtreecommitdiff
path: root/Vector.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'Vector.hpp')
-rw-r--r--Vector.hpp117
1 files changed, 109 insertions, 8 deletions
diff --git a/Vector.hpp b/Vector.hpp
index 7d6b40b..1366ec6 100644
--- a/Vector.hpp
+++ b/Vector.hpp
@@ -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;