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;