Ejemplo n.º 1
0
        /// <summary>
        /// Deep-Equal boolean operation for inputs of any atomic type.
        /// </summary>
        /// <param name="one">
        ///            input1 xpath expression/variable. </param>
        /// <param name="two">
        ///            input2 xpath expression/variable. </param>
        /// <returns> Result of fn:deep-equal operation. </returns>
        public static bool deep_equal_atomic(AnyAtomicType one, AnyAtomicType two, DynamicContext context, string collationURI)
        {
            if (!(one is CmpEq))
            {
                return(false);
            }
            if (!(two is CmpEq))
            {
                return(false);
            }

            CmpEq a = (CmpEq)one;

            try
            {
                if (isNumeric(one, two))
                {
                    NumericType numeric = (NumericType)one;
                    if (numeric.eq(two, context))
                    {
                        return(true);
                    }
                    else
                    {
                        XSString value1 = new XSString(one.StringValue);
                        if (value1.eq(two, context))
                        {
                            return(true);
                        }
                    }
                }

                if (a.eq(two, context))
                {
                    return(true);
                }

                if (needsStringComparison(one, two))
                {
                    XSString xstr1 = new XSString(one.StringValue);
                    XSString xstr2 = new XSString(two.StringValue);
                    if (FnCompare.compare_string(collationURI, xstr1, xstr2, context).Equals(System.Numerics.BigInteger.Zero))
                    {
                        return(true);
                    }
                }
                return(false);
            }
            catch (DynamicError)
            {
                return(false);                // XXX ???
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// A fast Equality operation, no conversion for the inputs performed.
        /// </summary>
        /// <param name="one">
        ///            input1 of any type. </param>
        /// <param name="two">
        ///            input2 of any type. </param>
        /// <exception cref="DynamicError">
        ///             Dynamic error. </exception>
        /// <returns> Result of Equality operation. </returns>
        public static bool fs_eq_fast(AnyType one, AnyType two, DynamicContext context)
        {
            one = FnData.atomize((Item)one);
            two = FnData.atomize((Item)two);

            if (one is XSUntypedAtomic)
            {
                one = new XSString(one.StringValue);
            }

            if (two is XSUntypedAtomic)
            {
                two = new XSString(two.StringValue);
            }

            if (!(one is CmpEq))
            {
                DynamicError.throw_type_error();
            }

            CmpEq cmpone = (CmpEq)one;

            return(cmpone.eq(two, context));
        }