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.plumelib.util.Intern;
009
010public final class SequenceSum extends UnaryDerivation {
011  // We are Serializable, so we specify a version to allow changes to
012  // method signatures without breaking serialization.  If you add or
013  // remove fields, you should change this number to the current date.
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 SequenceSum derived variables should be generated. */
019  public static boolean dkconfig_enabled = false;
020
021  public SequenceSum(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      long result = 0;
038      for (int i = 0; i < val_array.length; i++) {
039        result += val_array[i];
040      }
041      return new ValueAndModified(Intern.internedLong(result), source_mod);
042    } else if (val instanceof double[]) {
043      double[] val_array = (double[]) val;
044      double result = 0;
045      for (int i = 0; i < val_array.length; i++) {
046        result += val_array[i];
047      }
048      return new ValueAndModified(Intern.internedDouble(result), source_mod);
049
050    } else {
051      return ValueAndModified.MISSING_NONSENSICAL;
052    }
053  }
054
055  @Override
056  protected VarInfo makeVarInfo() {
057    return VarInfo.make_scalar_seq_func("sum", null, base, 0);
058  }
059
060  @Pure
061  @Override
062  public boolean isSameFormula(Derivation other) {
063    return (other instanceof SequenceSum);
064  }
065}