diff options
author | Adrian Thurston <thurston@complang.org> | 2015-02-12 14:23:35 -0500 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2015-02-12 14:23:35 -0500 |
commit | 5e5ae85e1e6f6193e1a913699bda1856f9b83112 (patch) | |
tree | c51b53c33ad3e476c1c66fc26dabe1dd35863839 /src/iter.c | |
parent | 5c20c54c78a16050f65cbf3073536469fc9c78ed (diff) | |
download | colm-5e5ae85e1e6f6193e1a913699bda1856f9b83112.tar.gz |
added map_iter, for iterating map elements
Diffstat (limited to 'src/iter.c')
-rw-r--r-- | src/iter.c | 31 |
1 files changed, 31 insertions, 0 deletions
@@ -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]; |