summaryrefslogtreecommitdiff
path: root/range.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-12-12 01:01:29 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-12-12 01:01:29 +0000
commit81be0398848dba163cf9f04263c8f3753133ab32 (patch)
tree9d1306498e517952b7b796f1fedc23728f7b0a02 /range.c
parent4d467a08650273f3e20dbc4dc78592a2237362a9 (diff)
* range.c (range_cover): new method Range#cover? added. the
method name might be changed. thanks to takano32 at http://www.rubyist.net/~matz/20051210.html#c08 for name suggestion. [ruby-talk:167182] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9674 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'range.c')
-rw-r--r--range.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/range.c b/range.c
index c23c3f45b7..ce744e6a7f 100644
--- a/range.c
+++ b/range.c
@@ -641,6 +641,38 @@ range_include(VALUE range, VALUE val)
}
+/*
+ * call-seq:
+ * rng.cover?(val) => true or false
+ *
+ * Returns <code>true</code> if <i>obj</i> is between beg and end,
+ * i.e <code>beg <= obj <= end</code> (or <i>end</i> exclusive when
+ * <code>exclude_end?</code> is true).
+ *
+ * ("a".."z").cover?("c") #=> true
+ * ("a".."z").cover?("5") #=> false
+ */
+
+static VALUE
+range_cover(range, val)
+ VALUE range, val;
+{
+ VALUE beg, end;
+
+ beg = rb_ivar_get(range, id_beg);
+ end = rb_ivar_get(range, id_end);
+ if (r_le(beg, val)) {
+ if (EXCL(range)) {
+ if (r_lt(val, end)) return Qtrue;
+ }
+ else {
+ if (r_le(val, end)) return Qtrue;
+ }
+ }
+ return Qfalse;
+}
+
+
/* A <code>Range</code> represents an interval---a set of values with a
* start and an end. Ranges may be constructed using the
* <em>s</em><code>..</code><em>e</em> and
@@ -718,6 +750,7 @@ Init_Range(void)
rb_define_method(rb_cRange, "member?", range_include, 1);
rb_define_method(rb_cRange, "include?", range_include, 1);
+ rb_define_method(rb_cRange, "cover?", range_cover, 1);
id_cmp = rb_intern("<=>");
id_succ = rb_intern("succ");