예제 #1
0
        private static void DeleteColumn <T>(DimensionLink <T> head)
        {
            var toSrink = head.Upper;

            // make sure we are not removing edge column
            if (toSrink != null && toSrink.Prev != null && toSrink.Next != null)
            {
                ShrinkColumn(toSrink);
            }
            head.AssignUpper(null);
            head.DimPoint.TailLink = head.DimPoint.HeadLink;
        }
예제 #2
0
        bool ISpaceManager.TryExtendUp <T>(DimensionLink <T> toExtendUp, out DimensionLink <T> nextUpExtension)
        {
            nextUpExtension = null;
            if (toExtendUp == null ||            // nothing to extend
                toExtendUp.Upper != null ||      // alrady extended
                toExtendUp.Next == null ||       // cannot extend up right edge
                toExtendUp.Prev == null ||       // cannot extend up left edge
                toExtendUp.Next.Upper != null || // no need to extend up if neighbours are extended up
                toExtendUp.Prev.Upper != null)
            {
                return(false);
            }

            var leftCorner  = toExtendUp.PrevUntil((n, i) => n.Upper != null);
            var rightCorner = toExtendUp.NextUntil((n, i) => n.Upper != null);

            if (leftCorner == null || rightCorner == null)
            {
                return(false);
            }

            var left  = leftCorner.Upper;
            var right = rightCorner.Upper;

            var upper = new DimensionLink <T>((byte)(toExtendUp.Level + 1));

            toExtendUp.AssignUpper(upper);
            left.AssignNext(upper);
            upper.AssignNext(right);

            toExtendUp.DimPoint.TailLink = upper;

            nextUpExtension = upper.GetSiblingExtensionCandidate();

            return(true);
        }
예제 #3
0
        private bool PopulateDimension <T>(Dimension <T> dimension, List <SpacePointSource <T> > points)
        {
            if (points.Count == 0)
            {
                return(false);
            }

            points.Sort(new SpacePointComparer <T>(dimension.Index));
            //points.Sort((a, b) => a.InitialPositions[dimension.Index].CompareTo(b.InitialPositions[dimension.Index]));

            DimensionPoint <T> head = null;
            DimensionPoint <T> curr = null;
            DimensionPoint <T> prev = null;

            for (var i = 0; i < points.Count; ++i)
            {
                var sp = points[i];
                if (sp == null)
                {
                    continue;
                }
                var position = sp.InitialPositions[dimension.Index];
                if (prev != null)
                {
                    if (dimension.Eq(prev.Position, position))
                    {
                        prev.AddPoint(sp);
                        continue;
                    }
                }
                curr = new DimensionPoint <T>(dimension)
                {
                    Position = position
                };
                curr.HeadLink = new DimensionLink <T>(0, curr);
                curr.TailLink = curr.HeadLink;
                curr.AddPoint(sp);

                if (prev != null)
                {
                    prev.HeadLink.AssignNext(curr.HeadLink);
                }
                else
                {
                    head = curr;
                }
                prev = curr;
            }

            dimension.HeadDimPoint = head;
            dimension.TailDimPoint = curr;
            dimension.Count       += points.Count;

            // ReSharper disable PossibleNullReferenceException
            DimensionLink <T> link = dimension.HeadDimPoint.HeadLink;

            // ReSharper restore PossibleNullReferenceException

            // if this is the top level
            if (link.Next == null || link.Next.Next == null)
            {
                return(true);
            }

            DimensionLink <T> prevUpper  = null;
            DimensionLink <T> firstUpper = null;

            while (link != null)
            {
                var upper = new DimensionLink <T>((byte)(link.Level + 1));
                if (firstUpper == null)
                {
                    firstUpper = upper;
                }
                link.AssignUpper(upper);
                link.DimPoint.TailLink = upper;
                if (prevUpper != null)
                {
                    prevUpper.AssignNext(upper);
                }
                // if this is the end
                if (link.Next == null)
                {
                    link       = firstUpper;
                    firstUpper = null;
                    prevUpper  = null;
                    // if this is the top level
                    if (link.Next == null || link.Next.Next == null)
                    {
                        return(true);
                    }
                    continue;
                }
                link = link.Next.Next;
                // the next is the end and it is two links away
                if (link.Next != null && link.Next.Next == null)
                {
                    link = link.Next;
                }
                prevUpper = upper;
            }
            return(true);
        }