static VALUE nst_allocate(VALUE self) { narray_t *na; char *ptr; VALUE velmsz; GetNArray(self,na); switch(NA_TYPE(na)) { case NARRAY_DATA_T: ptr = NA_DATA_PTR(na); if (na->size > 0 && ptr == NULL) { velmsz = rb_const_get(CLASS_OF(self), rb_intern("element_byte_size")); ptr = xmalloc(NUM2SIZET(velmsz) * na->size); NA_DATA_PTR(na) = ptr; } break; case NARRAY_VIEW_T: rb_funcall(NA_VIEW_DATA(na), rb_intern("allocate"), 0); break; case NARRAY_FILEMAP_T: //ptr = ((narray_filemap_t*)na)->ptr; // to be implemented default: rb_bug("invalid narray type : %d",NA_TYPE(na)); } return self; }
void na_release_lock(VALUE self) { narray_t *na; GetNArray(self,na); NA_UNSET_LOCK(na); switch(NA_TYPE(na)) { case NARRAY_VIEW_T: na_release_lock(NA_VIEW_DATA(na)); break; } }
char * na_get_pointer(VALUE self) { narray_t *na; GetNArray(self,na); switch(NA_TYPE(na)) { case NARRAY_DATA_T: return NA_DATA_PTR(na); case NARRAY_FILEMAP_T: return ((narray_filemap_t*)na)->ptr; case NARRAY_VIEW_T: return na_get_pointer(NA_VIEW_DATA(na)); //puts("pass NARRAY_VIEW_T in na_get_pointer_for_write"); //ptr += ((narray_view_t*)na)->offset; //ptr += NA_VIEW_OFFSET(na); break; default: rb_raise(rb_eRuntimeError,"invalid NA_TYPE"); } return NULL; }