diff options
| author | taiyoslime <[email protected]> | 2020-10-05 19:53:05 +0900 |
|---|---|---|
| committer | taiyoslime <[email protected]> | 2020-10-13 14:09:36 +0900 |
| commit | bec4d053400c3a11c8efd68c3e8bd5ea4a0bcc54 (patch) | |
| tree | 166195f4009b90a90d1fe1b28ad4c8c84ba2597d /mrbgems/mruby-range-ext/src/range.c | |
| parent | 9ea7b718683386d2dc0787e919fc3d413ab20e67 (diff) | |
| download | mruby-bec4d053400c3a11c8efd68c3e8bd5ea4a0bcc54.tar.gz mruby-bec4d053400c3a11c8efd68c3e8bd5ea4a0bcc54.zip | |
Introduce endless range (a part of #5085)
Co-Authored-By: n4o847 <[email protected]>
Co-Authored-By: smallkirby <[email protected]>
Diffstat (limited to 'mrbgems/mruby-range-ext/src/range.c')
| -rw-r--r-- | mrbgems/mruby-range-ext/src/range.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/mrbgems/mruby-range-ext/src/range.c b/mrbgems/mruby-range-ext/src/range.c index 2a0b4e97d..c263b484b 100644 --- a/mrbgems/mruby-range-ext/src/range.c +++ b/mrbgems/mruby-range-ext/src/range.c @@ -42,6 +42,9 @@ range_cover(mrb_state *mrb, mrb_value range) end = RANGE_END(r); if (r_le(mrb, beg, val)) { + if (mrb_nil_p(end)) { + return mrb_true_value(); + } if (RANGE_EXCL(r)) { if (r_lt(mrb, val, end)) return mrb_true_value(); @@ -76,6 +79,11 @@ range_last(mrb_state *mrb, mrb_value range) { mrb_value num; mrb_value array; + struct RRange *r = mrb_range_ptr(mrb, range); + + if (mrb_nil_p(RANGE_END(r))) { + mrb_raise(mrb, E_RANGE_ERROR, "cannot get the last element of endless range"); + } if (mrb_get_args(mrb, "|o", &num) == 0) { return mrb_range_end(mrb, range); @@ -108,6 +116,10 @@ range_size(mrb_state *mrb, mrb_value range) beg = RANGE_BEG(r); end = RANGE_END(r); + if ((mrb_fixnum_p(beg) || mrb_float_p(beg)) && mrb_nil_p(end)) { + return mrb_float_value(mrb, INFINITY); + } + excl = RANGE_EXCL(r); if (mrb_fixnum_p(beg)) { beg_f = (mrb_float)mrb_fixnum(beg); @@ -159,6 +171,10 @@ range_size(mrb_state *mrb, mrb_value range) beg = RANGE_BEG(r); end = RANGE_END(r); + if (mrb_fixnum_p(beg) && mrb_nil_p(end)) { + return mrb_nil_value(); + } + excl = RANGE_EXCL(r) ? 0 : 1; if (mrb_fixnum_p(beg) && mrb_fixnum_p(end)) { |
