[llvm-commits] [llvm] r158645 - in /llvm/trunk: include/llvm/ADT/SmallVector.h unittests/ADT/SmallVectorTest.cpp

Benjamin Kramer benny.kra at googlemail.com
Sun Jun 17 05:46:14 PDT 2012


Author: d0k
Date: Sun Jun 17 07:46:13 2012
New Revision: 158645

URL: http://llvm.org/viewvc/llvm-project?rev=158645&view=rev
Log:
Bring the return value of SmallVector::insert in line with std::vector::insert.

It always returns the iterator for the first inserted element, or the passed in
iterator if the inserted range was empty. Flesh out the unit test more and fix
all the cases it uncovered so far.

Modified:
    llvm/trunk/include/llvm/ADT/SmallVector.h
    llvm/trunk/unittests/ADT/SmallVectorTest.cpp

Modified: llvm/trunk/include/llvm/ADT/SmallVector.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/SmallVector.h?rev=158645&r1=158644&r2=158645&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/SmallVector.h (original)
+++ llvm/trunk/include/llvm/ADT/SmallVector.h Sun Jun 17 07:46:13 2012
@@ -540,14 +540,14 @@
   }
 
   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();
+
     if (I == this->end()) {  // Important special case for empty vector.
       append(NumToInsert, Elt);
-      return NumToInsert == 0 ? this->end() : this->end()-1;
+      return this->begin()+InsertElt;
     }
 
-    // Convert iterator to elt# to avoid invalidating iterator when we reserve()
-    size_t InsertElt = I - this->begin();
-
     // Ensure there is enough space.
     reserve(static_cast<unsigned>(this->size() + NumToInsert));
 
@@ -588,14 +588,15 @@
 
   template<typename ItTy>
   iterator insert(iterator I, ItTy From, ItTy To) {
+    // Convert iterator to elt# to avoid invalidating iterator when we reserve()
+    size_t InsertElt = I - this->begin();
+
     if (I == this->end()) {  // Important special case for empty vector.
       append(From, To);
-      return From == To ? this->end() : this->end()-1;
+      return this->begin()+InsertElt;
     }
 
     size_t NumToInsert = std::distance(From, To);
-    // Convert iterator to elt# to avoid invalidating iterator when we reserve()
-    size_t InsertElt = I - this->begin();
 
     // Ensure there is enough space.
     reserve(static_cast<unsigned>(this->size() + NumToInsert));
@@ -628,9 +629,9 @@
     this->uninitialized_copy(I, OldEnd, this->end()-NumOverwritten);
 
     // Replace the overwritten part.
-    for (; NumOverwritten > 0; --NumOverwritten) {
-      *I = *From;
-      ++I; ++From;
+    for (T *J = I; NumOverwritten > 0; --NumOverwritten) {
+      *J = *From;
+      ++J; ++From;
     }
 
     // Insert the non-overwritten middle part.

Modified: llvm/trunk/unittests/ADT/SmallVectorTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/SmallVectorTest.cpp?rev=158645&r1=158644&r2=158645&view=diff
==============================================================================
--- llvm/trunk/unittests/ADT/SmallVectorTest.cpp (original)
+++ llvm/trunk/unittests/ADT/SmallVectorTest.cpp Sun Jun 17 07:46:13 2012
@@ -342,7 +342,9 @@
   SCOPED_TRACE("InsertTest");
 
   makeSequence(theVector, 1, 3);
-  theVector.insert(theVector.begin() + 1, Constructable(77));
+  VectorType::iterator I =
+    theVector.insert(theVector.begin() + 1, Constructable(77));
+  EXPECT_EQ(theVector.begin() + 1, I);
   assertValuesInOrder(theVector, 4u, 1, 77, 2, 3);
 }
 
@@ -351,24 +353,48 @@
   SCOPED_TRACE("InsertRepeatedTest");
 
   makeSequence(theVector, 10, 15);
-  theVector.insert(theVector.begin() + 1, 2, Constructable(16));
+  VectorType::iterator I =
+    theVector.insert(theVector.begin() + 1, 2, Constructable(16));
+  EXPECT_EQ(theVector.begin() + 1, I);
   assertValuesInOrder(theVector, 8u, 10, 16, 16, 11, 12, 13, 14, 15);
 
+  // Insert at end.
+  I = theVector.insert(theVector.end(), 2, Constructable(16));
+  EXPECT_EQ(theVector.begin() + 8, I);
+  assertValuesInOrder(theVector, 10u, 10, 16, 16, 11, 12, 13, 14, 15, 16, 16);
+
+  // Empty insert.
   EXPECT_EQ(theVector.end(),
             theVector.insert(theVector.end(), 0, Constructable(42)));
+  EXPECT_EQ(theVector.begin() + 1,
+            theVector.insert(theVector.begin() + 1, 0, Constructable(42)));
 }
 
 // Insert range.
 TEST_F(SmallVectorTest, InsertRangeTest) {
-  SCOPED_TRACE("InsertRepeatedTest");
+  SCOPED_TRACE("InsertRangeTest");
+
+  Constructable Arr[3] =
+    { Constructable(77), Constructable(77), Constructable(77) };
 
   makeSequence(theVector, 1, 3);
-  theVector.insert(theVector.begin() + 1, 3, Constructable(77));
+  VectorType::iterator I =
+    theVector.insert(theVector.begin() + 1, Arr, Arr+3);
+  EXPECT_EQ(theVector.begin() + 1, I);
   assertValuesInOrder(theVector, 6u, 1, 77, 77, 77, 2, 3);
 
+  // Insert at end.
+  I = theVector.insert(theVector.end(), Arr, Arr+3);
+  EXPECT_EQ(theVector.begin() + 6, I);
+  assertValuesInOrder(theVector, 9u, 1, 77, 77, 77, 2, 3, 77, 77, 77);
+
+  // Empty insert.
   EXPECT_EQ(theVector.end(), theVector.insert(theVector.end(),
                                               theVector.begin(),
                                               theVector.begin()));
+  EXPECT_EQ(theVector.begin() + 1, theVector.insert(theVector.begin() + 1,
+                                                    theVector.begin(),
+                                                    theVector.begin()));
 }
 
 // Comparison tests.





More information about the llvm-commits mailing list