class Array

Public Instance Methods

native_bindex(*args) click to toggle source
static VALUE rb_array_binary_index(int argc, VALUE* argv, VALUE self) {
  int lower = 0;
  int upper = RARRAY_LEN(self) - 1;
  int i, comp;

  while(lower <= upper) {
    i = lower + (upper - lower) / 2;
    if(argc == 1)
    {
      comp = NUM2INT(rb_funcall(argv[0], id_cmp, 1, RARRAY_PTR(self)[i]));
    }
    else
    {
      comp = NUM2INT(rb_yield_values(1, rb_ary_entry(self, i)));
    }

    if(comp == 0) {
      return LONG2NUM(i);
    } else if(comp > 0) {
      lower = i + 1;
    } else {
      upper = i - 1;
    };
  }
  return Qnil;
}
native_bsearch(*args) click to toggle source
static VALUE rb_array_binary_search(int argc, VALUE* argv, VALUE self) {
  int lower = 0;
  int upper = RARRAY_LEN(self) - 1;
  int i, comp;

  while(lower <= upper) {
    i = lower + (upper - lower) / 2;
    if(argc == 1)
    {
      comp = NUM2INT(rb_funcall(argv[0], id_cmp, 1, RARRAY_PTR(self)[i]));
    }
    else
    {
      comp = NUM2INT(rb_yield_values(1, rb_ary_entry(self, i)));
    }

    if(comp == 0) {
      return rb_ary_entry(self, i);
    } else if(comp > 0) {
      lower = i + 1;
    } else {
      upper = i - 1;
    };
  }
  return Qnil;
}