diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2020-07-06 06:14:06 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2020-07-06 06:14:06 -0700 |
commit | dbd485c6bd828e112b0237ed60410b172a19183b (patch) | |
tree | d28e77607491ee5781074c48c82f393967384953 /lib.c | |
parent | 6c9d1315ca6da5f3b5d365d952259480be5b7e58 (diff) | |
download | txr-dbd485c6bd828e112b0237ed60410b172a19183b.tar.gz txr-dbd485c6bd828e112b0237ed60410b172a19183b.tar.bz2 txr-dbd485c6bd828e112b0237ed60410b172a19183b.zip |
seq_iter: reverse order of some tests.
* lib.c (seq_iter_rewind, seq_iter_init_with_info): Reverse
the order in which we perform some type tests. We check for
some special types first, and then for the sequence kind.
These situations are mutually exclusive now, so the order
doesn't matter. The plan is to introduce the ability for a
structure object to be iterable with special methods. Such an
object won't necessarily be a sequence (seq_info may identify
it as SEQ_NOTSEQ). This code will be prepared for it becuase
it's now checking for the type first, before the sequence
kind.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 260 |
1 files changed, 129 insertions, 131 deletions
@@ -577,52 +577,51 @@ val seq_geti(seq_iter_t *it) static void seq_iter_rewind(seq_iter_t *it, val self) { - switch (it->inf.kind) { - case SEQ_NIL: - it->ui.iter = nil; - break; - case SEQ_LISTLIKE: - it->ui.iter = it->inf.obj; + switch (it->inf.type) { + case RNG: + { + val rf = from(it->inf.obj); + + switch (type(rf)) { + case NUM: + it->ui.cn = c_num(rf, self); + break; + case CHR: + it->ui.cn = c_chr(rf); + break; + case BGNUM: + it->ui.vn = rf; + break; + default: + break; + } + } break; - case SEQ_VECLIKE: - it->ui.index = 0; + case CHR: + it->ui.cn = c_chr(it->inf.obj); break; - case SEQ_HASHLIKE: - it->ui.iter = hash_begin(it->inf.obj); + case NUM: + case BGNUM: + case FLNUM: + it->ui.vn = it->inf.obj; break; default: - switch (it->inf.type) { - case RNG: - { - val rf = from(it->inf.obj); - - switch (type(rf)) { - case NUM: - it->ui.cn = c_num(rf, self); - break; - case CHR: - it->ui.cn = c_chr(rf); - break; - case BGNUM: - it->ui.vn = rf; - break; - default: - break; - } - } + switch (it->inf.kind) { + case SEQ_NIL: + it->ui.iter = nil; break; - case CHR: - it->ui.cn = c_chr(it->inf.obj); + case SEQ_LISTLIKE: + it->ui.iter = it->inf.obj; break; - case NUM: - case BGNUM: - case FLNUM: - it->ui.vn = it->inf.obj; + case SEQ_VECLIKE: + it->ui.index = 0; + break; + case SEQ_HASHLIKE: + it->ui.iter = hash_begin(it->inf.obj); break; default: break; } - break; } } @@ -631,111 +630,110 @@ static void seq_iter_init_with_info(val self, seq_iter_t *it, { it->inf = si; - switch (it->inf.kind) { - case SEQ_NIL: - it->ui.iter = nil; - it->ul.len = 0; - it->get = seq_iter_get_nil; - it->peek = seq_iter_peek_nil; - break; - case SEQ_LISTLIKE: - it->ui.iter = it->inf.obj; - it->ul.len = 0; - it->get = seq_iter_get_list; - it->peek = seq_iter_peek_list; - if (!support_rewind) - it->inf.obj = nil; + switch (it->inf.type) { + case RNG: + { + val rf = from(it->inf.obj); + val rt = to(it->inf.obj); + + if (rt == colon_k || rt == t) { + seq_iter_init_with_info(self, it, seq_info(rf), support_rewind); + break; + } + + if (lt(rf, rt)) switch (type(rf)) { + case NUM: + it->ui.cn = c_num(rf, self); + it->ul.cbound = c_num(rt, self); + it->get = seq_iter_get_range_cnum; + it->peek = seq_iter_peek_range_cnum; + break; + case CHR: + it->ui.cn = c_chr(rf); + it->ul.cbound = c_chr(rt); + it->get = seq_iter_get_range_chr; + it->peek = seq_iter_peek_range_chr; + break; + case BGNUM: + it->ui.vn = rf; + it->ul.vbound = rt; + it->get = seq_iter_get_range_bignum; + it->peek = seq_iter_peek_range_bignum; + break; + default: + unsup_obj(self, it->inf.obj); + } else if (gt(rf, rt)) switch (type(rf)) { + case NUM: + it->ui.cn = c_num(rf, self); + it->ul.cbound = c_num(rt, self); + it->get = seq_iter_get_rev_range_cnum; + it->peek = seq_iter_peek_rev_range_cnum; + break; + case CHR: + it->ui.cn = c_chr(rf); + it->ul.cbound = c_chr(rt); + it->get = seq_iter_get_rev_range_chr; + it->peek = seq_iter_peek_rev_range_chr; + break; + case BGNUM: + it->ui.vn = rf; + it->ul.vbound = rt; + it->get = seq_iter_get_rev_range_bignum; + it->peek = seq_iter_peek_rev_range_bignum; + break; + default: + unsup_obj(self, it->inf.obj); + } else { + seq_iter_init_with_info(self, it, seq_info(nil), support_rewind); + break; + } + } break; - case SEQ_VECLIKE: - it->ui.index = 0; - it->ul.len = c_num(length(it->inf.obj), self); - it->get = seq_iter_get_vec; - it->peek = seq_iter_peek_vec; + case CHR: + it->ui.cn = c_chr(it->inf.obj); + it->ul.cbound = 0; + it->get = seq_iter_get_chr; + it->peek = seq_iter_peek_chr; break; - case SEQ_HASHLIKE: - it->ui.iter = hash_begin(it->inf.obj); - it->ul.len = 0; - it->get = seq_iter_get_hash; - it->peek = seq_iter_peek_hash; + case NUM: + case BGNUM: + case FLNUM: + it->ui.vn = it->inf.obj; + it->ul.vbound = nil; + it->get = seq_iter_get_num; + it->peek = seq_iter_peek_num; break; default: - switch (it->inf.type) { - case RNG: - { - val rf = from(it->inf.obj); - val rt = to(it->inf.obj); - - if (rt == colon_k || rt == t) { - seq_iter_init_with_info(self, it, seq_info(rf), support_rewind); - break; - } - - if (lt(rf, rt)) switch (type(rf)) { - case NUM: - it->ui.cn = c_num(rf, self); - it->ul.cbound = c_num(rt, self); - it->get = seq_iter_get_range_cnum; - it->peek = seq_iter_peek_range_cnum; - break; - case CHR: - it->ui.cn = c_chr(rf); - it->ul.cbound = c_chr(rt); - it->get = seq_iter_get_range_chr; - it->peek = seq_iter_peek_range_chr; - break; - case BGNUM: - it->ui.vn = rf; - it->ul.vbound = rt; - it->get = seq_iter_get_range_bignum; - it->peek = seq_iter_peek_range_bignum; - break; - default: - unsup_obj(self, it->inf.obj); - } else if (gt(rf, rt)) switch (type(rf)) { - case NUM: - it->ui.cn = c_num(rf, self); - it->ul.cbound = c_num(rt, self); - it->get = seq_iter_get_rev_range_cnum; - it->peek = seq_iter_peek_rev_range_cnum; - break; - case CHR: - it->ui.cn = c_chr(rf); - it->ul.cbound = c_chr(rt); - it->get = seq_iter_get_rev_range_chr; - it->peek = seq_iter_peek_rev_range_chr; - break; - case BGNUM: - it->ui.vn = rf; - it->ul.vbound = rt; - it->get = seq_iter_get_rev_range_bignum; - it->peek = seq_iter_peek_rev_range_bignum; - break; - default: - unsup_obj(self, it->inf.obj); - } else { - seq_iter_init_with_info(self, it, seq_info(nil), support_rewind); - break; - } - } + switch (it->inf.kind) { + case SEQ_NIL: + it->ui.iter = nil; + it->ul.len = 0; + it->get = seq_iter_get_nil; + it->peek = seq_iter_peek_nil; break; - case CHR: - it->ui.cn = c_chr(it->inf.obj); - it->ul.cbound = 0; - it->get = seq_iter_get_chr; - it->peek = seq_iter_peek_chr; + case SEQ_LISTLIKE: + it->ui.iter = it->inf.obj; + it->ul.len = 0; + it->get = seq_iter_get_list; + it->peek = seq_iter_peek_list; + if (!support_rewind) + it->inf.obj = nil; break; - case NUM: - case BGNUM: - case FLNUM: - it->ui.vn = it->inf.obj; - it->ul.vbound = nil; - it->get = seq_iter_get_num; - it->peek = seq_iter_peek_num; + case SEQ_VECLIKE: + it->ui.index = 0; + it->ul.len = c_num(length(it->inf.obj), self); + it->get = seq_iter_get_vec; + it->peek = seq_iter_peek_vec; + break; + case SEQ_HASHLIKE: + it->ui.iter = hash_begin(it->inf.obj); + it->ul.len = 0; + it->get = seq_iter_get_hash; + it->peek = seq_iter_peek_hash; break; default: unsup_obj(self, it->inf.obj); } - break; } } |