mirror of
https://github.com/atlanticbiomedical/biomedjs.git
synced 2025-07-02 00:47:26 -04:00
56 lines
1.9 KiB
JavaScript
56 lines
1.9 KiB
JavaScript
![]() |
var constant = require('../utility/constant'),
|
||
|
isNative = require('../lang/isNative');
|
||
|
|
||
|
/** Native method references. */
|
||
|
var ArrayBuffer = isNative(ArrayBuffer = global.ArrayBuffer) && ArrayBuffer,
|
||
|
bufferSlice = isNative(bufferSlice = ArrayBuffer && new ArrayBuffer(0).slice) && bufferSlice,
|
||
|
floor = Math.floor,
|
||
|
Uint8Array = isNative(Uint8Array = global.Uint8Array) && Uint8Array;
|
||
|
|
||
|
/** Used to clone array buffers. */
|
||
|
var Float64Array = (function() {
|
||
|
// Safari 5 errors when using an array buffer to initialize a typed array
|
||
|
// where the array buffer's `byteLength` is not a multiple of the typed
|
||
|
// array's `BYTES_PER_ELEMENT`.
|
||
|
try {
|
||
|
var func = isNative(func = global.Float64Array) && func,
|
||
|
result = new func(new ArrayBuffer(10), 0, 1) && func;
|
||
|
} catch(e) {}
|
||
|
return result;
|
||
|
}());
|
||
|
|
||
|
/** Used as the size, in bytes, of each `Float64Array` element. */
|
||
|
var FLOAT64_BYTES_PER_ELEMENT = Float64Array ? Float64Array.BYTES_PER_ELEMENT : 0;
|
||
|
|
||
|
/**
|
||
|
* Creates a clone of the given array buffer.
|
||
|
*
|
||
|
* @private
|
||
|
* @param {ArrayBuffer} buffer The array buffer to clone.
|
||
|
* @returns {ArrayBuffer} Returns the cloned array buffer.
|
||
|
*/
|
||
|
function bufferClone(buffer) {
|
||
|
return bufferSlice.call(buffer, 0);
|
||
|
}
|
||
|
if (!bufferSlice) {
|
||
|
// PhantomJS has `ArrayBuffer` and `Uint8Array` but not `Float64Array`.
|
||
|
bufferClone = !(ArrayBuffer && Uint8Array) ? constant(null) : function(buffer) {
|
||
|
var byteLength = buffer.byteLength,
|
||
|
floatLength = Float64Array ? floor(byteLength / FLOAT64_BYTES_PER_ELEMENT) : 0,
|
||
|
offset = floatLength * FLOAT64_BYTES_PER_ELEMENT,
|
||
|
result = new ArrayBuffer(byteLength);
|
||
|
|
||
|
if (floatLength) {
|
||
|
var view = new Float64Array(result, 0, floatLength);
|
||
|
view.set(new Float64Array(buffer, 0, floatLength));
|
||
|
}
|
||
|
if (byteLength != offset) {
|
||
|
view = new Uint8Array(result, offset);
|
||
|
view.set(new Uint8Array(buffer, offset));
|
||
|
}
|
||
|
return result;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
module.exports = bufferClone;
|