Make the range insert operation return an iterator, even though the STL
authorChris Lattner <sabre@nondot.org>
Mon, 29 Apr 2002 21:23:30 +0000 (21:23 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 29 Apr 2002 21:23:30 +0000 (21:23 +0000)
range insert doesn't

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2413 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ValueHolder.h
lib/VMCore/ValueHolderImpl.h

index af08212b01593c9d45022d3dec5a1dbde24f9561..a69c7b60717485d15b7b2f8a13e7c806383cab8f 100644 (file)
@@ -118,14 +118,14 @@ public:
   iterator insert(iterator Pos, ValueSubclass *Inst);
 
   // ValueHolder::insert - This method inserts the specified _range_ of values
-  // before the 'Pos' iterator.  This currently only works for vector
-  // iterators...
+  // before the 'Pos' iterator, returning a new iterator that points to the
+  // first item inserted.  *This currently only works for vector iterators...*
   //
   // FIXME: This is not generic so that the code does not have to be around
   // to be used... is this ok?
   //
-  void insert(iterator Pos,                     // Where to insert
-              iterator First, iterator Last);   // Vector to read insts from
+  iterator insert(iterator Pos,                     // Where to insert
+                  iterator First, iterator Last);   // Vector to read insts from
 };
 
 #endif
index cbc3e5f55886dc6f54feeaf16a1e206787708d16..3eb7e754569a106247de90a68378844a752bac70 100644 (file)
@@ -172,12 +172,18 @@ ValueHolder<ValueSubclass,ItemParentType,SymTabType>
 // to be used... is this ok?
 //
 template<class ValueSubclass, class ItemParentType, class SymTabType>
-void ValueHolder<ValueSubclass,ItemParentType,SymTabType>
-::insert(iterator Pos,                     // Where to insert
+ValueHolder<ValueSubclass,ItemParentType,SymTabType>::iterator
+ValueHolder<ValueSubclass,ItemParentType,SymTabType>
+::insert(iterator Pos,                      // Where to insert
          iterator First, iterator Last) {   // Vector to read insts from
 
+  // Since the vector range insert operation doesn't return an updated iterator,
+  // we have to convert the iterator to and index and back to assure that it
+  // cannot get invalidated.  Gross hack, but effective.
+  //
+  unsigned Offset = Pos-begin();
+
   // Check to make sure that the values are not already in some valueholder...
-  
   for (iterator X = First; X != Last; ++X) {
     assert((*X)->getParent() == 0 &&
            "Cannot insert into valueholder, value already has a parent!");
@@ -192,6 +198,8 @@ void ValueHolder<ValueSubclass,ItemParentType,SymTabType>
     for (;First != Last; ++First)
       if ((*First)->hasName())
         Parent->getSymbolTableSure()->insert(*First);
+
+  return begin()+Offset;
 }
 
 #endif