@stdlib/utils
Version:
Standard utilities.
87 lines (74 loc) • 2.51 kB
JavaScript
/**
* @license Apache-2.0
*
* Copyright (c) 2018 The Stdlib Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
;
// MODULES //
var ArrayBuffer = require( '@stdlib/array/buffer' );
var ceil2 = require( '@stdlib/math/base/special/ceil2' ); // TODO: nextpow2
// MAIN //
/**
* Adds one or more elements to the end of a typed array.
*
* ## Notes
*
* - If the underlying `ArrayBuffer` is too short, we need to copy the data to a new `ArrayBuffer`. To do so, we allocate a new `ArrayBuffer` in a manner similar to how `Arrays` are resized (i.e., allocate enough memory to hold `nextpow2(n)` elements).
* - Beware that, if an ArrayBuffer view is followed by one or more other views, the created view may contain elements from those views, thus resulting in possible mutation. Accordingly, providing a typed array view having a shared underlying `ArrayBuffer` may have unintended consequences (including security vulnerabilities).
*
* @private
* @param {TypedArray} arr - input array
* @param {Array} items - items to add
* @returns {TypedArray} input array
*
* @example
* var Float64Array = require( '@stdlib/array/float64' );
*
* var arr = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0 ] );
* // returns <Float64Array>[ 1.0, 2.0, 3.0, 4.0, 5.0 ]
*
* arr = push( arr, 6.0, 7.0 );
* // returns <Float64Array>[ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0 ]
*/
function push( arr, items ) {
var nbytes;
var ibytes;
var total;
var len;
var buf;
var n;
var v;
var i;
len = arr.length;
n = items.length;
nbytes = len * arr.BYTES_PER_ELEMENT;
ibytes = n * arr.BYTES_PER_ELEMENT;
total = nbytes + ibytes + arr.byteOffset;
if ( arr.buffer.byteLength < total ) {
buf = new ArrayBuffer( ceil2( total+1 ) );
v = new arr.constructor( buf, 0, len+n );
for ( i = 0; i < len; i++ ) {
v[ i ] = arr[ i ];
}
} else {
v = new arr.constructor( arr.buffer, arr.byteOffset, len+n );
}
for ( i = 0; i < n; i++ ) {
v[ len+i ] = items[ i ];
}
return v;
}
// EXPORTS //
module.exports = push;