Changes in directory llvm/include/llvm/ADT:
SmallVector.h updated: 1.21 -> 1.22 --- Log message: add a new form of insert. --- Diffs of the changes: (+48 -1) SmallVector.h | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 48 insertions(+), 1 deletion(-) Index: llvm/include/llvm/ADT/SmallVector.h diff -u llvm/include/llvm/ADT/SmallVector.h:1.21 llvm/include/llvm/ADT/SmallVector.h:1.22 --- llvm/include/llvm/ADT/SmallVector.h:1.21 Sun Oct 29 21:39:20 2006 +++ llvm/include/llvm/ADT/SmallVector.h Sun Oct 29 23:07:51 2006 @@ -207,6 +207,54 @@ goto Retry; } + template<typename ItTy> + iterator insert(iterator I, ItTy From, ItTy To) { + if (I == End) { // Important special case for empty vector. + append(From, To); + return end()-1; + } + + unsigned NumToInsert = std::distance(From, To); + // Convert iterator to elt# to avoid invalidating iterator when we reserve() + unsigned InsertElt = I-begin(); + + // Ensure there is enough space. + reserve(size() + NumToInsert); + + // Uninvalidate the iterator. + I = begin()+InsertElt; + + // If we already have this many elements in the collection, append the + // dest elements at the end, then copy over the appropriate elements. Since + // we already reserved space, we know that this won't reallocate the vector. + if (size() >= NumToInsert) { + T *OldEnd = End; + append(End-NumToInsert, End); + + // Copy the existing elements that get replaced. + std::copy(I, OldEnd-NumToInsert, I+NumToInsert); + + std::copy(From, To, I); + return I; + } + + // Otherwise, we're inserting more elements than exist already, and we're + // not inserting at the end. + + // Copy over the elements that we're about to overwrite. + T *OldEnd = End; + End += NumToInsert; + unsigned NumOverwritten = OldEnd-I; + std::uninitialized_copy(I, OldEnd, End-NumOverwritten); + + // Replace the overwritten part. + std::copy(From, From+NumOverwritten, I); + + // Insert the non-overwritten middle part. + std::uninitialized_copy(From+NumOverwritten, To, OldEnd); + return I; + } + const SmallVectorImpl &operator=(const SmallVectorImpl &RHS); private: @@ -224,7 +272,6 @@ for (; S != E; ++S) new (S) T(Elt); } - void destroy_range(T *S, T *E) { while (S != E) { _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits