From 1bcbd4e538df6907b19bc537da0ebe937a44918d Mon Sep 17 00:00:00 2001 From: Paul Loyd Date: Tue, 10 Sep 2013 21:30:47 +0400 Subject: [PATCH] Add "ref-array" module --- node-ffi/node-ffi-tests.ts | 26 +++++++++++++++++++++ node-ffi/node-ffi.d.ts | 46 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/node-ffi/node-ffi-tests.ts b/node-ffi/node-ffi-tests.ts index 06aa2a2ee7..fae927584f 100644 --- a/node-ffi/node-ffi-tests.ts +++ b/node-ffi/node-ffi-tests.ts @@ -3,6 +3,8 @@ import ffi = require('ffi'); import ref = require('ref'); import Struct = require('ref-struct'); +import Union = require('ref-union'); +import TArray = require('ref-array'); { var sqlite3 = ref.types.void; @@ -77,3 +79,27 @@ import Struct = require('ref-struct'); var ST = Struct(); var test: ffi.Type = ST.fields['t'].type; } +{ + var CharArray = TArray('char'); + var b = new Buffer('hello', 'ascii'); + var a = new CharArray(b); +} +{ + var Int32Array = TArray(ref.types.int32); + var input = [1, 4, 91, 123123, 5123512, 0, -1]; + var a = new Int32Array(input); +} +{ + var int = ref.types.int; + var IntArray = TArray(int); + + var buf = new Buffer(int.size * 3); + int.set(buf, int.size * 0, 5); + int.set(buf, int.size * 1, 8); + int.set(buf, int.size * 2, 0); + + var array = IntArray.untilZeros(buf); +} +{ + var refCharArr = TArray('char')([1, 3, 5], 2).ref(); +} diff --git a/node-ffi/node-ffi.d.ts b/node-ffi/node-ffi.d.ts index 12b8fc326d..bf8d1327eb 100644 --- a/node-ffi/node-ffi.d.ts +++ b/node-ffi/node-ffi.d.ts @@ -434,6 +434,52 @@ interface NodeBuffer { inspect(): string; } +declare module "ref-array" { + import ffi = require('ffi'); + + interface ArrayType extends ffi.Type { + BYTES_PER_ELEMENT: number; + /** The reference to the base type. */ + type: ffi.Type; + + /** + * Accepts a Buffer instance that should be an already-populated with data + * for the ArrayType. The "length" of the Array is determined by searching + * through the buffer's contents until an aligned NULL pointer is encountered. + */ + untilZeros(buffer: NodeBuffer): { [i: number]: number; length: number; + buffer: NodeBuffer; ref(): NodeBuffer; }; + + new (length?: number): { [i: number]: number; length: number; + buffer: NodeBuffer; ref(): NodeBuffer; }; + + new (data: number[], length?: number): { [i: number]: number; length: number; + buffer: NodeBuffer; ref(): NodeBuffer; }; + new (data: NodeBuffer, length?: number): { [i: number]: number; length: number; + buffer: NodeBuffer; ref(): NodeBuffer; }; + (length?: number): { [i: number]: number; length: number; + buffer: NodeBuffer; ref(): NodeBuffer; }; + (data: number[], length?: number): { [i: number]: number; length: number; + buffer: NodeBuffer; ref(): NodeBuffer; }; + (data: NodeBuffer, length?: number): { [i: number]: number; length: number; + buffer: NodeBuffer; ref(): NodeBuffer; }; + } + + /** + * The array type meta-constructor. + * The returned constructor's API is highly influenced by the WebGL + * TypedArray API. + */ + var ArrayType: { + new (type: ffi.Type, length?: number): ArrayType; + new (type: string, length?: number): ArrayType; + (type: ffi.Type, length?: number): ArrayType; + (type: string, length?: number): ArrayType; + }; + + export = ArrayType; +} + declare module "ref-struct" { import ffi = require('ffi');