//================================================================ /** * @packageDocumentation * @module std.experimental */ //================================================================ import { MultiTreeSet } from "../../internal/container/associative/MultiTreeSet"; import { ITreeContainer } from "../../internal/container/associative/ITreeContainer"; import { SetElementVector } from "../../internal/container/associative/SetElementVector"; import { IForwardIterator } from "../../iterator/IForwardIterator"; import { Comparator } from "../../internal/functional/Comparator"; import { Temporary } from "../../internal/functional/Temporary"; import { lower_bound, upper_bound } from "../../algorithm/binary_search"; /** * Multiple-key Set based on sorted array. * * @author Jeongho Nam - https://github.com/samchon */ export class FlatMultiSet extends MultiTreeSet< Key, FlatMultiSet, FlatMultiSet.Iterator, FlatMultiSet.ReverseIterator > { private key_comp_!: Comparator; /* --------------------------------------------------------- CONSTURCTORS --------------------------------------------------------- */ /** * Default Constructor. * * @param comp A binary function predicates *x* element would be placed before *y*. When returns `true`, then *x* precedes *y*. Note that, because *equality* is predicated by `!comp(x, y) && !comp(y, x)`, the function must not cover the *equality* like `<=` or `>=`. It must exclude the *equality* like `<` or `>`. Default is {@link less}. */ public constructor(comp?: Comparator); /** * Initializer Constructor. * * @param items Items to assign. * @param comp A binary function predicates *x* element would be placed before *y*. When returns `true`, then *x* precedes *y*. Note that, because *equality* is predicated by `!comp(x, y) && !comp(y, x)`, the function must not cover the *equality* like `<=` or `>=`. It must exclude the *equality* like `<` or `>`. Default is {@link less}. */ public constructor(items: Key[], comp?: Comparator); /** * Copy Constructor. * * @param obj Object to copy. */ public constructor(obj: FlatMultiSet); /** * Range Constructor. * * @param first Input iterator of the first position. * @param last Input iterator of the last position. * @param comp A binary function predicates *x* element would be placed before *y*. When returns `true`, then *x* precedes *y*. Note that, because *equality* is predicated by `!comp(x, y) && !comp(y, x)`, the function must not cover the *equality* like `<=` or `>=`. It must exclude the *equality* like `<` or `>`. Default is {@link less}. */ public constructor( first: Readonly>, last: Readonly>, comp?: Comparator, ); public constructor(...args: any[]) { // INITIALIZATION super((thisArg) => new SetElementVector(thisArg)); // OVERLOADINGS ITreeContainer.construct< Key, Key, FlatMultiSet, FlatMultiSet.Iterator, FlatMultiSet.ReverseIterator, Key >( this, FlatMultiSet, (comp) => { this.key_comp_ = comp; }, ...args, ); } /** * @inheritDoc */ public swap(obj: FlatMultiSet): void { // SWAP CONTENTS [this.data_, obj.data_] = [obj.data_, this.data_]; SetElementVector._Swap_associative( this.data_ as Temporary, obj.data_ as Temporary, ); // SWAP COMPARATORS [this.key_comp_, obj.key_comp_] = [obj.key_comp_, this.key_comp_]; } /* --------------------------------------------------------- ACCESSORS --------------------------------------------------------- */ /** * @inheritDoc */ public nth(index: number): FlatMultiSet.Iterator { return ( this.data_ as SetElementVector> ).nth(index); } /** * @inheritDoc */ public key_comp(): Comparator { return this.key_comp_; } /** * @inheritDoc */ public lower_bound(key: Key): FlatMultiSet.Iterator { return lower_bound(this.begin(), this.end(), key, this.value_comp()); } /** * @inheritDoc */ public upper_bound(key: Key): FlatMultiSet.Iterator { return upper_bound(this.begin(), this.end(), key, this.value_comp()); } /* --------------------------------------------------------- POST-PROCESS --------------------------------------------------------- */ protected _Handle_insert({}, {}): void {} protected _Handle_erase({}, {}): void {} } /** * */ export namespace FlatMultiSet { // HEAD export type Iterator = SetElementVector.Iterator< Key, false, FlatMultiSet >; export type ReverseIterator = SetElementVector.ReverseIterator< Key, false, FlatMultiSet >; // BODY export const Iterator = SetElementVector.Iterator; export const ReverseIterator = SetElementVector.ReverseIterator; export const __MODULE = "experimental"; }