/* iterator: collect!() */ static VALUE na_collect_bang(VALUE self) { int i, sz; VALUE v; struct NARRAY *a1; char *p1; void (*get)(), (*set)(); GetNArray(self,a1); p1 = a1->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, p1, 0, &v, 0 ); p1 += sz; } return self; }