public bool EqualityOperator(double opCode, IList<XPathItem> left, IList<XPathItem> right)
{
ComparisonOperator op = (ComparisonOperator)opCode;
Debug.Assert(op == ComparisonOperator.Eq || op == ComparisonOperator.Ne);
CheckXsltValue(left);
CheckXsltValue(right);
if (IsNodeSetOrRtf(left))
{
if (IsNodeSetOrRtf(right))
{
// Both left and right are node-sets
return CompareNodeSetAndNodeSet(op, ToNodeSetOrRtf(left), ToNodeSetOrRtf(right), TypeCode.String);
}
else
{
// left is a node-set, right is an atomic value
XPathItem rightItem = right[0];
return CompareNodeSetAndValue(op, ToNodeSetOrRtf(left), rightItem, GetTypeCode(rightItem));
}
}
else if (IsNodeSetOrRtf(right))
{
// left is an atomic value, right is a node-set
XPathItem leftItem = left[0];
// Swap operands: left op right -> right op left
return CompareNodeSetAndValue(op, ToNodeSetOrRtf(right), leftItem, GetTypeCode(leftItem));
}
else
{
// Both left and right are atomic values
XPathItem leftItem = left[0];
XPathItem rightItem = right[0];
return CompareValues(op, leftItem, rightItem, WeakestTypeCode(GetTypeCode(leftItem), GetTypeCode(rightItem)));
}
}