Ignore:
Timestamp:
Jul 9, 2020, 8:51:43 AM (4 years ago)
Author:
coas-nagasima
Message:

mrubyを2.1.1に更新

Location:
EcnlProtoTool/trunk/mruby-2.1.1
Files:
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-range-ext/src/range.c

    r331 r439  
    22#include <mruby/range.h>
    33#include <math.h>
    4 #include <float.h>
    54
    65static mrb_bool
    76r_le(mrb_state *mrb, mrb_value a, mrb_value b)
    87{
    9   mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */
    10   /* output :a < b => -1, a = b =>  0, a > b => +1 */
     8  mrb_int n = mrb_cmp(mrb, a, b);
    119
    12   if (mrb_fixnum_p(r)) {
    13     mrb_int c = mrb_fixnum(r);
    14     if (c == 0 || c == -1) return TRUE;
    15   }
    16 
     10  if (n == 0 || n == -1) return TRUE;
    1711  return FALSE;
    1812}
     
    2115r_lt(mrb_state *mrb, mrb_value a, mrb_value b)
    2216{
    23   mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b);
    24   /* output :a < b => -1, a = b =>  0, a > b => +1 */
    25 
    26   return mrb_fixnum_p(r) && mrb_fixnum(r) == -1;
     17  return mrb_cmp(mrb, a, b) == -1;
    2718}
    2819
     
    4233 */
    4334static mrb_value
    44 mrb_range_cover(mrb_state *mrb, mrb_value range)
     35range_cover(mrb_state *mrb, mrb_value range)
    4536{
    4637  mrb_value val;
     
    5041  mrb_get_args(mrb, "o", &val);
    5142
    52   beg = r->edges->beg;
    53   end = r->edges->end;
     43  beg = RANGE_BEG(r);
     44  end = RANGE_END(r);
    5445
    5546  if (r_le(mrb, beg, val)) {
    56     if (r->excl) {
     47    if (RANGE_EXCL(r)) {
    5748      if (r_lt(mrb, val, end))
    5849        return mrb_true_value();
     
    8475 */
    8576static mrb_value
    86 mrb_range_last(mrb_state *mrb, mrb_value range)
     77range_last(mrb_state *mrb, mrb_value range)
    8778{
    8879  mrb_value num;
    8980  mrb_value array;
    90   struct RRange *r = mrb_range_ptr(mrb, range);
    9181
    9282  if (mrb_get_args(mrb, "|o", &num) == 0) {
    93     return r->edges->end;
     83    return mrb_range_end(mrb, range);
    9484  }
    9585
     
    10999 */
    110100
     101#ifndef MRB_WITHOUT_FLOAT
    111102static mrb_value
    112 mrb_range_size(mrb_state *mrb, mrb_value range)
     103range_size(mrb_state *mrb, mrb_value range)
    113104{
    114105  struct RRange *r = mrb_range_ptr(mrb, range);
     
    118109  mrb_bool excl;
    119110
    120   beg = r->edges->beg;
    121   end = r->edges->end;
    122   excl = r->excl;
     111  beg = RANGE_BEG(r);
     112  end = RANGE_END(r);
     113  excl = RANGE_EXCL(r);
    123114  if (mrb_fixnum_p(beg)) {
    124115    beg_f = (mrb_float)mrb_fixnum(beg);
     
    161152  return mrb_nil_value();
    162153}
     154#else
     155static mrb_value
     156range_size(mrb_state *mrb, mrb_value range)
     157{
     158  struct RRange *r = mrb_range_ptr(mrb, range);
     159  mrb_value beg, end;
     160  mrb_int excl;
     161
     162  beg = RANGE_BEG(r);
     163  end = RANGE_END(r);
     164  excl = RANGE_EXCL(r) ? 0 : 1;
     165
     166  if (mrb_fixnum_p(beg) && mrb_fixnum_p(end)) {
     167    mrb_int a = mrb_fixnum(beg);
     168    mrb_int b = mrb_fixnum(end);
     169    mrb_int c = b - a + excl;
     170
     171    return mrb_fixnum_value(c);
     172  }
     173  return mrb_nil_value();
     174}
     175#endif /* MRB_WITHOUT_FLOAT */
    163176
    164177void
     
    167180  struct RClass * s = mrb_class_get(mrb, "Range");
    168181
    169   mrb_define_method(mrb, s, "cover?", mrb_range_cover, MRB_ARGS_REQ(1));
    170   mrb_define_method(mrb, s, "last",   mrb_range_last,  MRB_ARGS_OPT(1));
    171   mrb_define_method(mrb, s, "size",   mrb_range_size,  MRB_ARGS_NONE());
     182  mrb_define_method(mrb, s, "cover?", range_cover, MRB_ARGS_REQ(1));
     183  mrb_define_method(mrb, s, "last",   range_last,  MRB_ARGS_OPT(1));
     184  mrb_define_method(mrb, s, "size",   range_size,  MRB_ARGS_NONE());
    172185}
    173186
Note: See TracChangeset for help on using the changeset viewer.