public void LessOrEqual(RbKey key, out int count, out error err) { count = 0; err = null; if (key == null) { err = ErrorDef.ArgumentNilError("key"); return; } RbTree tree; this.checkStateAndGetTree(out tree, out err); if (err != null) { return; } try { this.walkLessOrEqual(tree.root, key); count = this.CurrentCount(); } finally { Interlocked.CompareExchange(ref this.state, (long)IterationState.iteratorReady, (long)IterationState.iteratorWalking); } }
public void Between(RbKey loKey, RbKey hiKey, out int count, out error err) { count = 0; err = null; if (loKey == null) { err = ErrorDef.ArgumentNilError("loKey"); return; } if (hiKey == null) { err = ErrorDef.ArgumentNilError("hiKey"); return; } RbTree tree; this.checkStateAndGetTree(out tree, out err); if (err != null) { return; } try { var cmp = loKey.ComparedTo(hiKey); switch (cmp) { case KeyComparison.KeysAreEqual: var node = tree.find(loKey); if (node != null) { count = 1; this.callback(this, node.key, node.value); return; } return; case KeyComparison.KeyIsGreater: var tmp = loKey; loKey = hiKey; hiKey = tmp; break; } this.walkBetween(tree.root, loKey, hiKey); count = this.CurrentCount(); } finally { Interlocked.CompareExchange(ref this.state, (long)IterationState.iteratorReady, (long)IterationState.iteratorWalking); } }
// NewRbIterator creates a new iterator for the given RbTree public RbIterator NewRbIterator(RbIterationCallback callback, out error err) { err = null; if (callback == null) { err = ErrorDef.ArgumentNilError("callback"); return(null); } return(new rbIterationContext { tree = this, callback = callback, state = (long)IterationState.iteratorReady, }); }