Skip to content

Commit 29bbe63

Browse files
committed
refactor: allow non-string dtypes and delegate to ndarray/base/assign for copying ndarray views
--- type: pre_commit_static_analysis_report description: Results of running static analysis checks when committing changes. report: - task: lint_filenames status: passed - task: lint_editorconfig status: passed - task: lint_markdown status: na - task: lint_package_json status: na - task: lint_repl_help status: na - task: lint_javascript_src status: passed - task: lint_javascript_cli status: na - task: lint_javascript_examples status: na - task: lint_javascript_tests status: na - task: lint_javascript_benchmarks status: na - task: lint_python status: na - task: lint_r status: na - task: lint_c_src status: na - task: lint_c_examples status: na - task: lint_c_benchmarks status: na - task: lint_c_tests_fixtures status: na - task: lint_shell status: na - task: lint_typescript_declarations status: na - task: lint_typescript_tests status: na - task: lint_license_headers status: passed ---
1 parent fc43bac commit 29bbe63

File tree

3 files changed

+66
-135
lines changed

3 files changed

+66
-135
lines changed

lib/node_modules/@stdlib/ndarray/array/lib/cast_buffer.js

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@
2020

2121
// MODULES //
2222

23+
var isEqualDataType = require( '@stdlib/ndarray/base/assert/is-equal-data-type' );
2324
var bufferCtors = require( '@stdlib/ndarray/base/buffer-ctors' );
2425
var allocUnsafe = require( '@stdlib/buffer/alloc-unsafe' );
26+
var resolveGetter = require( '@stdlib/array/base/resolve-getter' );
27+
var resolveSetter = require( '@stdlib/array/base/resolve-setter' );
2528

2629

2730
// MAIN //
@@ -32,34 +35,40 @@ var allocUnsafe = require( '@stdlib/buffer/alloc-unsafe' );
3235
* @private
3336
* @param {(Array|TypedArray|Buffer)} buffer - input buffer
3437
* @param {NonNegativeInteger} len - number of elements to cast
35-
* @param {string} dtype - data type
38+
* @param {*} dtype - data type
3639
* @returns {(Array|TypedArray|Buffer)} output buffer
3740
*
3841
* @example
3942
* var b = castBuffer( [ 1.0, 2.0, 3.0 ], 3, 'float64' );
4043
* // returns <Float64Array>[ 1.0, 2.0, 3.0 ]
4144
*/
4245
function castBuffer( buffer, len, dtype ) {
46+
var bget;
47+
var oset;
4348
var ctor;
4449
var out;
4550
var i;
4651

47-
ctor = bufferCtors( dtype );
48-
if ( dtype === 'generic' ) {
52+
bget = resolveGetter( buffer );
53+
if ( isEqualDataType( dtype, 'generic' ) ) {
4954
out = [];
5055
for ( i = 0; i < len; i++ ) {
51-
out.push( buffer[ i ] );
56+
out.push( bget( buffer, i ) );
5257
}
53-
} else if ( dtype === 'binary' ) {
58+
return out;
59+
}
60+
if ( isEqualDataType( dtype, 'binary' ) ) {
5461
out = allocUnsafe( len );
5562
for ( i = 0; i < len; i++ ) {
56-
out[ i ] = buffer[ i ];
57-
}
58-
} else {
59-
out = new ctor( len );
60-
for ( i = 0; i < len; i++ ) {
61-
out[ i ] = buffer[ i ]; // TODO: wrap and use accessors here and above
63+
out[ i ] = bget( buffer, i );
6264
}
65+
return out;
66+
}
67+
ctor = bufferCtors( dtype );
68+
out = new ctor( len );
69+
oset = resolveSetter( out );
70+
for ( i = 0; i < len; i++ ) {
71+
oset( out, i, bget( buffer, i ) );
6372
}
6473
return out;
6574
}

lib/node_modules/@stdlib/ndarray/array/lib/copy_view.js

Lines changed: 35 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -20,109 +20,15 @@
2020

2121
// MODULES //
2222

23-
var arraylike2object = require( '@stdlib/array/base/arraylike2object' );
24-
var castReturn = require( '@stdlib/complex/base/cast-return' );
25-
var complexCtors = require( '@stdlib/complex/ctors' );
26-
var bufferCtors = require( '@stdlib/ndarray/base/buffer-ctors' );
23+
var isEqualDataType = require( '@stdlib/ndarray/base/assert/is-equal-data-type' );
2724
var allocUnsafe = require( '@stdlib/buffer/alloc-unsafe' );
28-
var ndarray = require( '@stdlib/ndarray/base/ctor' );
29-
var getDType = require( '@stdlib/ndarray/dtype' );
25+
var bufferCtors = require( '@stdlib/ndarray/base/buffer-ctors' );
3026
var getShape = require( '@stdlib/ndarray/shape' );
31-
var getStrides = require( '@stdlib/ndarray/strides' );
32-
var getOffset = require( '@stdlib/ndarray/offset' );
3327
var getOrder = require( '@stdlib/ndarray/order' );
34-
var getData = require( '@stdlib/ndarray/data-buffer' );
35-
36-
37-
// FUNCTIONS //
38-
39-
/**
40-
* Copies a "generic" ndarray view.
41-
*
42-
* @private
43-
* @param {ndarray} arr - input ndarray
44-
* @returns {Array} output data buffer
45-
*/
46-
function generic( arr ) {
47-
var len;
48-
var out;
49-
var i;
50-
51-
len = arr.length;
52-
out = [];
53-
for ( i = 0; i < len; i++ ) {
54-
out.push( arr.iget( i ) ); // as output buffer is generic, should work with both real- and complex-valued ndarrays
55-
}
56-
return out;
57-
}
58-
59-
/**
60-
* Copies a "binary" ndarray view.
61-
*
62-
* @private
63-
* @param {ndarray} arr - input ndarray
64-
* @returns {Array} output data buffer
65-
*/
66-
function binary( arr ) {
67-
var len;
68-
var out;
69-
var i;
70-
71-
len = arr.length;
72-
out = allocUnsafe( len );
73-
for ( i = 0; i < len; i++ ) {
74-
out[ i ] = arr.iget( i ); // we're assuming that we're doing something sensible here (e.g., not trying to cast a complex-valued ndarray to a "binary" ndarray or a double-precision floating-point ndarray to binary, etc)
75-
}
76-
return out;
77-
}
78-
79-
/**
80-
* Copies a "typed" ndarray view.
81-
*
82-
* @private
83-
* @param {ndarray} arr - input ndarray
84-
* @param {string} dtype - data type
85-
* @returns {Array} output data buffer
86-
*/
87-
function typed( arr, dtype ) {
88-
var ctor;
89-
var len;
90-
var out;
91-
var set;
92-
var fcn;
93-
var o;
94-
var i;
95-
96-
ctor = bufferCtors( dtype );
97-
len = arr.length;
98-
out = new ctor( len );
99-
100-
// If the output data buffer is a complex number array, we need to use accessors...
101-
o = arraylike2object( out );
102-
if ( o.accessorProtocol ) {
103-
set = o.accessors[ 1 ];
104-
fcn = castReturn( wrapper, 1, complexCtors( dtype ) );
105-
for ( i = 0; i < len; i++ ) {
106-
set( out, i, fcn( i ) ); // we're assuming that we're doing something sensible here (e.g., not trying to cast arbitrary objects to complex numbers, etc)
107-
}
108-
} else {
109-
for ( i = 0; i < len; i++ ) {
110-
out[ i ] = arr.iget( i ); // we're assuming that we're doing something sensible here (e.g., not trying to cast an ndarray containing generic objects to a double-precision floating-point array or a complex-valued ndarray to a real-valued ndarray, etc)
111-
}
112-
}
113-
return out;
114-
115-
/**
116-
* Returns the ndarray element specified by a provided linear index.
117-
*
118-
* @private
119-
* @param {NonNegativeInteger} i - linear index
120-
* @returns {*} value
121-
*/
122-
function wrapper( i ) {
123-
return arr.iget( i );
124-
}
125-
}
28+
var numel = require( '@stdlib/ndarray/base/numel' );
29+
var shape2strides = require( '@stdlib/ndarray/base/shape2strides' );
30+
var assign = require( '@stdlib/ndarray/base/assign' );
31+
var zeros = require( '@stdlib/array/base/zeros' );
12632

12733

12834
// MAIN //
@@ -132,7 +38,7 @@ function typed( arr, dtype ) {
13238
*
13339
* @private
13440
* @param {ndarray} arr - input ndarray
135-
* @param {string} dtype - data type
41+
* @param {*} dtype - data type
13642
* @returns {(Array|TypedArray|Buffer)} output data buffer
13743
*
13844
* @example
@@ -146,19 +52,35 @@ function typed( arr, dtype ) {
14652
* var b = copyView( vec, 'float64' );
14753
* // returns <Float64Array>[ 3.0, 2.0, 1.0 ]
14854
*/
149-
function copyView( arr, dtype ) {
150-
var x;
151-
152-
// Create a new "base" view, thus ensuring we have an `.iget` method and associated meta data...
153-
x = new ndarray( getDType( arr ), getData( arr ), getShape( arr ), getStrides( arr ), getOffset( arr ), getOrder( arr ) ); // eslint-disable-line max-len
154-
155-
if ( dtype === 'generic' ) {
156-
return generic( x );
157-
}
158-
if ( dtype === 'binary' ) {
159-
return binary( x );
55+
function copyView( arr, dtype ) { // TODO: consider replacing with `@stdlib/ndarray[/base]/copy` once created
56+
var obuf;
57+
var ctor;
58+
var out;
59+
var len;
60+
var ord;
61+
var sh;
62+
63+
sh = getShape( arr );
64+
ord = getOrder( arr );
65+
len = numel( sh );
66+
if ( isEqualDataType( dtype, 'generic' ) ) {
67+
obuf = zeros( len );
68+
} else if ( isEqualDataType( dtype, 'binary' ) ) {
69+
obuf = allocUnsafe( len );
70+
} else {
71+
ctor = bufferCtors( dtype );
72+
obuf = new ctor( len );
16073
}
161-
return typed( x, dtype );
74+
out = {
75+
'dtype': dtype,
76+
'data': obuf,
77+
'shape': sh,
78+
'strides': shape2strides( sh, ord ),
79+
'offset': 0,
80+
'order': ord
81+
};
82+
assign( [ arr, out ] );
83+
return obuf;
16284
}
16385

16486

lib/node_modules/@stdlib/ndarray/array/lib/main.js

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,17 @@ var isBoolean = require( '@stdlib/assert/is-boolean' ).isPrimitive;
2626
var isArray = require( '@stdlib/assert/is-array' );
2727
var isNonNegativeInteger = require( '@stdlib/assert/is-nonnegative-integer' ).isPrimitive;
2828
var isndarrayLike = require( '@stdlib/assert/is-ndarray-like' );
29-
var shape2strides = require( '@stdlib/ndarray/base/shape2strides' );
30-
var strides2offset = require( '@stdlib/ndarray/base/strides2offset' );
31-
var strides2order = require( '@stdlib/ndarray/base/strides2order' );
32-
var numel = require( '@stdlib/ndarray/base/numel' );
33-
var ndarray = require( '@stdlib/ndarray/ctor' );
29+
var isEqualDataType = require( '@stdlib/ndarray/base/assert/is-equal-data-type' );
3430
var isColumnMajor = require( '@stdlib/ndarray/base/assert/is-column-major-string' );
3531
var isDataType = require( '@stdlib/ndarray/base/assert/is-data-type' );
3632
var isOrder = require( '@stdlib/ndarray/base/assert/is-order' );
3733
var isCastingMode = require( '@stdlib/ndarray/base/assert/is-casting-mode' );
3834
var isAllowedCast = require( '@stdlib/ndarray/base/assert/is-allowed-data-type-cast' );
35+
var shape2strides = require( '@stdlib/ndarray/base/shape2strides' );
36+
var strides2offset = require( '@stdlib/ndarray/base/strides2offset' );
37+
var strides2order = require( '@stdlib/ndarray/base/strides2order' );
38+
var numel = require( '@stdlib/ndarray/base/numel' );
39+
var ndarray = require( '@stdlib/ndarray/ctor' );
3940
var createBuffer = require( '@stdlib/ndarray/base/buffer' );
4041
var getBufferDType = require( '@stdlib/ndarray/base/buffer-dtype' );
4142
var getDType = require( '@stdlib/ndarray/dtype' );
@@ -204,17 +205,16 @@ function array() {
204205
if ( hasOwnProp( options, 'dtype' ) ) {
205206
dtype = options.dtype;
206207
if ( !isDataType( dtype ) ) {
207-
throw new TypeError( format( 'invalid option. `%s` option must be a recognized data type. Option: `%s`.', 'dtype', dtype ) );
208+
throw new TypeError( format( 'invalid option. `%s` option must be a supported data type. Option: `%s`.', 'dtype', dtype ) );
208209
}
209-
dtype = String( dtype );
210210
if ( btype && !isAllowedCast( btype, dtype, opts.casting ) ) {
211211
throw new Error( format( 'invalid option. Data type cast is not allowed. Casting mode: `%s`. From: `%s`. To: `%s`.', opts.casting, btype, dtype ) );
212212
}
213213
} else if ( btype ) { // btype !== void 0
214214
// TODO: reconcile difference in behavior when provided a generic array and no `dtype` option. Currently, we cast here, but do not allow casting a generic array (by default) when explicitly providing a `dtype` option.
215215

216216
// Only cast generic array data sources when not provided an ndarray...
217-
if ( !FLG && btype === 'generic' ) {
217+
if ( !FLG && isEqualDataType( btype, 'generic' ) ) {
218218
dtype = defaults.dtype;
219219
} else {
220220
dtype = btype;
@@ -310,7 +310,7 @@ function array() {
310310
if ( numel( buffer.shape ) !== len ) {
311311
throw new RangeError( 'invalid arguments. Array shape is incompatible with provided data source. Number of data source elements does not match array shape.' );
312312
}
313-
if ( btype !== dtype || opts.copy ) {
313+
if ( !isEqualDataType( btype, dtype ) || opts.copy ) {
314314
buffer = copyView( buffer, dtype );
315315
} else {
316316
strides = getStrides( buffer );
@@ -322,13 +322,13 @@ function array() {
322322
}
323323
}
324324
} else if ( buffer ) {
325-
if ( btype === 'generic' && opts.flatten && isArray( buffer ) ) {
325+
if ( isEqualDataType( btype, 'generic' ) && opts.flatten && isArray( buffer ) ) {
326326
buffer = flatten( buffer, osh || arrayShape( buffer ), isColumnMajor( order ) );
327327
}
328328
if ( buffer.length !== len ) {
329329
throw new RangeError( 'invalid arguments. Array shape is incompatible with provided data source. Number of data source elements does not match array shape.' );
330330
}
331-
if ( btype !== dtype || opts.copy ) {
331+
if ( !isEqualDataType( btype, dtype ) || opts.copy ) {
332332
buffer = castBuffer( buffer, len, dtype );
333333
}
334334
} else {

0 commit comments

Comments
 (0)