/* iterator: collect() */ static VALUE na_collect(VALUE obj1) { int i, sz; VALUE v, obj2; struct NARRAY *a1, *a2; char *p1, *p2; void (*get)(), (*set)(); GetNArray(obj1,a1); obj2 = na_make_object(a1->type, a1->rank, a1->shape, CLASS_OF(obj1)); GetNArray(obj2,a2); p1 = a1->ptr; p2 = a2->ptr; sz = na_sizeof[a1->type]; get = SetFuncs[NA_ROBJ][a1->type]; set = SetFuncs[a1->type][NA_ROBJ]; for ( i=a1->total; i-->0; ) { (*get)( 1, &v, 0, p1, 0 ); v = rb_yield(v); (*set)( 1, p2, 0, &v, 0 ); p1 += sz; p2 += sz; } return obj2; }