From 81be0398848dba163cf9f04263c8f3753133ab32 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: svn+ssh://ci.ruby-lang.org/ruby/trunk@9674 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ range.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/ChangeLog b/ChangeLog index 155c9d7a43..f94c7544a8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Mon Dec 12 09:58:09 2005 Yukihiro Matsumoto + + * 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] + Mon Dec 12 00:33:56 2005 Yukihiro Matsumoto * ext/digest/digest.c (rb_digest_base_s_digest): add volatile to 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 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 v1.2.3