001package daikon.derive.unary;
002
003import daikon.Daikon;
004import daikon.ProglangType;
005import daikon.VarInfo;
006import daikon.inv.OutputFormat;
007import java.util.ArrayList;
008import org.checkerframework.checker.nullness.qual.Nullable;
009
010public final class SequenceMinMaxSumFactory extends UnaryDerivationFactory {
011
012  @Override
013  public UnaryDerivation @Nullable [] instantiate(VarInfo vi) {
014    // System.out.println("SequenceMinMaxSumFactory.instantiate(" + vi.name + ")");
015
016    if (vi.rep_type != ProglangType.INT_ARRAY) {
017      return null;
018    }
019    if (!vi.type.isArray()) {
020      return null;
021    }
022    if (!vi.type.elementIsIntegral() && !vi.type.elementIsFloat()) {
023      return null;
024    }
025    if (vi.type.base() == "char") { // interned
026      return null;
027    }
028    // Should be reversed at some point; for now, will improve run time.
029    if (Daikon.output_format != OutputFormat.DAIKON) {
030      return null;
031    }
032
033    ArrayList<UnaryDerivation> result = new ArrayList<>(3);
034    if (SequenceMin.dkconfig_enabled) {
035      result.add(new SequenceMin(vi));
036    }
037    if (SequenceMax.dkconfig_enabled) {
038      result.add(new SequenceMax(vi));
039    }
040    if (SequenceSum.dkconfig_enabled) {
041      result.add(new SequenceSum(vi));
042    }
043
044    if (result.size() == 0) {
045      return null;
046    }
047
048    return result.toArray(new UnaryDerivation[0]);
049  }
050}