//================================================================ /** * @packageDocumentation * @module std.internal */ //================================================================ import { SetTree } from "./SetTree"; import { XTreeNode } from "./XTreeNode"; import { UniqueTreeSet } from "../container/associative/UniqueTreeSet"; import { SetElementList } from "../container/associative/SetElementList"; import { Comparator } from "../functional/Comparator"; export class UniqueSetTree< Key, Source extends UniqueTreeSet< Key, Source, SetElementList.Iterator, SetElementList.ReverseIterator >, > extends SetTree { /* --------------------------------------------------------- CONSTRUCTOR --------------------------------------------------------- */ public constructor(source: Source, comp: Comparator) { super(source, comp, (x, y) => comp(x.value, y.value)); } /* --------------------------------------------------------- FINDERS --------------------------------------------------------- */ public nearest_by_key( val: Key, ): XTreeNode> | null { // NEED NOT TO ITERATE if (this.root_ === null) return null; //---- // ITERATE //---- let ret: XTreeNode> | null = this.root_; while (true) { // UNTIL MEET THE MATCHED VALUE OR FINAL BRANCH const it: SetElementList.Iterator = ret.value; let my_node: XTreeNode< SetElementList.Iterator > | null = null; // COMPARE if (this.key_comp()(val, it.value)) my_node = ret.left; else if (this.key_comp()(it.value, val)) my_node = ret.right; else return ret; // MATCHED VALUE // FINAL BRANCH? OR KEEP GOING if (my_node === null) break; else ret = my_node; } return ret; // DIFFERENT NODE } public upper_bound(val: Key): SetElementList.Iterator { //-------- // FIND MATCHED NODE //-------- const node: XTreeNode< SetElementList.Iterator > | null = this.nearest_by_key(val); if (node === null) return this.source().end(); //-------- // RETURN BRANCH //-------- const it: SetElementList.Iterator = node.value; // MUST BE it.value > key if (this.key_comp()(val, it.value)) return it; else return it.next(); } }