ADT: Avoid using SmallVector::set_size() in SmallString
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Wed, 8 Dec 2021 01:22:29 +0000 (17:22 -0800)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Wed, 12 Jan 2022 01:33:13 +0000 (17:33 -0800)
Update `SmallString::append()` to use `resize_for_overwrite()` instead
of `reserve()` followed by `set_size()`.

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

llvm/include/llvm/ADT/SmallString.h

index 56b0639..81243af 100644 (file)
@@ -70,16 +70,16 @@ public:
 
   /// Append from a list of StringRefs.
   void append(std::initializer_list<StringRef> Refs) {
-    size_t SizeNeeded = this->size();
+    size_t CurrentSize = this->size();
+    size_t SizeNeeded = CurrentSize;
     for (const StringRef &Ref : Refs)
       SizeNeeded += Ref.size();
-    this->reserve(SizeNeeded);
-    auto CurEnd = this->end();
+    this->resize_for_overwrite(SizeNeeded);
     for (const StringRef &Ref : Refs) {
-      this->uninitialized_copy(Ref.begin(), Ref.end(), CurEnd);
-      CurEnd += Ref.size();
+      std::copy(Ref.begin(), Ref.end(), this->begin() + CurrentSize);
+      CurrentSize += Ref.size();
     }
-    this->set_size(SizeNeeded);
+    assert(CurrentSize == this->size());
   }
 
   /// @}