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(); }
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); }
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)); } } }
internal KDTree(Storage storage, string[] fieldNames, bool treateZeroAsUndefinedValue) : base(storage) { this.comparator = new ReflectionMultidimensionalComparator <T>(storage, fieldNames, treateZeroAsUndefinedValue); }
internal KDTree(Storage storage, MultidimensionalComparator <T> comparator) : base(storage) { this.comparator = comparator; }