copy_view.js (2551B)
1 /** 2 * @license Apache-2.0 3 * 4 * Copyright (c) 2018 The Stdlib Authors. 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 19 'use strict'; 20 21 // MODULES // 22 23 var bufferCtors = require( './../../base/buffer-ctors' ); 24 var allocUnsafe = require( '@stdlib/buffer/alloc-unsafe' ); 25 26 27 // FUNCTIONS // 28 29 /** 30 * Copies a "generic" ndarray view. 31 * 32 * @private 33 * @param {ndarray} arr - input ndarray 34 * @returns {Array} output data buffer 35 */ 36 function generic( arr ) { 37 var len; 38 var out; 39 var i; 40 41 len = arr.length; 42 out = []; 43 for ( i = 0; i < len; i++ ) { 44 out.push( arr.get( i ) ); 45 } 46 return out; 47 } 48 49 /** 50 * Copies a "binary" ndarray view. 51 * 52 * @private 53 * @param {ndarray} arr - input ndarray 54 * @returns {Array} output data buffer 55 */ 56 function binary( arr ) { 57 var len; 58 var out; 59 var i; 60 61 len = arr.length; 62 out = allocUnsafe( len ); 63 for ( i = 0; i < len; i++ ) { 64 out[ i ] = arr.get( i ); 65 } 66 return out; 67 } 68 69 /** 70 * Copies a "typed" ndarray view. 71 * 72 * @private 73 * @param {ndarray} arr - input ndarray 74 * @param {string} dtype - data type 75 * @returns {Array} output data buffer 76 */ 77 function typed( arr, dtype ) { 78 var ctor; 79 var len; 80 var out; 81 var i; 82 83 ctor = bufferCtors( dtype ); 84 len = arr.length; 85 out = new ctor( len ); 86 for ( i = 0; i < len; i++ ) { 87 out[ i ] = arr.get( i ); 88 } 89 return out; 90 } 91 92 93 // MAIN // 94 95 /** 96 * Copies an ndarray view to a data buffer. 97 * 98 * @private 99 * @param {ndarray} arr - input ndarray 100 * @param {string} dtype - data type 101 * @returns {(Array|TypedArray|Buffer)} output data buffer 102 * 103 * @example 104 * var ndarray = require( '@stdlib/ndarray/ctor' ); 105 * 106 * var buffer = [ 1.0, 2.0, 3.0 ]; 107 * var shape = [ 3 ]; 108 * var strides = [ -1 ]; 109 * var vec = ndarray( 'generic', buffer, shape, strides, 2, 'row-major' ); 110 * 111 * var b = copyView( vec, 'float64' ); 112 * // returns <Float64Array>[ 3.0, 2.0, 1.0 ] 113 */ 114 function copyView( arr, dtype ) { 115 // TODO: handle complex number dtypes!! 116 if ( dtype === 'generic') { 117 return generic( arr ); 118 } 119 if ( dtype === 'binary' ) { 120 return binary( arr ); 121 } 122 return typed( arr, dtype ); 123 } 124 125 126 // EXPORTS // 127 128 module.exports = copyView;