mirror of
https://github.com/Microsoft/vscode
synced 2024-09-20 02:58:15 +00:00
make TST#findSuperstr return another TST
This commit is contained in:
parent
39130b09e6
commit
d3e23ae223
|
@ -418,35 +418,33 @@ export class TernarySearchTree<E> {
|
|||
} else {
|
||||
return node.element || candidate;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
findSuperstr(key: string): E[] {
|
||||
findSuperstr(key: string): TernarySearchTree<E> {
|
||||
const segements = this._segments.reset(key);
|
||||
const bucket: E[] = [];
|
||||
this._findSuperstr(this._root, segements.next(), segements, bucket);
|
||||
return bucket.length ? bucket : undefined;
|
||||
return this._findSuperstr(this._root, segements.next(), segements);
|
||||
}
|
||||
|
||||
private _findSuperstr(node: TernarySearchTreeNode<E>, key: string, segments: IKeySegements, bucket: E[]): void {
|
||||
private _findSuperstr(node: TernarySearchTreeNode<E>, key: string, segments: IKeySegements): TernarySearchTree<E> {
|
||||
if (!node) {
|
||||
return;
|
||||
return undefined;
|
||||
} else if (node.str > key) {
|
||||
// left
|
||||
this._findSuperstr(node.left, key, segments, bucket);
|
||||
return this._findSuperstr(node.left, key, segments);
|
||||
} else if (node.str < key) {
|
||||
// right
|
||||
this._findSuperstr(node.right, key, segments, bucket);
|
||||
return this._findSuperstr(node.right, key, segments);
|
||||
} else if (segments.hasNext()) {
|
||||
// mid
|
||||
this._findSuperstr(node.mid, segments.next(), segments, bucket);
|
||||
return this._findSuperstr(node.mid, segments.next(), segments);
|
||||
} else {
|
||||
// collect
|
||||
if (node.element) {
|
||||
bucket.push(node.element);
|
||||
if (!node.mid) {
|
||||
return undefined;
|
||||
}
|
||||
this._forEach(node.mid, [], (entry) => bucket.push(entry[1]));
|
||||
|
||||
let ret = new TernarySearchTree<E>(this._segments);
|
||||
ret._root = node.mid;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -453,15 +453,16 @@ suite('Map', () => {
|
|||
map.set('/usr/foo', 4);
|
||||
|
||||
const elements = map.findSuperstr('/user');
|
||||
const [first, second, third] = elements.sort();
|
||||
|
||||
assert.equal(elements.length, 3);
|
||||
assert.equal(first, 1);
|
||||
assert.equal(second, 2);
|
||||
assert.equal(third, 3);
|
||||
assertTernarySearchTree(elements, ['foo/bar', 1], ['foo', 2], ['foo/flip/flop', 3]);
|
||||
// assert.equal(elements.length, 3);
|
||||
assert.equal(elements.get('foo/bar'), 1);
|
||||
assert.equal(elements.get('foo'), 2);
|
||||
assert.equal(elements.get('foo/flip/flop'), 3);
|
||||
|
||||
assert.deepEqual(map.findSuperstr('/usr'), [4]);
|
||||
assert.deepEqual(map.findSuperstr('/usr/foo'), [4]);
|
||||
assertTernarySearchTree(map.findSuperstr('/usr'), ['foo', 4]);
|
||||
assert.equal(map.findSuperstr('/usr/foo'), undefined);
|
||||
assert.equal(map.get('/usr/foo'), 4);
|
||||
|
||||
assert.equal(map.findSuperstr('/not'), undefined);
|
||||
assert.equal(map.findSuperstr('/us'), undefined);
|
||||
|
|
|
@ -72,8 +72,7 @@ export function toDeepIFileStat(provider: IFileSystemProvider, tuple: [URI, ISta
|
|||
}
|
||||
|
||||
return toIFileStat(provider, tuple, candidate => {
|
||||
const sub = trie.findSuperstr(candidate[0].toString());
|
||||
return !!sub;
|
||||
return Boolean(trie.findSuperstr(candidate[0].toString()) || trie.get(candidate[0].toString()));
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue