mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* numeric.c (int_upto, int_downto): Support for Integer#{down|up}to.size
[Feature #6636] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37518 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
faed90d814
commit
c2dc0dc1ce
2 changed files with 18 additions and 2 deletions
14
numeric.c
14
numeric.c
|
@ -3380,6 +3380,11 @@ fix_size(VALUE fix)
|
||||||
return INT2FIX(sizeof(long));
|
return INT2FIX(sizeof(long));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
int_upto_size(VALUE from, VALUE args) {
|
||||||
|
return num_interval_step_size(from, RARRAY_PTR(args)[0], INT2FIX(1), FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* int.upto(limit) {|i| block } -> self
|
* int.upto(limit) {|i| block } -> self
|
||||||
|
@ -3400,7 +3405,7 @@ fix_size(VALUE fix)
|
||||||
static VALUE
|
static VALUE
|
||||||
int_upto(VALUE from, VALUE to)
|
int_upto(VALUE from, VALUE to)
|
||||||
{
|
{
|
||||||
RETURN_ENUMERATOR(from, 1, &to);
|
RETURN_SIZED_ENUMERATOR(from, 1, &to, int_upto_size);
|
||||||
if (FIXNUM_P(from) && FIXNUM_P(to)) {
|
if (FIXNUM_P(from) && FIXNUM_P(to)) {
|
||||||
long i, end;
|
long i, end;
|
||||||
|
|
||||||
|
@ -3421,6 +3426,11 @@ int_upto(VALUE from, VALUE to)
|
||||||
return from;
|
return from;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
int_downto_size(VALUE from, VALUE args) {
|
||||||
|
return num_interval_step_size(from, RARRAY_PTR(args)[0], INT2FIX(-1), FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* int.downto(limit) {|i| block } -> self
|
* int.downto(limit) {|i| block } -> self
|
||||||
|
@ -3442,7 +3452,7 @@ int_upto(VALUE from, VALUE to)
|
||||||
static VALUE
|
static VALUE
|
||||||
int_downto(VALUE from, VALUE to)
|
int_downto(VALUE from, VALUE to)
|
||||||
{
|
{
|
||||||
RETURN_ENUMERATOR(from, 1, &to);
|
RETURN_SIZED_ENUMERATOR(from, 1, &to, int_downto_size);
|
||||||
if (FIXNUM_P(from) && FIXNUM_P(to)) {
|
if (FIXNUM_P(from) && FIXNUM_P(to)) {
|
||||||
long i, end;
|
long i, end;
|
||||||
|
|
||||||
|
|
|
@ -543,5 +543,11 @@ class TestEnumerator < Test::Unit::TestCase
|
||||||
assert_equal Float::INFINITY, (42..Float::INFINITY).step(2).size
|
assert_equal Float::INFINITY, (42..Float::INFINITY).step(2).size
|
||||||
assert_raise(ArgumentError){ (1..10).step(-2).size }
|
assert_raise(ArgumentError){ (1..10).step(-2).size }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_size_for_downup_to
|
||||||
|
assert_equal 0, 1.upto(-100).size
|
||||||
|
assert_equal 102, 1.downto(-100).size
|
||||||
|
assert_equal Float::INFINITY, 42.upto(Float::INFINITY).size
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue