001package daikon.derive.unary;
002
003import daikon.ValueTuple;
004import daikon.VarInfo;
005import daikon.derive.Derivation;
006import daikon.derive.ValueAndModified;
007import org.checkerframework.dataflow.qual.Pure;
008import org.checkerframework.dataflow.qual.SideEffectFree;
009import org.plumelib.util.ArraysPlume;
010import org.plumelib.util.Intern;
011
012// like SequenceMin; if one changes, change the other, too
013public final class SequenceMax extends UnaryDerivation {
014  static final long serialVersionUID = 20020122L;
015
016  // Variables starting with dkconfig_ should only be set via the
017  // daikon.config.Configuration interface.
018  /** Boolean. True iff SequencesMax derived variables should be generated. */
019  public static boolean dkconfig_enabled = false;
020
021  public SequenceMax(VarInfo vi) {
022    super(vi);
023  }
024
025  @Override
026  public ValueAndModified computeValueAndModifiedImpl(ValueTuple vt) {
027    int source_mod = base.getModified(vt);
028    if (source_mod == ValueTuple.MISSING_NONSENSICAL) {
029      return ValueAndModified.MISSING_NONSENSICAL;
030    }
031    Object val = base.getValue(vt);
032    if (val == null) {
033      return ValueAndModified.MISSING_NONSENSICAL;
034    }
035    if (val instanceof long[]) {
036      long[] val_array = (long[]) val;
037      if (val_array.length == 0) {
038        return ValueAndModified.MISSING_NONSENSICAL;
039      }
040      return new ValueAndModified(Intern.internedLong(ArraysPlume.max(val_array)), source_mod);
041    } else if (val instanceof double[]) {
042      double[] val_array = (double[]) val;
043      if (val_array.length == 0) {
044        return ValueAndModified.MISSING_NONSENSICAL;
045      }
046      return new ValueAndModified(Intern.internedDouble(ArraysPlume.max(val_array)), source_mod);
047    } else {
048      return ValueAndModified.MISSING_NONSENSICAL;
049    }
050  }
051
052  @Override
053  protected VarInfo makeVarInfo() {
054    return VarInfo.make_scalar_seq_func("max", null, base, 0);
055  }
056
057  @Pure
058  @Override
059  public boolean isSameFormula(Derivation other) {
060    return (other instanceof SequenceMax);
061  }
062
063  @SideEffectFree
064  @Override
065  public String esc_name(String index) {
066    return String.format("max(%s)", base.esc_name());
067  }
068}