1
0
Fork 0
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:
mrkn 2016-05-18 00:16:06 +00:00
parent 7f860741b9
commit eb9c9964b0
2 changed files with 27 additions and 17 deletions

View file

@ -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
View file

@ -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;
}
} }
} }