public boolean moveNext()

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;
    }
  }