import type { Event, IClear, IIDGen, INotify, Listener } from "@thi.ng/api";
import { type IDGenEventType } from "./api.js";
export declare class IDGen implements Iterable<number>, IClear, IIDGen<number>, INotify<IDGenEventType> {
    readonly ids: number[];
    protected nextID: number;
    protected _freeID: number;
    protected start: number;
    protected num: number;
    protected _capacity: number;
    protected mask: number;
    protected vmask: number;
    protected shift: number;
    constructor(bits?: number, vbits?: number, cap?: number, start?: number);
    /**
     * Extract actual ID (without version bits).
     *
     * @param id -
     */
    id(id: number): number;
    /**
     * Extract version from ID
     *
     * @param id -
     */
    version(id: number): number;
    get capacity(): number;
    /**
     * Attempts to set new capacity to given value. Capacity can only be
     * increased and the operation is only supported for unversioned
     * instances (i.e. vbits = 0).
     */
    set capacity(newCap: number);
    /**
     * Number of remaining available IDs.
     */
    get available(): number;
    /**
     * Number of currently used IDs.
     */
    get used(): number;
    /**
     * Next available free ID.
     */
    get freeID(): number;
    [Symbol.iterator](): Generator<number, void, unknown>;
    /**
     * Frees all existing IDs and resets counter to original start ID.
     */
    clear(): void;
    /**
     * Returns next available ID or throws error (assertion) if no further IDs
     * are currently available. Emits {@link EVENT_ADDED} if successful.
     */
    next(): number;
    /**
     * Marks given ID as available again and increases its version (if
     * versioning is enabled). Emits {@link EVENT_REMOVED} if successful.
     *
     * @param id -
     */
    free(id: number): boolean;
    /**
     * Returns true iff the given ID is valid and currently used.
     *
     * @param id -
     */
    has(id: number): boolean;
    addListener(id: IDGenEventType, fn: Listener<IDGenEventType>, scope?: any): boolean;
    removeListener(id: IDGenEventType, fn: Listener<IDGenEventType>, scope?: any): boolean;
    notify(event: Event<IDGenEventType>): boolean;
    protected nextVersion(id: number): number;
}
/**
 * Returns a new {@link IDGen} instance configured to use given counter &
 * version bits.
 *
 * @remarks
 * Overall ID range/capacity can be explicitly limited using `cap` (default and
 * maximum: 2^bits). The start ID can be defined via `start` (default: 0) and
 * MUST be < `cap`.
 *
 * @param bits -
 * @param vbits -
 * @param cap -
 * @param start -
 */
export declare const idgen: (bits?: number, vbits?: number, cap?: number, start?: number) => IDGen;
//# sourceMappingURL=idgen.d.ts.map