public void Split(int k, out ISegmentContainer sc1, out ISegmentContainer sc2) { //Contract.Requires(k < Count); //Contract.Ensures(sc1 != null); //Contract.Ensures(sc2 != null); Split(k, out sc1, out sc2, true); }
/// <inheritdoc /> public void Split(Segment segment, out ISegmentContainer container1, out ISegmentContainer container2) { Debug.Assert(segment != null); int index = IndexOf(segment); Split(index, out container1, out container2, false); }
public void Split(Segment s, out ISegmentContainer sc1, out ISegmentContainer sc2) { //Contract.Requires(Contains(s)); //Contract.Ensures(sc1 != null); //Contract.Ensures(sc2 != null); int index = IndexOf(s); Split(index, out sc1, out sc2, false); }
protected void Split(int k, out ISegmentContainer sc1, out ISegmentContainer sc2, bool keep) { //Contract.Requires(k < Count); //Contract.Ensures(sc1 != null); //Contract.Ensures(sc2 != null); int sc1Count = k + (keep ? 1 : 0); int sc2Count = Count - k - 1; sc1 = new SegmentContainer(sc1Count); sc2 = new SegmentContainer(sc2Count); for (int i = 0; i < sc1Count; i++) { sc1.Append(this[i]); } for (int i = k + 1; i < Count; i++) { sc2.Append(this[i]); } }
/// <summary> /// Splits this container at position <paramref name="k"/>. The first <paramref name="k"/> /// elements of the container are stored in <paramref name="container1"/> and the remainder /// in <paramref name="container2"/>. /// </summary> /// <param name="k">The index where the container should be split.</param> /// <param name="container1">The container which contains the elements before <paramref name="k"/>.</param> /// <param name="container2">The container which contains the elements after <paramref name="k"/>.</param> /// <param name="keep">Indicates if <paramref name="k"/>th item should be kept in <paramref name="container1"/> or not.</param> protected void Split( int k, [NotNull] out ISegmentContainer container1, [NotNull] out ISegmentContainer container2, bool keep) { Debug.Assert(k < Count); int container1Count = k + (keep ? 1 : 0); int container2Count = Count - k - 1; container1 = new SegmentContainer(container1Count); container2 = new SegmentContainer(container2Count); for (int i = 0; i < container1Count; ++i) { container1.Append(this[i]); } for (int i = k + 1; i < Count; ++i) { container2.Append(this[i]); } }
public void Join(ISegmentContainer sc) { AddRange(sc); }
/// <inheritdoc /> public void Split(int k, out ISegmentContainer container1, out ISegmentContainer container2) { Split(k, out container1, out container2, true); }
/// <inheritdoc /> public void Join(ISegmentContainer container) { Debug.Assert(container != null); AddRange(container); }
public ScatteredSegmentPicker(ISegmentContainer <TSegmentID, TVal> container, bool fromSmallToBig) { this.segmentContainer = container; this.pickFromSmallToBig = fromSmallToBig; }
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); }