/// <summary> /// Copy constructor helper. /// </summary> /// <param name="dataSource">The LGSPGraph object to get the data from</param> /// <param name="newName">Name of the copied graph.</param> /// <param name="oldToNewMap">A map of the old elements to the new elements after cloning, /// just forget about it if you don't need it.</param> private void Copy(LGSPGraph dataSource, String newName, out IDictionary<IGraphElement, IGraphElement> oldToNewMap) { model = dataSource.model; name = newName; InitializeGraph(); model.CreateAndBindIndexSet(this); if(dataSource.backend != null) { backend = dataSource.backend; modelAssemblyName = dataSource.modelAssemblyName; } oldToNewMap = new Dictionary<IGraphElement, IGraphElement>(); for(int i = 0; i < dataSource.nodesByTypeHeads.Length; i++) { for(LGSPNode head = dataSource.nodesByTypeHeads[i], node = head.lgspTypePrev; node != head; node = node.lgspTypePrev) { LGSPNode newNode = (LGSPNode) node.Clone(); AddNodeWithoutEvents(newNode, node.lgspType.TypeID); oldToNewMap[node] = newNode; } } for(int i = 0; i < dataSource.edgesByTypeHeads.Length; i++) { for(LGSPEdge head = dataSource.edgesByTypeHeads[i], edge = head.lgspTypePrev; edge != head; edge = edge.lgspTypePrev) { LGSPEdge newEdge = (LGSPEdge) edge.Clone((INode) oldToNewMap[edge.lgspSource], (INode) oldToNewMap[edge.lgspTarget]); AddEdgeWithoutEvents(newEdge, newEdge.lgspType.TypeID); oldToNewMap[edge] = newEdge; } } /* TODO: remove when cloning of graph variables was implemented * foreach(KeyValuePair<IGraphElement, LinkedList<Variable>> kvp in dataSource.ElementMap) { IGraphElement newElem = oldToNewMap[kvp.Key]; foreach(Variable var in kvp.Value) SetVariableValue(var.Name, newElem); }*/ model.FillIndexSetAsClone(this, dataSource, oldToNewMap); statistics = new LGSPGraphStatistics(this.Model); statistics.Copy(dataSource); }