static VALUE na_aref_md_protected(VALUE data_value) { na_aref_md_data_t *data = (na_aref_md_data_t*)(data_value); VALUE self = data->self; VALUE args = data->args; VALUE store = data->store; int ndim = data->ndim; na_index_arg_t *q = data->q; narray_t *na1 = data->na1; int keep_dim = data->keep_dim; int ndim_new; VALUE view; narray_view_t *na2; ssize_t elmsz; na_index_parse_args(args, na1, q, ndim); if (na_debug_flag) print_index_arg(q,ndim); if (keep_dim) { ndim_new = ndim; } else { ndim_new = na_ndim_new_narray(ndim, q); } view = na_s_allocate_view(CLASS_OF(self)); na_copy_flags(self, view); GetNArrayView(view,na2); na_alloc_shape((narray_t*)na2, ndim_new); na2->stridx = ALLOC_N(stridx_t,ndim_new); elmsz = nary_element_stride(self); switch(na1->type) { case NARRAY_DATA_T: case NARRAY_FILEMAP_T: na_index_aref_nadata((narray_data_t *)na1,na2,q,elmsz,ndim,keep_dim); na2->data = self; break; case NARRAY_VIEW_T: na2->offset = ((narray_view_t *)na1)->offset; na2->data = ((narray_view_t *)na1)->data; na_index_aref_naview((narray_view_t *)na1,na2,q,elmsz,ndim,keep_dim); break; } if (store) { na_get_pointer_for_write(store); // allocate memory na_store(na_flatten_dim(store,0),view); return store; } return view; }
/* Returns a new 1-D array initialized from binary raw data in a string. @overload from_string(string,[shape]) @param [String] string Binary raw data. @param [Array] shape array of integers representing array shape. @return [Numo::NArray] NArray containing binary data. */ static VALUE nary_s_from_string(int argc, VALUE *argv, VALUE type) { size_t len, str_len, elmsz; size_t *shape; char *ptr; int i, nd, narg; VALUE vstr,vshape,vna; narg = rb_scan_args(argc,argv,"11",&vstr,&vshape); str_len = RSTRING_LEN(vstr); elmsz = na_dtype_elmsz(type); if (narg==2) { nd = RARRAY_LEN(vshape); if (nd == 0 || nd > NA_MAX_DIMENSION) { rb_raise(nary_eDimensionError,"too long or empty shape (%d)", nd); } shape = ALLOCA_N(size_t,nd); len = 1; for (i=0; i<nd; ++i) { len *= shape[i] = NUM2SIZE(RARRAY_AREF(vshape,i)); } if (len*elmsz != str_len) { rb_raise(rb_eArgError, "size mismatch"); } } else { nd = 1; shape = ALLOCA_N(size_t,nd); shape[0] = len = str_len / elmsz; if (len == 0) { rb_raise(rb_eArgError, "string is empty or too short"); } } vna = rb_narray_new(type, nd, shape); ptr = na_get_pointer_for_write(vna); memcpy(ptr, RSTRING_PTR(vstr), elmsz*len); return vna; }
static VALUE <%=c_func(:nodef)%>(dtype x) { VALUE v; dtype *ptr; v = nary_new(cT, 0, NULL); ptr = (dtype*)(char*)na_get_pointer_for_write(v); *ptr = x; na_release_lock(v); return v; }