Skip to content

Commit b586995

Browse files
Jaysukh-409kgryte
andauthored
feat: add boolean dtype support to array/base/mskreject
PR-URL: #2452 Ref: #2304 Co-authored-by: Athan Reines <kgryte@gmail.com> Reviewed-by: Athan Reines <kgryte@gmail.com> Signed-off-by: Athan Reines <kgryte@gmail.com>
1 parent 4d45aa2 commit b586995

File tree

3 files changed

+125
-1
lines changed

3 files changed

+125
-1
lines changed

lib/node_modules/@stdlib/array/base/mskreject/lib/assign.js

+52-1
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@
2121
// MODULES //
2222

2323
var isComplexDataType = require( '@stdlib/array/base/assert/is-complex-floating-point-data-type' );
24+
var isBooleanDataType = require( '@stdlib/array/base/assert/is-boolean-data-type' );
2425
var arraylike2object = require( '@stdlib/array/base/arraylike2object' );
2526
var reinterpret = require( '@stdlib/strided/base/reinterpret-complex' );
27+
var reinterpretBoolean = require( '@stdlib/strided/base/reinterpret-boolean' );
2628

2729

2830
// FUNCTIONS //
@@ -163,6 +165,48 @@ function complex( x, mask, out, stride, offset ) {
163165
return out;
164166
}
165167

168+
/**
169+
* Applies a mask to a boolean array and assigns unmasked values to elements in a boolean output array.
170+
*
171+
* @private
172+
* @param {Collection} x - boolean input array view
173+
* @param {Object} mask - mask array object
174+
* @param {Collection} out - boolean output array view
175+
* @param {integer} stride - output array stride
176+
* @param {NonNegativeInteger} offset - output array offset
177+
* @returns {Collection} output array view
178+
*
179+
* @example
180+
* var Uint8Array = require( '@stdlib/array/uint8' );
181+
* var arraylike2object = require( '@stdlib/array/base/arraylike2object' );
182+
*
183+
* var x = new Uint8Array( [ 1, 0, 0, 1 ] );
184+
* var mask = [ 0, 1, 0, 1 ];
185+
*
186+
* var out = new Uint8Array( 4 );
187+
*
188+
* var arr = boolean( x, arraylike2object( mask ), out, 1, 0 );
189+
* // returns <Uint8Array>[ 1, 0, 0, 0 ]
190+
*/
191+
function boolean( x, mask, out, stride, offset ) {
192+
var mdata;
193+
var mget;
194+
var io;
195+
var i;
196+
197+
mdata = mask.data;
198+
mget = mask.accessors[ 0 ];
199+
200+
io = offset;
201+
for ( i = 0; i < mdata.length; i++ ) {
202+
if ( !mget( mdata, i ) ) {
203+
out[ io ] = x[ i ];
204+
io += stride;
205+
}
206+
}
207+
return out;
208+
}
209+
166210

167211
// MAIN //
168212

@@ -200,14 +244,21 @@ function assign( x, mask, out, stride, offset ) {
200244
mo.accessorProtocol ||
201245
oo.accessorProtocol
202246
) {
203-
// Note: we only explicitly support complex-to-complex, as this function should not be concerned with casting rules, etc. That is left to userland...
247+
// Note: we only explicitly support a limited set of dtype-to-dtype pairs, as this function should not be concerned with casting rules, etc. That is left to userland...
204248
if (
205249
isComplexDataType( xo.dtype ) &&
206250
isComplexDataType( oo.dtype )
207251
) {
208252
complex( reinterpret( x, 0 ), mo, reinterpret( out, 0 ), stride, offset ); // eslint-disable-line max-len
209253
return out;
210254
}
255+
if (
256+
isBooleanDataType( xo.dtype ) &&
257+
isBooleanDataType( oo.dtype )
258+
) {
259+
boolean( reinterpretBoolean( x, 0 ), mo, reinterpretBoolean( out, 0 ), stride, offset ); // eslint-disable-line max-len
260+
return out;
261+
}
211262
accessors( xo, mo, oo, stride, offset );
212263
return out;
213264
}

lib/node_modules/@stdlib/array/base/mskreject/test/test.assign.js

+60
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@
2222

2323
var tape = require( 'tape' );
2424
var Complex64Array = require( '@stdlib/array/complex64' );
25+
var BooleanArray = require( '@stdlib/array/bool' );
2526
var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
2627
var Int32Array = require( '@stdlib/array/int32' );
2728
var isSameComplex64Array = require( '@stdlib/assert/is-same-complex64array' );
29+
var isSameBooleanArray = require( '@stdlib/assert/is-same-booleanarray' );
2830
var zeros = require( '@stdlib/array/zeros' );
2931
var mskreject = require( './../lib/assign.js' );
3032

@@ -193,6 +195,58 @@ tape( 'the function rejects array elements (complex typed array)', function test
193195
t.end();
194196
});
195197

198+
tape( 'the function rejects array elements (boolean array)', function test( t ) {
199+
var expected;
200+
var actual;
201+
var mask;
202+
var out;
203+
var x;
204+
205+
x = new BooleanArray( [ true, false, false, true ] );
206+
207+
mask = [ 1, 0, 1, 0 ];
208+
out = new BooleanArray( 2 );
209+
actual = mskreject( x, mask, out, 1, 0 );
210+
expected = new BooleanArray( [ false, true ] );
211+
212+
t.strictEqual( actual, out, 'returns expected value' );
213+
t.strictEqual( isSameBooleanArray( actual, expected ), true, 'returns expected value' );
214+
215+
mask = [ 1, 1, 1, 1 ];
216+
out = new BooleanArray( 0 );
217+
actual = mskreject( x, mask, out, 1, 0 );
218+
expected = new BooleanArray( [] );
219+
220+
t.strictEqual( actual, out, 'returns expected value' );
221+
t.strictEqual( isSameBooleanArray( actual, expected ), true, 'returns expected value' );
222+
223+
mask = [ 1, 1, 1, 0 ];
224+
out = new BooleanArray( 1 );
225+
actual = mskreject( x, mask, out, 1, 0 );
226+
expected = new BooleanArray( [ true ] );
227+
228+
t.strictEqual( actual, out, 'returns expected value' );
229+
t.strictEqual( isSameBooleanArray( actual, expected ), true, 'returns expected value' );
230+
231+
mask = [ 0, 0, 0, 0 ];
232+
out = new BooleanArray( 4 );
233+
actual = mskreject( x, mask, out, 1, 0 );
234+
expected = new BooleanArray( [ true, false, false, true ] );
235+
236+
t.strictEqual( actual, out, 'returns expected value' );
237+
t.strictEqual( isSameBooleanArray( actual, expected ), true, 'returns expected value' );
238+
239+
mask = [ 1, 0, 1, 0 ];
240+
out = new BooleanArray( 4 );
241+
actual = mskreject( x, mask, out, -2, out.length-1 );
242+
expected = new BooleanArray( [ false, true, false, false ] );
243+
244+
t.strictEqual( actual, out, 'returns expected value' );
245+
t.strictEqual( isSameBooleanArray( actual, expected ), true, 'returns expected value' );
246+
247+
t.end();
248+
});
249+
196250
tape( 'the function rejects array elements (accessors)', function test( t ) {
197251
var expected;
198252
var actual;
@@ -285,5 +339,11 @@ tape( 'the function returns leaves an output array unchanged if provided a secon
285339
actual = mskreject( x, mask, out, 1, 0 );
286340
t.strictEqual( isSameComplex64Array( actual, expected ), true, 'returns expected value' );
287341

342+
x = new BooleanArray( [ true, false, false, true ] );
343+
out = new BooleanArray( [ false, false, false, false ] );
344+
expected = new BooleanArray( [ false, false, false, false ] );
345+
actual = mskreject( x, mask, out, 1, 0 );
346+
t.strictEqual( isSameBooleanArray( actual, expected ), true, 'returns expected value' );
347+
288348
t.end();
289349
});

lib/node_modules/@stdlib/array/base/mskreject/test/test.main.js

+13
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
var tape = require( 'tape' );
2424
var Complex64Array = require( '@stdlib/array/complex64' );
25+
var BooleanArray = require( '@stdlib/array/bool' );
2526
var isSameComplex64 = require( '@stdlib/assert/is-same-complex64' );
2627
var isArray = require( '@stdlib/assert/is-array' );
2728
var mskreject = require( './../lib' );
@@ -91,6 +92,18 @@ tape( 'the function rejects array elements (accessors)', function test( t ) {
9192
for ( i = 0; i < expected.length; i++ ) {
9293
t.strictEqual( isSameComplex64( actual[ i ], expected[ i ] ), true, 'returns expected value' );
9394
}
95+
96+
x = new BooleanArray( [ true, false, false, true ] );
97+
mask = [ 0, 1, 0, 1 ];
98+
actual = mskreject( x, mask );
99+
expected = [ x.get( 0 ), x.get( 2 ) ];
100+
101+
t.strictEqual( isArray( actual ), true, 'returns expected value' );
102+
t.notEqual( actual, x, 'returns different reference' );
103+
for ( i = 0; i < expected.length; i++ ) {
104+
t.strictEqual( actual[ i ], expected[ i ], 'returns expected value' );
105+
}
106+
94107
t.end();
95108
});
96109

0 commit comments

Comments
 (0)