void remove(ValueSubclass *D); // Defined in ValueHolderImpl.h
ValueSubclass *pop_back(); // Defined in ValueHolderImpl.h
+ // replaceWith - This removes the element pointed to by 'Where', and inserts
+ // NewValue in it's place. The old value is returned. 'Where' must be a
+ // valid iterator!
+ //
+ ValueSubclass *replaceWith(iterator &Where, ValueSubclass *NewValue);
+
// delete_span - Remove the elements from begin to end, deleting them as we
// go. This leaves the iterator pointing to the element that used to be end.
//
ValueSubclass *ValueHolder<ValueSubclass,ItemParentType,SymTabType>
::remove(const iterator &DI) {
assert(DI != ValueList.end() &&
- "Trying to remove the end of the def list!!!");
+ "Trying to remove the end of the value holder list!!!");
ValueSubclass *i = *DI;
ValueList.erase(DI);
return i;
}
+template<class ValueSubclass, class ItemParentType, class SymTabType>
+ValueSubclass *ValueHolder<ValueSubclass,ItemParentType,SymTabType>
+::replaceWith(iterator &DI, ValueSubclass *NewVal) {
+ assert(DI != ValueList.end() &&
+ "Trying to replace the end of the value holder list!!!");
+
+ // Remove the value from the current container...
+ ValueSubclass *Ret = *DI;
+ Ret->setParent(0); // I don't own you anymore... byebye...
+
+ // You don't get to be in the symbol table anymore... byebye
+ if (Ret->hasName() && Parent)
+ Parent->getSymbolTable()->remove(Ret);
+
+ // Insert the new value into the container...
+ assert(NewVal->getParent() == 0 && "Value already has parent!");
+ NewVal->setParent(ItemParent);
+
+ *DI = NewVal;
+ if (NewVal->hasName() && Parent)
+ Parent->getSymbolTableSure()->insert(NewVal);
+
+ return Ret;
+}
+
+
template<class ValueSubclass, class ItemParentType, class SymTabType>
void ValueHolder<ValueSubclass,ItemParentType,SymTabType>
::push_front(ValueSubclass *Inst) {