iter_get_next_root(struct iter_hints* hints, struct iter_forwards* fwd,
	uint16_t* c)
{
	uint16_t c1 = *c, c2 = *c;
	int r1 = hints_next_root(hints, &c1);
	int r2 = forwards_next_root(fwd, &c2);
	if(!r1 && !r2) /* got none, end of list */
		return 0;
	else if(!r1) /* got one, return that */
		*c = c2;
	else if(!r2)
		*c = c1;
	else if(c1 < c2) /* got both take smallest */
		*c = c1;
	else	*c = c2;
	return 1;
}
iter_get_next_root(struct iter_hints* hints, struct iter_forwards* fwd,
	uint16_t* c)
{
	uint16_t c1 = *c, c2 = *c;
	int r1 = hints_next_root(hints, &c1);
	int r2 = forwards_next_root(fwd, &c2);
	if(!r1 && !r2)  
		return 0;
	else if(!r1)  
		*c = c2;
	else if(!r2)
		*c = c1;
	else if(c1 < c2)  
		*c = c1;
	else	*c = c2;
	return 1;
}