summaryrefslogtreecommitdiff
path: root/src/iter.c
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2015-02-12 14:23:35 -0500
committerAdrian Thurston <thurston@complang.org>2015-02-12 14:23:35 -0500
commit5e5ae85e1e6f6193e1a913699bda1856f9b83112 (patch)
treec51b53c33ad3e476c1c66fc26dabe1dd35863839 /src/iter.c
parent5c20c54c78a16050f65cbf3073536469fc9c78ed (diff)
downloadcolm-5e5ae85e1e6f6193e1a913699bda1856f9b83112.tar.gz
added map_iter, for iterating map elements
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 1fc0ffdc..31632b1a 100644
--- a/src/iter.c
+++ b/src/iter.c
@@ -88,6 +88,37 @@ Tree *colm_list_iter_advance( Program *prg, Tree ***psp, ListIter *iter )
return (iter->ref.kid ? prg->trueVal : prg->falseVal );
}
+Tree *colm_map_iter_advance( Program *prg, Tree ***psp, ListIter *iter )
+{
+ Tree **sp = *psp;
+ assert( iter->yieldSize == (vm_ssize() - iter->rootSize) );
+
+ if ( iter->ref.kid == 0 ) {
+ /* Kid is zero, start from the root. */
+ Map *map = *((Map**)iter->rootRef.kid);
+ iter->ref.kid = map->head;
+ 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 );
+
+ MapEl *mapEl = iter->ref.kid;
+ mapEl = mapEl->next;
+ iter->ref.kid = mapEl;
+ iter->ref.next = 0;
+ }
+
+ sp = *psp;
+ iter->yieldSize = vm_ssize() - iter->rootSize;
+
+ return (iter->ref.kid ? prg->trueVal : prg->falseVal );
+}
+
Tree *colm_list_iter_deref_cur( Program *prg, ListIter *iter )
{
GenericInfo *gi = &prg->rtd->genericInfo[iter->genericId];