- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- Location:
- EcnlProtoTool/trunk/mruby-1.3.0
- Files:
-
- 1 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-range-ext/src/range.c
r321 r331 1 #include "mruby.h"2 #include "mruby/range.h"1 #include <mruby.h> 2 #include <mruby/range.h> 3 3 #include <math.h> 4 #include <float.h> 4 5 5 6 static mrb_bool … … 44 45 { 45 46 mrb_value val; 46 struct RRange *r = mrb_range_ptr( range);47 struct RRange *r = mrb_range_ptr(mrb, range); 47 48 mrb_value beg, end; 48 49 … … 68 69 /* 69 70 * call-seq: 70 * rng.first -> obj71 * rng.first(n) -> an_array72 *73 * Returns the first object in the range, or an array of the first +n+74 * elements.75 *76 * (10..20).first #=> 1077 * (10..20).first(3) #=> [10, 11, 12]78 */79 static mrb_value80 mrb_range_first(mrb_state *mrb, mrb_value range)81 {82 mrb_int num;83 mrb_value array;84 struct RRange *r = mrb_range_ptr(range);85 86 if (mrb_get_args(mrb, "|i", &num) == 0) {87 return r->edges->beg;88 }89 90 array = mrb_funcall(mrb, range, "to_a", 0);91 return mrb_funcall(mrb, array, "first", 1, mrb_fixnum_value(num));92 }93 94 /*95 * call-seq:96 71 * rng.last -> obj 97 72 * rng.last(n) -> an_array … … 113 88 mrb_value num; 114 89 mrb_value array; 115 struct RRange *r = mrb_range_ptr( range);90 struct RRange *r = mrb_range_ptr(mrb, range); 116 91 117 92 if (mrb_get_args(mrb, "|o", &num) == 0) { … … 137 112 mrb_range_size(mrb_state *mrb, mrb_value range) 138 113 { 139 struct RRange *r = mrb_range_ptr( range);114 struct RRange *r = mrb_range_ptr(mrb, range); 140 115 mrb_value beg, end; 141 doublebeg_f, end_f;116 mrb_float beg_f, end_f; 142 117 mrb_bool num_p = TRUE; 118 mrb_bool excl; 143 119 144 120 beg = r->edges->beg; 145 121 end = r->edges->end; 122 excl = r->excl; 146 123 if (mrb_fixnum_p(beg)) { 147 beg_f = ( double)mrb_fixnum(beg);124 beg_f = (mrb_float)mrb_fixnum(beg); 148 125 } 149 126 else if (mrb_float_p(beg)) { … … 154 131 } 155 132 if (mrb_fixnum_p(end)) { 156 end_f = ( double)mrb_fixnum(end);133 end_f = (mrb_float)mrb_fixnum(end); 157 134 } 158 135 else if (mrb_float_p(end)) { … … 163 140 } 164 141 if (num_p) { 165 double f; 142 mrb_float n = end_f - beg_f; 143 mrb_float err = (fabs(beg_f) + fabs(end_f) + fabs(end_f-beg_f)) * MRB_FLOAT_EPSILON; 166 144 167 if (beg_f > end_f) return mrb_fixnum_value(0); 168 f = end_f - beg_f; 169 if (!r->excl) { 170 return mrb_fixnum_value((mrb_int)ceil(f + 1)); 145 if (err>0.5) err=0.5; 146 if (excl) { 147 if (n<=0) return mrb_fixnum_value(0); 148 if (n<1) 149 n = 0; 150 else 151 n = floor(n - err); 171 152 } 172 return mrb_fixnum_value((mrb_int)ceil(f)); 153 else { 154 if (n<0) return mrb_fixnum_value(0); 155 n = floor(n + err); 156 } 157 if (isinf(n+1)) 158 return mrb_float_value(mrb, INFINITY); 159 return mrb_fixnum_value((mrb_int)n+1); 173 160 } 174 161 return mrb_nil_value(); … … 181 168 182 169 mrb_define_method(mrb, s, "cover?", mrb_range_cover, MRB_ARGS_REQ(1)); 183 mrb_define_method(mrb, s, "first", mrb_range_first, MRB_ARGS_OPT(1));184 170 mrb_define_method(mrb, s, "last", mrb_range_last, MRB_ARGS_OPT(1)); 185 171 mrb_define_method(mrb, s, "size", mrb_range_size, MRB_ARGS_NONE());
Note:
See TracChangeset
for help on using the changeset viewer.