private void mergeWithAssignedArray(AssociativeArray sourceArray, AssociativeArray targetArray) { // Get descriptors IArrayDescriptor sourceDescriptor = Worker.Structure.GetDescriptor(sourceArray); IArrayDescriptorBuilder targetDescriptorBuilder = Worker.Structure.GetDescriptor(targetArray).Builder(Worker.Structure); // Iterate source indexes which are not present in node foreach (var item in sourceDescriptor.Indexes) { string name = item.Key; MemoryIndex index = item.Value; if (!Node.NamedChildren.ContainsKey(name)) { // Index is present in source but not in node MemoryIndex createdIndex = TargetIndex.CreateIndex(name); targetDescriptorBuilder.AddIndex(name, createdIndex); Worker.AddOperation(new UnknownIndexMayAssign(Worker, index, createdIndex, MemoryEntryCollectorNode.GetEmptyNode(Worker.Snapshot))); } } // Iterate all child nodes foreach (var item in Node.NamedChildren) { string name = item.Key; MemoryEntryCollectorNode node = item.Value; if (sourceDescriptor.ContainsIndex(name)) { // Index is present in source and node MemoryIndex createdIndex = TargetIndex.CreateIndex(name); targetDescriptorBuilder.AddIndex(name, createdIndex); Worker.AddOperation(new UnknownIndexMayAssign(Worker, sourceDescriptor.GetIndex(name), createdIndex, node)); } else { // Index is present in node but not in source MemoryIndex createdIndex = TargetIndex.CreateIndex(name); targetDescriptorBuilder.AddIndex(name, createdIndex); Worker.AddOperation(new UnknownIndexMayAssign(Worker, sourceDescriptor.UnknownIndex, createdIndex, node)); } } // Merge unknown index with unknown node (unknown index was created in array initialization - scip new array) UnknownIndexMayAssign toUnknownAssignOperation = new UnknownIndexMayAssign(Worker, sourceDescriptor.UnknownIndex, targetDescriptorBuilder.UnknownIndex, Node.AnyChild); toUnknownAssignOperation.CreateNewIndex = false; Worker.AddOperation(toUnknownAssignOperation); // Build and set modified target descriptor Worker.Structure.SetDescriptor(targetArray, targetDescriptorBuilder.Build(Worker.Structure)); }
private void mergeWithAssignedArray(AssociativeArray arrayValue) { // Get descriptors IArrayDescriptor descriptor = Worker.Structure.GetDescriptor(arrayValue); IArrayDescriptorBuilder builder = Worker.Structure.GetDescriptor(arrayValue).Builder(Worker.Structure); // Iterate source indexes which are not present in node List <string> namesToRemove = new List <string>(); foreach (var item in descriptor.Indexes) { string name = item.Key; MemoryIndex index = item.Value; if (!Node.NamedChildren.ContainsKey(name)) { // Index is present in source but not in node Worker.AddOperation(new MemoryIndexDeleteAssignOperation(Worker, index)); namesToRemove.Add(name); } } // Safely removes nodes which are no longer used (prevents changes in lazy builder) foreach (string name in namesToRemove) { builder.RemoveIndex(name); } // Iterate all child nodes foreach (var item in Node.NamedChildren) { string name = item.Key; MemoryEntryCollectorNode node = item.Value; if (descriptor.ContainsIndex(name)) { // Index is present in source and node Worker.AddOperation(new MemoryIndexMustAssignOperation(Worker, descriptor.GetIndex(name), node)); } else { // Index is present in node but not in source MemoryIndex createdIndex = TargetIndex.CreateIndex(name); builder.AddIndex(name, createdIndex); Worker.AddOperation(new UndefinedMustAssignOperation(Worker, createdIndex, node)); } } // Merge unknown index with unknown node (unknown index was created in array initialization - scip new array) Worker.AddOperation(new MemoryIndexMustAssignOperation(Worker, descriptor.UnknownIndex, Node.AnyChild)); // Build and set modified target descriptor Worker.Structure.SetDescriptor(arrayValue, builder.Build(Worker.Structure)); }