All files / concat/lib base.js

51.06% Statements 48/94
100% Branches 1/1
0% Functions 0/1
51.06% Lines 48/94

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 951x 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  
/**
* @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 indicesComplement = require( '@stdlib/array/base/indices-complement' );
var getShape = require( '@stdlib/ndarray/base/shape' );
var getDType = require( '@stdlib/ndarray/base/dtype' );
var getOrder = require( '@stdlib/ndarray/base/order' );
var getData = require( '@stdlib/ndarray/base/data-buffer' );
var ndarray = require( '@stdlib/ndarray/base/ctor' );
var assign = require( '@stdlib/ndarray/base/assign' );
var nditerStacks = require( '@stdlib/ndarray/iter/stacks' );
 
 
// MAIN //
 
/**
* Concatenates a list of ndarrays along a specified ndarray dimension.
*
* @private
* @param {ArrayLikeObject<ndarrayLike>} arrays - array-like object containing input ndarrays
* @param {NegativeInteger} dim - dimension along which to concatenate input ndarrays
* @param {ndarray} out - output ndarray
* @returns {ndarray} output ndarray
*/
function concat( arrays, dim, out ) {
	var istacks;
	var ostacks;
	var offset;
	var buf;
	var ord;
	var sh;
	var dt;
	var s;
	var i;
	var v;

	// Resolve the output ndarray shape:
	sh = getShape( out, false );

	// When concatenating one-dimensional ndarrays, opt for a faster path in which we write to output ndarray segments directly...
	if ( sh.length === 1 ) {
		dt = getDType( out );
		buf = getData( out );
		ord = getOrder( out );
		offset = 0;
		for ( i = 0; i < arrays.length; i++ ) {
			sh = getShape( arrays[ i ], false );
			v = new ndarray( dt, buf, sh, [ 1 ], offset, ord );
			assign( [ arrays[ i ], v ] );
			offset += sh[ 0 ];
		}
		return out;
	}
	// Create iterator for iterating over subarray views within the output ndarray:
	ostacks = nditerStacks( out, indicesComplement( sh.length, [ dim ] ) );

	// Assign each input ndarray subarray to a corresponding output subarray view...
	for ( i = 0; i < arrays.length; i++ ) {
		sh = getShape( arrays[ i ], false );
		istacks = nditerStacks( arrays[ i ], indicesComplement( sh.length, [ dim ] ) ); // eslint-disable-line max-len
		while ( true ) {
			s = istacks.next();
			if ( s.done ) {
				break;
			}
			assign( [ s.value, ostacks.next().value ] );
		}
	}
	return out;
}
 
 
// EXPORTS //
 
module.exports = concat;