Exemple #1
0
            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);
            }
Exemple #3
0
            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);
            }
Exemple #4
0
            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]);
                }
            }
Exemple #6
0
 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);
            }
Exemple #9
0
 public ScatteredSegmentPicker(ISegmentContainer <TSegmentID, TVal> container, bool fromSmallToBig)
 {
     this.segmentContainer   = container;
     this.pickFromSmallToBig = fromSmallToBig;
 }
Exemple #10
0
        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);
        }