summaryrefslogtreecommitdiffstats
path: root/range.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-11-25 01:30:57 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-11-25 01:30:57 +0000
commit62955b5eb7de527c287879415c183f03f487124c (patch)
tree5e92918808cc09af3d36b03cb45918b3b55badec /range.c
parentdf498a7befac8e3f08bcffca6dc4fab6cdb74ba0 (diff)
downloadruby-62955b5eb7de527c287879415c183f03f487124c.tar.gz
ruby-62955b5eb7de527c287879415c183f03f487124c.tar.xz
ruby-62955b5eb7de527c287879415c183f03f487124c.zip
* range.c (range_min): use <=> comparison rather than iteration.
[ruby-talk:167420] * range.c (range_max): ditto. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@9607 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'range.c')
-rw-r--r--range.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/range.c b/range.c
index 4475608ee..f3f1f3191 100644
--- a/range.c
+++ b/range.c
@@ -436,6 +436,64 @@ range_last(VALUE range)
return rb_ivar_get(range, id_end);
}
+/*
+ * call-seq:
+ * rng.min => obj
+ * rng.min {| a,b | block } => obj
+ *
+ * Returns the minimum value in <i>rng</i>. The second uses
+ * the block to compare values. Returns nil if the first
+ * value in range is larger than the last value.
+ *
+ */
+
+
+static VALUE
+range_min(VALUE range)
+{
+ if (rb_block_given_p()) {
+ return rb_call_super(0, 0);
+ }
+ else {
+ VALUE b = rb_ivar_get(range, id_beg);
+ VALUE e = rb_ivar_get(range, id_end);
+ VALUE r = rb_funcall(b, id_cmp, 1, e);
+ int c = rb_cmpint(r, b, e);
+
+ if (c > 0) return Qnil;
+ return b;
+ }
+}
+
+/*
+ * call-seq:
+ * rng.max => obj
+ * rng.max {| a,b | block } => obj
+ *
+ * Returns the maximum value in <i>rng</i>. The second uses
+ * the block to compare values. Returns nil if the first
+ * value in range is larger than the last value.
+ *
+ */
+
+
+static VALUE
+range_max(VALUE range)
+{
+ if (rb_block_given_p() || EXCL(range)) {
+ return rb_call_super(0, 0);
+ }
+ else {
+ VALUE b = rb_ivar_get(range, id_beg);
+ VALUE e = rb_ivar_get(range, id_end);
+ VALUE r = rb_funcall(b, id_cmp, 1, e);
+ int c = rb_cmpint(r, b, e);
+
+ if (c > 0) return Qnil;
+ return e;
+ }
+}
+
VALUE
rb_range_beg_len(VALUE range, long *begp, long *lenp, long len, int err)
{
@@ -638,6 +696,8 @@ Init_Range(void)
rb_define_method(rb_cRange, "last", range_last, 0);
rb_define_method(rb_cRange, "begin", range_first, 0);
rb_define_method(rb_cRange, "end", range_last, 0);
+ rb_define_method(rb_cRange, "min", range_min, 0);
+ rb_define_method(rb_cRange, "max", range_max, 0);
rb_define_method(rb_cRange, "to_s", range_to_s, 0);
rb_define_method(rb_cRange, "inspect", range_inspect, 0);