summaryrefslogtreecommitdiff
path: root/range.c
diff options
context:
space:
mode:
authormarcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-06 17:15:00 +0000
committermarcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-06 17:15:00 +0000
commitfaed90d814d6739cc55e6f0103fdc06fc1c5de0a (patch)
tree96e82262e4324f3cf0c5669a335c25005a574e5e /range.c
parent28d8bf902d573236ee0bdfdc84de5d96deffefee (diff)
* 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.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/range.c b/range.c
index b449e97758..d83e1d2eb1 100644
--- a/range.c
+++ b/range.c
@@ -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);