/*
* rng.length/rng.size -> anInteger
* -----
* Returns the number of objects in rng.
* (1..10).length #=> 10
* (1...10).length #=> 9
*/
static VALUE
range_length(range)
VALUE range;
{
VALUE beg, end;
long size;
beg = rb_ivar_get(range, id_beg);
end = rb_ivar_get(range, id_end);
if (RTEST(rb_funcall(beg, '>', 1, end))) {
return INT2FIX(0);
}
if (FIXNUM_P(beg) && FIXNUM_P(end)) {
if (EXCL(range)) {
return INT2NUM(NUM2LONG(end) - NUM2LONG(beg));
}
else {
return INT2NUM(NUM2LONG(end) - NUM2LONG(beg) + 1);
}
}
if (!rb_obj_is_kind_of(beg, rb_cInteger)) {
return rb_length_by_each(range);
}
size = rb_funcall(end, '-', 1, beg);
if (!EXCL(range)) {
size = rb_funcall(size, '+', 1, INT2FIX(1));
}
return size;
}