summaryrefslogtreecommitdiff
path: root/src/iter.c
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2015-06-05 10:26:36 -0400
committerAdrian Thurston <thurston@complang.org>2015-06-05 10:26:36 -0400
commitdb0fd98a4f646abef622684d4228d879a933cbce (patch)
treeb8a7662b964b597ae91e05dae7247caf2d5afe27 /src/iter.c
parent009deb74e036c25053246ce9b8a21069f8440834 (diff)
downloadcolm-db0fd98a4f646abef622684d4228d879a933cbce.tar.gz
more of the vlist implementation .. moved all test cases to vlist
Diffstat (limited to 'src/iter.c')
-rw-r--r--src/iter.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/iter.c b/src/iter.c
index ef7490ff..368dce26 100644
--- a/src/iter.c
+++ b/src/iter.c
@@ -88,6 +88,37 @@ tree_t *colm_list_iter_advance( program_t *prg, tree_t ***psp, generic_iter_t *i
return (iter->ref.kid ? prg->true_val : prg->false_val );
}
+tree_t *colm_rev_list_iter_advance( program_t *prg, tree_t ***psp, generic_iter_t *iter )
+{
+ tree_t **sp = *psp;
+ assert( iter->yield_size == (vm_ssize() - iter->root_size) );
+
+ if ( iter->ref.kid == 0 ) {
+ /* kid_t is zero, start from the root. */
+ list_t *list = *((list_t**)iter->root_ref.kid);
+ iter->ref.kid = (kid_t*)list->tail;
+ iter->ref.next = 0;
+
+ //= iter->rootRef;
+ //iter
+ //iterFind( prg, psp, iter, true );
+ }
+ else {
+ /* Have a previous item, continue searching from there. */
+ //iterFind( prg, psp, iter, false );
+
+ list_el_t *list_el = (list_el_t*)iter->ref.kid;
+ list_el = list_el->list_prev;
+ iter->ref.kid = (kid_t*)list_el;
+ iter->ref.next = 0;
+ }
+
+ sp = *psp;
+ iter->yield_size = vm_ssize() - iter->root_size;
+
+ return (iter->ref.kid ? prg->true_val : prg->false_val );
+}
+
tree_t *colm_map_iter_advance( program_t *prg, tree_t ***psp, generic_iter_t *iter )
{
tree_t **sp = *psp;