[llvm] e253735 - ADT: Share an implementation for single-element insert in SmallVector, NFC

Duncan P. N. Exon Smith via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 17 21:22:20 PST 2020


Author: Duncan P. N. Exon Smith
Date: 2020-11-17T21:20:51-08:00
New Revision: e2537353e63859a2a36da93fa97cb16275681a23

URL: https://github.com/llvm/llvm-project/commit/e2537353e63859a2a36da93fa97cb16275681a23
DIFF: https://github.com/llvm/llvm-project/commit/e2537353e63859a2a36da93fa97cb16275681a23.diff

LOG: ADT: Share an implementation for single-element insert in SmallVector, NFC

Factor out `SmallVectorImple::insert_one_impl`, a common implementation
for `insert(iterator, T&&)` and `insert(iterator, T const&)`. This is
just a clean up and has no functionality change.

Differential Revision: https://reviews.llvm.org/D91674

Added: 
    

Modified: 
    llvm/include/llvm/ADT/SmallVector.h

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/ADT/SmallVector.h b/llvm/include/llvm/ADT/SmallVector.h
index fbc8ede255d2..ccf36c91d9ac 100644
--- a/llvm/include/llvm/ADT/SmallVector.h
+++ b/llvm/include/llvm/ADT/SmallVector.h
@@ -533,9 +533,10 @@ class SmallVectorImpl : public SmallVectorTemplateBase<T> {
     return(N);
   }
 
-  iterator insert(iterator I, T &&Elt) {
+private:
+  template <class ArgType> iterator insert_one_impl(iterator I, ArgType &&Elt) {
     if (I == this->end()) {  // Important special case for empty vector.
-      this->push_back(::std::move(Elt));
+      this->push_back(::std::forward<ArgType>(Elt));
       return this->end()-1;
     }
 
@@ -555,43 +556,21 @@ class SmallVectorImpl : public SmallVectorTemplateBase<T> {
 
     // If we just moved the element we're inserting, be sure to update
     // the reference.
-    T *EltPtr = &Elt;
+    std::remove_reference_t<ArgType> *EltPtr = &Elt;
     if (I <= EltPtr && EltPtr < this->end())
       ++EltPtr;
 
-    *I = ::std::move(*EltPtr);
+    *I = ::std::forward<ArgType>(*EltPtr);
     return I;
   }
 
-  iterator insert(iterator I, const T &Elt) {
-    if (I == this->end()) {  // Important special case for empty vector.
-      this->push_back(Elt);
-      return this->end()-1;
-    }
-
-    assert(I >= this->begin() && "Insertion iterator is out of bounds.");
-    assert(I <= this->end() && "Inserting past the end of the vector.");
-
-    if (this->size() >= this->capacity()) {
-      size_t EltNo = I-this->begin();
-      this->grow();
-      I = this->begin()+EltNo;
-    }
-    ::new ((void*) this->end()) T(std::move(this->back()));
-    // Push everything else over.
-    std::move_backward(I, this->end()-1, this->end());
-    this->set_size(this->size() + 1);
-
-    // If we just moved the element we're inserting, be sure to update
-    // the reference.
-    const T *EltPtr = &Elt;
-    if (I <= EltPtr && EltPtr < this->end())
-      ++EltPtr;
-
-    *I = *EltPtr;
-    return I;
+public:
+  iterator insert(iterator I, T &&Elt) {
+    return insert_one_impl(I, std::move(Elt));
   }
 
+  iterator insert(iterator I, const T &Elt) { return insert_one_impl(I, Elt); }
+
   iterator insert(iterator I, size_type NumToInsert, const T &Elt) {
     // Convert iterator to elt# to avoid invalidating iterator when we reserve()
     size_t InsertElt = I - this->begin();


        


More information about the llvm-commits mailing list