diff options
Diffstat (limited to 'range.c')
| -rw-r--r-- | range.c | 36 |
1 files changed, 30 insertions, 6 deletions
@@ -47,6 +47,7 @@ static VALUE r_cover_p(VALUE, VALUE, VALUE, VALUE); static void range_init(VALUE range, VALUE beg, VALUE end, VALUE exclude_end) { + // Changing this condition has implications for JITs. If you do, please let maintainers know. if ((!FIXNUM_P(beg) || !FIXNUM_P(end)) && !NIL_P(beg) && !NIL_P(end)) { VALUE v; @@ -153,14 +154,14 @@ recursive_equal(VALUE range, VALUE obj, int recur) * call-seq: * self == other -> true or false * - * Returns +true+ if and only if: + * Returns whether all of the following are true: * * - +other+ is a range. * - <tt>other.begin == self.begin</tt>. * - <tt>other.end == self.end</tt>. * - <tt>other.exclude_end? == self.exclude_end?</tt>. * - * Otherwise returns +false+. + * Examples: * * r = (1..5) * r == (1..5) # => true @@ -783,7 +784,7 @@ bsearch_integer_range(VALUE beg, VALUE end, int excl) * * Returns an element from +self+ selected by a binary search. * - * See {Binary Searching}[rdoc-ref:bsearch.rdoc]. + * See {Binary Searching}[rdoc-ref:language/bsearch.rdoc]. * */ @@ -1017,6 +1018,29 @@ range_to_a(VALUE range) return rb_call_super(0, 0); } +/* + * call-seq: + * to_set -> set + * + * Returns a set containing the elements in +self+, if a finite collection; + * raises an exception otherwise. + * + * (1..4).to_set # => Set[1, 2, 3, 4] + * (1...4).to_set # => Set[1, 2, 3] + * + * (1..).to_set + * # in 'Range#to_set': cannot convert endless range to a set (RangeError) + * + */ +static VALUE +range_to_set(VALUE range) +{ + if (NIL_P(RANGE_END(range))) { + rb_raise(rb_eRangeError, "cannot convert endless range to a set"); + } + return rb_call_super(0, NULL); +} + static VALUE range_enum_size(VALUE range, VALUE args, VALUE eobj) { @@ -2030,10 +2054,9 @@ VALUE rb_str_include_range_p(VALUE beg, VALUE end, VALUE val, VALUE exclusive); /* * call-seq: - * self === object -> true or false + * self === other -> true or false * - * Returns +true+ if +object+ is between <tt>self.begin</tt> and <tt>self.end</tt>. - * +false+ otherwise: + * Returns whether +other+ is between <tt>self.begin</tt> and <tt>self.end</tt>: * * (1..4) === 2 # => true * (1..4) === 5 # => false @@ -2844,6 +2867,7 @@ Init_Range(void) rb_define_method(rb_cRange, "minmax", range_minmax, 0); rb_define_method(rb_cRange, "size", range_size, 0); rb_define_method(rb_cRange, "to_a", range_to_a, 0); + rb_define_method(rb_cRange, "to_set", range_to_set, 0); rb_define_method(rb_cRange, "entries", range_to_a, 0); rb_define_method(rb_cRange, "to_s", range_to_s, 0); rb_define_method(rb_cRange, "inspect", range_inspect, 0); |
