treeLeaf* innerNode::next(innerNode *node) { innerNode *parent; do { /* iterate through all children in order */ for (; node->iter_state < 4; ) { printf("node %p state %i\n", node, node->iter_state); switch (node->iter_state) { case 0: if (node->p_upperleft->getType() == TREELEAF) /* go upper left */ { printf("0 leaf found\n"); node->iter_state++; return (treeLeaf *)node->p_upperleft; } else { treeLeaf *leaf = ((innerNode *)node->p_upperleft)->next((innerNode *)node->p_upperleft); if(((innerNode *)node->p_upperleft)->iter_state == 4) node->iter_state++; return leaf; } case 1: if (node->p_upperright->getType() == TREELEAF) /* go upper right */ { printf("1 leaf found\n"); node->iter_state++; return (treeLeaf* )node->p_upperright; } else { treeLeaf *leaf = ((innerNode *)node->p_upperright)->next((innerNode *)node->p_upperright); if(((innerNode *)node->p_upperright)->iter_state == 4) node->iter_state++; return leaf; } case 2: if (node->p_downleft->getType() == TREELEAF) /* go down left */ { printf("2 leaf found\n"); node->iter_state++; return (treeLeaf* )node->p_downleft; } else { treeLeaf *leaf = ((innerNode *)node->p_downleft)->next((innerNode *)node->p_downleft); if(((innerNode *)node->p_downleft)->iter_state == 4) node->iter_state++; return leaf; } case 3: if (node->p_downright->getType() == TREELEAF) /* go down right */ { printf("3 leaf found\n"); node->iter_state++; return (treeLeaf* )node->p_downright; } else { treeLeaf *leaf = ((innerNode *)node->p_downright)->next((innerNode *)node->p_downright); if(((innerNode *)node->p_downright)->iter_state == 4) node->iter_state++; return leaf; } } } node->iter_state = 0; /* reset iter state */ } while ((node = (innerNode *)node->parent)); /* go to parent and continue at next child */ return NULL; }