コード例 #1
0
 internal KDTreeEnumerator(KDTree <T> tree, T low, T high)
 {
     this.tree  = tree;
     this.low   = low;
     this.high  = high;
     root       = tree.root;
     comparator = tree.comparator;
     nDims      = comparator.NumberOfDimensions;
     stack      = new KDTreeNode[tree.height + 1];
     Reset();
 }
コード例 #2
0
            internal OpResult Remove(T rem, MultidimensionalComparator <T> comparator, int level)
            {
                Load();
                if (obj == rem)
                {
                    if (left == null && right == null)
                    {
                        Deallocate();
                        return(OpResult.TRUNCATE);
                    }
                    else
                    {
                        Modify();
                        obj     = comparator.CloneField(obj, level % comparator.NumberOfDimensions);
                        deleted = true;
                        return(OpResult.OK);
                    }
                }
                CompareResult diff = comparator.Compare(rem, obj, level % comparator.NumberOfDimensions);

                if (diff != CompareResult.GT && left != null)
                {
                    OpResult result = left.Remove(rem, comparator, level + 1);
                    if (result == OpResult.TRUNCATE)
                    {
                        Modify();
                        left = null;
                        return(OpResult.OK);
                    }
                    else if (result == OpResult.OK)
                    {
                        return(OpResult.OK);
                    }
                }
                if (diff != CompareResult.LT && right != null)
                {
                    OpResult result = right.Remove(rem, comparator, level + 1);
                    if (result == OpResult.TRUNCATE)
                    {
                        Modify();
                        right = null;
                        return(OpResult.OK);
                    }
                    else if (result == OpResult.OK)
                    {
                        return(OpResult.OK);
                    }
                }
                return(OpResult.NOT_FOUND);
            }
コード例 #3
0
            internal int Insert(T ins, MultidimensionalComparator <T> comparator, int level)
            {
                Load();
                CompareResult diff = comparator.Compare(ins, obj, level % comparator.NumberOfDimensions);

                if (diff == CompareResult.EQ && deleted)
                {
                    Storage.Deallocate(obj);
                    Modify();
                    obj     = ins;
                    deleted = false;
                    return(level);
                }
                else if (diff != CompareResult.GT)
                {
                    if (left == null)
                    {
                        Modify();
                        left = new KDTreeNode(Storage, ins);
                        return(level + 1);
                    }
                    else
                    {
                        return(left.Insert(ins, comparator, level + 1));
                    }
                }
                else
                {
                    if (right == null)
                    {
                        Modify();
                        right = new KDTreeNode(Storage, ins);
                        return(level + 1);
                    }
                    else
                    {
                        return(right.Insert(ins, comparator, level + 1));
                    }
                }
            }
コード例 #4
0
 internal KDTree(Storage storage, string[] fieldNames, bool treateZeroAsUndefinedValue)
     : base(storage)
 {
     this.comparator = new ReflectionMultidimensionalComparator <T>(storage, fieldNames, treateZeroAsUndefinedValue);
 }
コード例 #5
0
 internal KDTree(Storage storage, MultidimensionalComparator <T> comparator)
     : base(storage)
 {
     this.comparator = comparator;
 }