c-structs
Version:
52 lines (50 loc) • 1.89 kB
TypeScript
type InferField<F> = F extends PrimitiveDescriptor ? number : F extends PrimitiveDescriptor[] ? number[] : 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;
};
}
/**
* Primitive descriptors map
*/
declare const p: Record<string, PrimitiveDescriptor>;
/**
* 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[];
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, PrimitiveDescriptor | PrimitiveDescriptor[] | StructDescriptor<any>>>(schema: S): StructDescriptor<InferSchema<S>>;
};
export { type StructDescriptor, c, p };