/// <summary> /// Merges the arrays into the target index and clear inner collection. /// </summary> /// <param name="targetSnapshot">The target snapshot.</param> /// <param name="targetIndex">Index of the target.</param> /// <param name="operation">The operation.</param> public void MergeArraysAndClear(Snapshot targetSnapshot, MemoryIndex targetIndex, MergeOperation operation) { if (hasArray) { if (targetArray == null) { targetArray = targetSnapshot.CreateArray(); } IArrayDescriptor targetArrayDescriptor; if (!writeableTargetStructure.TryGetDescriptor(targetArray, out targetArrayDescriptor)) { // Target does not contain array - create and add new in target snapshot targetArrayDescriptor = worker.Factories.StructuralContainersFactories.ArrayDescriptorFactory.CreateArrayDescriptor(writeableTargetStructure, targetArray, targetIndex); writeableTargetStructure.SetDescriptor(targetArray, targetArrayDescriptor); writeableTargetStructure.NewIndex(targetArrayDescriptor.UnknownIndex); writeableTargetStructure.SetArray(targetIndex, targetArray); } // Create context and merge descriptors var arrayContext = new ArrayTargetContainerContext(writeableTargetStructure, targetArrayDescriptor); worker.CreateAndEnqueueOperations(arrayContext, operation.TreeNode, sourceArrays, arrayAlwaysDefined && !operation.IsUndefined); // Update current descriptor when changed IArrayDescriptor currentDescriptor = arrayContext.getCurrentDescriptor(); if (currentDescriptor != targetArrayDescriptor) { writeableTargetStructure.SetDescriptor(targetArray, currentDescriptor); } sourceArrays.Clear(); hasArray = false; targetArray = null; } else if (targetArray != null) { worker.DeleteArray(targetIndex, targetArray); targetArray = null; } arrayAlwaysDefined = true; }