/**
 * Growable Uint32Array list of `(idA, idB)` body-id pairs. Stride is 2 words
 * per pair. `count` tracks the number of pairs; capacity grows by doubling.
 *
 * No allocation happens during {@link push} until capacity is exceeded. The
 * intended usage is `clear()` at the top of each step and `push` for each
 * candidate pair encountered during broadphase.
 *
 * @author Alex Goldring
 * @copyright Company Named Limited (c) 2026
 */
export class PairList {
    /**
     * @param {number} [initial_capacity] pairs (not words)
     */
    constructor(initial_capacity?: number);
    __capacity: number;
    __count: number;
    __data: Uint32Array;
    /**
     * @returns {number} number of pairs currently stored
     */
    get count(): number;
    /**
     * @returns {number} pair capacity (doubles on overflow)
     */
    get capacity(): number;
    /**
     * Raw word buffer. `data[i*2 + 0]` is idA, `data[i*2 + 1]` is idB for the
     * `i`-th pair, where `i < count`. Exposed for hot-loop iteration; valid
     * until the next {@link push} that triggers a grow.
     * @returns {Uint32Array}
     */
    get data(): Uint32Array;
    /**
     * Reset to empty without releasing capacity.
     */
    clear(): void;
    /**
     * Append a pair. Caller is expected to have already canonicalised
     * `idA < idB` if symmetric semantics are needed.
     *
     * @param {number} idA
     * @param {number} idB
     */
    push(idA: number, idB: number): void;
    /**
     * @param {number} i pair index, `[0, count)`
     * @returns {number}
     */
    get_a(i: number): number;
    /**
     * @param {number} i pair index, `[0, count)`
     * @returns {number}
     */
    get_b(i: number): number;
    /**
     * @private
     */
    private __grow;
}
//# sourceMappingURL=PairList.d.ts.map