From 7bcee674c8fb89d9d5505c0af46c74323ca95569 Mon Sep 17 00:00:00 2001 From: Alexander Rose <alex.rose@rcsb.org> Date: Wed, 20 Feb 2019 16:38:08 -0800 Subject: [PATCH] added SimpleBuffer to wrap DataView and node's Buffer --- src/mol-io/common/simple-buffer.ts | 94 ++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/mol-io/common/simple-buffer.ts diff --git a/src/mol-io/common/simple-buffer.ts b/src/mol-io/common/simple-buffer.ts new file mode 100644 index 000000000..45f4d85d5 --- /dev/null +++ b/src/mol-io/common/simple-buffer.ts @@ -0,0 +1,94 @@ +/** + * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info. + * + * @author Alexander Rose <alexander.rose@weirdbyte.de> + */ + +export interface SimpleBuffer extends Uint8Array { + readInt8: (offset: number) => number + readUInt8: (offset: number) => number + + writeInt8: (value: number, offset: number) => void + writeUInt8: (value: number, offset: number) => void + + readInt16LE: (offset: number) => number + readInt32LE: (offset: number) => number + readUInt16LE: (offset: number) => number + readUInt32LE: (offset: number) => number + readFloatLE: (offset: number) => number + readDoubleLE: (offset: number) => number + + writeInt16LE: (value: number, offset: number) => void + writeInt32LE: (value: number, offset: number) => void + writeUInt16LE: (value: number, offset: number) => void + writeUInt32LE: (value: number, offset: number) => void + writeFloatLE: (value: number, offset: number) => void + writeDoubleLE: (value: number, offset: number) => void + + readInt16BE: (offset: number) => number + readInt32BE: (offset: number) => number + readUInt16BE: (offset: number) => number + readUInt32BE: (offset: number) => number + readFloatBE: (offset: number) => number + readDoubleBE: (offset: number) => number + + writeInt16BE: (value: number, offset: number) => void + writeInt32BE: (value: number, offset: number) => void + writeUInt16BE: (value: number, offset: number) => void + writeUInt32BE: (value: number, offset: number) => void + writeFloatBE: (value: number, offset: number) => void + writeDoubleBE: (value: number, offset: number) => void +} + +export namespace SimpleBuffer { + export function fromUint8Array(array: Uint8Array): SimpleBuffer { + const dv = new DataView(array.buffer) + return Object.assign(array.subarray(0), { + readInt8: (offset: number) => dv.getInt8(offset), + readUInt8: (offset: number) => dv.getUint8(offset), + writeInt8: (value: number, offset: number) => dv.setInt8(offset, value), + writeUInt8: (value: number, offset: number) => dv.setUint8(offset, value), + + readInt16LE: (offset: number) => dv.getInt16(offset, true), + readInt32LE: (offset: number) => dv.getInt32(offset, true), + readUInt16LE: (offset: number) => dv.getUint16(offset, true), + readUInt32LE: (offset: number) => dv.getUint32(offset, true), + readFloatLE: (offset: number) => dv.getFloat32(offset, true), + readDoubleLE: (offset: number) => dv.getFloat64(offset, true), + + writeInt16LE: (value: number, offset: number) => dv.setInt16(offset, value, true), + writeInt32LE: (value: number, offset: number) => dv.setInt32(offset, value, true), + writeUInt16LE: (value: number, offset: number) => dv.setUint16(offset, value, true), + writeUInt32LE: (value: number, offset: number) => dv.setUint32(offset, value, true), + writeFloatLE: (value: number, offset: number) => dv.setFloat32(offset, value, true), + writeDoubleLE: (value: number, offset: number) => dv.setFloat64(offset, value, true), + + readInt16BE: (offset: number) => dv.getInt16(offset, false), + readInt32BE: (offset: number) => dv.getInt32(offset, false), + readUInt16BE: (offset: number) => dv.getUint16(offset, false), + readUInt32BE: (offset: number) => dv.getUint32(offset, false), + readFloatBE: (offset: number) => dv.getFloat32(offset, false), + readDoubleBE: (offset: number) => dv.getFloat64(offset, false), + + writeInt16BE: (value: number, offset: number) => dv.setInt16(offset, value, false), + writeInt32BE: (value: number, offset: number) => dv.setInt32(offset, value, false), + writeUInt16BE: (value: number, offset: number) => dv.setUint16(offset, value, false), + writeUInt32BE: (value: number, offset: number) => dv.setUint32(offset, value, false), + writeFloatBE: (value: number, offset: number) => dv.setFloat32(offset, value, false), + writeDoubleBE: (value: number, offset: number) => dv.setFloat64(offset, value, false), + }) + } + + export function fromBuffer(buffer: Buffer): SimpleBuffer { + return buffer + } + + /** source and target can't be the same */ + export function flipByteOrder(source: SimpleBuffer, target: Uint8Array, byteCount: number, elementByteSize: number, offset: number) { + for (let i = 0, n = byteCount; i < n; i += elementByteSize) { + for (let j = 0; j < elementByteSize; j++) { + target[offset + i + elementByteSize - j - 1] = source[offset + i + j]; + } + } + } +} \ No newline at end of file -- GitLab