Browse Source

feat(list, vector): impl. emplace_back

greatbridf 2 years ago
parent
commit
ffa995672b
2 changed files with 25 additions and 2 deletions
  1. 18 2
      include/types/list.hpp
  2. 7 0
      include/types/vector.hpp

+ 18 - 2
include/types/list.hpp

@@ -221,23 +221,27 @@ public:
     }
 
     // insert the value v in front of the given iterator
-    void insert(const iterator_type& iter, const value_type& v) noexcept
+    iterator_type insert(const iterator_type& iter, const value_type& v) noexcept
     {
         node_base_type* new_node = allocator_traits<allocator_type>::allocate_and_construct(v);
+        iterator_type ret(new_node);
         iter._node()->prev->connect(new_node);
         new_node->connect(iter._node());
 
         ++_size();
+        return ret;
     }
 
     // insert the value v in front of the given iterator
-    void insert(const iterator_type& iter, value_type&& v) noexcept
+    iterator_type insert(const iterator_type& iter, value_type&& v) noexcept
     {
         node_base_type* new_node = allocator_traits<allocator_type>::allocate_and_construct(v);
+        iterator_type ret(new_node);
         iter._node().prev->connect(new_node);
         new_node->connect(iter._node());
 
         ++_size();
+        return ret;
     }
 
     void push_back(const value_type& v) noexcept
@@ -250,6 +254,12 @@ public:
         insert(end(), v);
     }
 
+    template <typename... Args>
+    reference_type emplace_back(Args... args)
+    {
+        return insert(end(), value_type(args...));
+    }
+
     void push_front(const value_type& v) noexcept
     {
         insert(begin(), v);
@@ -260,6 +270,12 @@ public:
         insert(begin(), v);
     }
 
+    template <typename... Args>
+    reference_type emplace_front(Args... args)
+    {
+        return insert(begin(), value_type(args...));
+    }
+
     size_t size(void) const noexcept
     {
         return _size();

+ 7 - 0
include/types/vector.hpp

@@ -230,6 +230,13 @@ public:
         ++m_size;
     }
 
+    template <typename... Args>
+    iterator_type emplace_back(Args... args)
+    {
+        push_back(value_type(args...));
+        return back();
+    }
+
     void pop_back(void) noexcept
     {
         allocator_traits<allocator_type>::deconstruct(&*back());