|
// ---------------------------------------------------------------------------
// Copyright (C) 2005 Microsoft Corporation All Rights Reserved
// ---------------------------------------------------------------------------
#define CODE_ANALYSIS
using System.CodeDom;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Reflection;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.Activities.Common;
namespace System.Workflow.Activities.Rules
{
#region Literal Class
/// <summary>
/// Represents a typed literal value and is the base class for all type specific literal classes
/// </summary>
internal abstract class Literal
{
#region Properties
/// <summary>
/// A delegate for literal factory methods
/// </summary>
private delegate Literal LiteralMaker(object literalValue);
/// <summary>
/// Collection of literal factory methods indexed by type
/// </summary>
static private Dictionary<Type, LiteralMaker> types = CreateMakersDictionary();
/// <summary>
/// The type of the literal
/// </summary>
protected internal Type m_type;
/// <summary>
/// Get the boxed literal
/// </summary>
internal abstract object Value { get; }
/// <summary>
/// Group types by similar characteristics so we can check if comparisons succeed
/// </summary>
[Flags()]
enum TypeFlags
{
SignedNumbers = 0x01,
UnsignedNumbers = 0x02,
ULong = 0x04,
Float = 0x08,
Decimal = 0x10,
String = 0x20,
Bool = 0x40
};
/// <summary>
/// Collection of TypeFlags for the supported value types indexed by type
/// </summary>
private static Dictionary<Type, TypeFlags> supportedTypes = CreateTypesDictionary();
private static Dictionary<Type, LiteralMaker> CreateMakersDictionary()
{
// Create the literal class factory delegates
Dictionary<Type, LiteralMaker> dictionary = new Dictionary<Type, LiteralMaker>(32);
dictionary.Add(typeof(byte), new LiteralMaker(Literal.MakeByte));
dictionary.Add(typeof(sbyte), new LiteralMaker(Literal.MakeSByte));
dictionary.Add(typeof(short), new LiteralMaker(Literal.MakeShort));
dictionary.Add(typeof(int), new LiteralMaker(Literal.MakeInt));
dictionary.Add(typeof(long), new LiteralMaker(Literal.MakeLong));
dictionary.Add(typeof(ushort), new LiteralMaker(Literal.MakeUShort));
dictionary.Add(typeof(uint), new LiteralMaker(Literal.MakeUInt));
dictionary.Add(typeof(ulong), new LiteralMaker(Literal.MakeULong));
dictionary.Add(typeof(float), new LiteralMaker(Literal.MakeFloat));
dictionary.Add(typeof(double), new LiteralMaker(Literal.MakeDouble));
dictionary.Add(typeof(char), new LiteralMaker(Literal.MakeChar));
dictionary.Add(typeof(string), new LiteralMaker(Literal.MakeString));
dictionary.Add(typeof(decimal), new LiteralMaker(Literal.MakeDecimal));
dictionary.Add(typeof(bool), new LiteralMaker(Literal.MakeBool));
dictionary.Add(typeof(byte?), new LiteralMaker(Literal.MakeByte));
dictionary.Add(typeof(sbyte?), new LiteralMaker(Literal.MakeSByte));
dictionary.Add(typeof(short?), new LiteralMaker(Literal.MakeShort));
dictionary.Add(typeof(int?), new LiteralMaker(Literal.MakeInt));
dictionary.Add(typeof(long?), new LiteralMaker(Literal.MakeLong));
dictionary.Add(typeof(ushort?), new LiteralMaker(Literal.MakeUShort));
dictionary.Add(typeof(uint?), new LiteralMaker(Literal.MakeUInt));
dictionary.Add(typeof(ulong?), new LiteralMaker(Literal.MakeULong));
dictionary.Add(typeof(float?), new LiteralMaker(Literal.MakeFloat));
dictionary.Add(typeof(double?), new LiteralMaker(Literal.MakeDouble));
dictionary.Add(typeof(char?), new LiteralMaker(Literal.MakeChar));
dictionary.Add(typeof(decimal?), new LiteralMaker(Literal.MakeDecimal));
dictionary.Add(typeof(bool?), new LiteralMaker(Literal.MakeBool));
return dictionary;
}
private static Dictionary<Type, TypeFlags> CreateTypesDictionary()
{
// Create the literal class factory delegates
Dictionary<Type, TypeFlags> dictionary = new Dictionary<Type, TypeFlags>(32);
dictionary.Add(typeof(byte), TypeFlags.UnsignedNumbers);
dictionary.Add(typeof(byte?), TypeFlags.UnsignedNumbers);
dictionary.Add(typeof(sbyte), TypeFlags.SignedNumbers);
dictionary.Add(typeof(sbyte?), TypeFlags.SignedNumbers);
dictionary.Add(typeof(short), TypeFlags.SignedNumbers);
dictionary.Add(typeof(short?), TypeFlags.SignedNumbers);
dictionary.Add(typeof(int), TypeFlags.SignedNumbers);
dictionary.Add(typeof(int?), TypeFlags.SignedNumbers);
dictionary.Add(typeof(long), TypeFlags.SignedNumbers);
dictionary.Add(typeof(long?), TypeFlags.SignedNumbers);
dictionary.Add(typeof(ushort), TypeFlags.UnsignedNumbers);
dictionary.Add(typeof(ushort?), TypeFlags.UnsignedNumbers);
dictionary.Add(typeof(uint), TypeFlags.UnsignedNumbers);
dictionary.Add(typeof(uint?), TypeFlags.UnsignedNumbers);
dictionary.Add(typeof(ulong), TypeFlags.ULong);
dictionary.Add(typeof(ulong?), TypeFlags.ULong);
dictionary.Add(typeof(float), TypeFlags.Float);
dictionary.Add(typeof(float?), TypeFlags.Float);
dictionary.Add(typeof(double), TypeFlags.Float);
dictionary.Add(typeof(double?), TypeFlags.Float);
dictionary.Add(typeof(char), TypeFlags.UnsignedNumbers);
dictionary.Add(typeof(char?), TypeFlags.UnsignedNumbers);
dictionary.Add(typeof(string), TypeFlags.String);
dictionary.Add(typeof(decimal), TypeFlags.Decimal);
dictionary.Add(typeof(decimal?), TypeFlags.Decimal);
dictionary.Add(typeof(bool), TypeFlags.Bool);
dictionary.Add(typeof(bool?), TypeFlags.Bool);
return dictionary;
}
#endregion
#region Factory Methods
internal static Literal MakeLiteral(Type literalType, object literalValue)
{
if (literalValue == null)
return new NullLiteral(literalType);
LiteralMaker f;
if (types.TryGetValue(literalType, out f))
{
try
{
return f(literalValue);
}
catch (InvalidCastException e)
{
throw new RuleEvaluationIncompatibleTypesException(
string.Format(CultureInfo.CurrentCulture,
Messages.InvalidCast,
RuleDecompiler.DecompileType(literalValue.GetType()),
RuleDecompiler.DecompileType(literalType)),
literalType,
CodeBinaryOperatorType.Assign,
literalValue.GetType(),
e);
}
}
return null;
}
/// <summary>
/// Factory function for a boolean type
/// </summary>
/// <param name="literalValue"></param>
/// <param name="readOnly"></param>
private static Literal MakeBool(object literalValue)
{
return new BoolLiteral((bool)literalValue);
}
/// <summary>
/// Factory function for a byte type
/// </summary>
/// <param name="literalValue"></param>
/// <param name="readOnly"></param>
private static Literal MakeByte(object literalValue)
{
return new ByteLiteral((byte)literalValue);
}
/// <summary>
/// Factory function for a sbyte type
/// </summary>
/// <param name="literalValue"></param>
/// <param name="readOnly"></param>
private static Literal MakeSByte(object literalValue)
{
return new SByteLiteral((sbyte)literalValue);
}
/// <summary>
/// Factory function for a char type
/// </summary>
/// <param name="literalValue"></param>
/// <param name="readOnly"></param>
private static Literal MakeChar(object literalValue)
{
return new CharLiteral((char)literalValue);
}
/// <summary>
/// Factory function for a decimal type
/// </summary>
/// <param name="literalValue"></param>
/// <param name="readOnly"></param>
private static Literal MakeDecimal(object literalValue)
{
return new DecimalLiteral((decimal)literalValue);
}
/// <summary>
/// Factory function for an Int16 type
/// </summary>
/// <param name="literalValue"></param>
/// <param name="readOnly"></param>
private static Literal MakeShort(object literalValue)
{
return new ShortLiteral((short)literalValue);
}
/// <summary>
/// Factory function for an Int32 type
/// </summary>
/// <param name="literalValue"></param>
/// <param name="readOnly"></param>
private static Literal MakeInt(object literalValue)
{
return new IntLiteral((int)literalValue);
}
/// <summary>
/// Factory function for an Int64 type
/// </summary>
/// <param name="literalValue"></param>
/// <param name="readOnly"></param>
private static Literal MakeLong(object literalValue)
{
return new LongLiteral((long)literalValue);
}
/// <summary>
/// Factory function for an UInt16 type
/// </summary>
/// <param name="literalValue"></param>
/// <param name="readOnly"></param>
private static Literal MakeUShort(object literalValue)
{
return new UShortLiteral((ushort)literalValue);
}
/// <summary>
/// Factory function for an UInt32 type
/// </summary>
/// <param name="literalValue"></param>
/// <param name="readOnly"></param>
private static Literal MakeUInt(object literalValue)
{
return new UIntLiteral((uint)literalValue);
}
/// <summary>
/// Factory function for an UInt64 type
/// </summary>
/// <param name="literalValue"></param>
/// <param name="readOnly"></param>
private static Literal MakeULong(object literalValue)
{
return new ULongLiteral((ulong)literalValue);
}
/// <summary>
/// Factory function for a float type
/// </summary>
/// <param name="literalValue"></param>
/// <param name="readOnly"></param>
private static Literal MakeFloat(object literalValue)
{
return new FloatLiteral((float)literalValue);
}
/// <summary>
/// Factory function for a double type
/// </summary>
/// <param name="literalValue"></param>
/// <param name="readOnly"></param>
private static Literal MakeDouble(object literalValue)
{
return new DoubleLiteral((double)literalValue);
}
/// <summary>
/// Factory function for a string type
/// </summary>
/// <param name="literalValue"></param>
/// <param name="readOnly"></param>
private static Literal MakeString(object literalValue)
{
return new StringLiteral((string)literalValue);
}
#endregion
#region Default Operators
internal static class DefaultOperators
{
public static int Addition(int x, int y) { return x + y; }
public static uint Addition(uint x, uint y) { return x + y; }
public static long Addition(long x, long y) { return x + y; }
public static ulong Addition(ulong x, ulong y) { return x + y; }
public static float Addition(float x, float y) { return x + y; }
public static double Addition(double x, double y) { return x + y; }
public static decimal Addition(decimal x, decimal y) { return x + y; }
public static string Addition(string x, string y) { return x + y; }
public static string Addition(string x, object y) { return x + y; }
public static string Addition(object x, string y) { return x + y; }
public static int Subtraction(int x, int y) { return x - y; }
public static uint Subtraction(uint x, uint y) { return x - y; }
public static long Subtraction(long x, long y) { return x - y; }
public static ulong Subtraction(ulong x, ulong y) { return x - y; }
public static float Subtraction(float x, float y) { return x - y; }
public static double Subtraction(double x, double y) { return x - y; }
public static decimal Subtraction(decimal x, decimal y) { return x - y; }
public static int Multiply(int x, int y) { return x * y; }
public static uint Multiply(uint x, uint y) { return x * y; }
public static long Multiply(long x, long y) { return x * y; }
public static ulong Multiply(ulong x, ulong y) { return x * y; }
public static float Multiply(float x, float y) { return x * y; }
public static double Multiply(double x, double y) { return x * y; }
public static decimal Multiply(decimal x, decimal y) { return x * y; }
public static int Division(int x, int y) { return x / y; }
public static uint Division(uint x, uint y) { return x / y; }
public static long Division(long x, long y) { return x / y; }
public static ulong Division(ulong x, ulong y) { return x / y; }
public static float Division(float x, float y) { return x / y; }
public static double Division(double x, double y) { return x / y; }
public static decimal Division(decimal x, decimal y) { return x / y; }
public static int Modulus(int x, int y) { return x % y; }
public static uint Modulus(uint x, uint y) { return x % y; }
public static long Modulus(long x, long y) { return x % y; }
public static ulong Modulus(ulong x, ulong y) { return x % y; }
public static float Modulus(float x, float y) { return x % y; }
public static double Modulus(double x, double y) { return x % y; }
public static decimal Modulus(decimal x, decimal y) { return x % y; }
public static int BitwiseAnd(int x, int y) { return x & y; }
public static uint BitwiseAnd(uint x, uint y) { return x & y; }
public static long BitwiseAnd(long x, long y) { return x & y; }
public static ulong BitwiseAnd(ulong x, ulong y) { return x & y; }
public static bool BitwiseAnd(bool x, bool y) { return x & y; }
public static int BitwiseOr(int x, int y) { return x | y; }
public static uint BitwiseOr(uint x, uint y) { return x | y; }
public static long BitwiseOr(long x, long y) { return x | y; }
public static ulong BitwiseOr(ulong x, ulong y) { return x | y; }
public static bool BitwiseOr(bool x, bool y) { return x | y; }
public static bool Equality(int x, int y) { return x == y; }
public static bool Equality(uint x, uint y) { return x == y; }
public static bool Equality(long x, long y) { return x == y; }
public static bool Equality(ulong x, ulong y) { return x == y; }
public static bool Equality(float x, float y) { return x == y; }
public static bool Equality(double x, double y) { return x == y; }
public static bool Equality(decimal x, decimal y) { return x == y; }
public static bool Equality(bool x, bool y) { return x == y; }
public static bool Equality(string x, string y) { return x == y; }
// mark object == object since it has special rules
public static bool ObjectEquality(object x, object y) { return x == y; }
public static bool GreaterThan(int x, int y) { return x > y; }
public static bool GreaterThan(uint x, uint y) { return x > y; }
public static bool GreaterThan(long x, long y) { return x > y; }
public static bool GreaterThan(ulong x, ulong y) { return x > y; }
public static bool GreaterThan(float x, float y) { return x > y; }
public static bool GreaterThan(double x, double y) { return x > y; }
public static bool GreaterThan(decimal x, decimal y) { return x > y; }
public static bool GreaterThanOrEqual(int x, int y) { return x >= y; }
public static bool GreaterThanOrEqual(uint x, uint y) { return x >= y; }
public static bool GreaterThanOrEqual(long x, long y) { return x >= y; }
public static bool GreaterThanOrEqual(ulong x, ulong y) { return x >= y; }
public static bool GreaterThanOrEqual(float x, float y) { return x >= y; }
public static bool GreaterThanOrEqual(double x, double y) { return x >= y; }
public static bool GreaterThanOrEqual(decimal x, decimal y) { return x >= y; }
public static bool LessThan(int x, int y) { return x < y; }
public static bool LessThan(uint x, uint y) { return x < y; }
public static bool LessThan(long x, long y) { return x < y; }
public static bool LessThan(ulong x, ulong y) { return x < y; }
public static bool LessThan(float x, float y) { return x < y; }
public static bool LessThan(double x, double y) { return x < y; }
public static bool LessThan(decimal x, decimal y) { return x < y; }
public static bool LessThanOrEqual(int x, int y) { return x <= y; }
public static bool LessThanOrEqual(uint x, uint y) { return x <= y; }
public static bool LessThanOrEqual(long x, long y) { return x <= y; }
public static bool LessThanOrEqual(ulong x, ulong y) { return x <= y; }
public static bool LessThanOrEqual(float x, float y) { return x <= y; }
public static bool LessThanOrEqual(double x, double y) { return x <= y; }
public static bool LessThanOrEqual(decimal x, decimal y) { return x <= y; }
}
#endregion
#region Type Checking Methods
[SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
internal static RuleBinaryExpressionInfo AllowedComparison(
Type lhs,
CodeExpression lhsExpression,
Type rhs,
CodeExpression rhsExpression,
CodeBinaryOperatorType comparison,
RuleValidation validator,
out ValidationError error)
{
// note that null values come in as a NullLiteral type
TypeFlags lhsFlags, rhsFlags;
// are the types supported?
if ((supportedTypes.TryGetValue(lhs, out lhsFlags)) && (supportedTypes.TryGetValue(rhs, out rhsFlags)))
{
// both sides supported
if (lhsFlags == rhsFlags)
{
// both sides the same type, so it's allowed
// only allow equality on booleans
if ((lhsFlags == TypeFlags.Bool) && (comparison != CodeBinaryOperatorType.ValueEquality))
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.RelationalOpBadTypes, comparison.ToString(),
RuleDecompiler.DecompileType(lhs),
RuleDecompiler.DecompileType(rhs));
error = new ValidationError(message, ErrorNumbers.Error_OperandTypesIncompatible);
return null;
}
error = null;
return new RuleBinaryExpressionInfo(lhs, rhs, typeof(bool));
}
// if not the same, only certain combinations allowed
switch (lhsFlags | rhsFlags)
{
case TypeFlags.Decimal | TypeFlags.SignedNumbers:
case TypeFlags.Decimal | TypeFlags.UnsignedNumbers:
case TypeFlags.Decimal | TypeFlags.ULong:
case TypeFlags.Float | TypeFlags.SignedNumbers:
case TypeFlags.Float | TypeFlags.UnsignedNumbers:
case TypeFlags.Float | TypeFlags.ULong:
case TypeFlags.ULong | TypeFlags.UnsignedNumbers:
case TypeFlags.SignedNumbers | TypeFlags.UnsignedNumbers:
error = null;
return new RuleBinaryExpressionInfo(lhs, rhs, typeof(bool));
}
string message2 = string.Format(CultureInfo.CurrentCulture, Messages.RelationalOpBadTypes, comparison.ToString(),
(lhs == typeof(NullLiteral)) ? Messages.NullValue : RuleDecompiler.DecompileType(lhs),
(rhs == typeof(NullLiteral)) ? Messages.NullValue : RuleDecompiler.DecompileType(rhs));
error = new ValidationError(message2, ErrorNumbers.Error_OperandTypesIncompatible);
return null;
}
else
{
// see if they override the operator
MethodInfo operatorOverride = MapOperatorToMethod(comparison, lhs, lhsExpression, rhs, rhsExpression, validator, out error);
if (operatorOverride != null)
return new RuleBinaryExpressionInfo(lhs, rhs, operatorOverride);
// unable to evaluate, so return false
return null;
}
}
internal enum OperatorGrouping
{
Arithmetic,
Equality,
Relational
}
internal static MethodInfo ObjectEquality = typeof(DefaultOperators).GetMethod("ObjectEquality");
[SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[SuppressMessage("Microsoft.Performance", "CA1803:AvoidCostlyCallsWherePossible")]
[SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] // bogus since the casts are in different case statements
internal static MethodInfo MapOperatorToMethod(
CodeBinaryOperatorType op,
Type lhs,
CodeExpression lhsExpression,
Type rhs,
CodeExpression rhsExpression,
RuleValidation validator,
out ValidationError error)
{
// determine what the method name should be
string methodName;
string message;
OperatorGrouping group;
switch (op)
{
case CodeBinaryOperatorType.ValueEquality:
methodName = "op_Equality";
group = OperatorGrouping.Equality;
break;
case CodeBinaryOperatorType.GreaterThan:
methodName = "op_GreaterThan";
group = OperatorGrouping.Relational;
break;
case CodeBinaryOperatorType.GreaterThanOrEqual:
methodName = "op_GreaterThanOrEqual";
group = OperatorGrouping.Relational;
break;
case CodeBinaryOperatorType.LessThan:
methodName = "op_LessThan";
group = OperatorGrouping.Relational;
break;
case CodeBinaryOperatorType.LessThanOrEqual:
methodName = "op_LessThanOrEqual";
group = OperatorGrouping.Relational;
break;
case CodeBinaryOperatorType.Add:
methodName = "op_Addition";
group = OperatorGrouping.Arithmetic;
break;
case CodeBinaryOperatorType.Subtract:
methodName = "op_Subtraction";
group = OperatorGrouping.Arithmetic;
break;
case CodeBinaryOperatorType.Multiply:
methodName = "op_Multiply";
group = OperatorGrouping.Arithmetic;
break;
case CodeBinaryOperatorType.Divide:
methodName = "op_Division";
group = OperatorGrouping.Arithmetic;
break;
case CodeBinaryOperatorType.Modulus:
methodName = "op_Modulus";
group = OperatorGrouping.Arithmetic;
break;
case CodeBinaryOperatorType.BitwiseAnd:
methodName = "op_BitwiseAnd";
group = OperatorGrouping.Arithmetic;
break;
case CodeBinaryOperatorType.BitwiseOr:
methodName = "op_BitwiseOr";
group = OperatorGrouping.Arithmetic;
break;
default:
Debug.Assert(false, "Operator " + op.ToString() + " not implemented");
message = string.Format(CultureInfo.CurrentCulture, Messages.BinaryOpNotSupported, op.ToString());
error = new ValidationError(message, ErrorNumbers.Error_CodeExpressionNotHandled);
return null;
}
// NOTE: types maybe NullLiteral, which signifies the constant "null"
List<MethodInfo> candidates = new List<MethodInfo>();
bool lhsNullable = ConditionHelper.IsNullableValueType(lhs);
bool rhsNullable = ConditionHelper.IsNullableValueType(rhs);
Type lhsType0 = (lhsNullable) ? Nullable.GetUnderlyingType(lhs) : lhs;
Type rhsType0 = (rhsNullable) ? Nullable.GetUnderlyingType(rhs) : rhs;
// special cases for enums
if (lhsType0.IsEnum)
{
// only 3 cases (U = underlying type of E):
// E = E + U
// U = E - E
// E = E - U
// plus the standard comparisons (E == E, E > E, etc.)
// need to also allow E == 0
Type underlyingType;
switch (op)
{
case CodeBinaryOperatorType.Add:
underlyingType = EnumHelper.GetUnderlyingType(lhsType0);
if ((underlyingType != null) &&
(RuleValidation.TypesAreAssignable(rhsType0, underlyingType, rhsExpression, out error)))
{
error = null;
return new EnumOperationMethodInfo(lhs, op, rhs, false);
}
break;
case CodeBinaryOperatorType.Subtract:
underlyingType = EnumHelper.GetUnderlyingType(lhsType0);
if (underlyingType != null)
{
if (lhsType0 == rhsType0)
{
// E - E
error = null;
return new EnumOperationMethodInfo(lhs, op, rhs, false);
}
else if (DecimalIntegerLiteralZero(rhs, rhsExpression as CodePrimitiveExpression))
{
// E - 0, can convert 0 to E
error = null;
return new EnumOperationMethodInfo(lhs, op, rhs, true);
}
else if (RuleValidation.TypesAreAssignable(rhsType0, underlyingType, rhsExpression, out error))
{
// expression not passed to TypesAreAssignable, so not looking for constants (since 0 is all we care about)
error = null;
return new EnumOperationMethodInfo(lhs, op, rhs, false);
}
}
break;
case CodeBinaryOperatorType.ValueEquality:
case CodeBinaryOperatorType.LessThan:
case CodeBinaryOperatorType.LessThanOrEqual:
case CodeBinaryOperatorType.GreaterThan:
case CodeBinaryOperatorType.GreaterThanOrEqual:
if (lhsType0 == rhsType0)
{
error = null;
return new EnumOperationMethodInfo(lhs, op, rhs, false);
}
else if (lhsNullable && (rhs == typeof(NullLiteral)))
{
// handle enum? op null
// treat the rhs as the same nullable enum
error = null;
return new EnumOperationMethodInfo(lhs, op, lhs, false);
}
else if (DecimalIntegerLiteralZero(rhs, rhsExpression as CodePrimitiveExpression))
{
error = null;
return new EnumOperationMethodInfo(lhs, op, rhs, true);
}
break;
}
// can't do it, sorry
// but check if there is a user-defined operator that works
}
else if (rhsType0.IsEnum)
{
// lhs != enum, so only 2 cases (U = underlying type of E):
// E = U + E
// E = U - E
// comparisons are E == E, etc., so if the lhs is not an enum, too bad
// although we need to check for 0 == E
Type underlyingType;
switch (op)
{
case CodeBinaryOperatorType.Add:
underlyingType = EnumHelper.GetUnderlyingType(rhsType0);
if ((underlyingType != null) &&
(RuleValidation.TypesAreAssignable(lhsType0, underlyingType, lhsExpression, out error)))
{
error = null;
return new EnumOperationMethodInfo(lhs, op, rhs, false);
}
break;
case CodeBinaryOperatorType.Subtract:
underlyingType = EnumHelper.GetUnderlyingType(rhsType0);
if (underlyingType != null)
{
CodePrimitiveExpression primitive = lhsExpression as CodePrimitiveExpression;
if (DecimalIntegerLiteralZero(lhs, primitive))
{
// 0 - E, can convert 0 to E
error = null;
return new EnumOperationMethodInfo(lhs, op, rhs, true);
}
else if (RuleValidation.TypesAreAssignable(lhsType0, underlyingType, lhsExpression, out error))
{
// expression not passed to TypesAreAssignable, so not looking for constants (since 0 is all we care about)
error = null;
return new EnumOperationMethodInfo(lhs, op, rhs, false);
}
}
break;
case CodeBinaryOperatorType.ValueEquality:
case CodeBinaryOperatorType.LessThan:
case CodeBinaryOperatorType.LessThanOrEqual:
case CodeBinaryOperatorType.GreaterThan:
case CodeBinaryOperatorType.GreaterThanOrEqual:
if (rhsNullable && (lhs == typeof(NullLiteral)))
{
// handle null op enum?
// treat the lhs as the same nullable enum type
error = null;
return new EnumOperationMethodInfo(rhs, op, rhs, false);
}
else if (DecimalIntegerLiteralZero(lhs, lhsExpression as CodePrimitiveExpression))
{
error = null;
return new EnumOperationMethodInfo(lhs, op, rhs, true);
}
break;
}
// can't do it, sorry
// but check if there is a user-defined operator that works
}
// enum specific operations already handled, see if one side (or both) define operators
AddOperatorOverloads(lhsType0, methodName, lhs, rhs, candidates);
AddOperatorOverloads(rhsType0, methodName, lhs, rhs, candidates);
if (lhsNullable || rhsNullable || (lhs == typeof(NullLiteral)) || (rhs == typeof(NullLiteral)))
{
// need to add in lifted methods
AddLiftedOperators(lhsType0, methodName, group, lhsType0, rhsType0, candidates);
AddLiftedOperators(rhsType0, methodName, group, lhsType0, rhsType0, candidates);
}
if (candidates.Count == 0)
{
// no overrides, so get the default list
methodName = methodName.Substring(3); // strip off the op_
foreach (MethodInfo mi in typeof(DefaultOperators).GetMethods())
{
if (mi.Name == methodName)
{
ParameterInfo[] parameters = mi.GetParameters();
Type parm1 = parameters[0].ParameterType;
Type parm2 = parameters[1].ParameterType;
if (RuleValidation.ImplicitConversion(lhs, parm1) &&
RuleValidation.ImplicitConversion(rhs, parm2))
{
candidates.Add(mi);
}
}
}
// if no candidates and ==, can we use object == object?
if ((candidates.Count == 0) && ("Equality" == methodName))
{
// C# 7.9.6
// references must be compatible
// no boxing
// value types can't be compared
if ((!lhs.IsValueType) && (!rhs.IsValueType))
{
// they are not classes, so references need to be compatible
// also check for null (which is NullLiteral type) -- null is compatible with any object type
if ((lhs == typeof(NullLiteral)) || (rhs == typeof(NullLiteral)) ||
(lhs.IsAssignableFrom(rhs)) || (rhs.IsAssignableFrom(lhs)))
{
candidates.Add(ObjectEquality);
}
}
}
// if no candidates and nullable, add lifted operators
if ((candidates.Count == 0) && ((lhsNullable || rhsNullable || (lhs == typeof(NullLiteral)) || (rhs == typeof(NullLiteral)))))
{
foreach (MethodInfo mi in typeof(DefaultOperators).GetMethods())
{
if (mi.Name == methodName)
{
ParameterInfo[] parameters = mi.GetParameters();
MethodInfo liftedMethod = EvaluateLiftedMethod(mi, parameters, group, lhsType0, rhsType0);
if (liftedMethod != null)
candidates.Add(liftedMethod);
}
}
}
}
if (candidates.Count == 1)
{
// only 1, so it is it
error = null;
return candidates[0];
}
else if (candidates.Count == 0)
{
// nothing matched
message = string.Format(CultureInfo.CurrentCulture,
(group == OperatorGrouping.Arithmetic) ? Messages.ArithOpBadTypes : Messages.RelationalOpBadTypes,
op.ToString(),
(lhs == typeof(NullLiteral)) ? Messages.NullValue : RuleDecompiler.DecompileType(lhs),
(rhs == typeof(NullLiteral)) ? Messages.NullValue : RuleDecompiler.DecompileType(rhs));
error = new ValidationError(message, ErrorNumbers.Error_OperandTypesIncompatible);
return null;
}
else
{
// more than 1, so pick the best one
MethodInfo bestFit = validator.FindBestCandidate(null, candidates, lhs, rhs);
if (bestFit != null)
{
error = null;
return bestFit;
}
// must be ambiguous. Since there are at least 2 choices, show only the first 2
message = string.Format(CultureInfo.CurrentCulture,
Messages.AmbiguousOperator,
op.ToString(),
RuleDecompiler.DecompileMethod(candidates[0]),
RuleDecompiler.DecompileMethod(candidates[1]));
error = new ValidationError(message, ErrorNumbers.Error_OperandTypesIncompatible);
return null;
}
}
private static bool DecimalIntegerLiteralZero(Type type, CodePrimitiveExpression expression)
{
if (expression != null)
{
if (type == typeof(int))
return expression.Value.Equals(0);
else if (type == typeof(uint))
return expression.Value.Equals(0U);
else if (type == typeof(long))
return expression.Value.Equals(0L);
else if (type == typeof(ulong))
return expression.Value.Equals(0UL);
}
return false;
}
private static void AddOperatorOverloads(Type type, string methodName, Type arg1, Type arg2, List<MethodInfo> candidates)
{
// append the list of methods that match the name specified
int numAdded = 0;
MethodInfo[] possible = type.GetMethods(BindingFlags.Static | BindingFlags.Public);
foreach (MethodInfo mi in possible)
{
ParameterInfo[] parameters = mi.GetParameters();
if ((mi.Name == methodName) && (parameters.Length == 2))
{
if (EvaluateMethod(parameters, arg1, arg2))
{
++numAdded;
if (!candidates.Contains(mi))
candidates.Add(mi);
}
}
}
if ((numAdded > 0) || (type == typeof(object)))
return;
// no matches, check direct base class (if there is one)
type = type.BaseType;
if (type != null)
{
possible = type.GetMethods(BindingFlags.Static | BindingFlags.Public);
foreach (MethodInfo mi in possible)
{
ParameterInfo[] parameters = mi.GetParameters();
if ((mi.Name == methodName) && (parameters.Length == 2))
{
if (EvaluateMethod(parameters, arg1, arg2))
{
if (!candidates.Contains(mi))
candidates.Add(mi);
}
}
}
}
}
private static void AddLiftedOperators(Type type, string methodName, OperatorGrouping group, Type arg1, Type arg2, List<MethodInfo> candidates)
{
// append the list of lifted methods that match the name specified
int numAdded = 0;
MethodInfo[] possible = type.GetMethods(BindingFlags.Static | BindingFlags.Public);
foreach (MethodInfo mi in possible)
{
ParameterInfo[] parameters = mi.GetParameters();
if ((mi.Name == methodName) && (parameters.Length == 2))
{
MethodInfo liftedMethod = EvaluateLiftedMethod(mi, parameters, group, arg1, arg2);
if (liftedMethod != null)
{
++numAdded;
if (!candidates.Contains(liftedMethod))
candidates.Add(liftedMethod);
}
}
}
if ((numAdded > 0) || (type == typeof(object)))
return;
// no matches, check direct base class (if there is one)
type = type.BaseType;
if (type != null)
{
possible = type.GetMethods(BindingFlags.Static | BindingFlags.Public);
foreach (MethodInfo mi in possible)
{
ParameterInfo[] parameters = mi.GetParameters();
if ((mi.Name == methodName) && (parameters.Length == 2))
{
MethodInfo liftedMethod = EvaluateLiftedMethod(mi, parameters, group, arg1, arg2);
if ((liftedMethod != null) && !candidates.Contains(liftedMethod))
candidates.Add(liftedMethod);
}
}
}
}
private static bool EvaluateMethod(ParameterInfo[] parameters, Type arg1, Type arg2)
{
Type parm1 = parameters[0].ParameterType;
Type parm2 = parameters[1].ParameterType;
return (RuleValidation.ImplicitConversion(arg1, parm1) &&
RuleValidation.ImplicitConversion(arg2, parm2));
}
private static MethodInfo EvaluateLiftedMethod(MethodInfo mi, ParameterInfo[] parameters, OperatorGrouping group, Type arg1, Type arg2)
{
Type parm1 = parameters[0].ParameterType;
Type parm2 = parameters[1].ParameterType;
if (ConditionHelper.IsNonNullableValueType(parm1) && ConditionHelper.IsNonNullableValueType(parm2))
{
// lift the parameters for testing conversions, if possible
parm1 = typeof(Nullable<>).MakeGenericType(parm1);
parm2 = typeof(Nullable<>).MakeGenericType(parm2);
switch (group)
{
case OperatorGrouping.Equality: // for == !=
if (mi.ReturnType == typeof(bool) &&
RuleValidation.ImplicitConversion(arg1, parm1) &&
RuleValidation.ImplicitConversion(arg2, parm2))
{
return new LiftedEqualityOperatorMethodInfo(mi);
}
break;
case OperatorGrouping.Relational: // for < > <= >=
if (mi.ReturnType == typeof(bool) &&
RuleValidation.ImplicitConversion(arg1, parm1) &&
RuleValidation.ImplicitConversion(arg2, parm2))
{
return new LiftedRelationalOperatorMethodInfo(mi);
}
break;
case OperatorGrouping.Arithmetic: // for + - * / % & ^
if (ConditionHelper.IsNonNullableValueType(mi.ReturnType) &&
RuleValidation.ImplicitConversion(arg1, parm1) &&
RuleValidation.ImplicitConversion(arg2, parm2))
{
return new LiftedArithmeticOperatorMethodInfo(mi);
}
break;
}
}
return null;
}
#endregion
#region Value Type Dispatch Methods
/// <summary>
/// Relational equal operator
/// Value-equality if we can do it, otherwise reference-equality
/// </summary>
/// <param name="rhs"></param>
/// <returns></returns>
internal abstract bool Equal(Literal rhs);
internal virtual bool Equal(byte literalValue)
{
return false;
}
internal virtual bool Equal(sbyte literalValue)
{
return false;
}
internal virtual bool Equal(short literalValue)
{
return false;
}
internal virtual bool Equal(int literalValue)
{
return false;
}
internal virtual bool Equal(long literalValue)
{
return false;
}
internal virtual bool Equal(ushort literalValue)
{
return false;
}
internal virtual bool Equal(uint literalValue)
{
return false;
}
internal virtual bool Equal(ulong literalValue)
{
return false;
}
internal virtual bool Equal(float literalValue)
{
return false;
}
internal virtual bool Equal(double literalValue)
{
return false;
}
internal virtual bool Equal(char literalValue)
{
return false;
}
internal virtual bool Equal(string literalValue)
{
return false;
}
internal virtual bool Equal(decimal literalValue)
{
return false;
}
internal virtual bool Equal(bool literalValue)
{
return false;
}
/// <summary>
/// Relational less than operator
/// </summary>
/// <param name="rhs"></param>
/// <returns></returns>
internal abstract bool LessThan(Literal rhs);
internal virtual bool LessThan()
{
return false;
}
internal virtual bool LessThan(byte literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThan, m_type);
}
internal virtual bool LessThan(char literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThan, m_type);
}
internal virtual bool LessThan(sbyte literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThan, m_type);
}
internal virtual bool LessThan(short literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThan, m_type);
}
internal virtual bool LessThan(int literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThan, m_type);
}
internal virtual bool LessThan(long literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThan, m_type);
}
internal virtual bool LessThan(ushort literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThan, m_type);
}
internal virtual bool LessThan(uint literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThan, m_type);
}
internal virtual bool LessThan(ulong literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThan, m_type);
}
internal virtual bool LessThan(float literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThan, m_type);
}
internal virtual bool LessThan(double literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThan, m_type);
}
internal virtual bool LessThan(string literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThan, m_type);
}
internal virtual bool LessThan(decimal literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThan, m_type);
}
internal virtual bool LessThan(bool literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThan, m_type);
}
/// <summary>
/// Relational greater than operator
/// </summary>
/// <param name="rhs"></param>
/// <returns></returns>
internal abstract bool GreaterThan(Literal rhs);
internal virtual bool GreaterThan()
{
return false;
}
internal virtual bool GreaterThan(byte literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThan, m_type);
}
internal virtual bool GreaterThan(char literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThan, m_type);
}
internal virtual bool GreaterThan(sbyte literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThan, m_type);
}
internal virtual bool GreaterThan(short literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThan, m_type);
}
internal virtual bool GreaterThan(int literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThan, m_type);
}
internal virtual bool GreaterThan(long literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThan, m_type);
}
internal virtual bool GreaterThan(ushort literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThan, m_type);
}
internal virtual bool GreaterThan(uint literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThan, m_type);
}
internal virtual bool GreaterThan(ulong literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThan, m_type);
}
internal virtual bool GreaterThan(float literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThan, m_type);
}
internal virtual bool GreaterThan(double literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThan, m_type);
}
internal virtual bool GreaterThan(string literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThan, m_type);
}
internal virtual bool GreaterThan(decimal literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThan, m_type);
}
internal virtual bool GreaterThan(bool literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThan, m_type);
}
/// <summary>
/// Relational less than or equal to operator
/// </summary>
/// <param name="rhs"></param>
/// <returns></returns>
internal abstract bool LessThanOrEqual(Literal rhs);
internal virtual bool LessThanOrEqual()
{
return false;
}
internal virtual bool LessThanOrEqual(byte literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThanOrEqual, m_type);
}
internal virtual bool LessThanOrEqual(char literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThanOrEqual, m_type);
}
internal virtual bool LessThanOrEqual(sbyte literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThanOrEqual, m_type);
}
internal virtual bool LessThanOrEqual(short literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThanOrEqual, m_type);
}
internal virtual bool LessThanOrEqual(int literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThanOrEqual, m_type);
}
internal virtual bool LessThanOrEqual(long literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThanOrEqual, m_type);
}
internal virtual bool LessThanOrEqual(ushort literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThanOrEqual, m_type);
}
internal virtual bool LessThanOrEqual(uint literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThanOrEqual, m_type);
}
internal virtual bool LessThanOrEqual(ulong literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThanOrEqual, m_type);
}
internal virtual bool LessThanOrEqual(float literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThanOrEqual, m_type);
}
internal virtual bool LessThanOrEqual(double literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThanOrEqual, m_type);
}
internal virtual bool LessThanOrEqual(string literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThanOrEqual, m_type);
}
internal virtual bool LessThanOrEqual(decimal literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThanOrEqual, m_type);
}
internal virtual bool LessThanOrEqual(bool literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.LessThanOrEqual, m_type);
}
/// <summary>
/// Relational greater than or equal to operator
/// </summary>
/// <param name="rhs"></param>
/// <returns></returns>
internal abstract bool GreaterThanOrEqual(Literal rhs);
internal virtual bool GreaterThanOrEqual()
{
return false;
}
internal virtual bool GreaterThanOrEqual(byte literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThanOrEqual, m_type);
}
internal virtual bool GreaterThanOrEqual(char literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThanOrEqual, m_type);
}
internal virtual bool GreaterThanOrEqual(sbyte literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThanOrEqual, m_type);
}
internal virtual bool GreaterThanOrEqual(short literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThanOrEqual, m_type);
}
internal virtual bool GreaterThanOrEqual(int literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThanOrEqual, m_type);
}
internal virtual bool GreaterThanOrEqual(long literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThanOrEqual, m_type);
}
internal virtual bool GreaterThanOrEqual(ushort literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThanOrEqual, m_type);
}
internal virtual bool GreaterThanOrEqual(uint literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThanOrEqual, m_type);
}
internal virtual bool GreaterThanOrEqual(ulong literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThanOrEqual, m_type);
}
internal virtual bool GreaterThanOrEqual(float literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThanOrEqual, m_type);
}
internal virtual bool GreaterThanOrEqual(double literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThanOrEqual, m_type);
}
internal virtual bool GreaterThanOrEqual(string literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThanOrEqual, m_type);
}
internal virtual bool GreaterThanOrEqual(decimal literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThanOrEqual, m_type);
}
internal virtual bool GreaterThanOrEqual(bool literalValue)
{
string message = string.Format(CultureInfo.CurrentCulture, Messages.IncompatibleComparisonTypes, literalValue.GetType(), m_type);
throw new RuleEvaluationIncompatibleTypesException(message, literalValue.GetType(), CodeBinaryOperatorType.GreaterThanOrEqual, m_type);
}
#endregion
}
#endregion
#region Null Literal Class
/// <summary>
/// Represents an null literal
/// </summary>
internal class NullLiteral : Literal
{
// NOTE (from MSDN page on IComparable.CompareTo Method):
// By definition, any object compares greater than a null reference
// But C# (24.3.1) doesn't -- if either side is null, result is false
internal NullLiteral(Type type)
{
m_type = type;
}
internal override object Value
{
get { return null; }
}
internal override bool Equal(Literal rhs)
{
return rhs.Value == null;
}
internal override bool LessThan(Literal rhs)
{
return rhs.GreaterThan();
}
internal override bool LessThan(byte literalValue)
{
return false;
}
internal override bool LessThan(char literalValue)
{
return false;
}
internal override bool LessThan(sbyte literalValue)
{
return false;
}
internal override bool LessThan(short literalValue)
{
return false;
}
internal override bool LessThan(int literalValue)
{
return false;
}
internal override bool LessThan(long literalValue)
{
return false;
}
internal override bool LessThan(ushort literalValue)
{
return false;
}
internal override bool LessThan(uint literalValue)
{
return false;
}
internal override bool LessThan(ulong literalValue)
{
return false;
}
internal override bool LessThan(float literalValue)
{
return false;
}
internal override bool LessThan(double literalValue)
{
return false;
}
internal override bool LessThan(string literalValue)
{
// for strings, maintain compatibility with v1
return true;
}
internal override bool LessThan(decimal literalValue)
{
return false;
}
internal override bool GreaterThan(Literal rhs)
{
return rhs.LessThan();
}
internal override bool GreaterThan(byte literalValue)
{
return false;
}
internal override bool GreaterThan(char literalValue)
{
return false;
}
internal override bool GreaterThan(sbyte literalValue)
{
return false;
}
internal override bool GreaterThan(short literalValue)
{
return false;
}
internal override bool GreaterThan(int literalValue)
{
return false;
}
internal override bool GreaterThan(long literalValue)
{
return false;
}
internal override bool GreaterThan(ushort literalValue)
{
return false;
}
internal override bool GreaterThan(uint literalValue)
{
return false;
}
internal override bool GreaterThan(ulong literalValue)
{
return false;
}
internal override bool GreaterThan(float literalValue)
{
return false;
}
internal override bool GreaterThan(double literalValue)
{
return false;
}
internal override bool GreaterThan(string literalValue)
{
return false;
}
internal override bool GreaterThan(decimal literalValue)
{
return false;
}
/// <summary>
/// Relational less than or equal to operator
/// </summary>
/// <param name="rhs"></param>
/// <returns></returns>
internal override bool LessThanOrEqual(Literal rhs)
{
return rhs.GreaterThanOrEqual();
}
internal override bool LessThanOrEqual()
{
return (m_type == typeof(string)); // null == null for strings only
}
internal override bool LessThanOrEqual(byte literalValue)
{
return false;
}
internal override bool LessThanOrEqual(char literalValue)
{
return false;
}
internal override bool LessThanOrEqual(sbyte literalValue)
{
return false;
}
internal override bool LessThanOrEqual(short literalValue)
{
return false;
}
internal override bool LessThanOrEqual(int literalValue)
{
return false;
}
internal override bool LessThanOrEqual(long literalValue)
{
return false;
}
internal override bool LessThanOrEqual(ushort literalValue)
{
return false;
}
internal override bool LessThanOrEqual(uint literalValue)
{
return false;
}
internal override bool LessThanOrEqual(ulong literalValue)
{
return false;
}
internal override bool LessThanOrEqual(float literalValue)
{
return false;
}
internal override bool LessThanOrEqual(double literalValue)
{
return false;
}
internal override bool LessThanOrEqual(string literalValue)
{
// for strings, maintain compatibility with v1
return true;
}
internal override bool LessThanOrEqual(decimal literalValue)
{
return false;
}
internal override bool GreaterThanOrEqual(Literal rhs)
{
return rhs.LessThanOrEqual();
}
internal override bool GreaterThanOrEqual()
{
return (m_type == typeof(string)); // null == null for strings only
}
internal override bool GreaterThanOrEqual(byte literalValue)
{
return false;
}
internal override bool GreaterThanOrEqual(char literalValue)
{
return false;
}
internal override bool GreaterThanOrEqual(sbyte literalValue)
{
return false;
}
internal override bool GreaterThanOrEqual(short literalValue)
{
return false;
}
internal override bool GreaterThanOrEqual(int literalValue)
{
return false;
}
internal override bool GreaterThanOrEqual(long literalValue)
{
return false;
}
internal override bool GreaterThanOrEqual(ushort literalValue)
{
return false;
}
internal override bool GreaterThanOrEqual(uint literalValue)
{
return false;
}
internal override bool GreaterThanOrEqual(ulong literalValue)
{
return false;
}
internal override bool GreaterThanOrEqual(float literalValue)
{
return false;
}
internal override bool GreaterThanOrEqual(double literalValue)
{
return false;
}
internal override bool GreaterThanOrEqual(string literalValue)
{
return false;
}
internal override bool GreaterThanOrEqual(decimal literalValue)
{
return false;
}
}
#endregion
#region Boolean Literal Class
/// <summary>
/// Represents a boolean literal
/// </summary>
internal class BoolLiteral : Literal
{
private bool m_value;
internal override object Value
{
get { return m_value; }
}
internal BoolLiteral(bool literalValue)
{
m_value = literalValue;
m_type = typeof(bool);
}
internal override bool Equal(Literal rhs)
{
return rhs.Equal(m_value);
}
internal override bool Equal(bool rhs)
{
return m_value == rhs;
}
internal override bool LessThan(Literal rhs)
{
return rhs.GreaterThan(m_value);
}
internal override bool GreaterThan(Literal rhs)
{
return rhs.LessThan(m_value);
}
internal override bool LessThanOrEqual(Literal rhs)
{
return rhs.GreaterThanOrEqual(m_value);
}
internal override bool GreaterThanOrEqual(Literal rhs)
{
return rhs.LessThanOrEqual(m_value);
}
}
#endregion
#region Byte Literal Class
/// <summary>
/// Represents a byte literal
/// </summary>
internal class ByteLiteral : Literal
{
private byte m_value;
internal override object Value
{
get { return m_value; }
}
internal ByteLiteral(byte literalValue)
{
m_value = literalValue;
m_type = typeof(byte);
}
internal override bool Equal(Literal rhs)
{
return rhs.Equal(m_value);
}
internal override bool Equal(sbyte rhs)
{
return m_value == rhs;
}
internal override bool Equal(byte rhs)
{
return m_value == rhs;
}
internal override bool Equal(char rhs)
{
return m_value == rhs;
}
internal override bool Equal(short rhs)
{
return m_value == rhs;
}
internal override bool Equal(ushort rhs)
{
return m_value == rhs;
}
internal override bool Equal(int rhs)
{
return m_value == rhs;
}
internal override bool Equal(uint rhs)
{
return m_value == rhs;
}
internal override bool Equal(long rhs)
{
return m_value == rhs;
}
internal override bool Equal(ulong rhs)
{
return m_value == rhs;
}
internal override bool Equal(float rhs)
{
return m_value == rhs;
}
internal override bool Equal(double rhs)
{
return m_value == rhs;
}
internal override bool Equal(decimal rhs)
{
return m_value == rhs;
}
internal override bool LessThan(Literal rhs)
{
return rhs.GreaterThan(m_value);
}
internal override bool LessThan(sbyte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(byte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(char rhs)
{
return m_value < rhs;
}
internal override bool LessThan(short rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ushort rhs)
{
return m_value < rhs;
}
internal override bool LessThan(int rhs)
{
return m_value < rhs;
}
internal override bool LessThan(uint rhs)
{
return m_value < rhs;
}
internal override bool LessThan(long rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ulong rhs)
{
return m_value < rhs;
}
internal override bool LessThan(float rhs)
{
return m_value < rhs;
}
internal override bool LessThan(double rhs)
{
return m_value < rhs;
}
internal override bool LessThan(decimal rhs)
{
return m_value < rhs;
}
internal override bool GreaterThan(Literal rhs)
{
return rhs.LessThan(m_value);
}
internal override bool GreaterThan(sbyte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(byte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(char rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(short rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ushort rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(int rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(uint rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(long rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ulong rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(float rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(double rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(decimal rhs)
{
return m_value > rhs;
}
internal override bool LessThanOrEqual(Literal rhs)
{
return rhs.GreaterThanOrEqual(m_value);
}
internal override bool LessThanOrEqual(sbyte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(byte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(short rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(char rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ushort rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(int rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(uint rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(long rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ulong rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(float rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(double rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(decimal rhs)
{
return m_value <= rhs;
}
internal override bool GreaterThanOrEqual(Literal rhs)
{
return rhs.LessThanOrEqual(m_value);
}
internal override bool GreaterThanOrEqual(sbyte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(byte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(char rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(short rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ushort rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(int rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(uint rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(long rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ulong rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(float rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(double rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(decimal rhs)
{
return m_value >= rhs;
}
}
#endregion
#region SByte Literal Class
/// <summary>
/// Represents a byte literal
/// </summary>
internal class SByteLiteral : Literal
{
private sbyte m_value;
internal override object Value
{
get { return m_value; }
}
internal SByteLiteral(sbyte literalValue)
{
m_value = literalValue;
m_type = typeof(sbyte);
}
internal override bool Equal(Literal rhs)
{
return rhs.Equal(m_value);
}
internal override bool Equal(sbyte rhs)
{
return m_value == rhs;
}
internal override bool Equal(byte rhs)
{
return m_value == rhs;
}
internal override bool Equal(char rhs)
{
return m_value == rhs;
}
internal override bool Equal(short rhs)
{
return m_value == rhs;
}
internal override bool Equal(ushort rhs)
{
return m_value == rhs;
}
internal override bool Equal(ulong rhs)
{
return (m_value >= 0) && ((ulong)m_value == rhs);
}
internal override bool Equal(int rhs)
{
return m_value == rhs;
}
internal override bool Equal(uint rhs)
{
return m_value == rhs;
}
internal override bool Equal(long rhs)
{
return m_value == rhs;
}
internal override bool Equal(float rhs)
{
return m_value == rhs;
}
internal override bool Equal(double rhs)
{
return m_value == rhs;
}
internal override bool Equal(decimal rhs)
{
return m_value == rhs;
}
internal override bool LessThan(Literal rhs)
{
return rhs.GreaterThan(m_value);
}
internal override bool LessThan(sbyte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(byte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(char rhs)
{
return m_value < rhs;
}
internal override bool LessThan(short rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ushort rhs)
{
return m_value < rhs;
}
internal override bool LessThan(int rhs)
{
return m_value < rhs;
}
internal override bool LessThan(uint rhs)
{
return m_value < rhs;
}
internal override bool LessThan(long rhs)
{
return m_value < rhs;
}
internal override bool LessThan(float rhs)
{
return m_value < rhs;
}
internal override bool LessThan(double rhs)
{
return m_value < rhs;
}
internal override bool LessThan(decimal rhs)
{
return m_value < rhs;
}
internal override bool GreaterThan(Literal rhs)
{
return rhs.LessThan(m_value);
}
internal override bool GreaterThan(sbyte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(byte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(char rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(short rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ushort rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(int rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(uint rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(long rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(float rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(double rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(decimal rhs)
{
return m_value > rhs;
}
internal override bool LessThanOrEqual(Literal rhs)
{
return rhs.GreaterThanOrEqual(m_value);
}
internal override bool LessThanOrEqual(sbyte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(byte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(short rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(char rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ushort rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(int rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(uint rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(long rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(float rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(double rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(decimal rhs)
{
return m_value <= rhs;
}
internal override bool GreaterThanOrEqual(Literal rhs)
{
return rhs.LessThanOrEqual(m_value);
}
internal override bool GreaterThanOrEqual(sbyte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(byte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(char rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(short rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ushort rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(int rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(uint rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(long rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(float rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(double rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(decimal rhs)
{
return m_value >= rhs;
}
}
#endregion
#region Char Literal Class
/// <summary>
/// Represents a byte literal
/// </summary>
internal class CharLiteral : Literal
{
private char m_value;
internal override object Value
{
get { return m_value; }
}
internal CharLiteral(char literalValue)
{
m_value = literalValue;
m_type = typeof(char);
}
internal override bool Equal(Literal rhs)
{
return rhs.Equal(m_value);
}
internal override bool Equal(sbyte rhs)
{
return m_value == rhs;
}
internal override bool Equal(byte rhs)
{
return m_value == rhs;
}
internal override bool Equal(char rhs)
{
return m_value == rhs;
}
internal override bool Equal(short rhs)
{
return m_value == rhs;
}
internal override bool Equal(ushort rhs)
{
return m_value == rhs;
}
internal override bool Equal(int rhs)
{
return m_value == rhs;
}
internal override bool Equal(uint rhs)
{
return m_value == rhs;
}
internal override bool Equal(long rhs)
{
return m_value == rhs;
}
internal override bool Equal(ulong rhs)
{
return m_value == rhs;
}
internal override bool Equal(float rhs)
{
return m_value == rhs;
}
internal override bool Equal(double rhs)
{
return m_value == rhs;
}
internal override bool Equal(decimal rhs)
{
return m_value == rhs;
}
internal override bool LessThan(Literal rhs)
{
return rhs.GreaterThan(m_value);
}
internal override bool LessThan(sbyte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(byte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(char rhs)
{
return m_value < rhs;
}
internal override bool LessThan(short rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ushort rhs)
{
return m_value < rhs;
}
internal override bool LessThan(int rhs)
{
return m_value < rhs;
}
internal override bool LessThan(uint rhs)
{
return m_value < rhs;
}
internal override bool LessThan(long rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ulong rhs)
{
return m_value < rhs;
}
internal override bool LessThan(float rhs)
{
return m_value < rhs;
}
internal override bool LessThan(double rhs)
{
return m_value < rhs;
}
internal override bool LessThan(decimal rhs)
{
return m_value < rhs;
}
internal override bool GreaterThan(Literal rhs)
{
return rhs.LessThan(m_value);
}
internal override bool GreaterThan(sbyte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(byte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(char rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(short rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ushort rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(int rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(uint rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(long rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ulong rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(float rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(double rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(decimal rhs)
{
return m_value > rhs;
}
internal override bool LessThanOrEqual(Literal rhs)
{
return rhs.GreaterThanOrEqual(m_value);
}
internal override bool LessThanOrEqual(sbyte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(byte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(short rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(char rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ushort rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(int rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(uint rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(long rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ulong rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(float rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(double rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(decimal rhs)
{
return m_value <= rhs;
}
internal override bool GreaterThanOrEqual(Literal rhs)
{
return rhs.LessThanOrEqual(m_value);
}
internal override bool GreaterThanOrEqual(sbyte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(byte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(char rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(short rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ushort rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(int rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(uint rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(long rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ulong rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(float rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(double rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(decimal rhs)
{
return m_value >= rhs;
}
}
#endregion
#region Decimal Literal Class
/// <summary>
/// Represents a decimal literal
/// </summary>
internal class DecimalLiteral : Literal
{
private decimal m_value;
internal override object Value
{
get { return m_value; }
}
internal DecimalLiteral(decimal literalValue)
{
m_value = literalValue;
m_type = typeof(decimal);
}
internal override bool Equal(Literal rhs)
{
return rhs.Equal(m_value);
}
internal override bool Equal(sbyte rhs)
{
return m_value == rhs;
}
internal override bool Equal(byte rhs)
{
return m_value == rhs;
}
internal override bool Equal(char rhs)
{
return m_value == rhs;
}
internal override bool Equal(short rhs)
{
return m_value == rhs;
}
internal override bool Equal(ushort rhs)
{
return m_value == rhs;
}
internal override bool Equal(int rhs)
{
return m_value == rhs;
}
internal override bool Equal(uint rhs)
{
return m_value == rhs;
}
internal override bool Equal(long rhs)
{
return m_value == rhs;
}
internal override bool Equal(ulong rhs)
{
return m_value == rhs;
}
internal override bool Equal(decimal rhs)
{
return m_value == rhs;
}
internal override bool LessThan(Literal rhs)
{
return rhs.GreaterThan(m_value);
}
internal override bool LessThan(sbyte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(byte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(char rhs)
{
return m_value < rhs;
}
internal override bool LessThan(short rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ushort rhs)
{
return m_value < rhs;
}
internal override bool LessThan(int rhs)
{
return m_value < rhs;
}
internal override bool LessThan(uint rhs)
{
return m_value < rhs;
}
internal override bool LessThan(long rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ulong rhs)
{
return m_value < rhs;
}
internal override bool LessThan(decimal rhs)
{
return m_value < rhs;
}
internal override bool GreaterThan(Literal rhs)
{
return rhs.LessThan(m_value);
}
internal override bool GreaterThan(sbyte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(byte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(char rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(short rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ushort rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(int rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(uint rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(long rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ulong rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(decimal rhs)
{
return m_value > rhs;
}
internal override bool LessThanOrEqual(Literal rhs)
{
return rhs.GreaterThanOrEqual(m_value);
}
internal override bool LessThanOrEqual(sbyte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(byte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(short rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(char rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ushort rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(int rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(uint rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(long rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ulong rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(decimal rhs)
{
return m_value <= rhs;
}
internal override bool GreaterThanOrEqual(Literal rhs)
{
return rhs.LessThanOrEqual(m_value);
}
internal override bool GreaterThanOrEqual(sbyte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(byte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(char rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(short rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ushort rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(int rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(uint rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(long rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ulong rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(decimal rhs)
{
return m_value >= rhs;
}
}
#endregion
#region Int16 Literal Class
/// <summary>
/// Represents an Int16 literal
/// </summary>
internal class ShortLiteral : Literal
{
private short m_value;
internal override object Value
{
get { return m_value; }
}
internal ShortLiteral(short literalValue)
{
m_value = literalValue;
m_type = typeof(short);
}
internal override bool Equal(Literal rhs)
{
return rhs.Equal(m_value);
}
internal override bool Equal(sbyte rhs)
{
return m_value == rhs;
}
internal override bool Equal(byte rhs)
{
return m_value == rhs;
}
internal override bool Equal(char rhs)
{
return m_value == rhs;
}
internal override bool Equal(short rhs)
{
return m_value == rhs;
}
internal override bool Equal(ushort rhs)
{
return m_value == rhs;
}
internal override bool Equal(int rhs)
{
return m_value == rhs;
}
internal override bool Equal(uint rhs)
{
return m_value == rhs;
}
internal override bool Equal(long rhs)
{
return m_value == rhs;
}
internal override bool Equal(ulong rhs)
{
return (m_value >= 0) && ((ulong)m_value == rhs);
}
internal override bool Equal(float rhs)
{
return m_value == rhs;
}
internal override bool Equal(double rhs)
{
return m_value == rhs;
}
internal override bool Equal(decimal rhs)
{
return m_value == rhs;
}
internal override bool LessThan(Literal rhs)
{
return rhs.GreaterThan(m_value);
}
internal override bool LessThan(sbyte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(byte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(char rhs)
{
return m_value < rhs;
}
internal override bool LessThan(short rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ushort rhs)
{
return m_value < rhs;
}
internal override bool LessThan(int rhs)
{
return m_value < rhs;
}
internal override bool LessThan(uint rhs)
{
return m_value < rhs;
}
internal override bool LessThan(long rhs)
{
return m_value < rhs;
}
internal override bool LessThan(float rhs)
{
return m_value < rhs;
}
internal override bool LessThan(double rhs)
{
return m_value < rhs;
}
internal override bool LessThan(decimal rhs)
{
return m_value < rhs;
}
internal override bool GreaterThan(Literal rhs)
{
return rhs.LessThan(m_value);
}
internal override bool GreaterThan(sbyte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(byte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(char rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(short rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ushort rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(int rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(uint rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(long rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(float rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(double rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(decimal rhs)
{
return m_value > rhs;
}
internal override bool LessThanOrEqual(Literal rhs)
{
return rhs.GreaterThanOrEqual(m_value);
}
internal override bool LessThanOrEqual(sbyte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(byte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(short rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(char rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ushort rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(int rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(uint rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(long rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(float rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(double rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(decimal rhs)
{
return m_value <= rhs;
}
internal override bool GreaterThanOrEqual(Literal rhs)
{
return rhs.LessThanOrEqual(m_value);
}
internal override bool GreaterThanOrEqual(sbyte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(byte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(char rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(short rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ushort rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(int rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(uint rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(long rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(float rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(double rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(decimal rhs)
{
return m_value >= rhs;
}
}
#endregion
#region Int32 Literal Class
/// <summary>
/// Represents an Int32 literal
/// </summary>
internal class IntLiteral : Literal
{
private int m_value;
internal override object Value
{
get { return m_value; }
}
internal IntLiteral(int literalValue)
{
m_value = literalValue;
m_type = typeof(int);
}
internal override bool Equal(Literal rhs)
{
return rhs.Equal(m_value);
}
internal override bool Equal(sbyte rhs)
{
return m_value == rhs;
}
internal override bool Equal(byte rhs)
{
return m_value == rhs;
}
internal override bool Equal(char rhs)
{
return m_value == rhs;
}
internal override bool Equal(short rhs)
{
return m_value == rhs;
}
internal override bool Equal(ushort rhs)
{
return m_value == rhs;
}
internal override bool Equal(int rhs)
{
return m_value == rhs;
}
internal override bool Equal(uint rhs)
{
return m_value == rhs;
}
internal override bool Equal(long rhs)
{
return m_value == rhs;
}
internal override bool Equal(ulong rhs)
{
return (m_value >= 0) && ((ulong)m_value == rhs);
}
internal override bool Equal(float rhs)
{
return m_value == rhs;
}
internal override bool Equal(double rhs)
{
return m_value == rhs;
}
internal override bool Equal(decimal rhs)
{
return m_value == rhs;
}
internal override bool LessThan(Literal rhs)
{
return rhs.GreaterThan(m_value);
}
internal override bool LessThan(sbyte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(byte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(char rhs)
{
return m_value < rhs;
}
internal override bool LessThan(short rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ushort rhs)
{
return m_value < rhs;
}
internal override bool LessThan(int rhs)
{
return m_value < rhs;
}
internal override bool LessThan(uint rhs)
{
return m_value < rhs;
}
internal override bool LessThan(long rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ulong rhs)
{
return (m_value < 0) || ((ulong)m_value < rhs);
}
internal override bool LessThan(float rhs)
{
return m_value < rhs;
}
internal override bool LessThan(double rhs)
{
return m_value < rhs;
}
internal override bool LessThan(decimal rhs)
{
return m_value < rhs;
}
internal override bool GreaterThan(Literal rhs)
{
return rhs.LessThan(m_value);
}
internal override bool GreaterThan(sbyte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(byte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(char rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(short rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ushort rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(int rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(uint rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(long rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ulong rhs)
{
return (m_value >= 0) && ((ulong)m_value > rhs);
}
internal override bool GreaterThan(float rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(double rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(decimal rhs)
{
return m_value > rhs;
}
internal override bool LessThanOrEqual(Literal rhs)
{
return rhs.GreaterThanOrEqual(m_value);
}
internal override bool LessThanOrEqual(sbyte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(byte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(short rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(char rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ushort rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(int rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(uint rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(long rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ulong rhs)
{
return (m_value < 0) || ((ulong)m_value <= rhs);
}
internal override bool LessThanOrEqual(float rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(double rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(decimal rhs)
{
return m_value <= rhs;
}
internal override bool GreaterThanOrEqual(Literal rhs)
{
return rhs.LessThanOrEqual(m_value);
}
internal override bool GreaterThanOrEqual(sbyte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(byte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(char rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(short rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ushort rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(int rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(uint rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(long rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ulong rhs)
{
return (m_value >= 0) && ((ulong)m_value >= rhs);
}
internal override bool GreaterThanOrEqual(float rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(double rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(decimal rhs)
{
return m_value >= rhs;
}
}
#endregion
#region Int64 Literal Class
/// <summary>
/// Represents an Int64 literal
/// </summary>
internal class LongLiteral : Literal
{
private long m_value;
internal override object Value
{
get { return m_value; }
}
internal LongLiteral(long literalValue)
{
m_value = literalValue;
m_type = typeof(long);
}
internal override bool Equal(Literal rhs)
{
return rhs.Equal(m_value);
}
internal override bool Equal(sbyte rhs)
{
return m_value == rhs;
}
internal override bool Equal(byte rhs)
{
return m_value == rhs;
}
internal override bool Equal(char rhs)
{
return m_value == rhs;
}
internal override bool Equal(short rhs)
{
return m_value == rhs;
}
internal override bool Equal(ushort rhs)
{
return m_value == rhs;
}
internal override bool Equal(int rhs)
{
return m_value == rhs;
}
internal override bool Equal(uint rhs)
{
return m_value == rhs;
}
internal override bool Equal(long rhs)
{
return m_value == rhs;
}
internal override bool Equal(ulong rhs)
{
return (m_value >= 0) && ((ulong)m_value == rhs);
}
internal override bool Equal(float rhs)
{
return m_value == rhs;
}
internal override bool Equal(double rhs)
{
return m_value == rhs;
}
internal override bool Equal(decimal rhs)
{
return m_value == rhs;
}
internal override bool LessThan(Literal rhs)
{
return rhs.GreaterThan(m_value);
}
internal override bool LessThan(sbyte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(byte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(char rhs)
{
return m_value < rhs;
}
internal override bool LessThan(short rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ushort rhs)
{
return m_value < rhs;
}
internal override bool LessThan(int rhs)
{
return m_value < rhs;
}
internal override bool LessThan(uint rhs)
{
return m_value < rhs;
}
internal override bool LessThan(long rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ulong rhs)
{
return (m_value < 0) || ((ulong)m_value < rhs);
}
internal override bool LessThan(float rhs)
{
return m_value < rhs;
}
internal override bool LessThan(double rhs)
{
return m_value < rhs;
}
internal override bool LessThan(decimal rhs)
{
return m_value < rhs;
}
internal override bool GreaterThan(Literal rhs)
{
return rhs.LessThan(m_value);
}
internal override bool GreaterThan(sbyte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(byte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(char rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(short rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ushort rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(int rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(uint rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(long rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ulong rhs)
{
return (m_value >= 0) && ((ulong)m_value > rhs);
}
internal override bool GreaterThan(float rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(double rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(decimal rhs)
{
return m_value > rhs;
}
internal override bool LessThanOrEqual(Literal rhs)
{
return rhs.GreaterThanOrEqual(m_value);
}
internal override bool LessThanOrEqual(sbyte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(byte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(short rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(char rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ushort rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(int rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(uint rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(long rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ulong rhs)
{
return (m_value < 0) || ((ulong)m_value <= rhs);
}
internal override bool LessThanOrEqual(float rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(double rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(decimal rhs)
{
return m_value <= rhs;
}
internal override bool GreaterThanOrEqual(Literal rhs)
{
return rhs.LessThanOrEqual(m_value);
}
internal override bool GreaterThanOrEqual(sbyte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(byte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(char rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(short rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ushort rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(int rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(uint rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(long rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ulong rhs)
{
return (m_value >= 0) && ((ulong)m_value >= rhs);
}
internal override bool GreaterThanOrEqual(float rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(double rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(decimal rhs)
{
return m_value >= rhs;
}
}
#endregion
#region UInt16 Literal Class
/// <summary>
/// Represents an UInt16 literal
/// </summary>
internal class UShortLiteral : Literal
{
private ushort m_value;
internal override object Value
{
get { return m_value; }
}
internal UShortLiteral(ushort literalValue)
{
m_value = literalValue;
m_type = typeof(ushort);
}
internal override bool Equal(Literal rhs)
{
return rhs.Equal(m_value);
}
internal override bool Equal(sbyte rhs)
{
return m_value == rhs;
}
internal override bool Equal(byte rhs)
{
return m_value == rhs;
}
internal override bool Equal(char rhs)
{
return m_value == rhs;
}
internal override bool Equal(short rhs)
{
return m_value == rhs;
}
internal override bool Equal(ushort rhs)
{
return m_value == rhs;
}
internal override bool Equal(int rhs)
{
return m_value == rhs;
}
internal override bool Equal(uint rhs)
{
return m_value == rhs;
}
internal override bool Equal(long rhs)
{
return m_value == rhs;
}
internal override bool Equal(ulong rhs)
{
return m_value == rhs;
}
internal override bool Equal(float rhs)
{
return m_value == rhs;
}
internal override bool Equal(double rhs)
{
return m_value == rhs;
}
internal override bool Equal(decimal rhs)
{
return m_value == rhs;
}
internal override bool LessThan(Literal rhs)
{
return rhs.GreaterThan(m_value);
}
internal override bool LessThan(sbyte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(byte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(char rhs)
{
return m_value < rhs;
}
internal override bool LessThan(short rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ushort rhs)
{
return m_value < rhs;
}
internal override bool LessThan(int rhs)
{
return m_value < rhs;
}
internal override bool LessThan(uint rhs)
{
return m_value < rhs;
}
internal override bool LessThan(long rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ulong rhs)
{
return m_value < rhs;
}
internal override bool LessThan(float rhs)
{
return m_value < rhs;
}
internal override bool LessThan(double rhs)
{
return m_value < rhs;
}
internal override bool LessThan(decimal rhs)
{
return m_value < rhs;
}
internal override bool GreaterThan(Literal rhs)
{
return rhs.LessThan(m_value);
}
internal override bool GreaterThan(sbyte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(byte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(char rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(short rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ushort rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(int rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(uint rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(long rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ulong rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(float rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(double rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(decimal rhs)
{
return m_value > rhs;
}
internal override bool LessThanOrEqual(Literal rhs)
{
return rhs.GreaterThanOrEqual(m_value);
}
internal override bool LessThanOrEqual(sbyte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(byte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(short rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(char rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ushort rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(int rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(uint rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(long rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ulong rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(float rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(double rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(decimal rhs)
{
return m_value <= rhs;
}
internal override bool GreaterThanOrEqual(Literal rhs)
{
return rhs.LessThanOrEqual(m_value);
}
internal override bool GreaterThanOrEqual(sbyte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(byte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(char rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(short rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ushort rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(int rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(uint rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(long rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ulong rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(float rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(double rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(decimal rhs)
{
return m_value >= rhs;
}
}
#endregion
#region UInt32 Literal Class
/// <summary>
/// Represents an UInt32 literal
/// </summary>
internal class UIntLiteral : Literal
{
private uint m_value;
internal override object Value
{
get { return m_value; }
}
internal UIntLiteral(uint literalValue)
{
m_value = literalValue;
m_type = typeof(uint);
}
internal override bool Equal(Literal rhs)
{
return rhs.Equal(m_value);
}
internal override bool Equal(sbyte rhs)
{
return m_value == rhs;
}
internal override bool Equal(byte rhs)
{
return m_value == rhs;
}
internal override bool Equal(char rhs)
{
return m_value == rhs;
}
internal override bool Equal(short rhs)
{
return m_value == rhs;
}
internal override bool Equal(ushort rhs)
{
return m_value == rhs;
}
internal override bool Equal(int rhs)
{
return m_value == rhs;
}
internal override bool Equal(uint rhs)
{
return m_value == rhs;
}
internal override bool Equal(long rhs)
{
return m_value == rhs;
}
internal override bool Equal(ulong rhs)
{
return m_value == rhs;
}
internal override bool Equal(float rhs)
{
return m_value == rhs;
}
internal override bool Equal(double rhs)
{
return m_value == rhs;
}
internal override bool Equal(decimal rhs)
{
return m_value == rhs;
}
internal override bool LessThan(Literal rhs)
{
return rhs.GreaterThan(m_value);
}
internal override bool LessThan(sbyte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(byte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(char rhs)
{
return m_value < rhs;
}
internal override bool LessThan(short rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ushort rhs)
{
return m_value < rhs;
}
internal override bool LessThan(int rhs)
{
return m_value < rhs;
}
internal override bool LessThan(uint rhs)
{
return m_value < rhs;
}
internal override bool LessThan(long rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ulong rhs)
{
return m_value < rhs;
}
internal override bool LessThan(float rhs)
{
return m_value < rhs;
}
internal override bool LessThan(double rhs)
{
return m_value < rhs;
}
internal override bool LessThan(decimal rhs)
{
return m_value < rhs;
}
internal override bool GreaterThan(Literal rhs)
{
return rhs.LessThan(m_value);
}
internal override bool GreaterThan(sbyte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(byte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(char rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(short rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ushort rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(int rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(uint rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(long rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ulong rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(float rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(double rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(decimal rhs)
{
return m_value > rhs;
}
internal override bool LessThanOrEqual(Literal rhs)
{
return rhs.GreaterThanOrEqual(m_value);
}
internal override bool LessThanOrEqual(sbyte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(byte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(short rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(char rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ushort rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(int rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(uint rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(long rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ulong rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(float rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(double rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(decimal rhs)
{
return m_value <= rhs;
}
internal override bool GreaterThanOrEqual(Literal rhs)
{
return rhs.LessThanOrEqual(m_value);
}
internal override bool GreaterThanOrEqual(sbyte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(byte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(char rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(short rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ushort rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(int rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(uint rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(long rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ulong rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(float rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(double rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(decimal rhs)
{
return m_value >= rhs;
}
}
#endregion
#region UInt64 Literal Class
/// <summary>
/// Represents an UInt64 literal
/// </summary>
internal class ULongLiteral : Literal
{
private ulong m_value;
internal override object Value
{
get { return m_value; }
}
internal ULongLiteral(ulong literalValue)
{
m_value = literalValue;
m_type = typeof(ulong);
}
internal override bool Equal(Literal rhs)
{
return rhs.Equal(m_value);
}
internal override bool Equal(byte rhs)
{
return m_value == rhs;
}
internal override bool Equal(sbyte rhs)
{
return (rhs >= 0) && (m_value == (ulong)rhs);
}
internal override bool Equal(short rhs)
{
return (rhs >= 0) && (m_value == (ulong)rhs);
}
internal override bool Equal(int rhs)
{
return (rhs >= 0) && (m_value == (ulong)rhs);
}
internal override bool Equal(long rhs)
{
return (rhs >= 0) && (m_value == (ulong)rhs);
}
internal override bool Equal(char rhs)
{
return m_value == rhs;
}
internal override bool Equal(ushort rhs)
{
return m_value == rhs;
}
internal override bool Equal(uint rhs)
{
return m_value == rhs;
}
internal override bool Equal(ulong rhs)
{
return m_value == rhs;
}
internal override bool Equal(float rhs)
{
return m_value == rhs;
}
internal override bool Equal(double rhs)
{
return m_value == rhs;
}
internal override bool Equal(decimal rhs)
{
return m_value == rhs;
}
internal override bool LessThan(Literal rhs)
{
return rhs.GreaterThan(m_value);
}
internal override bool LessThan(byte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(int rhs)
{
return (rhs >= 0) && (m_value < (ulong)rhs);
}
internal override bool LessThan(long rhs)
{
return (rhs >= 0) && (m_value < (ulong)rhs);
}
internal override bool LessThan(char rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ushort rhs)
{
return m_value < rhs;
}
internal override bool LessThan(uint rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ulong rhs)
{
return m_value < rhs;
}
internal override bool LessThan(float rhs)
{
return m_value < rhs;
}
internal override bool LessThan(double rhs)
{
return m_value < rhs;
}
internal override bool LessThan(decimal rhs)
{
return m_value < rhs;
}
internal override bool GreaterThan(Literal rhs)
{
return rhs.LessThan(m_value);
}
internal override bool GreaterThan(byte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(int rhs)
{
return (rhs < 0) || (m_value > (ulong)rhs);
}
internal override bool GreaterThan(long rhs)
{
return (rhs < 0) || (m_value > (ulong)rhs);
}
internal override bool GreaterThan(char rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ushort rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(uint rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ulong rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(float rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(double rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(decimal rhs)
{
return m_value > rhs;
}
internal override bool LessThanOrEqual(Literal rhs)
{
return rhs.GreaterThanOrEqual(m_value);
}
internal override bool LessThanOrEqual(byte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(int rhs)
{
return (rhs >= 0) && (m_value <= (ulong)rhs);
}
internal override bool LessThanOrEqual(long rhs)
{
return (rhs >= 0) && (m_value <= (ulong)rhs);
}
internal override bool LessThanOrEqual(char rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ushort rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(uint rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ulong rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(float rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(double rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(decimal rhs)
{
return m_value <= rhs;
}
internal override bool GreaterThanOrEqual(Literal rhs)
{
return rhs.LessThanOrEqual(m_value);
}
internal override bool GreaterThanOrEqual(byte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(int rhs)
{
return (rhs < 0) || (m_value >= (ulong)rhs);
}
internal override bool GreaterThanOrEqual(long rhs)
{
return (rhs < 0) || (m_value >= (ulong)rhs);
}
internal override bool GreaterThanOrEqual(char rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ushort rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(uint rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ulong rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(float rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(double rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(decimal rhs)
{
return m_value >= rhs;
}
}
#endregion
#region Double Literal Class
/// <summary>
/// Represents a double literal
/// </summary>
internal class DoubleLiteral : Literal
{
private double m_value;
internal override object Value
{
get { return m_value; }
}
internal DoubleLiteral(double literalValue)
{
m_value = literalValue;
m_type = typeof(double);
}
internal override bool Equal(Literal rhs)
{
return rhs.Equal(m_value);
}
internal override bool Equal(sbyte rhs)
{
return m_value == rhs;
}
internal override bool Equal(byte rhs)
{
return m_value == rhs;
}
internal override bool Equal(char rhs)
{
return m_value == rhs;
}
internal override bool Equal(short rhs)
{
return m_value == rhs;
}
internal override bool Equal(ushort rhs)
{
return m_value == rhs;
}
internal override bool Equal(int rhs)
{
return m_value == rhs;
}
internal override bool Equal(uint rhs)
{
return m_value == rhs;
}
internal override bool Equal(long rhs)
{
return m_value == rhs;
}
internal override bool Equal(ulong rhs)
{
return m_value == rhs;
}
internal override bool Equal(float rhs)
{
return m_value == rhs;
}
internal override bool Equal(double rhs)
{
return m_value == rhs;
}
internal override bool LessThan(Literal rhs)
{
return rhs.GreaterThan(m_value);
}
internal override bool LessThan(sbyte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(byte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(char rhs)
{
return m_value < rhs;
}
internal override bool LessThan(short rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ushort rhs)
{
return m_value < rhs;
}
internal override bool LessThan(int rhs)
{
return m_value < rhs;
}
internal override bool LessThan(uint rhs)
{
return m_value < rhs;
}
internal override bool LessThan(long rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ulong rhs)
{
return m_value < rhs;
}
internal override bool LessThan(float rhs)
{
return m_value < rhs;
}
internal override bool LessThan(double rhs)
{
return m_value < rhs;
}
internal override bool GreaterThan(Literal rhs)
{
return rhs.LessThan(m_value);
}
internal override bool GreaterThan(sbyte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(byte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(char rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(short rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ushort rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(int rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(uint rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(long rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ulong rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(float rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(double rhs)
{
return m_value > rhs;
}
internal override bool LessThanOrEqual(Literal rhs)
{
return rhs.GreaterThanOrEqual(m_value);
}
internal override bool LessThanOrEqual(sbyte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(byte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(short rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(char rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ushort rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(int rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(uint rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(long rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ulong rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(float rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(double rhs)
{
return m_value <= rhs;
}
internal override bool GreaterThanOrEqual(Literal rhs)
{
return rhs.LessThanOrEqual(m_value);
}
internal override bool GreaterThanOrEqual(sbyte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(byte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(char rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(short rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ushort rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(int rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(uint rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(long rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ulong rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(float rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(double rhs)
{
return m_value >= rhs;
}
}
#endregion
#region Float Literal Class
/// <summary>
/// Represents a float literal
/// </summary>
internal class FloatLiteral : Literal
{
private float m_value;
internal override object Value
{
get { return m_value; }
}
internal FloatLiteral(float literalValue)
{
m_value = literalValue;
m_type = typeof(float);
}
internal override bool Equal(Literal rhs)
{
return rhs.Equal(m_value);
}
internal override bool Equal(sbyte rhs)
{
return m_value == rhs;
}
internal override bool Equal(byte rhs)
{
return m_value == rhs;
}
internal override bool Equal(char rhs)
{
return m_value == rhs;
}
internal override bool Equal(short rhs)
{
return m_value == rhs;
}
internal override bool Equal(ushort rhs)
{
return m_value == rhs;
}
internal override bool Equal(int rhs)
{
return m_value == rhs;
}
internal override bool Equal(uint rhs)
{
return m_value == rhs;
}
internal override bool Equal(long rhs)
{
return m_value == rhs;
}
internal override bool Equal(ulong rhs)
{
return m_value == rhs;
}
internal override bool Equal(float rhs)
{
return m_value == rhs;
}
internal override bool Equal(double rhs)
{
return m_value == rhs;
}
internal override bool LessThan(Literal rhs)
{
return rhs.GreaterThan(m_value);
}
internal override bool LessThan(sbyte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(byte rhs)
{
return m_value < rhs;
}
internal override bool LessThan(char rhs)
{
return m_value < rhs;
}
internal override bool LessThan(short rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ushort rhs)
{
return m_value < rhs;
}
internal override bool LessThan(int rhs)
{
return m_value < rhs;
}
internal override bool LessThan(uint rhs)
{
return m_value < rhs;
}
internal override bool LessThan(long rhs)
{
return m_value < rhs;
}
internal override bool LessThan(ulong rhs)
{
return m_value < rhs;
}
internal override bool LessThan(float rhs)
{
return m_value < rhs;
}
internal override bool LessThan(double rhs)
{
return m_value < rhs;
}
internal override bool GreaterThan(Literal rhs)
{
return rhs.LessThan(m_value);
}
internal override bool GreaterThan(sbyte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(byte rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(char rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(short rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ushort rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(int rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(uint rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(long rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(ulong rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(float rhs)
{
return m_value > rhs;
}
internal override bool GreaterThan(double rhs)
{
return m_value > rhs;
}
internal override bool LessThanOrEqual(Literal rhs)
{
return rhs.GreaterThanOrEqual(m_value);
}
internal override bool LessThanOrEqual(sbyte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(byte rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(short rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(char rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ushort rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(int rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(uint rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(long rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(ulong rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(float rhs)
{
return m_value <= rhs;
}
internal override bool LessThanOrEqual(double rhs)
{
return m_value <= rhs;
}
internal override bool GreaterThanOrEqual(Literal rhs)
{
return rhs.LessThanOrEqual(m_value);
}
internal override bool GreaterThanOrEqual(sbyte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(byte rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(char rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(short rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ushort rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(int rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(uint rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(long rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(ulong rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(float rhs)
{
return m_value >= rhs;
}
internal override bool GreaterThanOrEqual(double rhs)
{
return m_value >= rhs;
}
}
#endregion
#region String Literal Class
/// <summary>
/// Represents a string literal
/// </summary>
internal class StringLiteral : Literal
{
private string m_value;
internal override object Value
{
get { return m_value; }
}
internal StringLiteral(string internalValue)
{
m_value = internalValue;
m_type = typeof(string);
}
internal override bool Equal(Literal rhs)
{
return rhs.Equal(m_value);
}
internal override bool Equal(string rhs)
{
return m_value == rhs;
}
internal override bool LessThan(Literal rhs)
{
return rhs.GreaterThan(m_value);
}
internal override bool LessThan(string rhs)
{
return 0 > string.Compare(m_value, rhs, false, System.Globalization.CultureInfo.CurrentCulture);
}
internal override bool GreaterThan(Literal rhs)
{
return rhs.LessThan(m_value);
}
internal override bool GreaterThan()
{
return true;
}
internal override bool GreaterThan(string rhs)
{
return 0 < string.Compare(m_value, rhs, false, System.Globalization.CultureInfo.CurrentCulture);
}
internal override bool LessThanOrEqual(Literal rhs)
{
return rhs.GreaterThanOrEqual(m_value);
}
internal override bool LessThanOrEqual(string rhs)
{
return 0 >= string.Compare(m_value, (string)rhs, false, System.Globalization.CultureInfo.CurrentCulture);
}
internal override bool GreaterThanOrEqual(Literal rhs)
{
return rhs.LessThanOrEqual(m_value);
}
internal override bool GreaterThanOrEqual()
{
return true;
}
internal override bool GreaterThanOrEqual(string rhs)
{
return 0 <= string.Compare(m_value, rhs, false, System.Globalization.CultureInfo.CurrentCulture);
}
}
#endregion
}
|