/* call-seq:
Function.joint_sort(x,y)
Sorts +x+, while ensuring that the corresponding +y+ values
keep matching. Should be pretty fast, as it is derived from
glibc's quicksort.
a = Dvector[3,2,1]
b = a * 2 -> [6,4,2]
Function.joint_sort(a,b) -> [[1,2,3], [2,4,6]]
*/
static VALUE function_joint_sort(VALUE self, VALUE x, VALUE y)
{
long x_len, y_len;
double * x_values = Dvector_Data_for_Write(x, &x_len);
double * y_values = Dvector_Data_for_Write(y, &y_len);
if(x_len != y_len)
rb_raise(rb_eArgError,"both vectors must have the same size");
else
{
/* we temporarily freeze both Dvectors before sorting */
FL_SET(x, DVEC_TMPLOCK);
FL_SET(y, DVEC_TMPLOCK);
joint_quicksort(x_values, y_values, (size_t) x_len);
/* and unfreeze them */
FL_UNSET(x, DVEC_TMPLOCK);
FL_UNSET(y, DVEC_TMPLOCK);
}
/* we return the array of both Dvectors */
return rb_ary_new3(2,x,y);
}