public override ValueEval Evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1)
        {
            ValueEval vA;
            ValueEval vB;

            try
            {
                vA = OperandResolver.GetSingleValue(arg0, srcRowIndex, srcColumnIndex);
                vB = OperandResolver.GetSingleValue(arg1, srcRowIndex, srcColumnIndex);
            }
            catch (EvaluationException e)
            {
                return(e.GetErrorEval());
            }
            int  cmpResult = DoCompare(vA, vB);
            bool result    = ConvertComparisonResult(cmpResult);

            return(BoolEval.ValueOf(result));
        }
 private static int CompareBlank(ValueEval v)
 {
     if (v == BlankEval.instance)
     {
         return(0);
     }
     if (v is BoolEval)
     {
         BoolEval boolEval = (BoolEval)v;
         return(boolEval.BooleanValue ? -1 : 0);
     }
     if (v is NumberEval)
     {
         NumberEval ne = (NumberEval)v;
         //return ne.NumberValue.CompareTo(0.0);
         return(NumberComparer.Compare(0.0, ne.NumberValue));
     }
     if (v is StringEval)
     {
         StringEval se = (StringEval)v;
         return(se.StringValue.Length < 1 ? 0 : -1);
     }
     throw new ArgumentException("bad value class (" + v.GetType().Name + ")");
 }
        private static int DoCompare(ValueEval va, ValueEval vb)
        {
            // special cases when one operand is blank
            if (va == BlankEval.instance)
            {
                return(CompareBlank(vb));
            }
            if (vb == BlankEval.instance)
            {
                return(-CompareBlank(va));
            }

            if (va is BoolEval)
            {
                if (vb is BoolEval)
                {
                    BoolEval bA = (BoolEval)va;
                    BoolEval bB = (BoolEval)vb;
                    if (bA.BooleanValue == bB.BooleanValue)
                    {
                        return(0);
                    }
                    return(bA.BooleanValue ? 1 : -1);
                }
                return(1);
            }
            if (vb is BoolEval)
            {
                return(-1);
            }
            if (va is StringEval)
            {
                if (vb is StringEval)
                {
                    StringEval sA = (StringEval)va;
                    StringEval sB = (StringEval)vb;
                    return(string.Compare(sA.StringValue, sB.StringValue, StringComparison.OrdinalIgnoreCase));
                }
                return(1);
            }
            if (vb is StringEval)
            {
                return(-1);
            }
            if (va is NumberEval)
            {
                if (vb is NumberEval)
                {
                    NumberEval nA = (NumberEval)va;
                    NumberEval nB = (NumberEval)vb;
                    if (nA.NumberValue == nB.NumberValue)
                    {
                        // Excel considers -0.0 == 0.0 which is different to Double.compare()
                        return(0);
                    }
                    return(NumberComparer.Compare(nA.NumberValue, nB.NumberValue));
                }
            }
            throw new ArgumentException("Bad operand types (" + va.GetType().Name + "), ("
                                        + vb.GetType().Name + ")");
        }
Beispiel #4
0
        public BooleanLookupComparer(BoolEval be)
            : base(be)
        {

            _value = be.BooleanValue;
        }
Beispiel #5
0
        public ValueEval EvaluateArray(ValueEval[] args, int srcRowIndex, int srcColumnIndex)
        {
            ValueEval arg0 = args[0];
            ValueEval arg1 = args[1];

            int w1, w2, h1, h2;
            int a1FirstCol = 0, a1FirstRow = 0;

            if (arg0 is AreaEval)
            {
                AreaEval ae = (AreaEval)arg0;
                w1         = ae.Width;
                h1         = ae.Height;
                a1FirstCol = ae.FirstColumn;
                a1FirstRow = ae.FirstRow;
            }
            else if (arg0 is RefEval)
            {
                RefEval ref1 = (RefEval)arg0;
                w1         = 1;
                h1         = 1;
                a1FirstCol = ref1.Column;
                a1FirstRow = ref1.Row;
            }
            else
            {
                w1 = 1;
                h1 = 1;
            }
            int a2FirstCol = 0, a2FirstRow = 0;

            if (arg1 is AreaEval)
            {
                AreaEval ae = (AreaEval)arg1;
                w2         = ae.Width;
                h2         = ae.Height;
                a2FirstCol = ae.FirstColumn;
                a2FirstRow = ae.FirstRow;
            }
            else if (arg1 is RefEval)
            {
                RefEval ref1 = (RefEval)arg1;
                w2         = 1;
                h2         = 1;
                a2FirstCol = ref1.Column;
                a2FirstRow = ref1.Row;
            }
            else
            {
                w2 = 1;
                h2 = 1;
            }

            int width  = Math.Max(w1, w2);
            int height = Math.Max(h1, h2);

            ValueEval[] vals = new ValueEval[height * width];

            int idx = 0;

            for (int i = 0; i < height; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    ValueEval vA;
                    try
                    {
                        vA = OperandResolver.GetSingleValue(arg0, a1FirstRow + i, a1FirstCol + j);
                    }
                    catch (EvaluationException e)
                    {
                        vA = e.GetErrorEval();
                    }
                    ValueEval vB;
                    try
                    {
                        vB = OperandResolver.GetSingleValue(arg1, a2FirstRow + i, a2FirstCol + j);
                    }
                    catch (EvaluationException e)
                    {
                        vB = e.GetErrorEval();
                    }
                    if (vA is ErrorEval)
                    {
                        vals[idx++] = vA;
                    }
                    else if (vB is ErrorEval)
                    {
                        vals[idx++] = vB;
                    }
                    else
                    {
                        int  cmpResult = DoCompare(vA, vB);
                        bool result    = ConvertComparisonResult(cmpResult);
                        vals[idx++] = BoolEval.ValueOf(result);
                    }
                }
            }

            if (vals.Length == 1)
            {
                return(vals[0]);
            }

            return(new CacheAreaEval(srcRowIndex, srcColumnIndex, srcRowIndex + height - 1, srcColumnIndex + width - 1, vals));
        }