- Timestamp:
- Jul 9, 2020, 8:51:43 AM (4 years ago)
- 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 2 2 #include <mruby/range.h> 3 3 #include <math.h> 4 #include <float.h>5 4 6 5 static mrb_bool 7 6 r_le(mrb_state *mrb, mrb_value a, mrb_value b) 8 7 { 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); 11 9 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; 17 11 return FALSE; 18 12 } … … 21 15 r_lt(mrb_state *mrb, mrb_value a, mrb_value b) 22 16 { 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; 27 18 } 28 19 … … 42 33 */ 43 34 static mrb_value 44 mrb_range_cover(mrb_state *mrb, mrb_value range)35 range_cover(mrb_state *mrb, mrb_value range) 45 36 { 46 37 mrb_value val; … … 50 41 mrb_get_args(mrb, "o", &val); 51 42 52 beg = r->edges->beg;53 end = r->edges->end;43 beg = RANGE_BEG(r); 44 end = RANGE_END(r); 54 45 55 46 if (r_le(mrb, beg, val)) { 56 if ( r->excl) {47 if (RANGE_EXCL(r)) { 57 48 if (r_lt(mrb, val, end)) 58 49 return mrb_true_value(); … … 84 75 */ 85 76 static mrb_value 86 mrb_range_last(mrb_state *mrb, mrb_value range)77 range_last(mrb_state *mrb, mrb_value range) 87 78 { 88 79 mrb_value num; 89 80 mrb_value array; 90 struct RRange *r = mrb_range_ptr(mrb, range);91 81 92 82 if (mrb_get_args(mrb, "|o", &num) == 0) { 93 return r->edges->end;83 return mrb_range_end(mrb, range); 94 84 } 95 85 … … 109 99 */ 110 100 101 #ifndef MRB_WITHOUT_FLOAT 111 102 static mrb_value 112 mrb_range_size(mrb_state *mrb, mrb_value range)103 range_size(mrb_state *mrb, mrb_value range) 113 104 { 114 105 struct RRange *r = mrb_range_ptr(mrb, range); … … 118 109 mrb_bool excl; 119 110 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); 123 114 if (mrb_fixnum_p(beg)) { 124 115 beg_f = (mrb_float)mrb_fixnum(beg); … … 161 152 return mrb_nil_value(); 162 153 } 154 #else 155 static mrb_value 156 range_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 */ 163 176 164 177 void … … 167 180 struct RClass * s = mrb_class_get(mrb, "Range"); 168 181 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()); 172 185 } 173 186
Note:
See TracChangeset
for help on using the changeset viewer.