All files / assert/is-allowed-data-type-cast/lib main.js

62.5% Statements 50/80
100% Branches 1/1
0% Functions 0/1
62.5% Lines 50/80

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 811x 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  
/**
* @license Apache-2.0
*
* Copyright (c) 2018 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 isSafeCast = require( '@stdlib/ndarray/base/assert/is-safe-data-type-cast' );
var isMostlySafeCast = require( '@stdlib/ndarray/base/assert/is-mostly-safe-data-type-cast' );
var isSameKindCast = require( '@stdlib/ndarray/base/assert/is-same-kind-data-type-cast' );
var resolveStr = require( '@stdlib/ndarray/base/dtype-resolve-str' );
 
 
// MAIN //
 
/**
* Returns a boolean indicating if a provided ndarray data type can be cast to another ndarray data type according to a specified casting mode.
*
* @param {*} from - ndarray data type
* @param {*} to - ndarray data type
* @param {string} casting - ndarray casting mode
* @returns {boolean} boolean indicating if a data type can be cast to another data type
*
* @example
* var bool = isAllowedCast( 'float32', 'float64', 'safe' );
* // returns true
*
* bool = isAllowedCast( 'float64', 'int32', 'safe' );
* // returns false
*/
function isAllowedCast( from, to, casting ) {
	var dt1;
	var dt2;

	// Anything goes for "unsafe" casting...
	if ( casting === 'unsafe' ) {
		return true;
	}
	dt1 = resolveStr( from );
	dt2 = resolveStr( to );

	// "Casting" to the same data type is always allowed, regardless of the casting mode...
	if ( dt1 === dt2 ) {
		return true;
	}
	// No casts between different data types are allowed in "none" or "equiv" casting modes...
	if ( casting === 'none' || casting === 'equiv' ) {
		return false;
	}
	// In "safe" casting mode, only casts which preserve values are allowed...
	if ( casting === 'safe' ) {
		return isSafeCast( from, to );
	}
	// In "mostly-safe" casting mode, in addition to "safe" casts, for floating-point data types, downcasts are allowed...
	if ( casting === 'mostly-safe' ) {
		return isMostlySafeCast( from, to );
	}
	// In "same-kind" casting mode, in addition to "safe" casts, casts within a "kind" (e.g., between signed integers or between floating-point numbers) are allowed...
	return isSameKindCast( from, to );
}
 
 
// EXPORTS //
 
module.exports = isAllowedCast;