public void SetVariableValue(String varName, object val) { if(varName == null) return; Variable var; VariableMap.TryGetValue(varName, out var); if(var != null) { if(var.Value == val) return; // Variable already set to this element? if(var.Value is IGraphElement) DetachVariableFromElement(var); if(val == null) { VariableMap.Remove(varName); return; } var.Value = val; } else { if(val == null) return; var = new Variable(varName, val); VariableMap[varName] = var; } IGraphElement elem = val as IGraphElement; if(elem == null) return; LinkedList<Variable> newVarList; if(!ElementMap.TryGetValue(elem, out newVarList)) { newVarList = new LinkedList<Variable>(); ElementMap[elem] = newVarList; } newVarList.AddFirst(var); LGSPNode node = elem as LGSPNode; if(node != null) node.lgspFlags |= (uint)LGSPElemFlags.HAS_VARIABLES; else { LGSPEdge edge = (LGSPEdge)elem; edge.lgspFlags |= (uint)LGSPElemFlags.HAS_VARIABLES; } }
/// <summary> /// Detaches the specified variable from the according graph element. /// If it was the last variable pointing to the element, the variable list for the element is removed. /// This function may only called on variables pointing to graph elements. /// </summary> /// <param name="var">Variable to detach.</param> private void DetachVariableFromElement(Variable var) { IGraphElement elem = (IGraphElement)var.Value; LinkedList<Variable> oldVarList = ElementMap[elem]; oldVarList.Remove(var); if(oldVarList.Count == 0) { ElementMap.Remove(elem); LGSPNode oldNode = elem as LGSPNode; if(oldNode != null) oldNode.lgspFlags &= ~(uint)LGSPElemFlags.HAS_VARIABLES; else { LGSPEdge oldEdge = (LGSPEdge)elem; oldEdge.lgspFlags &= ~(uint)LGSPElemFlags.HAS_VARIABLES; } } }