123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402 |
- /**
- * @description The iterator type including `NORMAL` and `REVERSE`.
- */
- declare const enum IteratorType {
- NORMAL = 0,
- REVERSE = 1
- }
- declare abstract class ContainerIterator<T> {
- /**
- * @description The container pointed to by the iterator.
- */
- abstract readonly container: Container<T>;
- /**
- * @description Iterator's type.
- * @example
- * console.log(container.end().iteratorType === IteratorType.NORMAL); // true
- */
- readonly iteratorType: IteratorType;
- /**
- * @param iter - The other iterator you want to compare.
- * @returns Whether this equals to obj.
- * @example
- * container.find(1).equals(container.end());
- */
- equals(iter: ContainerIterator<T>): boolean;
- /**
- * @description Pointers to element.
- * @returns The value of the pointer's element.
- * @example
- * const val = container.begin().pointer;
- */
- abstract get pointer(): T;
- /**
- * @description Set pointer's value (some containers are unavailable).
- * @param newValue - The new value you want to set.
- * @example
- * (<LinkList<number>>container).begin().pointer = 1;
- */
- abstract set pointer(newValue: T);
- /**
- * @description Move `this` iterator to pre.
- * @returns The iterator's self.
- * @example
- * const iter = container.find(1); // container = [0, 1]
- * const pre = iter.pre();
- * console.log(pre === iter); // true
- * console.log(pre.equals(iter)); // true
- * console.log(pre.pointer, iter.pointer); // 0, 0
- */
- abstract pre(): this;
- /**
- * @description Move `this` iterator to next.
- * @returns The iterator's self.
- * @example
- * const iter = container.find(1); // container = [1, 2]
- * const next = iter.next();
- * console.log(next === iter); // true
- * console.log(next.equals(iter)); // true
- * console.log(next.pointer, iter.pointer); // 2, 2
- */
- abstract next(): this;
- /**
- * @description Get a copy of itself.
- * @returns The copy of self.
- * @example
- * const iter = container.find(1); // container = [1, 2]
- * const next = iter.copy().next();
- * console.log(next === iter); // false
- * console.log(next.equals(iter)); // false
- * console.log(next.pointer, iter.pointer); // 2, 1
- */
- abstract copy(): ContainerIterator<T>;
- abstract isAccessible(): boolean;
- }
- declare abstract class Base {
- /**
- * @returns The size of the container.
- * @example
- * const container = new Vector([1, 2]);
- * console.log(container.length); // 2
- */
- get length(): number;
- /**
- * @returns The size of the container.
- * @example
- * const container = new Vector([1, 2]);
- * console.log(container.size()); // 2
- */
- size(): number;
- /**
- * @returns Whether the container is empty.
- * @example
- * container.clear();
- * console.log(container.empty()); // true
- */
- empty(): boolean;
- /**
- * @description Clear the container.
- * @example
- * container.clear();
- * console.log(container.empty()); // true
- */
- abstract clear(): void;
- }
- declare abstract class Container<T> extends Base {
- /**
- * @returns Iterator pointing to the beginning element.
- * @example
- * const begin = container.begin();
- * const end = container.end();
- * for (const it = begin; !it.equals(end); it.next()) {
- * doSomething(it.pointer);
- * }
- */
- abstract begin(): ContainerIterator<T>;
- /**
- * @returns Iterator pointing to the super end like c++.
- * @example
- * const begin = container.begin();
- * const end = container.end();
- * for (const it = begin; !it.equals(end); it.next()) {
- * doSomething(it.pointer);
- * }
- */
- abstract end(): ContainerIterator<T>;
- /**
- * @returns Iterator pointing to the end element.
- * @example
- * const rBegin = container.rBegin();
- * const rEnd = container.rEnd();
- * for (const it = rBegin; !it.equals(rEnd); it.next()) {
- * doSomething(it.pointer);
- * }
- */
- abstract rBegin(): ContainerIterator<T>;
- /**
- * @returns Iterator pointing to the super begin like c++.
- * @example
- * const rBegin = container.rBegin();
- * const rEnd = container.rEnd();
- * for (const it = rBegin; !it.equals(rEnd); it.next()) {
- * doSomething(it.pointer);
- * }
- */
- abstract rEnd(): ContainerIterator<T>;
- /**
- * @returns The first element of the container.
- */
- abstract front(): T | undefined;
- /**
- * @returns The last element of the container.
- */
- abstract back(): T | undefined;
- /**
- * @param element - The element you want to find.
- * @returns An iterator pointing to the element if found, or super end if not found.
- * @example
- * container.find(1).equals(container.end());
- */
- abstract find(element: T): ContainerIterator<T>;
- /**
- * @description Iterate over all elements in the container.
- * @param callback - Callback function like Array.forEach.
- * @example
- * container.forEach((element, index) => console.log(element, index));
- */
- abstract forEach(callback: (element: T, index: number, container: Container<T>) => void): void;
- /**
- * @description Gets the value of the element at the specified position.
- * @example
- * const val = container.getElementByPos(-1); // throw a RangeError
- */
- abstract getElementByPos(pos: number): T;
- /**
- * @description Removes the element at the specified position.
- * @param pos - The element's position you want to remove.
- * @returns The container length after erasing.
- * @example
- * container.eraseElementByPos(-1); // throw a RangeError
- */
- abstract eraseElementByPos(pos: number): number;
- /**
- * @description Removes element by iterator and move `iter` to next.
- * @param iter - The iterator you want to erase.
- * @returns The next iterator.
- * @example
- * container.eraseElementByIterator(container.begin());
- * container.eraseElementByIterator(container.end()); // throw a RangeError
- */
- abstract eraseElementByIterator(iter: ContainerIterator<T>): ContainerIterator<T>;
- /**
- * @description Using for `for...of` syntax like Array.
- * @example
- * for (const element of container) {
- * console.log(element);
- * }
- */
- abstract [Symbol.iterator](): Generator<T, void>;
- }
- /**
- * @description The initial data type passed in when initializing the container.
- */
- type initContainer<T> = {
- size?: number | (() => number);
- length?: number;
- forEach: (callback: (el: T) => void) => void;
- };
- declare abstract class TreeIterator<K, V> extends ContainerIterator<K | [
- K,
- V
- ]> {
- abstract readonly container: TreeContainer<K, V>;
- /**
- * @description Get the sequential index of the iterator in the tree container.<br/>
- * <strong>Note:</strong>
- * This function only takes effect when the specified tree container `enableIndex = true`.
- * @returns The index subscript of the node in the tree.
- * @example
- * const st = new OrderedSet([1, 2, 3], true);
- * console.log(st.begin().next().index); // 1
- */
- get index(): number;
- isAccessible(): boolean;
- // @ts-ignore
- pre(): this;
- // @ts-ignore
- next(): this;
- }
- declare const enum TreeNodeColor {
- RED = 1,
- BLACK = 0
- }
- declare class TreeNode<K, V> {
- _color: TreeNodeColor;
- _key: K | undefined;
- _value: V | undefined;
- _left: TreeNode<K, V> | undefined;
- _right: TreeNode<K, V> | undefined;
- _parent: TreeNode<K, V> | undefined;
- constructor(key?: K, value?: V, color?: TreeNodeColor);
- /**
- * @description Get the pre node.
- * @returns TreeNode about the pre node.
- */
- _pre(): TreeNode<K, V>;
- /**
- * @description Get the next node.
- * @returns TreeNode about the next node.
- */
- _next(): TreeNode<K, V>;
- /**
- * @description Rotate left.
- * @returns TreeNode about moved to original position after rotation.
- */
- _rotateLeft(): TreeNode<K, V>;
- /**
- * @description Rotate right.
- * @returns TreeNode about moved to original position after rotation.
- */
- _rotateRight(): TreeNode<K, V>;
- }
- declare abstract class TreeContainer<K, V> extends Container<K | [
- K,
- V
- ]> {
- enableIndex: boolean;
- protected _inOrderTraversal(): TreeNode<K, V>[];
- protected _inOrderTraversal(pos: number): TreeNode<K, V>;
- protected _inOrderTraversal(callback: (node: TreeNode<K, V>, index: number, map: this) => void): TreeNode<K, V>;
- clear(): void;
- /**
- * @description Update node's key by iterator.
- * @param iter - The iterator you want to change.
- * @param key - The key you want to update.
- * @returns Whether the modification is successful.
- * @example
- * const st = new orderedSet([1, 2, 5]);
- * const iter = st.find(2);
- * st.updateKeyByIterator(iter, 3); // then st will become [1, 3, 5]
- */
- updateKeyByIterator(iter: TreeIterator<K, V>, key: K): boolean;
- eraseElementByPos(pos: number): number;
- /**
- * @description Remove the element of the specified key.
- * @param key - The key you want to remove.
- * @returns Whether erase successfully.
- */
- eraseElementByKey(key: K): boolean;
- eraseElementByIterator(iter: TreeIterator<K, V>): TreeIterator<K, V>;
- /**
- * @description Get the height of the tree.
- * @returns Number about the height of the RB-tree.
- */
- getHeight(): number;
- /**
- * @param key - The given key you want to compare.
- * @returns An iterator to the first element less than the given key.
- */
- abstract reverseUpperBound(key: K): TreeIterator<K, V>;
- /**
- * @description Union the other tree to self.
- * @param other - The other tree container you want to merge.
- * @returns The size of the tree after union.
- */
- abstract union(other: TreeContainer<K, V>): number;
- /**
- * @param key - The given key you want to compare.
- * @returns An iterator to the first element not greater than the given key.
- */
- abstract reverseLowerBound(key: K): TreeIterator<K, V>;
- /**
- * @param key - The given key you want to compare.
- * @returns An iterator to the first element not less than the given key.
- */
- abstract lowerBound(key: K): TreeIterator<K, V>;
- /**
- * @param key - The given key you want to compare.
- * @returns An iterator to the first element greater than the given key.
- */
- abstract upperBound(key: K): TreeIterator<K, V>;
- }
- declare class OrderedMapIterator<K, V> extends TreeIterator<K, V> {
- container: OrderedMap<K, V>;
- constructor(node: TreeNode<K, V>, header: TreeNode<K, V>, container: OrderedMap<K, V>, iteratorType?: IteratorType);
- get pointer(): [
- K,
- V
- ];
- copy(): OrderedMapIterator<K, V>;
- // @ts-ignore
- equals(iter: OrderedMapIterator<K, V>): boolean;
- }
- declare class OrderedMap<K, V> extends TreeContainer<K, V> {
- /**
- * @param container - The initialization container.
- * @param cmp - The compare function.
- * @param enableIndex - Whether to enable iterator indexing function.
- * @example
- * new OrderedMap();
- * new OrderedMap([[0, 1], [2, 1]]);
- * new OrderedMap([[0, 1], [2, 1]], (x, y) => x - y);
- * new OrderedMap([[0, 1], [2, 1]], (x, y) => x - y, true);
- */
- constructor(container?: initContainer<[
- K,
- V
- ]>, cmp?: (x: K, y: K) => number, enableIndex?: boolean);
- begin(): OrderedMapIterator<K, V>;
- end(): OrderedMapIterator<K, V>;
- rBegin(): OrderedMapIterator<K, V>;
- rEnd(): OrderedMapIterator<K, V>;
- front(): [
- K,
- V
- ] | undefined;
- back(): [
- K,
- V
- ] | undefined;
- lowerBound(key: K): OrderedMapIterator<K, V>;
- upperBound(key: K): OrderedMapIterator<K, V>;
- reverseLowerBound(key: K): OrderedMapIterator<K, V>;
- reverseUpperBound(key: K): OrderedMapIterator<K, V>;
- forEach(callback: (element: [
- K,
- V
- ], index: number, map: OrderedMap<K, V>) => void): void;
- /**
- * @description Insert a key-value pair or set value by the given key.
- * @param key - The key want to insert.
- * @param value - The value want to set.
- * @param hint - You can give an iterator hint to improve insertion efficiency.
- * @return The size of container after setting.
- * @example
- * const mp = new OrderedMap([[2, 0], [4, 0], [5, 0]]);
- * const iter = mp.begin();
- * mp.setElement(1, 0);
- * mp.setElement(3, 0, iter); // give a hint will be faster.
- */
- setElement(key: K, value: V, hint?: OrderedMapIterator<K, V>): number;
- getElementByPos(pos: number): [
- K,
- V
- ];
- find(key: K): OrderedMapIterator<K, V>;
- /**
- * @description Get the value of the element of the specified key.
- * @param key - The specified key you want to get.
- * @example
- * const val = container.getElementByKey(1);
- */
- getElementByKey(key: K): V | undefined;
- union(other: OrderedMap<K, V>): number;
- [Symbol.iterator](): Generator<[
- K,
- V
- ], void, unknown>;
- // @ts-ignore
- eraseElementByIterator(iter: OrderedMapIterator<K, V>): OrderedMapIterator<K, V>;
- }
- export { OrderedMap };
- export type { OrderedMapIterator, IteratorType, Container, ContainerIterator, TreeContainer };
|