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}