Esempio n. 1
0
        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);
        }