Class: Array

Inherits:
Object
  • Object
show all
Defined in:
(unknown)

Instance Method Summary collapse

Instance Method Details

#native_bindex(*args) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'ext/native_bsearch/native_bsearch.c', line 12

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) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'ext/native_bsearch/native_bsearch.c', line 39

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;
}