mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Extract int_range_sum from enum_sum
* enum.c (enum_sum, int_range_sum): Extract int_range_sum from enum_sum. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55040 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7f860741b9
commit
eb9c9964b0
2 changed files with 27 additions and 17 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Wed May 18 09:14:00 2016 Kenta Murata <mrkn@mrkn.jp>
|
||||||
|
|
||||||
|
* enum.c (enum_sum, int_range_sum): Extract int_range_sum from
|
||||||
|
enum_sum.
|
||||||
|
|
||||||
Wed May 18 03:16:06 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Wed May 18 03:16:06 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* re.c (match_values_at): fix regression at r55036.
|
* re.c (match_values_at): fix regression at r55036.
|
||||||
|
@ -15,7 +20,7 @@ Wed May 18 01:57:43 2016 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
* re.c (namev_to_backref_number): separeted.
|
* re.c (namev_to_backref_number): separeted.
|
||||||
|
|
||||||
Tue May 18 00:05:00 2016 Kenta Murata <mrkn@mrkn.jp>
|
Wed May 18 00:05:00 2016 Kenta Murata <mrkn@mrkn.jp>
|
||||||
|
|
||||||
* enum.c (enum_sum): Optimize for a range from int to int.
|
* enum.c (enum_sum): Optimize for a range from int to int.
|
||||||
|
|
||||||
|
|
37
enum.c
37
enum.c
|
@ -3666,6 +3666,26 @@ enum_sum_iter_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, args))
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
int_range_sum(VALUE beg, VALUE end, int excl, VALUE init)
|
||||||
|
{
|
||||||
|
if (excl) {
|
||||||
|
if (FIXNUM_P(end))
|
||||||
|
end = LONG2FIX(FIX2LONG(end) - 1);
|
||||||
|
else
|
||||||
|
end = rb_big_minus(end, LONG2FIX(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rb_int_ge(end, beg)) {
|
||||||
|
VALUE a;
|
||||||
|
a = rb_int_plus(rb_int_minus(end, beg), LONG2FIX(1));
|
||||||
|
a = rb_int_mul(a, rb_int_plus(end, beg));
|
||||||
|
a = rb_int_idiv(a, LONG2FIX(2));
|
||||||
|
return rb_int_plus(init, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
return init;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
|
@ -3719,22 +3739,7 @@ enum_sum(int argc, VALUE* argv, VALUE obj)
|
||||||
if (!memo.block_given && !memo.float_value &&
|
if (!memo.block_given && !memo.float_value &&
|
||||||
(FIXNUM_P(beg) || RB_TYPE_P(beg, T_BIGNUM)) &&
|
(FIXNUM_P(beg) || RB_TYPE_P(beg, T_BIGNUM)) &&
|
||||||
(FIXNUM_P(end) || RB_TYPE_P(end, T_BIGNUM))) {
|
(FIXNUM_P(end) || RB_TYPE_P(end, T_BIGNUM))) {
|
||||||
if (excl) {
|
return int_range_sum(beg, end, excl, memo.v);
|
||||||
if (FIXNUM_P(end))
|
|
||||||
end = LONG2FIX(FIX2LONG(end) - 1);
|
|
||||||
else
|
|
||||||
end = rb_big_minus(end, LONG2FIX(1));
|
|
||||||
}
|
|
||||||
if (rb_int_ge(end, beg)) {
|
|
||||||
VALUE a;
|
|
||||||
a = rb_int_plus(rb_int_minus(end, beg), LONG2FIX(1));
|
|
||||||
a = rb_int_mul(a, rb_int_plus(end, beg));
|
|
||||||
a = rb_int_idiv(a, LONG2FIX(2));
|
|
||||||
return rb_int_plus(memo.v, a);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return memo.v;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue