c-structs
Version:
58 lines (56 loc) • 2.2 kB
TypeScript
type InferField<F> = F extends PrimitiveDescriptor ? number : F extends PrimitiveDescriptor[] ? number[] | Float32Array | Int16Array | Int32Array | BigInt64Array | Uint16Array | Uint32Array | BigUint64Array | Float64Array : F extends StructDescriptor<infer U> ? U : never;
/** Given a whole schema object, produce a “shaped” type */
type InferSchema<S extends Record<string, any>> = {
[K in keyof S]: InferField<S[K]>;
};
/**
* Primitive descriptor defines size, TypedArray constructor, and DataView accessors.
*/
interface PrimitiveDescriptor {
size: number;
arrayType: Float32ArrayConstructor | Int16ArrayConstructor | Int32ArrayConstructor | BigInt64ArrayConstructor | Uint16ArrayConstructor | Uint32ArrayConstructor | BigUint64ArrayConstructor | Float64ArrayConstructor;
getter: keyof DataView;
setter: keyof DataView;
}
/**
* Descriptor for a generated struct: knows its byte-size and has a create method.
*/
interface StructDescriptor<T> {
size: number;
create(buffer?: ArrayBuffer, baseOffset?: number): T & {
buffer: ArrayBuffer;
};
}
/**
* Constructor helpers for vectors, arrays, and structs.
*/
declare const c: {
float(): PrimitiveDescriptor;
float2(): PrimitiveDescriptor[];
float3(): PrimitiveDescriptor[];
float4(): PrimitiveDescriptor[];
uint(): PrimitiveDescriptor;
uint2(): PrimitiveDescriptor[];
uint3(): PrimitiveDescriptor[];
uint4(): PrimitiveDescriptor[];
int(): PrimitiveDescriptor;
int2(): PrimitiveDescriptor[];
int3(): PrimitiveDescriptor[];
int4(): PrimitiveDescriptor[];
uint16(): PrimitiveDescriptor;
uint64(): PrimitiveDescriptor;
int16(): PrimitiveDescriptor;
int64(): PrimitiveDescriptor;
float64(): PrimitiveDescriptor;
matrix3(): PrimitiveDescriptor[];
matrix4(): PrimitiveDescriptor[];
/**
* Create an array descriptor for nested structs.
*/
array<T>(structDesc: StructDescriptor<T>, length: number): StructDescriptor<T[]>;
/**
* Create a struct descriptor from a schema map.
*/
struct<S extends Record<string, any>>(schema: S): StructDescriptor<InferSchema<S>>;
};
export { type StructDescriptor, c };