in src/main/java/net/hydromatic/linq4j/CartesianProductEnumerator.java [43:80]
public boolean moveNext() {
if (first) {
if (enumerators.isEmpty()) {
return false;
}
int i = 0;
for (Enumerator<T> enumerator : enumerators) {
if (!enumerator.moveNext()) {
return false;
}
elements[i++] = enumerator.current();
}
first = false;
return true;
}
int ordinal = enumerators.size() - 1;
for (;;) {
final Enumerator<T> enumerator = enumerators.get(ordinal);
if (enumerator.moveNext()) {
elements[ordinal] = enumerator.current();
return true;
}
// Move back to first element.
enumerator.reset();
if (!enumerator.moveNext()) {
// Very strange... this was empty all along.
return false;
}
elements[ordinal] = enumerator.current();
// Advance higher rank enumerator.
if (ordinal == 0) {
return false;
}
--ordinal;
}
}