public AlternatingLayer Clone() { var clonedLayer = new AlternatingLayer(); foreach (var item in this) { var cloneableItem = item as ICloneable; if (cloneableItem != null) { clonedLayer.Add(cloneableItem.Clone() as IData); } else { clonedLayer.Add(item); } } return(clonedLayer); }
private static AlternatingLayer InitialOrderingOfNextLayer( [NotNull, ItemNotNull] AlternatingLayer alternatingLayer, [NotNull, ItemNotNull] IEnumerable <SugiVertex> nextLayer, bool straightSweep) { Debug.Assert(alternatingLayer != null); Debug.Assert(nextLayer != null); // Get the list of the containers and vertices var segmentContainerStack = new Stack <ISegmentContainer>(alternatingLayer.OfType <ISegmentContainer>().Reverse()); VertexTypes ignorableVertexType = straightSweep ? VertexTypes.QVertex : VertexTypes.PVertex; var vertexStack = new Stack <SugiVertex>( nextLayer .Where(v => v.Type != ignorableVertexType) .OrderBy(v => v.MeasuredPosition) .Reverse()); var newAlternatingLayer = new AlternatingLayer(); while (vertexStack.Count > 0 && segmentContainerStack.Count > 0) { SugiVertex vertex = vertexStack.Peek(); ISegmentContainer segmentContainer = segmentContainerStack.Peek(); if (vertex.MeasuredPosition <= segmentContainer.Position) { newAlternatingLayer.Add(vertexStack.Pop()); } else if (vertex.MeasuredPosition >= segmentContainer.Position + segmentContainer.Count - 1) { newAlternatingLayer.Add(segmentContainerStack.Pop()); } else { vertexStack.Pop(); segmentContainerStack.Pop(); int k = (int)Math.Ceiling(vertex.MeasuredPosition - segmentContainer.Position); segmentContainer.Split(k, out ISegmentContainer container1, out ISegmentContainer container2); newAlternatingLayer.Add(container1); newAlternatingLayer.Add(vertex); container2.Position = segmentContainer.Position + k; segmentContainerStack.Push(container2); } } if (vertexStack.Count > 0) { newAlternatingLayer.AddRange( vertexStack #if !SUPPORTS_ENUMERABLE_COVARIANT .OfType <IData>() #endif ); } if (segmentContainerStack.Count > 0) { newAlternatingLayer.AddRange( segmentContainerStack #if !SUPPORTS_ENUMERABLE_COVARIANT .OfType <IData>() #endif ); } return(newAlternatingLayer); }