25 #define RANGE_BEG(r) (RSTRUCT(r)->as.ary[0])
26 #define RANGE_END(r) (RSTRUCT(r)->as.ary[1])
27 #define RANGE_EXCL(r) (RSTRUCT(r)->as.ary[2])
28 #define RANGE_SET_BEG(r, v) (RSTRUCT_SET(r, 0, v))
29 #define RANGE_SET_END(r, v) (RSTRUCT_SET(r, 1, v))
30 #define RANGE_SET_EXCL(r, v) (RSTRUCT_SET(r, 2, v))
31 #define RBOOL(v) ((v) ? Qtrue : Qfalse)
33 #define EXCL(r) RTEST(RANGE_EXCL(r))
99 VALUE beg, end, flags;
135 if (recur)
return Qtrue;
204 if (recur)
return Qtrue;
275 (*func) (v,
arg, 0, 0, 0);
281 (*func) (v,
arg, 0, 0, 0);
393 VALUE b, e, step, tmp;
424 if (i + unit < i)
break;
430 VALUE args[2], iter[2];
458 VALUE args[2], iter[2];
482 #if SIZEOF_DOUBLE == 8 && defined(HAVE_INT64_T)
489 int64_as_double_to_num(int64_t i)
491 union int64_double convert;
503 double_as_int64(
double d)
505 union int64_double convert;
507 return d < 0 ? -convert.i : convert.i;
574 int smaller, satisfied = 0;
590 #define BSEARCH_CHECK(val) \
592 VALUE v = rb_yield(val); \
594 if (FIX2INT(v) == 0) return val; \
595 smaller = FIX2INT(v) < 0; \
597 else if (v == Qtrue) { \
601 else if (v == Qfalse || v == Qnil) { \
604 else if (rb_obj_is_kind_of(v, rb_cNumeric)) { \
605 int cmp = rb_cmpint(rb_funcall(v, id_cmp, 1, INT2FIX(0)), v, INT2FIX(0)); \
606 if (!cmp) return val; \
610 rb_raise(rb_eTypeError, "wrong argument type %s" \
611 " (must be numeric, true, false or nil)", \
612 rb_obj_classname(v)); \
616 #define BSEARCH(conv) \
618 RETURN_ENUMERATOR(range, 0, 0); \
619 if (EXCL(range)) high--; \
621 while (low < high) { \
622 mid = ((high < 0) == (low < 0)) ? low + ((high - low) / 2) \
623 : (low < -high) ? -((-1 - low - high)/2 + 1) : (low + high) / 2; \
624 BSEARCH_CHECK(conv(mid)); \
632 if (low == org_high) { \
633 BSEARCH_CHECK(conv(low)); \
634 if (!smaller) return Qnil; \
636 if (!satisfied) return Qnil; \
650 #if SIZEOF_DOUBLE == 8 && defined(HAVE_INT64_T)
654 int64_t mid, org_high;
655 BSEARCH(int64_as_double_to_num);
678 if (!smaller)
return Qnil;
680 if (!satisfied)
return Qnil;
768 for (i =
FIX2LONG(beg); i < lim; i++) {
928 if (c > 0 || (c == 0 &&
EXCL(range)))
967 if (c == 0)
return Qnil;
1007 long beg, end, origbeg, origend;
1026 if (err == 0 || err == 2) {
1043 origbeg, excl ?
"." :
"", origend);
1157 if (
r_le(beg, val)) {
1181 if (b <= v && v < e)
return Qtrue;
1182 if (!
EXCL(range) && v == e)
return Qtrue;
1215 if (
r_le(beg, val)) {
1325 #define rb_intern(str) rb_intern_const(str)
1337 "begin",
"end",
"excl",
NULL);