2020
2121// MODULES //
2222
23+ var isEqualDataType = require ( '@stdlib/ndarray-base-assert-is-equal-data-type' ) ;
2324var bufferCtors = require ( '@stdlib/ndarray-base-buffer-ctors' ) ;
2425var 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*/
4245function 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}
0 commit comments