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])
29 #define EXCL(r) RTEST(RANGE_EXCL(r))
30 #define SET_EXCL(r,v) (RSTRUCT(r)->as.ary[2] = (v) ? Qtrue : Qfalse)
62 RSTRUCT(range)->as.ary[0] = beg;
98 #define range_initialize_copy rb_struct_init_copy
119 if (recur)
return Qtrue;
188 if (recur)
return Qtrue;
416 if (i + unit < i)
break;
474 #if SIZEOF_DOUBLE == 8 && defined(HAVE_INT64_T)
481 int64_as_double_to_num(int64_t
i)
483 union int64_double convert;
495 double_as_int64(
double d)
497 union int64_double convert;
499 return d < 0 ? -convert.i : convert.i;
566 int smaller, satisfied = 0;
582 #define BSEARCH_CHECK(val) \
584 VALUE v = rb_yield(val); \
586 if (FIX2INT(v) == 0) return val; \
587 smaller = FIX2INT(v) < 0; \
589 else if (v == Qtrue) { \
593 else if (v == Qfalse || v == Qnil) { \
596 else if (rb_obj_is_kind_of(v, rb_cNumeric)) { \
597 int cmp = rb_cmpint(rb_funcall(v, id_cmp, 1, INT2FIX(0)), v, INT2FIX(0)); \
598 if (!cmp) return val; \
602 rb_raise(rb_eTypeError, "wrong argument type %s" \
603 " (must be numeric, true, false or nil)", \
604 rb_obj_classname(v)); \
608 #define BSEARCH(conv) \
610 RETURN_ENUMERATOR(range, 0, 0); \
611 if (EXCL(range)) high--; \
613 while (low < high) { \
614 mid = ((high < 0) == (low < 0)) ? low + ((high - low) / 2) \
615 : (low < -high) ? -((-1 - low - high)/2 + 1) : (low + high) / 2; \
616 BSEARCH_CHECK(conv(mid)); \
624 if (low == org_high) { \
625 BSEARCH_CHECK(conv(low)); \
626 if (!smaller) return Qnil; \
628 if (!satisfied) return Qnil; \
642 #if SIZEOF_DOUBLE == 8 && defined(HAVE_INT64_T)
646 int64_t mid, org_high;
647 BSEARCH(int64_as_double_to_num);
670 if (!smaller)
return Qnil;
672 if (!satisfied)
return Qnil;
754 for (i =
FIX2LONG(beg); i < lim; i++) {
913 if (c > 0 || (c == 0 &&
EXCL(range)))
952 if (c == 0)
return Qnil;
992 long beg,
end, origbeg, origend;
1011 if (err == 0 || err == 2) {
1028 origbeg, excl ?
"." :
"", origend);
1142 if (
r_le(beg, val)) {
1166 if (b <= v && v < e)
return Qtrue;
1167 if (!
EXCL(range) && v == e)
return Qtrue;
1200 if (
r_le(beg, val)) {
1309 #define rb_intern(str) rb_intern_const(str)
1321 "begin",
"end",
"excl",
NULL);
#define RB_TYPE_P(obj, type)
static int is_integer_p(VALUE v)
const char * rb_obj_classname(VALUE)
static VALUE range_max(VALUE range)
static VALUE range_dumper(VALUE range)
static VALUE range_step_size(VALUE range, VALUE args)
static VALUE range_include(VALUE range, VALUE val)
SSL_METHOD *(* func)(void)
RUBY_EXTERN VALUE rb_cTime
static VALUE range_bsearch(VALUE range)
static VALUE range_loader(VALUE range, VALUE obj)
VALUE rb_ary_last(int argc, VALUE *argv, VALUE ary)
VALUE rb_ary_push(VALUE ary, VALUE item)
static VALUE inspect_range(VALUE range, VALUE dummy, int recur)
VALUE rb_funcall(VALUE, ID, int,...)
Calls a method.
void rb_raise(VALUE exc, const char *fmt,...)
#define RETURN_ENUMERATOR(obj, argc, argv)
void rb_include_module(VALUE klass, VALUE module)
static VALUE sym_step_i(VALUE i, void *arg)
static VALUE range_to_s(VALUE range)
static VALUE recursive_hash(VALUE range, VALUE dummy, int recur)
#define range_initialize_copy
int rb_cmpint(VALUE val, VALUE a, VALUE b)
VALUE rb_str_append(VALUE, VALUE)
VALUE rb_ivar_get(VALUE, ID)
VALUE rb_equal(VALUE, VALUE)
void rb_name_error(ID id, const char *fmt,...)
st_index_t rb_hash_start(st_index_t)
static VALUE recursive_eql(VALUE range, VALUE obj, int recur)
static VALUE range_eql(VALUE range, VALUE obj)
static VALUE range_size(VALUE range)
VALUE rb_rescue(VALUE(*b_proc)(ANYARGS), VALUE data1, VALUE(*r_proc)(ANYARGS), VALUE data2)
static VALUE range_step(int argc, VALUE *argv, VALUE range)
static VALUE step_i(VALUE i, void *arg)
int rb_block_given_p(void)
int ruby_float_step(VALUE from, VALUE to, VALUE step, int excl)
static VALUE first_i(VALUE i, VALUE *ary)
static VALUE range_initialize(int argc, VALUE *argv, VALUE range)
VALUE rb_check_to_integer(VALUE, const char *)
VALUE rb_call_super(int, const VALUE *)
VALUE rb_struct_define_without_accessor(const char *, VALUE, rb_alloc_func_t,...)
#define range(low, item, hi)
#define BSEARCH_CHECK(val)
static VALUE sym_each_i(VALUE v, void *arg)
static VALUE range_first(int argc, VALUE *argv, VALUE range)
static void range_each_func(VALUE range, VALUE(*func)(VALUE, void *), void *arg)
VALUE rb_check_funcall(VALUE, ID, int, VALUE *)
int rb_range_values(VALUE range, VALUE *begp, VALUE *endp, int *exclp)
VALUE rb_obj_as_string(VALUE)
RUBY_EXTERN VALUE rb_cInteger
static VALUE range_check(VALUE *args)
static VALUE range_min(VALUE range)
static VALUE range_hash(VALUE range)
VALUE rb_range_new(VALUE, VALUE, int)
static void range_init(VALUE range, VALUE beg, VALUE end, int exclude_end)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
static VALUE range_exclude_end_p(VALUE range)
VALUE rb_block_call(VALUE, ID, int, VALUE *, VALUE(*)(ANYARGS), VALUE)
static int discrete_object_p(VALUE obj)
VALUE rb_exec_recursive_outer(VALUE(*)(VALUE, VALUE, int), VALUE, VALUE)
void rb_marshal_define_compat(VALUE newclass, VALUE oldclass, VALUE(*dumper)(VALUE), VALUE(*loader)(VALUE, VALUE))
static VALUE recursive_equal(VALUE range, VALUE obj, int recur)
VALUE rb_ivar_set(VALUE, ID, VALUE)
#define NEWOBJ_OF(obj, type, klass, flags)
VALUE rb_str_cat(VALUE, const char *, long)
static VALUE range_end(VALUE range)
#define RETURN_SIZED_ENUMERATOR(obj, argc, argv, size_fn)
static VALUE range_inspect(VALUE range)
static int r_lt(VALUE a, VALUE b)
VALUE rb_obj_is_kind_of(VALUE, VALUE)
VALUE num_interval_step_size(VALUE from, VALUE to, VALUE step, int excl)
static VALUE range_begin(VALUE range)
static VALUE range_last(int argc, VALUE *argv, VALUE range)
VALUE rb_exec_recursive_paired(VALUE(*)(VALUE, VALUE, int), VALUE, VALUE, VALUE)
RUBY_EXTERN VALUE rb_cObject
int rb_respond_to(VALUE, ID)
static VALUE range_alloc(VALUE klass)
VALUE rb_exec_recursive(VALUE(*)(VALUE, VALUE, int), VALUE, VALUE)
static VALUE each_i(VALUE v, void *arg)
VALUE rb_ary_new2(long capa)
static VALUE range_each(VALUE range)
VALUE rb_range_beg_len(VALUE, long *, long *, long, int)
VALUE rb_obj_alloc(VALUE)
VALUE rb_str_intern(VALUE)
static VALUE range_eqq(VALUE range, VALUE val)
static VALUE range_eq(VALUE range, VALUE obj)
VALUE rb_check_string_type(VALUE)
static int r_le(VALUE a, VALUE b)
RUBY_EXTERN VALUE rb_cRange
static VALUE range_cover(VALUE range, VALUE val)
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
RUBY_EXTERN VALUE rb_cNumeric
static VALUE range_failed(void)
VALUE rb_struct_alloc_noinit(VALUE)
#define rb_hash_uint(h, i)