summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-05-09 22:06:16 +0900
committerYukihiro Matsumoto <[email protected]>2012-05-09 22:06:16 +0900
commit6a0c30d038172a238eb22ef259d835123cb117c9 (patch)
treed8a01678d651048ead9931d6d72be0f0c89465cd
parentdb96db6a8079f8e578acaa77890ddcb49de9fc7d (diff)
downloadmruby-6a0c30d038172a238eb22ef259d835123cb117c9.tar.gz
mruby-6a0c30d038172a238eb22ef259d835123cb117c9.zip
move body of Comparison from compar.c to compar.rb
-rw-r--r--mrblib/compar.rb121
-rw-r--r--src/compar.c104
2 files changed, 64 insertions, 161 deletions
diff --git a/mrblib/compar.rb b/mrblib/compar.rb
index 974ad5036..3badf57de 100644
--- a/mrblib/compar.rb
+++ b/mrblib/compar.rb
@@ -1,63 +1,68 @@
-### move to compar.c
-# module Comparable
- # def == other
- # cmp = self <=> other
- # if cmp == 0
- # true
- # else
- # false
- # end
- # end
+module Comparable
+ # 15.3.3.2.1
+ def < other
+ cmp = self <=> other
+ if cmp.nil?
+ false
+ elsif cmp < 0
+ true
+ else
+ false
+ end
+ end
- # def < other
- # cmp = self <=> other
- # if cmp.nil?
- # false
- # elsif cmp < 0
- # true
- # else
- # false
- # end
- # end
+ # 15.3.3.2.2
+ def <= other
+ cmp = self <=> other
+ if cmp.nil?
+ false
+ elsif cmp <= 0
+ true
+ else
+ false
+ end
+ end
- # def <= other
- # cmp = self <=> other
- # if cmp.nil?
- # false
- # elsif cmp <= 0
- # true
- # else
- # false
- # end
- # end
+ # 15.3.3.2.3
+ def == other
+ cmp = self <=> other
+ if cmp == 0
+ true
+ else
+ false
+ end
+ end
- # def > other
- # cmp = self <=> other
- # if cmp.nil?
- # false
- # elsif cmp > 0
- # true
- # else
- # false
- # end
- # end
+ # 15.3.3.2.4
+ def > other
+ cmp = self <=> other
+ if cmp.nil?
+ false
+ elsif cmp > 0
+ true
+ else
+ false
+ end
+ end
- # def >= other
- # cmp = self <=> other
- # if cmp.nil?
- # false
- # elsif cmp >= 0
- # true
- # else
- # false
- # end
- # end
+ # 15.3.3.2.5
+ def >= other
+ cmp = self <=> other
+ if cmp.nil?
+ false
+ elsif cmp >= 0
+ true
+ else
+ false
+ end
+ end
- # def between?(min,max)
- # if self < min or self > max
- # false
- # else
- # true
- # end
- # end
-# end
+ # 15.3.3.2.6
+ def between?(min,max)
+ if self < min or self > max
+ false
+ else
+ true
+ end
+ end
+end
diff --git a/src/compar.c b/src/compar.c
index bcd77867e..1502d450b 100644
--- a/src/compar.c
+++ b/src/compar.c
@@ -15,7 +15,6 @@ mrb_cmperr(mrb_state *mrb, mrb_value x, mrb_value y)
if (SPECIAL_CONST_P(y)) {
y = mrb_inspect(mrb, y);
- //classname = StringValuePtr(y);
classname = mrb_string_value_ptr(mrb, y);
}
else {
@@ -42,109 +41,8 @@ mrb_cmpint(mrb_state *mrb, mrb_value val, mrb_value a, mrb_value b)
return 0;
}
-static mrb_value
-cmp_equal(mrb_state *mrb, mrb_value x)
-{
- mrb_value y, c;
-
- /* *** TEMPORAL IMPLEMENT *** */
-
- mrb_get_args(mrb, "o", &y);
- if (mrb_obj_equal(mrb, x, y)) return mrb_true_value();
-
- c = mrb_funcall(mrb, x, "<=>", 1, y);
-
- if (mrb_cmpint(mrb, c, x, y) == 0) return mrb_true_value();
- return mrb_false_value();
-}
-
-#include <stdio.h>
-static mrb_value
-cmp_gt(mrb_state *mrb, mrb_value x, mrb_value y)
-{
- mrb_value c;
-
- c = mrb_funcall(mrb, x, "<=>", 1, y);
-
- if (mrb_cmpint(mrb, c, x, y) > 0) return mrb_true_value();
- return mrb_false_value();
-}
-
-static mrb_value
-cmp_gt_m(mrb_state *mrb, mrb_value x)
-{
- mrb_value y;
-
- mrb_get_args(mrb, "o", &y);
- return cmp_gt(mrb, x, y);
-}
-
-static mrb_value
-cmp_ge_m(mrb_state *mrb, mrb_value x)
-{
- mrb_value y, c;
-
- mrb_get_args(mrb, "o", &y);
- c = mrb_funcall(mrb, x, "<=>", 1, y);
-
- if (mrb_cmpint(mrb, c, x, y) >= 0) return mrb_true_value();
- return mrb_false_value();
-}
-
-static mrb_value
-cmp_lt(mrb_state *mrb, mrb_value x, mrb_value y)
-{
- mrb_value c;
-
- c = mrb_funcall(mrb, x, "<=>", 1, y);
-
- if (mrb_cmpint(mrb, c, x, y) < 0) return mrb_true_value();
- return mrb_false_value();
-}
-
-static mrb_value
-cmp_lt_m(mrb_state *mrb, mrb_value x)
-{
- mrb_value y;
-
- mrb_get_args(mrb, "o", &y);
- return cmp_lt(mrb, x, y);
-}
-
-static mrb_value
-cmp_le_m(mrb_state *mrb, mrb_value x)
-{
- mrb_value y, c;
-
- mrb_get_args(mrb, "o", &y);
- c = mrb_funcall(mrb, x, "<=>", 1, y);
-
- if (mrb_cmpint(mrb, c, x, y) <= 0) return mrb_true_value();
- return mrb_false_value();
-}
-
-static mrb_value
-cmp_between(mrb_state *mrb, mrb_value x)
-{
- mrb_value min, max;
-
- mrb_get_args(mrb, "oo", &min, &max);
-
- if (mrb_test(cmp_lt(mrb, x, min))) return mrb_false_value();
- if (mrb_test(cmp_gt(mrb, x, max))) return mrb_false_value();
- return mrb_true_value();
-}
-
void
mrb_init_comparable(mrb_state *mrb)
{
- struct RClass *comp;
-
- comp = mrb_define_module(mrb, "Comparable");
- mrb_define_method(mrb, comp, "<", cmp_lt_m, ARGS_REQ(1)); /* 15.3.3.2.1 */
- mrb_define_method(mrb, comp, "<=", cmp_le_m, ARGS_REQ(1)); /* 15.3.3.2.2 */
- mrb_define_method(mrb, comp, "==", cmp_equal, ARGS_REQ(1)); /* 15.3.3.2.3 */
- mrb_define_method(mrb, comp, ">", cmp_gt_m, ARGS_REQ(1)); /* 15.3.3.2.4 */
- mrb_define_method(mrb, comp, ">=", cmp_ge_m, ARGS_REQ(1)); /* 15.3.3.2.5 */
- mrb_define_method(mrb, comp, "between?", cmp_between, ARGS_REQ(2)); /* 15.3.3.2.6 */
+ mrb_define_module(mrb, "Comparable");
}