Bläddra i källkod

feat(list): clear, erase and operator=

greatbridf 2 år sedan
förälder
incheckning
c0158d5a7e
1 ändrade filer med 23 tillägg och 4 borttagningar
  1. 23 4
      include/types/list.hpp

+ 23 - 4
include/types/list.hpp

@@ -77,6 +77,12 @@ public:
         {
         }
 
+        iterator& operator=(const iterator& iter)
+        {
+            n = iter.n;
+            return *this;
+        }
+
         explicit iterator(node_base* _n) noexcept
             : n(_n)
         {
@@ -173,6 +179,14 @@ public:
             push_back(item);
     }
 
+    list<T, Allocator>& operator=(const list<T, Allocator>& v)
+    {
+        clear();
+        for (const auto& item : v)
+            push_back(item);
+        return *this;
+    }
+
     ~list() noexcept
     {
         for (auto iter = begin(); iter != end(); ++iter) {
@@ -190,12 +204,20 @@ public:
     }
 
     // erase the node which iter points to
-    void erase(const iterator_type& iter) noexcept
+    iterator_type erase(const iterator_type& iter) noexcept
     {
         node_base_type* current_node = iter._node();
+        iterator_type ret(current_node->next);
         current_node->prev->connect(current_node->next);
         allocator_traits<allocator_type>::deconstruct_and_deallocate(static_cast<node_type*>(current_node));
         --_size();
+        return ret;
+    }
+
+    void clear(void)
+    {
+        for (auto iter = begin(); iter != end();)
+            iter = erase(iter);
     }
 
     // insert the value v in front of the given iterator
@@ -279,9 +301,6 @@ public:
     }
 
     // TODO
-    // iterator_type cstart() noexcept;
-    // iterator_type cend() noexcept;
-
     // iterator_type r_start() noexcept;
     // iterator_type r_end() noexcept;