diff options
author | Nobuyoshi Nakada <[email protected]> | 2023-09-14 22:45:42 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2023-09-16 17:24:21 +0900 |
commit | b4213a73b807cf8c8884e29d37308c46ca80352a () | |
tree | 93a13face4add0cffc7e1460bf463055f1245b5c /range.c | |
parent | c3ef7a528b1fdfe7fc98b846fd2ccb0c07443682 (diff) |
[Feature #19839] Fix `Range#overlap?` for empty ranges
Empty ranges do not overlap with any range. Regarding benchmarks, PR#8242 is significantly faster in some cases, but one of these two cases is a wrong result. | |ActiveSupport| PR#8242|built-ruby| |:--------------------------|------------:|-------:|---------:| |(2..3).overlap?(1..1) | 7.761M| 15.053M| 32.368M| | | -| 1.94x| 4.17x| |(2..3).overlap?(2..4) | 25.720M| 55.070M| 21.981M| | | 1.17x| 2.51x| -| |(2..3).overlap?(4..5) | 7.616M| 15.048M| 21.730M| | | -| 1.98x| 2.85x| |(2..3).overlap?(2..1) | 25.585M| 56.545M| 32.786M| | | -| 2.21x| 1.28x| |(2..3).overlap?(0..1) | 7.554M| 14.755M| 32.545M| | | -| 1.95x| 4.31x| |(2..3).overlap?(...1) | 6.681M| 5.843M| 32.255M| | | 1.14x| -| 5.52x| |(2...3).overlap?(..2) | 6.676M| 5.817M| 21.572M| | | 1.15x| -| 3.71x| |(2...3).overlap?(3...) | 7.392M| 14.755M| 31.805M| | | -| 2.00x| 4.30x| |(2..3).overlap?('a'..'d') | 3.675M| 3.482M| 17.009M| | | 1.06x| -| 4.89x|
-rw-r--r-- | range.c | 77 |
1 files changed, 72 insertions, 5 deletions
@@ -2151,6 +2151,18 @@ range_count(int argc, VALUE *argv, VALUE range) } } /* * call-seq: * overlap?(range) -> true or false @@ -2161,6 +2173,49 @@ range_count(int argc, VALUE *argv, VALUE range) * (0..2).overlap?(3..4) #=> false * (0..).overlap?(..0) #=> true * * Related: Range#cover?. */ @@ -2168,15 +2223,27 @@ static VALUE range_overlap(VALUE range, VALUE other) { if (!rb_obj_is_kind_of(other, rb_cRange)) { - rb_raise(rb_eTypeError, "argument must be Range"); } - VALUE beg_self, beg_other; - beg_self = RANGE_BEG(range); - beg_other = RANGE_BEG(other); - return RBOOL(rb_equal(beg_self, beg_other) || range_cover(range, beg_other) || range_cover(other, beg_self)); } /* A \Range object represents a collection of values |