2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / System.XML / System.Xml.Query / XQueryComparisonOperator.cs
index 6bdc764e810922bd82b7a615d2af69292dc57265..c0d7a83ce1a166f69a805c95b428c09fa1fb4358 100755 (executable)
@@ -78,65 +78,29 @@ namespace Mono.Xml.XPath2
 \r
                public static bool ValueEQ (XPathAtomicValue lvalue, XPathAtomicValue rvalue)\r
                {\r
-                       switch (lvalue.XmlType.TypeCode) {\r
-                       case XmlTypeCode.Decimal:\r
-                               if (rvalue.XmlType.TypeCode == XmlTypeCode.Decimal)\r
-                                       return lvalue.ValueAsDecimal == rvalue.ValueAsDecimal;\r
-                               goto case XmlTypeCode.Integer;\r
-\r
-                       // numerics\r
-                       case XmlTypeCode.Integer:\r
-                       case XmlTypeCode.Float:\r
-                       case XmlTypeCode.Double:\r
-                               switch (rvalue.XmlType.TypeCode) {\r
-                               case XmlTypeCode.Integer:\r
-                               case XmlTypeCode.Decimal:\r
-                               case XmlTypeCode.Float:\r
-                               case XmlTypeCode.Double:\r
-                                       return lvalue.ValueAsDouble == rvalue.ValueAsDouble;\r
-                               }\r
-                               break;\r
-\r
-                       // FIXME: handle Gregorian (gXXX) types\r
+                       if (lvalue.XmlType.TypeCode == XmlTypeCode.Decimal &&\r
+                               rvalue.XmlType.TypeCode == XmlTypeCode.Decimal)\r
+                               return lvalue.ValueAsDecimal == rvalue.ValueAsDecimal;\r
+                       if (SequenceType.IsNumeric (lvalue.XmlType.TypeCode) &&\r
+                               SequenceType.IsNumeric (lvalue.XmlType.TypeCode))\r
+                               return lvalue.ValueAsDouble == rvalue.ValueAsDouble;\r
+                       if (lvalue.XmlType.TypeCode == rvalue.XmlType.TypeCode)\r
+                               return CompareEquality (lvalue, rvalue);\r
 \r
-                       // other types\r
-                       default:\r
-                               if (lvalue.XmlType.TypeCode != rvalue.XmlType.TypeCode)\r
-                                       return CompareEquality (lvalue, rvalue);\r
-                               break;\r
-                       }\r
                        throw new XmlQueryException (String.Format ("Not allowed value comparison between {0} and {1}.", lvalue.XmlType.QualifiedName, rvalue.XmlType.QualifiedName));\r
                }\r
 \r
                public static bool ValueNE (XPathAtomicValue lvalue, XPathAtomicValue rvalue)\r
                {\r
-                       switch (lvalue.XmlType.TypeCode) {\r
-                       case XmlTypeCode.Decimal:\r
-                               if (rvalue.XmlType.TypeCode == XmlTypeCode.Decimal)\r
-                                       return lvalue.ValueAsDecimal != rvalue.ValueAsDecimal;\r
-                               goto case XmlTypeCode.Integer;\r
+                       if (lvalue.XmlType.TypeCode == XmlTypeCode.Decimal &&\r
+                               rvalue.XmlType.TypeCode == XmlTypeCode.Decimal)\r
+                               return lvalue.ValueAsDecimal != rvalue.ValueAsDecimal;\r
+                       if (SequenceType.IsNumeric (lvalue.XmlType.TypeCode) &&\r
+                               SequenceType.IsNumeric (lvalue.XmlType.TypeCode))\r
+                               return lvalue.ValueAsDouble != rvalue.ValueAsDouble;\r
+                       if (lvalue.XmlType.TypeCode == rvalue.XmlType.TypeCode)\r
+                               return !CompareEquality (lvalue, rvalue);\r
 \r
-                       // numerics\r
-                       case XmlTypeCode.Integer:\r
-                       case XmlTypeCode.Float:\r
-                       case XmlTypeCode.Double:\r
-                               switch (rvalue.XmlType.TypeCode) {\r
-                               case XmlTypeCode.Integer:\r
-                               case XmlTypeCode.Decimal:\r
-                               case XmlTypeCode.Float:\r
-                               case XmlTypeCode.Double:\r
-                                       return lvalue.ValueAsDouble != rvalue.ValueAsDouble;\r
-                               }\r
-                               break;\r
-\r
-                       // FIXME: handle Gregorian (gXXX) types\r
-\r
-                       // other types\r
-                       default:\r
-                               if (lvalue.XmlType.TypeCode != rvalue.XmlType.TypeCode)\r
-                                       return !CompareEquality (lvalue, rvalue);\r
-                               break;\r
-                       }\r
                        throw new XmlQueryException (String.Format ("Not allowed value comparison between {0} and {1}.", lvalue.XmlType.QualifiedName, rvalue.XmlType.QualifiedName));\r
                }\r
 \r
@@ -159,30 +123,15 @@ namespace Mono.Xml.XPath2
 \r
                public static bool ValueLT (XPathAtomicValue lvalue, XPathAtomicValue rvalue)\r
                {\r
-                       switch (lvalue.XmlType.TypeCode) {\r
-                       case XmlTypeCode.Decimal:\r
-                               if (rvalue.XmlType.TypeCode == XmlTypeCode.Decimal)\r
-                                       return lvalue.ValueAsDecimal < rvalue.ValueAsDecimal;\r
-                               goto case XmlTypeCode.Integer;\r
-\r
-                       // numerics\r
-                       case XmlTypeCode.Integer:\r
-                       case XmlTypeCode.Float:\r
-                       case XmlTypeCode.Double:\r
-                               switch (rvalue.XmlType.TypeCode) {\r
-                               case XmlTypeCode.Integer:\r
-                               case XmlTypeCode.Decimal:\r
-                               case XmlTypeCode.Float:\r
-                               case XmlTypeCode.Double:\r
-                                       return lvalue.ValueAsDouble < rvalue.ValueAsDouble;\r
-                               }\r
-                               break;\r
+                       if (lvalue.XmlType.TypeCode == XmlTypeCode.Decimal &&\r
+                               rvalue.XmlType.TypeCode == XmlTypeCode.Decimal)\r
+                               return lvalue.ValueAsDecimal < rvalue.ValueAsDecimal;\r
+                       if (SequenceType.IsNumeric (lvalue.XmlType.TypeCode) &&\r
+                               SequenceType.IsNumeric (lvalue.XmlType.TypeCode))\r
+                               return lvalue.ValueAsDouble < rvalue.ValueAsDouble;\r
+                       if (lvalue.XmlType.TypeCode == rvalue.XmlType.TypeCode)\r
+                               return CompareLT (lvalue, rvalue);\r
 \r
-                       default:\r
-                               if (lvalue.XmlType.TypeCode != rvalue.XmlType.TypeCode)\r
-                                       return CompareLT (lvalue, rvalue);\r
-                               break;\r
-                       }\r
                        throw new XmlQueryException (String.Format ("Not allowed value comparison between {0} and {1}.", lvalue.XmlType.QualifiedName, rvalue.XmlType.QualifiedName));\r
                }\r
 \r
@@ -205,30 +154,15 @@ namespace Mono.Xml.XPath2
 \r
                public static bool ValueLE (XPathAtomicValue lvalue, XPathAtomicValue rvalue)\r
                {\r
-                       switch (lvalue.XmlType.TypeCode) {\r
-                       case XmlTypeCode.Decimal:\r
-                               if (rvalue.XmlType.TypeCode == XmlTypeCode.Decimal)\r
-                                       return lvalue.ValueAsDecimal <= rvalue.ValueAsDecimal;\r
-                               goto case XmlTypeCode.Integer;\r
-\r
-                       // numerics\r
-                       case XmlTypeCode.Integer:\r
-                       case XmlTypeCode.Float:\r
-                       case XmlTypeCode.Double:\r
-                               switch (rvalue.XmlType.TypeCode) {\r
-                               case XmlTypeCode.Integer:\r
-                               case XmlTypeCode.Decimal:\r
-                               case XmlTypeCode.Float:\r
-                               case XmlTypeCode.Double:\r
-                                       return lvalue.ValueAsDouble <= rvalue.ValueAsDouble;\r
-                               }\r
-                               break;\r
+                       if (lvalue.XmlType.TypeCode == XmlTypeCode.Decimal &&\r
+                               rvalue.XmlType.TypeCode == XmlTypeCode.Decimal)\r
+                               return lvalue.ValueAsDecimal <= rvalue.ValueAsDecimal;\r
+                       if (SequenceType.IsNumeric (lvalue.XmlType.TypeCode) &&\r
+                               SequenceType.IsNumeric (lvalue.XmlType.TypeCode))\r
+                               return lvalue.ValueAsDouble <= rvalue.ValueAsDouble;\r
+                       if (lvalue.XmlType.TypeCode == rvalue.XmlType.TypeCode)\r
+                               return CompareLE (lvalue, rvalue);\r
 \r
-                       default:\r
-                               if (lvalue.XmlType.TypeCode != rvalue.XmlType.TypeCode)\r
-                                       return CompareLE (lvalue, rvalue);\r
-                               break;\r
-                       }\r
                        throw new XmlQueryException (String.Format ("Not allowed value comparison between {0} and {1}.", lvalue.XmlType.QualifiedName, rvalue.XmlType.QualifiedName));\r
                }\r
 \r
@@ -251,30 +185,15 @@ namespace Mono.Xml.XPath2
 \r
                public static bool ValueGT (XPathAtomicValue lvalue, XPathAtomicValue rvalue)\r
                {\r
-                       switch (lvalue.XmlType.TypeCode) {\r
-                       case XmlTypeCode.Decimal:\r
-                               if (rvalue.XmlType.TypeCode == XmlTypeCode.Decimal)\r
-                                       return lvalue.ValueAsDecimal > rvalue.ValueAsDecimal;\r
-                               goto case XmlTypeCode.Integer;\r
+                       if (lvalue.XmlType.TypeCode == XmlTypeCode.Decimal &&\r
+                               rvalue.XmlType.TypeCode == XmlTypeCode.Decimal)\r
+                               return lvalue.ValueAsDecimal > rvalue.ValueAsDecimal;\r
+                       if (SequenceType.IsNumeric (lvalue.XmlType.TypeCode) &&\r
+                               SequenceType.IsNumeric (lvalue.XmlType.TypeCode))\r
+                               return lvalue.ValueAsDouble > rvalue.ValueAsDouble;\r
+                       if (lvalue.XmlType.TypeCode == rvalue.XmlType.TypeCode)\r
+                               return CompareGT (lvalue, rvalue);\r
 \r
-                       // numerics\r
-                       case XmlTypeCode.Integer:\r
-                       case XmlTypeCode.Float:\r
-                       case XmlTypeCode.Double:\r
-                               switch (rvalue.XmlType.TypeCode) {\r
-                               case XmlTypeCode.Integer:\r
-                               case XmlTypeCode.Decimal:\r
-                               case XmlTypeCode.Float:\r
-                               case XmlTypeCode.Double:\r
-                                       return lvalue.ValueAsDouble > rvalue.ValueAsDouble;\r
-                               }\r
-                               break;\r
-\r
-                       default:\r
-                               if (lvalue.XmlType.TypeCode != rvalue.XmlType.TypeCode)\r
-                                       return CompareGT (lvalue, rvalue);\r
-                               break;\r
-                       }\r
                        throw new XmlQueryException (String.Format ("Not allowed value comparison between {0} and {1}.", lvalue.XmlType.QualifiedName, rvalue.XmlType.QualifiedName));\r
                }\r
 \r
@@ -297,30 +216,15 @@ namespace Mono.Xml.XPath2
 \r
                public static bool ValueGE (XPathAtomicValue lvalue, XPathAtomicValue rvalue)\r
                {\r
-                       switch (lvalue.XmlType.TypeCode) {\r
-                       case XmlTypeCode.Decimal:\r
-                               if (rvalue.XmlType.TypeCode == XmlTypeCode.Decimal)\r
-                                       return lvalue.ValueAsDecimal >= rvalue.ValueAsDecimal;\r
-                               goto case XmlTypeCode.Integer;\r
+                       if (lvalue.XmlType.TypeCode == XmlTypeCode.Decimal &&\r
+                               rvalue.XmlType.TypeCode == XmlTypeCode.Decimal)\r
+                               return lvalue.ValueAsDecimal >= rvalue.ValueAsDecimal;\r
+                       if (SequenceType.IsNumeric (lvalue.XmlType.TypeCode) &&\r
+                               SequenceType.IsNumeric (lvalue.XmlType.TypeCode))\r
+                               return lvalue.ValueAsDouble >= rvalue.ValueAsDouble;\r
+                       if (lvalue.XmlType.TypeCode == rvalue.XmlType.TypeCode)\r
+                               return CompareGE (lvalue, rvalue);\r
 \r
-                       // numerics\r
-                       case XmlTypeCode.Integer:\r
-                       case XmlTypeCode.Float:\r
-                       case XmlTypeCode.Double:\r
-                               switch (rvalue.XmlType.TypeCode) {\r
-                               case XmlTypeCode.Integer:\r
-                               case XmlTypeCode.Decimal:\r
-                               case XmlTypeCode.Float:\r
-                               case XmlTypeCode.Double:\r
-                                       return lvalue.ValueAsDouble >= rvalue.ValueAsDouble;\r
-                               }\r
-                               break;\r
-\r
-                       default:\r
-                               if (lvalue.XmlType.TypeCode != rvalue.XmlType.TypeCode)\r
-                                       return CompareGE (lvalue, rvalue);\r
-                               break;\r
-                       }\r
                        throw new XmlQueryException (String.Format ("Not allowed value comparison between {0} and {1}.", lvalue.XmlType.QualifiedName, rvalue.XmlType.QualifiedName));\r
                }\r
        }\r