public override void Update(object[] expressions, IErrorContext iErrorContext) { Global.Tracer.Assert(null != expressions); Global.Tracer.Assert(1 == expressions.Length); object obj = expressions[0]; DataTypeCode typeCode = DataAggregate.GetTypeCode(obj); if (!DataAggregate.IsNull(typeCode)) { if (!DataTypeUtility.IsNumeric(typeCode)) { iErrorContext.Register(ProcessingErrorCode.rsAggregateOfNonNumericData, Severity.Warning); throw new InvalidOperationException(); } if (this.m_expressionType == DataTypeCode.Null) { this.m_expressionType = typeCode; } else if (typeCode != this.m_expressionType) { iErrorContext.Register(ProcessingErrorCode.rsAggregateOfMixedDataTypes, Severity.Warning); throw new InvalidOperationException(); } DataAggregate.ConvertToDoubleOrDecimal(typeCode, obj, out typeCode, out obj); if (this.m_currentTotal == null) { this.m_currentTotalType = typeCode; this.m_currentTotal = obj; } else { this.m_currentTotal = DataAggregate.Add(this.m_currentTotalType, this.m_currentTotal, typeCode, obj); } } }
public static DataAggregate.DataTypeCode CommonNumericDenominator(DataAggregate.DataTypeCode x, DataAggregate.DataTypeCode y) { if (DataTypeUtility.IsNumeric(x) && DataTypeUtility.IsNumeric(y)) { if (x == y) { return(x); } if (DataTypeUtility.IsSigned(x) && DataTypeUtility.IsSigned(y)) { if (DataAggregate.DataTypeCode.Int64 != x && DataAggregate.DataTypeCode.Int64 != y) { return(DataAggregate.DataTypeCode.Int32); } return(DataAggregate.DataTypeCode.Int64); } if (DataTypeUtility.IsUnsigned(x) && DataTypeUtility.IsUnsigned(y)) { if (DataAggregate.DataTypeCode.UInt64 != x && DataAggregate.DataTypeCode.UInt64 != y) { return(DataAggregate.DataTypeCode.UInt32); } return(DataAggregate.DataTypeCode.UInt64); } if (DataTypeUtility.IsFloat(x) && DataTypeUtility.IsFloat(y)) { return(DataAggregate.DataTypeCode.Double); } if (DataTypeUtility.IsSigned(x) && DataTypeUtility.IsUnsigned(y)) { return(DataTypeUtility.CommonDataTypeSignedUnsigned(x, y)); } if (DataTypeUtility.IsUnsigned(x) && DataTypeUtility.IsSigned(y)) { return(DataTypeUtility.CommonDataTypeSignedUnsigned(y, x)); } if (DataTypeUtility.Is32BitOrLess(x) && DataTypeUtility.IsFloat(y)) { goto IL_00b6; } if (DataTypeUtility.Is32BitOrLess(y) && DataTypeUtility.IsFloat(x)) { goto IL_00b6; } if (DataTypeUtility.Is64BitOrLess(x) && DataAggregate.DataTypeCode.Decimal == y) { goto IL_00d3; } if (DataTypeUtility.Is64BitOrLess(y) && DataAggregate.DataTypeCode.Decimal == x) { goto IL_00d3; } return(DataAggregate.DataTypeCode.Null); } return(DataAggregate.DataTypeCode.Null); IL_00b6: return(DataAggregate.DataTypeCode.Double); IL_00d3: return(DataAggregate.DataTypeCode.Decimal); }