[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