/* method: where2 idx_true, idx_false = narray.where2 */ static VALUE na_where2(volatile VALUE obj) { VALUE v1, v0; int n, i, n1, n0; char *c; int32_t *idx1, *idx0; struct NARRAY *ary, *a1, *a0; /* a1=true, a0=false */ GetNArray(obj,ary); /* Convert to NA_BYTE by calling "obj.ne(0)", if needed */ if(ary->type != NA_BYTE) { obj = rb_funcall(obj, na_id_ne, 1, INT2FIX(0)); GetNArray(obj,ary); } n = ary->total; /* Count true */ c = ary->ptr; n1 = 0; for (i=0; i<n; ++i) if (*(c++)) ++n1; n0 = n-n1; /* partially true and false */ v1 = na_make_object( NA_LINT, 1, &n1, cNArray ); GetNArray(v1,a1); idx1 = (int32_t*) a1->ptr; v0 = na_make_object( NA_LINT, 1, &n0, cNArray ); GetNArray(v0,a0); idx0 = (int32_t*) a0->ptr; /* Get Indices */ c = ary->ptr; for ( i=0; i<n; ++i ) { if (*(c++)) *(idx1++) = i; else *(idx0++) = i; } return rb_assoc_new( v1, v0 ); }