time-to-botec

Benchmark sampling in different programming languages
Log | Files | Refs | README

main.js (6786B)


      1 /**
      2 * @license Apache-2.0
      3 *
      4 * Copyright (c) 2020 The Stdlib Authors.
      5 *
      6 * Licensed under the Apache License, Version 2.0 (the "License");
      7 * you may not use this file except in compliance with the License.
      8 * You may obtain a copy of the License at
      9 *
     10 *    http://www.apache.org/licenses/LICENSE-2.0
     11 *
     12 * Unless required by applicable law or agreed to in writing, software
     13 * distributed under the License is distributed on an "AS IS" BASIS,
     14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15 * See the License for the specific language governing permissions and
     16 * limitations under the License.
     17 */
     18 
     19 'use strict';
     20 
     21 // MODULES //
     22 
     23 var isString = require( '@stdlib/assert/is-string' ).isPrimitive;
     24 var isNonNegativeInteger = require( '@stdlib/assert/is-nonnegative-integer' ).isPrimitive;
     25 var isCollection = require( '@stdlib/assert/is-collection' );
     26 var isArrayBuffer = require( '@stdlib/assert/is-arraybuffer' );
     27 var isObject = require( '@stdlib/assert/is-object' );
     28 var isFunction = require( '@stdlib/assert/is-function' );
     29 var hasOwnProp = require( '@stdlib/assert/has-own-property' );
     30 var ctors = require( './../../ctors' );
     31 var gfill = require( '@stdlib/blas/ext/base/gfill' );
     32 var hasIteratorSymbolSupport = require( '@stdlib/assert/has-iterator-symbol-support' );
     33 var ITERATOR_SYMBOL = require( '@stdlib/symbol/iterator' );
     34 
     35 
     36 // VARIABLES //
     37 
     38 var HAS_ITERATOR_SYMBOL = hasIteratorSymbolSupport();
     39 
     40 
     41 // MAIN //
     42 
     43 /**
     44 * Creates a filled array.
     45 *
     46 * @param {*} [value] - fill value
     47 * @param {(NonNegativeInteger|TypedArray|ArrayLikeObject|ArrayBuffer)} [arg] - a length, typed array, array-like object, or buffer
     48 * @param {NonNegativeInteger} [byteOffset=0] - byte offset
     49 * @param {NonNegativeInteger} [length] - view length
     50 * @param {string} [dtype="float64"] - data type
     51 * @throws {TypeError} must provide a recognized data type
     52 * @throws {TypeError} must provide a length, typed array, array-like object, or buffer
     53 * @throws {Error} creating a generic array from an `ArrayBuffer` is not supported
     54 * @returns {(TypedArray|Array)} array or typed array
     55 *
     56 * @example
     57 * var arr = filledarray();
     58 * // returns <Float64Array>
     59 *
     60 * @example
     61 * var arr = filledarray( 1.0, 2 );
     62 * // returns <Float64Array>[ 1.0, 1.0 ]
     63 *
     64 * @example
     65 * var arr = filledarray( 1.0, 2, 'float32' );
     66 * // returns <Float32Array>[ 1.0, 1.0 ]
     67 *
     68 * @example
     69 * var arr = filledarray( 1.0, 2, 'generic' );
     70 * // returns [ 1.0, 1.0 ]
     71 *
     72 * @example
     73 * var arr = filledarray( 1.0, [ 0.5, 0.5 ] );
     74 * // returns <Float64Array>[ 1.0, 1.0 ]
     75 *
     76 * @example
     77 * var arr = filledarray( 1, [ 5, -3 ], 'int32' );
     78 * // returns <Int32Array>[ 1, 1 ]
     79 *
     80 * @example
     81 * var arr1 = filledarray( 2, [ 5, 3 ], 'int32' );
     82 * var arr2 = filledarray( 1.0, arr1 );
     83 * // returns <Float64Array>[ 1.0, 1.0 ]
     84 *
     85 * @example
     86 * var arr1 = filledarray( 2, [ 5, 3 ], 'int32' );
     87 * var arr2 = filledarray( 1, arr1, 'uint32' );
     88 * // returns <Uint32Array>[ 1, 1 ]
     89 *
     90 * @example
     91 * var ArrayBuffer = require( '@stdlib/array/buffer' );
     92 *
     93 * var buf = new ArrayBuffer( 16 );
     94 * var arr = filledarray( 1.0, buf );
     95 * // returns <Float64Array>[ 1.0, 1.0 ]
     96 *
     97 * @example
     98 * var ArrayBuffer = require( '@stdlib/array/buffer' );
     99 *
    100 * var buf = new ArrayBuffer( 16 );
    101 * var arr = filledarray( 1.0, buf, 'float32' );
    102 * // returns <Float32Array>[ 1.0, 1.0, 1.0, 1.0 ]
    103 *
    104 * @example
    105 * var ArrayBuffer = require( '@stdlib/array/buffer' );
    106 *
    107 * var buf = new ArrayBuffer( 16 );
    108 * var arr = filledarray( 1.0, buf, 8 );
    109 * // returns <Float64Array>[ 1.0 ]
    110 *
    111 * @example
    112 * var ArrayBuffer = require( '@stdlib/array/buffer' );
    113 *
    114 * var buf = new ArrayBuffer( 16 );
    115 * var arr = filledarray( 1.0, buf, 8, 'float32' );
    116 * // returns <Float32Array>[ 1.0, 1.0 ]
    117 *
    118 * @example
    119 * var ArrayBuffer = require( '@stdlib/array/buffer' );
    120 *
    121 * var buf = new ArrayBuffer( 32 );
    122 * var arr = filledarray( 1.0, buf, 8, 2 );
    123 * // returns <Float64Array>[ 1.0, 1.0 ]
    124 *
    125 * @example
    126 * var ArrayBuffer = require( '@stdlib/array/buffer' );
    127 *
    128 * var buf = new ArrayBuffer( 32 );
    129 * var arr = filledarray( 1, buf, 8, 2, 'int32' );
    130 * // returns <Int32Array>[ 1, 1 ]
    131 */
    132 function filledarray() {
    133 	var value;
    134 	var nargs;
    135 	var dtype;
    136 	var ctor;
    137 	var arr;
    138 	var len;
    139 	var arg;
    140 	var v;
    141 	var i;
    142 
    143 	nargs = arguments.length;
    144 	nargs -= 1;
    145 	if ( nargs >= 0 && isString( arguments[ nargs ] ) ) {
    146 		dtype = arguments[ nargs ];
    147 		nargs -= 1;
    148 	} else {
    149 		dtype = 'float64';
    150 	}
    151 	ctor = ctors( dtype );
    152 	if ( ctor === null ) {
    153 		throw new TypeError( 'invalid argument. Must provide a recognized data type. Value: `'+dtype+'`.' );
    154 	}
    155 	if ( dtype === 'generic' ) {
    156 		if ( nargs <= 0 ) {
    157 			return [];
    158 		}
    159 		value = arguments[ 0 ];
    160 		arg = arguments[ 1 ];
    161 		if ( nargs === 1 ) {
    162 			if ( isNonNegativeInteger( arg ) ) {
    163 				len = arg;
    164 			} else if ( isCollection( arg ) ) {
    165 				len = arg.length;
    166 			}
    167 			if ( len !== void 0 ) {
    168 				arr = [];
    169 
    170 				// Manually push elements in order to ensure "fast" elements...
    171 				for ( i = 0; i < len; i++ ) {
    172 					arr.push( value );
    173 				}
    174 				return arr;
    175 			}
    176 			if ( isArrayBuffer( arg ) ) {
    177 				throw new Error( 'invalid arguments. Creating a generic array from an ArrayBuffer is not supported.' );
    178 			}
    179 			if ( isObject( arg ) ) {
    180 				if ( HAS_ITERATOR_SYMBOL === false ) {
    181 					throw new TypeError( 'invalid argument. Environment lacks Symbol.iterator support. Must provide a length, typed array, or array-like object. Value: `'+arg+'`.' );
    182 				}
    183 				if ( !isFunction( arg[ ITERATOR_SYMBOL ] ) ) {
    184 					throw new TypeError( 'invalid argument. Must provide a length, typed array, array-like object, or an iterable. Value: `'+arg+'`.' );
    185 				}
    186 				arg = arg[ ITERATOR_SYMBOL ]();
    187 				if ( !isFunction( arg.next ) ) {
    188 					throw new TypeError( 'invalid argument. Must provide a length, typed array, array-like object, or an iterable.' );
    189 				}
    190 				arr = [];
    191 				while ( true ) {
    192 					v = arg.next();
    193 					if ( hasOwnProp( v, 'value' ) ) {
    194 						arr.push( value );
    195 					}
    196 					if ( v.done ) {
    197 						break;
    198 					}
    199 				}
    200 				return arr;
    201 			}
    202 			throw new TypeError( 'invalid argument. Must provide a length, typed array, array-like object, or an iterable. Value: `'+arg+'`.' );
    203 		} else if ( isArrayBuffer( arg ) ) {
    204 			throw new Error( 'invalid arguments. Creating a generic array from an ArrayBuffer is not supported.' );
    205 		}
    206 		throw new TypeError( 'invalid argument. Must provide a length, typed array, array-like object, or an iterable. Value: `'+arg+'`.' );
    207 	}
    208 	if ( nargs <= 0 ) {
    209 		return new ctor( 0 );
    210 	}
    211 	if ( nargs === 1 ) {
    212 		arr = new ctor( arguments[1] );
    213 	} else if ( nargs === 2 ) {
    214 		arr = new ctor( arguments[1], arguments[2] );
    215 	} else {
    216 		arr = new ctor( arguments[1], arguments[2], arguments[3] );
    217 	}
    218 	value = arguments[ 0 ];
    219 	if ( arr.length > 0 && value !== 0 ) { // i.e., nonzero
    220 		gfill( arr.length, value, arr, 1 );
    221 	}
    222 	return arr;
    223 }
    224 
    225 
    226 // EXPORTS //
    227 
    228 module.exports = filledarray;