/* Splits the function on NaN values for x, y or xy, depending on whether _sym_ is +:x+, +:y+ or +:xy+ (or, as a matter of fact, anything else than +:x+ or +:y+). This returns an array of new Function objects. This function will return empty Function objects between consecutive NaN values. */ static VALUE function_split_on_nan(VALUE self, VALUE sym) { VALUE ret = rb_ary_new(); VALUE cur_x = Dvector_Create(); VALUE cur_y = Dvector_Create(); int on_x = 1; int on_y = 1; long size = function_sanity_check(self); long cur_size = 0; long i; if(size < 2) rb_raise(rb_eRuntimeError, "Function needs to have at least 2 points"); double *x = Dvector_Data_for_Read(get_x_vector(self),NULL); double *y = Dvector_Data_for_Read(get_y_vector(self),NULL); VALUE f; if(sym == ID2SYM(rb_intern("x"))) on_y = 0; else if(sym == ID2SYM(rb_intern("y"))) on_x = 0; for(i = 0; i < size; i++) { if((on_x && isnan(x[i])) || (on_y && isnan(y[i]))) { /* We split */ f = Function_Create(cur_x, cur_y); rb_ary_push(ret, f); cur_x = Dvector_Create(); cur_y = Dvector_Create(); } else { Dvector_Push_Double(cur_x, x[i]); Dvector_Push_Double(cur_y, y[i]); } } f = Function_Create(cur_x, cur_y); rb_ary_push(ret, f); return ret; }