diff options
-rw-r--r-- | lib.c | 72 | ||||
-rw-r--r-- | tests/012/iter.tl | 23 |
2 files changed, 71 insertions, 24 deletions
@@ -529,7 +529,7 @@ static int seq_iter_peek_range_chr(seq_iter_t *it, val *pval) return 0; } -static int seq_iter_get_range_bignum(seq_iter_t *it, val *pval) +static int seq_iter_get_range_number(seq_iter_t *it, val *pval) { if (lt(it->ui.vn, it->ul.vbound)) { *pval = it->ui.iter; @@ -539,7 +539,7 @@ static int seq_iter_get_range_bignum(seq_iter_t *it, val *pval) return 0; } -static int seq_iter_peek_range_bignum(seq_iter_t *it, val *pval) +static int seq_iter_peek_range_number(seq_iter_t *it, val *pval) { if (lt(it->ui.vn, it->ul.vbound)) { *pval = it->ui.iter; @@ -620,7 +620,7 @@ static int seq_iter_peek_rev_range_chr(seq_iter_t *it, val *pval) return 0; } -static int seq_iter_get_rev_range_bignum(seq_iter_t *it, val *pval) +static int seq_iter_get_rev_range_number(seq_iter_t *it, val *pval) { if (gt(it->ui.vn, it->ul.vbound)) { *pval = it->ui.iter = pred(it->ui.iter); @@ -629,7 +629,7 @@ static int seq_iter_get_rev_range_bignum(seq_iter_t *it, val *pval) return 0; } -static int seq_iter_peek_rev_range_bignum(seq_iter_t *it, val *pval) +static int seq_iter_peek_rev_range_number(seq_iter_t *it, val *pval) { if (gt(it->ui.vn, it->ul.vbound)) { *pval = pred(it->ui.iter); @@ -892,9 +892,9 @@ struct seq_iter_ops si_range_chr_ops = seq_iter_ops_init_nomark(seq_iter_get_range_chr, seq_iter_peek_range_chr); -struct seq_iter_ops si_range_bignum_ops = - seq_iter_ops_init(seq_iter_get_range_bignum, - seq_iter_peek_range_bignum); +struct seq_iter_ops si_range_number_ops = + seq_iter_ops_init(seq_iter_get_range_number, + seq_iter_peek_range_number); struct seq_iter_ops si_range_str_ops = seq_iter_ops_init(seq_iter_get_range_str, @@ -908,9 +908,9 @@ struct seq_iter_ops si_rev_range_chr_ops = seq_iter_ops_init_nomark(seq_iter_get_rev_range_chr, seq_iter_peek_rev_range_chr); -struct seq_iter_ops si_rev_range_bignum_ops = - seq_iter_ops_init(seq_iter_get_rev_range_bignum, - seq_iter_peek_rev_range_bignum); +struct seq_iter_ops si_rev_range_number_ops = + seq_iter_ops_init(seq_iter_get_rev_range_number, + seq_iter_peek_rev_range_number); struct seq_iter_ops si_rev_range_str_ops = seq_iter_ops_init(seq_iter_get_rev_range_str, @@ -946,14 +946,22 @@ void seq_iter_init_with_info(val self, seq_iter_t *it, if (less(rf, rt)) switch (type(rf)) { case NUM: - if (bignump(rt) && !mp_in_intptr_range(mp(rt))) { + num_range_fwd: + switch (type(rt)) { + case BGNUM: + if (mp_in_intptr_range(mp(rt))) { + case NUM: + it->ui.cn = c_num(rf, self); + it->ul.cbound = c_num(rt, self); + it->ops = &si_range_cnum_ops; + break; + } + /* fallthrough */ + default: it->ui.vn = rf; it->ul.vbound = rt; - it->ops = &si_range_bignum_ops; - } else { - it->ui.cn = c_num(rf, self); - it->ul.cbound = c_num(rt, self); - it->ops = &si_range_cnum_ops; + it->ops = &si_range_number_ops; + break; } break; case CHR: @@ -962,9 +970,13 @@ void seq_iter_init_with_info(val self, seq_iter_t *it, it->ops = &si_range_chr_ops; break; case BGNUM: + if (mp_in_intptr_range(mp(rf))) + goto num_range_fwd; + /* fallthrough */ + case FLNUM: it->ui.vn = rf; it->ul.vbound = rt; - it->ops = &si_range_bignum_ops; + it->ops = &si_range_number_ops; break; case LIT: case STR: @@ -979,14 +991,22 @@ void seq_iter_init_with_info(val self, seq_iter_t *it, unsup_obj(self, it->inf.obj); } else if (!equal(rf, rt)) switch (type(rf)) { case NUM: - if (bignump(rt) && !mp_in_intptr_range(mp(rt))) { + num_range_rev: + switch (type(rt)) { + case BGNUM: + if (mp_in_intptr_range(mp(rt))) { + case NUM: + it->ui.cn = c_num(rf, self); + it->ul.cbound = c_num(rt, self); + it->ops = &si_rev_range_cnum_ops; + break; + } + /* fallthrough */ + default: it->ui.vn = rf; it->ul.vbound = rt; - it->ops = &si_rev_range_bignum_ops; - } else { - it->ui.cn = c_num(rf, self); - it->ul.cbound = c_num(rt, self); - it->ops = &si_rev_range_cnum_ops; + it->ops = &si_rev_range_number_ops; + break; } break; case CHR: @@ -995,9 +1015,13 @@ void seq_iter_init_with_info(val self, seq_iter_t *it, it->ops = &si_rev_range_chr_ops; break; case BGNUM: + if (mp_in_intptr_range(mp(rf))) + goto num_range_rev; + /* fallthrough */ + case FLNUM: it->ui.vn = rf; it->ul.vbound = rt; - it->ops = &si_rev_range_bignum_ops; + it->ops = &si_rev_range_number_ops; break; case LIT: case STR: diff --git a/tests/012/iter.tl b/tests/012/iter.tl index 051368b3..9b1db6f5 100644 --- a/tests/012/iter.tl +++ b/tests/012/iter.tl @@ -67,3 +67,26 @@ (let ((big (* fixnum-max 8))) (test (progn (each ((x big..(+ 10 big))) (sys:gc)) 42) 42)) + +(mtest + (list-seq 0..5) (0 1 2 3 4) + (list-seq 5..0) (4 3 2 1 0) + (list-seq 0..5.0) (0 1 2 3 4) + (list-seq 5..0.0) (4 3 2 1 0) + (list-seq 0.0..5.0) (0.0 1.0 2.0 3.0 4.0) + (list-seq 5.0..0.0) (4.0 3.0 2.0 1.0 0.0) + (list-seq 0.0..5) (0.0 1.0 2.0 3.0 4.0) + (list-seq 5.0..0) (4.0 3.0 2.0 1.0 0.0) + (list-seq 0.0..5.1) (0.0 1.0 2.0 3.0 4.0 5.0) + (list-seq 0.5..5) (0.5 1.5 2.5 3.5 4.5) + (list-seq (expt 2 256)..(ssucc (expt 2 256))) + (115792089237316195423570985008687907853269984665640564039457584007913129639936 + 115792089237316195423570985008687907853269984665640564039457584007913129639937) + (list-seq (expt 2 256)..(ppred (expt 2 256))) + (115792089237316195423570985008687907853269984665640564039457584007913129639935 + 115792089237316195423570985008687907853269984665640564039457584007913129639934) + (take 3 (list-seq (expt 2 256)..0)) + (115792089237316195423570985008687907853269984665640564039457584007913129639935 + 115792089237316195423570985008687907853269984665640564039457584007913129639934 + 115792089237316195423570985008687907853269984665640564039457584007913129639933)) + |