Source: ascontiguousarray.mjs

import { array, asarray, tester, slice, ones, NDArray, Dtype } from './core.mjs';

/**
 * @param {NDArray} a array-like
 * @param {Dtype} [dtype]
 * @returns {NDArray}
 */
export function ascontiguousarray(a, dtype = undefined) {
	a = asarray(a, dtype);
	return contiguous(a) ? a : array(a);
}

/**
 * Always returns `false` if `ndim == 0`
 * @param {NDArray} a
 * @returns {boolean}
 * @ignore
 */
export function contiguous(a) {
	let { strides, shape, ndim, itemsize } = a;
	if (ndim == 0) return false;

	for (let i = ndim - 1; i >= 0; i--) {
		if (shape[i] > 1) {
			if (itemsize != strides[i]) return false;
			itemsize *= shape[i];
		}
	}
	return true;
}

process.env.PRODUCTION ||
	tester
		.add(
			ascontiguousarray,
			() => {
				let a = ones([3, 1, 5]).at(slice(), slice([, , 3]), slice());
				// console.log(a.shape, a.strides, a.itemsize);
				return ascontiguousarray(a) === a;
			},
			() => true
		)
		.add(
			ascontiguousarray,
			() => {
				let a = ones([3, 4, 5]).at(slice(), slice([, , 1]), slice());
				return ascontiguousarray(a) === a;
			},
			() => true
		)
		.add(
			ascontiguousarray,
			() => {
				let a = ones([3, 4, 5]).at(slice(), slice(), slice(1));
				return ascontiguousarray(a) === a;
			},
			() => false
		)
		.add(
			ascontiguousarray,
			() => {
				let a = ones([3]).at(slice([, , -3]));
				return ascontiguousarray(a) === a;
			},
			() => true
		)
		.add(
			ascontiguousarray,
			() => {
				let a = ones([2]).at(slice([, , 2]));
				return ascontiguousarray(a) === a;
			},
			() => true
		)
		.add(
			ascontiguousarray,
			() => {
				let a = ones([3]).at(slice([, , 2]));
				return ascontiguousarray(a) === a;
			},
			() => false
		)
		.add(
			ascontiguousarray,
			() => {
				let a = ones([3]).at(slice([1, 2]));
				return ascontiguousarray(a) === a;
			},
			() => true
		)
		.add(
			ascontiguousarray,
			() => {
				let x, y;
				x = array([]);
				y = ascontiguousarray(x);
				return x === y;
			},
			() => true
		)
		.add(
			ascontiguousarray,
			() => {
				let x, y;
				x = array(5);
				y = ascontiguousarray(x);
				return x === y;
			},
			() => false
		);