//================================================================ /** * @packageDocumentation * @module std */ //================================================================ import { IArrayContainer } from "../base/container/IArrayContainer"; import { VectorContainer } from "../internal/container/linear/VectorContainer"; import { ArrayIterator } from "../internal/iterator/ArrayIterator"; import { ArrayReverseIterator } from "../internal/iterator/ArrayReverseIterator"; import { IForwardIterator } from "../iterator/IForwardIterator"; /** * Vector, an array with variable capacity. * * @author Jeongho Nam - https://github.com/samchon */ export class Vector extends VectorContainer< T, Vector, Vector, Vector.Iterator, Vector.ReverseIterator > implements IArrayContainer< T, Vector, Vector.Iterator, Vector.ReverseIterator > { /* --------------------------------------------------------- CONSTURCTORS --------------------------------------------------------- */ /** * Default Constructor. */ public constructor(); /** * Initializer Constructor. * * @param items Items to assign. */ public constructor(items: Array); /** * @internal */ public constructor(items: Array, move: true); /** * Copy Constructor * * @param obj Object to copy. */ public constructor(obj: Vector); /** * Fill Constructor. * * @param size Initial size. * @param val Value to fill. */ public constructor(n: number, val: T); /** * Range Constructor. * * @param first Input iterator of the first position. * @param last Input iteartor of the last position. */ public constructor( first: Readonly>, last: Readonly>, ); public constructor(...args: any[]) { super(); // CONSTRUCTORS BRANCH if (args.length === 0) { // DEFAULT CONSTRUCTOR this.data_ = []; } else if (args[0] instanceof Array) { // INITIALIZER CONSTRUCTOR const array: Array = args[0]; this.data_ = args[1] === true ? array : array.slice(); } else if (args.length === 1 && args[0] instanceof Vector) { // COPY CONSTRUCTOR const v: Vector = args[0]; this.data_ = v.data_.slice(); } else if (args.length === 2) { // ASSIGN CONSTRUCTOR this.data_ = []; this.assign(args[0], args[1]); } } /* --------------------------------------------------------- ACCESSORS --------------------------------------------------------- */ /** * Wrap an array into a vector. * * @param data Target array to be wrapped * @return A vector wrapping the parametric array. */ public static wrap(data: Array): Vector { return new Vector(data, true); } /** * @inheritDoc */ public nth(index: number): Vector.Iterator { return new Vector.Iterator(this as Vector, index); } protected source(): Vector { return this; } } /** * */ export namespace Vector { // HEAD /** * Iterator of {@link Vector} */ export type Iterator = ArrayIterator>; /** * Reverse iterator of {@link Vector} */ export type ReverseIterator = ArrayReverseIterator>; // BODY export const Iterator = ArrayIterator; export const ReverseIterator = ArrayReverseIterator; }