From 65771c815dbaf754f1b1bcd0dd47aa2c60e7af19 Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 12 Dec 2005 01:01:29 +0000 Subject: * 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: http://svn.ruby-lang.org/repos/ruby/trunk@9674 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- range.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'range.c') diff --git a/range.c b/range.c index c23c3f45b..ce744e6a7 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 true if obj is between beg and end, + * i.e beg <= obj <= end (or end exclusive when + * exclude_end? 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 Range represents an interval---a set of values with a * start and an end. Ranges may be constructed using the * s..e 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"); -- cgit