All files / ndarray/fill-slice/lib main.js

100% Statements 108/108
100% Branches 9/9
100% Functions 1/1
100% Lines 108/108

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 1091x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 41x 41x 41x 41x 41x 41x 10x 10x 41x 1x 1x 41x 10x 10x 20x 20x 20x 20x 41x 10x 10x 10x 10x 10x 10x 10x 10x 10x 41x 1x 1x 1x 1x 1x  
/**
* @license Apache-2.0
*
* Copyright (c) 2025 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.
*/
 
'use strict';
 
// MODULES //
 
var isScalarMostlySafeCompatible = require( '@stdlib/ndarray/base/assert/is-scalar-mostly-safe-compatible' ); // eslint-disable-line id-length
var broadcastScalar = require( '@stdlib/ndarray/base/broadcast-scalar' );
var isndarrayLike = require( '@stdlib/assert/is-ndarray-like' );
var getDtype = require( '@stdlib/ndarray/base/dtype' );
var getShape = require( '@stdlib/ndarray/base/shape' );
var getOrder = require( '@stdlib/ndarray/base/order' );
var isReadOnly = require( '@stdlib/ndarray/base/assert/is-read-only' );
var isMultiSlice = require( '@stdlib/assert/is-multi-slice' );
var slice = require( '@stdlib/ndarray/base/slice' );
var format = require( '@stdlib/string/format' );
var base = require( '@stdlib/ndarray/slice-assign' );
 
 
// MAIN //
 
/**
* Fills an input ndarray with a specified value in the region defined by a MultiSlice.
*
* @param {ndarray} x - input ndarray
* @param {MultiSlice} s - multislice specifying the fill region
* @param {*} value - scalar value
* @throws {TypeError} first argument must be an ndarray-like object
* @throws {TypeError} second argument must be a MultiSlice instance
* @throws {TypeError} third argument cannot be safely cast to the input ndarray data type
* @throws {Error} cannot write to a read-only ndarray
* @returns {ndarray} input ndarray
*
* @example
* var zeros = require( '@stdlib/ndarray/zeros' );
* var MultiSlice = require( '@stdlib/slice/multi' );
* var Slice = require( '@stdlib/slice/ctor' );
* var ndarray2array = require( '@stdlib/ndarray/to-array' );
*
* var x = zeros( [ 3, 4 ], {
*     'dtype': 'float64'
* });
*
* // Create a MultiSlice to specify the fill region:
* var s0 = new Slice( 1, 3 );
* var s1 = new Slice( 2, 4 );
* var s = new MultiSlice( s0, s1 );
*
* // Fill the ndarray with a scalar value:
* var y = fillSlice( x, s, 5.0 );
* // returns <ndarray>
*
* var bool = ( y === x );
* // returns true
*
* var arr = ndarray2array( x );
* // returns [ [ 0, 0, 0, 0 ], [ 0, 0, 5, 5 ], [ 0, 0, 5, 5 ] ]
*/
function fillSlice( x, s, value ) {
	var view;
	var dt;
	var v;
 
	if ( !isndarrayLike( x ) ) {
		throw new TypeError( format( 'invalid argument. First argument must be an ndarray-like object. Value: `%s`.', x ) );
	}
	if ( isReadOnly( x ) ) {
		throw new Error( 'invalid argument. Cannot write to a read-only array.' );
	}
	if ( !isMultiSlice( s ) ) {
		throw new TypeError( format( 'invalid argument. Second argument must be a MultiSlice instance. Value: `%s`.', s ) );
	}
 
	dt = getDtype( x );
 
	// Safe casts are always allowed and allow same kind casts (i.e., downcasts) only when the output data type is floating-point...
	if ( !isScalarMostlySafeCompatible( value, dt ) ) {
		throw new TypeError( format( 'invalid argument. Third argument cannot be safely cast to the input array data type. Data type: %s. Value: `%s`.', dt, value ) );
	}
	// Resolve the slice view:
	view = slice( x, s, true, true );
 
	// Broadcast the fill value to an ndarray of same shape and data type as the input ndarray:
	v = broadcastScalar( value, dt, getShape( view, true ), getOrder( x ) );
 
	return base( v, x, s );
}
 
 
// EXPORTS //
 
module.exports = fillSlice;