diff options
author | marcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-11-06 17:15:00 +0000 |
---|---|---|
committer | marcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-11-06 17:15:00 +0000 |
commit | faed90d814d6739cc55e6f0103fdc06fc1c5de0a (patch) | |
tree | 96e82262e4324f3cf0c5669a335c25005a574e5e /range.c | |
parent | 28d8bf902d573236ee0bdfdc84de5d96deffefee (diff) | |
download | ruby-faed90d814d6739cc55e6f0103fdc06fc1c5de0a.tar.gz |
* range.c: Support for range.step.size
[Feature #6636]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37517 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'range.c')
-rw-r--r-- | range.c | 25 |
1 files changed, 24 insertions, 1 deletions
@@ -315,6 +315,29 @@ discrete_object_p(VALUE obj) return rb_respond_to(obj, id_succ); } +static VALUE +range_step_size(VALUE range, VALUE args) +{ + VALUE b = RANGE_BEG(range), e = RANGE_END(range); + VALUE step = INT2FIX(1); + if (args) { + step = RARRAY_PTR(args)[0]; + if (!rb_obj_is_kind_of(step, rb_cNumeric)) { + step = rb_to_int(step); + } + } + if (rb_funcall(step, '<', 1, INT2FIX(0))) { + rb_raise(rb_eArgError, "step can't be negative"); + } + else if (!rb_funcall(step, '>', 1, INT2FIX(0))) { + rb_raise(rb_eArgError, "step can't be 0"); + } + + if (rb_obj_is_kind_of(b, rb_cNumeric) && rb_obj_is_kind_of(e, rb_cNumeric)) { + return num_interval_step_size(b, e, step, EXCL(range)); + } + return Qnil; +} /* * call-seq: @@ -355,7 +378,7 @@ range_step(int argc, VALUE *argv, VALUE range) { VALUE b, e, step, tmp; - RETURN_ENUMERATOR(range, argc, argv); + RETURN_SIZED_ENUMERATOR(range, argc, argv, range_step_size); b = RANGE_BEG(range); e = RANGE_END(range); |