diff options
author | Shouichi Kamiya <[email protected]> | 2023-08-18 10:30:57 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2023-09-16 14:57:19 +0900 |
commit | e9b503f1bb9692eda1d1f55f62c19d861b88a0d5 (patch) | |
tree | 8c3a734105021eea0f5235a844e8b93dccaa3d27 /range.c | |
parent | 7d08dbd015a16c27f2d9c77751e80fa6efba2d7a (diff) |
[Feature #19839] Add Range#overlap?
Add a method that returns true if two range overlap, otherwise false.
```
(0..10).overlap?(5..15) #=> true
(0..10).overlap?(20..30) #=> false
```
Diffstat (limited to 'range.c')
-rw-r--r-- | range.c | 29 |
1 files changed, 29 insertions, 0 deletions
@@ -2151,6 +2151,34 @@ range_count(int argc, VALUE *argv, VALUE range) } } +/* + * call-seq: + * overlap?(range) -> true or false + * + * Returns +true+ if +range+ overlaps with +self+, +false+ otherwise: + * + * (0..2).overlap?(1..3) #=> true + * (0..2).overlap?(3..4) #=> false + * (0..).overlap?(..0) #=> true + * + * Related: Range#cover?. + */ + +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 * that are between given begin and end values. * @@ -2417,4 +2445,5 @@ Init_Range(void) rb_define_method(rb_cRange, "include?", range_include, 1); rb_define_method(rb_cRange, "cover?", range_cover, 1); rb_define_method(rb_cRange, "count", range_count, -1); + rb_define_method(rb_cRange, "overlap?", range_overlap, 1); } |