Mercurial > pub > bltoolkit
diff Source/Common/Operator.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/Common/Operator.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,1405 @@ +using System; +using System.Data.SqlTypes; + +namespace BLToolkit.Common +{ + public static class Operator<T> + { + public static IOperable<T> Op = GetOperable(); + private static IOperable<T> GetOperable() + { + Type t = typeof(T); + + // Scalar types. + // + if (t == typeof(String)) return (IOperable<T>)new S(); + + if (t == typeof(SByte)) return (IOperable<T>)new S8(); + if (t == typeof(Int16)) return (IOperable<T>)new S16(); + if (t == typeof(Int32)) return (IOperable<T>)new S32(); + if (t == typeof(Int64)) return (IOperable<T>)new S64(); + + if (t == typeof(Byte)) return (IOperable<T>)new U8(); + if (t == typeof(UInt16)) return (IOperable<T>)new U16(); + if (t == typeof(UInt32)) return (IOperable<T>)new U32(); + if (t == typeof(UInt64)) return (IOperable<T>)new U64(); + + if (t == typeof(bool)) return (IOperable<T>)new B(); + if (t == typeof(Char)) return (IOperable<T>)new C(); + if (t == typeof(Single)) return (IOperable<T>)new R4(); + if (t == typeof(Double)) return (IOperable<T>)new R8(); + + if (t == typeof(Decimal)) return (IOperable<T>)new D(); + if (t == typeof(DateTime)) return (IOperable<T>)new DT(); + if (t == typeof(TimeSpan)) return (IOperable<T>)new TS(); + if (t == typeof(Guid)) return (IOperable<T>)new G(); + + // Nullable types. + // + if (t == typeof(SByte?)) return (IOperable<T>)new NS8(); + if (t == typeof(Int16?)) return (IOperable<T>)new NS16(); + if (t == typeof(Int32?)) return (IOperable<T>)new NS32(); + if (t == typeof(Int64?)) return (IOperable<T>)new NS64(); + + if (t == typeof(Byte?)) return (IOperable<T>)new NU8(); + if (t == typeof(UInt16?)) return (IOperable<T>)new NU16(); + if (t == typeof(UInt32?)) return (IOperable<T>)new NU32(); + if (t == typeof(UInt64?)) return (IOperable<T>)new NU64(); + + if (t == typeof(bool?)) return (IOperable<T>)new NB(); + if (t == typeof(Char?)) return (IOperable<T>)new NC(); + if (t == typeof(Single?)) return (IOperable<T>)new NR4(); + if (t == typeof(Double?)) return (IOperable<T>)new NR8(); + + if (t == typeof(Decimal?)) return (IOperable<T>)new ND(); + if (t == typeof(DateTime?)) return (IOperable<T>)new NDT(); + if (t == typeof(TimeSpan?)) return (IOperable<T>)new NTS(); + if (t == typeof(Guid?)) return (IOperable<T>)new NG(); + + // Sql types. + // + if (t == typeof(SqlString)) return (IOperable<T>)new DBS(); + + if (t == typeof(SqlByte)) return (IOperable<T>)new DBU8(); + if (t == typeof(SqlInt16)) return (IOperable<T>)new DBS16(); + if (t == typeof(SqlInt32)) return (IOperable<T>)new DBS32(); + if (t == typeof(SqlInt64)) return (IOperable<T>)new DBS64(); + + if (t == typeof(SqlSingle)) return (IOperable<T>)new DBR4(); + if (t == typeof(SqlDouble)) return (IOperable<T>)new DBR8(); + if (t == typeof(SqlDecimal)) return (IOperable<T>)new DBD(); + if (t == typeof(SqlMoney)) return (IOperable<T>)new DBM(); + + if (t == typeof(SqlBoolean)) return (IOperable<T>)new DBB(); + if (t == typeof(SqlBinary)) return (IOperable<T>)new DBBin(); + if (t == typeof(SqlDateTime)) return (IOperable<T>)new DBDT(); + if (t == typeof(SqlGuid)) return (IOperable<T>)new DBG(); + + return new Default<T>(); + } + + public static T Addition (T op1, T op2) { return Op.Addition (op1, op2); } + public static T Subtraction (T op1, T op2) { return Op.Subtraction (op1, op2); } + public static T Multiply (T op1, T op2) { return Op.Multiply (op1, op2); } + public static T Division (T op1, T op2) { return Op.Division (op1, op2); } + public static T Modulus (T op1, T op2) { return Op.Modulus (op1, op2); } + + public static T BitwiseAnd (T op1, T op2) { return Op.BitwiseAnd (op1, op2); } + public static T BitwiseOr (T op1, T op2) { return Op.BitwiseOr (op1, op2); } + public static T ExclusiveOr (T op1, T op2) { return Op.ExclusiveOr (op1, op2); } + + public static T UnaryNegation (T op) { return Op.UnaryNegation (op); } + public static T OnesComplement (T op) { return Op.OnesComplement (op); } + + public static bool Equality (T op1, T op2) { return Op.Equality (op1, op2); } + public static bool Inequality (T op1, T op2) { return Op.Inequality (op1, op2); } + public static bool GreaterThan (T op1, T op2) { return Op.GreaterThan (op1, op2); } + public static bool GreaterThanOrEqual(T op1, T op2) { return Op.GreaterThanOrEqual(op1, op2); } + public static bool LessThan (T op1, T op2) { return Op.LessThan (op1, op2); } + public static bool LessThanOrEqual (T op1, T op2) { return Op.LessThanOrEqual (op1, op2); } + + #region Default + + private class Default<Q> : IOperable<Q> + { + public Q Addition (Q op1, Q op2) { throw new InvalidOperationException(); } + public Q Subtraction (Q op1, Q op2) { throw new InvalidOperationException(); } + public Q Multiply (Q op1, Q op2) { throw new InvalidOperationException(); } + public Q Division (Q op1, Q op2) { throw new InvalidOperationException(); } + public Q Modulus (Q op1, Q op2) { throw new InvalidOperationException(); } + + public Q BitwiseAnd (Q op1, Q op2) { throw new InvalidOperationException(); } + public Q BitwiseOr (Q op1, Q op2) { throw new InvalidOperationException(); } + public Q ExclusiveOr (Q op1, Q op2) { throw new InvalidOperationException(); } + + public Q UnaryNegation (Q op) { throw new InvalidOperationException(); } + public Q OnesComplement (Q op) { throw new InvalidOperationException(); } + + public bool Equality (Q op1, Q op2) { throw new InvalidOperationException(); } + public bool Inequality (Q op1, Q op2) { throw new InvalidOperationException(); } + public bool GreaterThan (Q op1, Q op2) { throw new InvalidOperationException(); } + public bool GreaterThanOrEqual(Q op1, Q op2) { throw new InvalidOperationException(); } + public bool LessThan (Q op1, Q op2) { throw new InvalidOperationException(); } + public bool LessThanOrEqual (Q op1, Q op2) { throw new InvalidOperationException(); } + } + + #endregion + + #region Scalar Types. + + #region String + + private class S : IOperable<String> + { + public String Addition (String op1, String op2) { return (op1 + op2); } + public String Subtraction (String op1, String op2) { throw new InvalidOperationException(); } + public String Multiply (String op1, String op2) { throw new InvalidOperationException(); } + public String Division (String op1, String op2) { throw new InvalidOperationException(); } + public String Modulus (String op1, String op2) { throw new InvalidOperationException(); } + + public String BitwiseAnd (String op1, String op2) { throw new InvalidOperationException(); } + public String BitwiseOr (String op1, String op2) { throw new InvalidOperationException(); } + public String ExclusiveOr (String op1, String op2) { throw new InvalidOperationException(); } + + public String UnaryNegation (String op) { throw new InvalidOperationException(); } + public String OnesComplement (String op) { throw new InvalidOperationException(); } + + public bool Equality (String op1, String op2) { return op1 == op2; } + public bool Inequality (String op1, String op2) { return op1 != op2; } + public bool GreaterThan (String op1, String op2) { throw new InvalidOperationException(); } + public bool GreaterThanOrEqual(String op1, String op2) { throw new InvalidOperationException(); } + public bool LessThan (String op1, String op2) { throw new InvalidOperationException(); } + public bool LessThanOrEqual (String op1, String op2) { throw new InvalidOperationException(); } + } + + #endregion + + #region SByte + + private class S8 : IOperable<SByte> + { + public SByte Addition (SByte op1, SByte op2) { return (SByte)(op1 + op2); } + public SByte Subtraction (SByte op1, SByte op2) { return (SByte)(op1 - op2); } + public SByte Multiply (SByte op1, SByte op2) { return (SByte)(op1 * op2); } + public SByte Division (SByte op1, SByte op2) { return (SByte)(op1 / op2); } + public SByte Modulus (SByte op1, SByte op2) { return (SByte)(op1 % op2); } + + public SByte BitwiseAnd (SByte op1, SByte op2) { return (SByte)(op1 & op2); } + public SByte BitwiseOr (SByte op1, SByte op2) { return (SByte)(op1 | op2); } + public SByte ExclusiveOr (SByte op1, SByte op2) { return (SByte)(op1 ^ op2); } + + public SByte UnaryNegation (SByte op) { return (SByte)(-op); } + public SByte OnesComplement (SByte op) { return (SByte)(~op); } + + public bool Equality (SByte op1, SByte op2) { return op1 == op2; } + public bool Inequality (SByte op1, SByte op2) { return op1 != op2; } + public bool GreaterThan (SByte op1, SByte op2) { return op1 > op2; } + public bool GreaterThanOrEqual(SByte op1, SByte op2) { return op1 >= op2; } + public bool LessThan (SByte op1, SByte op2) { return op1 < op2; } + public bool LessThanOrEqual (SByte op1, SByte op2) { return op1 <= op2; } + } + + #endregion + + #region Int16 + + private class S16 : IOperable<Int16> + { + public Int16 Addition (Int16 op1, Int16 op2) { return (Int16)(op1 + op2); } + public Int16 Subtraction (Int16 op1, Int16 op2) { return (Int16)(op1 - op2); } + public Int16 Multiply (Int16 op1, Int16 op2) { return (Int16)(op1 * op2); } + public Int16 Division (Int16 op1, Int16 op2) { return (Int16)(op1 / op2); } + public Int16 Modulus (Int16 op1, Int16 op2) { return (Int16)(op1 % op2); } + + public Int16 BitwiseAnd (Int16 op1, Int16 op2) { return (Int16)(op1 & op2); } + public Int16 BitwiseOr (Int16 op1, Int16 op2) { return (Int16)(op1 | op2); } + public Int16 ExclusiveOr (Int16 op1, Int16 op2) { return (Int16)(op1 ^ op2); } + + public Int16 UnaryNegation (Int16 op) { return (Int16)(-op); } + public Int16 OnesComplement (Int16 op) { return (Int16)(~op); } + + public bool Equality (Int16 op1, Int16 op2) { return op1 == op2; } + public bool Inequality (Int16 op1, Int16 op2) { return op1 != op2; } + public bool GreaterThan (Int16 op1, Int16 op2) { return op1 > op2; } + public bool GreaterThanOrEqual(Int16 op1, Int16 op2) { return op1 >= op2; } + public bool LessThan (Int16 op1, Int16 op2) { return op1 < op2; } + public bool LessThanOrEqual (Int16 op1, Int16 op2) { return op1 <= op2; } + } + + #endregion + + #region Int32 + + private class S32 : IOperable<Int32> + { + public Int32 Addition (Int32 op1, Int32 op2) { return (op1 + op2); } + public Int32 Subtraction (Int32 op1, Int32 op2) { return (op1 - op2); } + public Int32 Multiply (Int32 op1, Int32 op2) { return (op1 * op2); } + public Int32 Division (Int32 op1, Int32 op2) { return (op1 / op2); } + public Int32 Modulus (Int32 op1, Int32 op2) { return (op1 % op2); } + + public Int32 BitwiseAnd (Int32 op1, Int32 op2) { return (op1 & op2); } + public Int32 BitwiseOr (Int32 op1, Int32 op2) { return (op1 | op2); } + public Int32 ExclusiveOr (Int32 op1, Int32 op2) { return (op1 ^ op2); } + + public Int32 UnaryNegation (Int32 op) { return (-op); } + public Int32 OnesComplement (Int32 op) { return (~op); } + + public bool Equality (Int32 op1, Int32 op2) { return op1 == op2; } + public bool Inequality (Int32 op1, Int32 op2) { return op1 != op2; } + public bool GreaterThan (Int32 op1, Int32 op2) { return op1 > op2; } + public bool GreaterThanOrEqual(Int32 op1, Int32 op2) { return op1 >= op2; } + public bool LessThan (Int32 op1, Int32 op2) { return op1 < op2; } + public bool LessThanOrEqual (Int32 op1, Int32 op2) { return op1 <= op2; } + } + + #endregion + + #region Int64 + + private class S64 : IOperable<Int64> + { + public Int64 Addition (Int64 op1, Int64 op2) { return (op1 + op2); } + public Int64 Subtraction (Int64 op1, Int64 op2) { return (op1 - op2); } + public Int64 Multiply (Int64 op1, Int64 op2) { return (op1 * op2); } + public Int64 Division (Int64 op1, Int64 op2) { return (op1 / op2); } + public Int64 Modulus (Int64 op1, Int64 op2) { return (op1 % op2); } + + public Int64 BitwiseAnd (Int64 op1, Int64 op2) { return (op1 & op2); } + public Int64 BitwiseOr (Int64 op1, Int64 op2) { return (op1 | op2); } + public Int64 ExclusiveOr (Int64 op1, Int64 op2) { return (op1 ^ op2); } + + public Int64 UnaryNegation (Int64 op) { return (-op); } + public Int64 OnesComplement (Int64 op) { return (~op); } + + public bool Equality (Int64 op1, Int64 op2) { return op1 == op2; } + public bool Inequality (Int64 op1, Int64 op2) { return op1 != op2; } + public bool GreaterThan (Int64 op1, Int64 op2) { return op1 > op2; } + public bool GreaterThanOrEqual(Int64 op1, Int64 op2) { return op1 >= op2; } + public bool LessThan (Int64 op1, Int64 op2) { return op1 < op2; } + public bool LessThanOrEqual (Int64 op1, Int64 op2) { return op1 <= op2; } + } + + #endregion + + #region Byte + + private class U8 : IOperable<Byte> + { + public Byte Addition (Byte op1, Byte op2) { return (Byte)(op1 + op2); } + public Byte Subtraction (Byte op1, Byte op2) { return (Byte)(op1 - op2); } + public Byte Multiply (Byte op1, Byte op2) { return (Byte)(op1 * op2); } + public Byte Division (Byte op1, Byte op2) { return (Byte)(op1 / op2); } + public Byte Modulus (Byte op1, Byte op2) { return (Byte)(op1 % op2); } + + public Byte BitwiseAnd (Byte op1, Byte op2) { return (Byte)(op1 & op2); } + public Byte BitwiseOr (Byte op1, Byte op2) { return (Byte)(op1 | op2); } + public Byte ExclusiveOr (Byte op1, Byte op2) { return (Byte)(op1 ^ op2); } + + public Byte UnaryNegation (Byte op) { throw new InvalidOperationException(); } + public Byte OnesComplement (Byte op) { return (Byte)(~op); } + + public bool Equality (Byte op1, Byte op2) { return op1 == op2; } + public bool Inequality (Byte op1, Byte op2) { return op1 != op2; } + public bool GreaterThan (Byte op1, Byte op2) { return op1 > op2; } + public bool GreaterThanOrEqual(Byte op1, Byte op2) { return op1 >= op2; } + public bool LessThan (Byte op1, Byte op2) { return op1 < op2; } + public bool LessThanOrEqual (Byte op1, Byte op2) { return op1 <= op2; } + } + + #endregion + + #region UInt16 + + private class U16 : IOperable<UInt16> + { + public UInt16 Addition (UInt16 op1, UInt16 op2) { return (UInt16)(op1 + op2); } + public UInt16 Subtraction (UInt16 op1, UInt16 op2) { return (UInt16)(op1 - op2); } + public UInt16 Multiply (UInt16 op1, UInt16 op2) { return (UInt16)(op1 * op2); } + public UInt16 Division (UInt16 op1, UInt16 op2) { return (UInt16)(op1 / op2); } + public UInt16 Modulus (UInt16 op1, UInt16 op2) { return (UInt16)(op1 % op2); } + + public UInt16 BitwiseAnd (UInt16 op1, UInt16 op2) { return (UInt16)(op1 & op2); } + public UInt16 BitwiseOr (UInt16 op1, UInt16 op2) { return (UInt16)(op1 | op2); } + public UInt16 ExclusiveOr (UInt16 op1, UInt16 op2) { return (UInt16)(op1 ^ op2); } + + public UInt16 UnaryNegation (UInt16 op) { throw new InvalidOperationException(); } + public UInt16 OnesComplement (UInt16 op) { return (UInt16)(~op); } + + public bool Equality (UInt16 op1, UInt16 op2) { return op1 == op2; } + public bool Inequality (UInt16 op1, UInt16 op2) { return op1 != op2; } + public bool GreaterThan (UInt16 op1, UInt16 op2) { return op1 > op2; } + public bool GreaterThanOrEqual(UInt16 op1, UInt16 op2) { return op1 >= op2; } + public bool LessThan (UInt16 op1, UInt16 op2) { return op1 < op2; } + public bool LessThanOrEqual (UInt16 op1, UInt16 op2) { return op1 <= op2; } + } + + #endregion + + #region UInt32 + + private class U32 : IOperable<UInt32> + { + public UInt32 Addition (UInt32 op1, UInt32 op2) { return (op1 + op2); } + public UInt32 Subtraction (UInt32 op1, UInt32 op2) { return (op1 - op2); } + public UInt32 Multiply (UInt32 op1, UInt32 op2) { return (op1 * op2); } + public UInt32 Division (UInt32 op1, UInt32 op2) { return (op1 / op2); } + public UInt32 Modulus (UInt32 op1, UInt32 op2) { return (op1 % op2); } + + public UInt32 BitwiseAnd (UInt32 op1, UInt32 op2) { return (op1 & op2); } + public UInt32 BitwiseOr (UInt32 op1, UInt32 op2) { return (op1 | op2); } + public UInt32 ExclusiveOr (UInt32 op1, UInt32 op2) { return (op1 ^ op2); } + + public UInt32 UnaryNegation (UInt32 op) { throw new InvalidOperationException(); } + public UInt32 OnesComplement (UInt32 op) { return (~op); } + + public bool Equality (UInt32 op1, UInt32 op2) { return op1 == op2; } + public bool Inequality (UInt32 op1, UInt32 op2) { return op1 != op2; } + public bool GreaterThan (UInt32 op1, UInt32 op2) { return op1 > op2; } + public bool GreaterThanOrEqual(UInt32 op1, UInt32 op2) { return op1 >= op2; } + public bool LessThan (UInt32 op1, UInt32 op2) { return op1 < op2; } + public bool LessThanOrEqual (UInt32 op1, UInt32 op2) { return op1 <= op2; } + } + + #endregion + + #region UInt64 + + private class U64 : IOperable<UInt64> + { + public UInt64 Addition (UInt64 op1, UInt64 op2) { return (op1 + op2); } + public UInt64 Subtraction (UInt64 op1, UInt64 op2) { return (op1 - op2); } + public UInt64 Multiply (UInt64 op1, UInt64 op2) { return (op1 * op2); } + public UInt64 Division (UInt64 op1, UInt64 op2) { return (op1 / op2); } + public UInt64 Modulus (UInt64 op1, UInt64 op2) { return (op1 % op2); } + + public UInt64 BitwiseAnd (UInt64 op1, UInt64 op2) { return (op1 & op2); } + public UInt64 BitwiseOr (UInt64 op1, UInt64 op2) { return (op1 | op2); } + public UInt64 ExclusiveOr (UInt64 op1, UInt64 op2) { return (op1 ^ op2); } + + public UInt64 UnaryNegation (UInt64 op) { throw new InvalidOperationException(); } + public UInt64 OnesComplement (UInt64 op) { return (~op); } + + public bool Equality (UInt64 op1, UInt64 op2) { return op1 == op2; } + public bool Inequality (UInt64 op1, UInt64 op2) { return op1 != op2; } + public bool GreaterThan (UInt64 op1, UInt64 op2) { return op1 > op2; } + public bool GreaterThanOrEqual(UInt64 op1, UInt64 op2) { return op1 >= op2; } + public bool LessThan (UInt64 op1, UInt64 op2) { return op1 < op2; } + public bool LessThanOrEqual (UInt64 op1, UInt64 op2) { return op1 <= op2; } + } + + #endregion + + #region Boolean + + private class B : IOperable<Boolean> + { + public Boolean Addition (Boolean op1, Boolean op2) { throw new InvalidOperationException(); } + public Boolean Subtraction (Boolean op1, Boolean op2) { throw new InvalidOperationException(); } + public Boolean Multiply (Boolean op1, Boolean op2) { throw new InvalidOperationException(); } + public Boolean Division (Boolean op1, Boolean op2) { throw new InvalidOperationException(); } + public Boolean Modulus (Boolean op1, Boolean op2) { throw new InvalidOperationException(); } + + public Boolean BitwiseAnd (Boolean op1, Boolean op2) { return (op1 & op2); } + public Boolean BitwiseOr (Boolean op1, Boolean op2) { return (op1 | op2); } + public Boolean ExclusiveOr (Boolean op1, Boolean op2) { return (op1 ^ op2); } + + public Boolean UnaryNegation (Boolean op) { throw new InvalidOperationException(); } + public Boolean OnesComplement (Boolean op) { return !op; } + + public bool Equality (Boolean op1, Boolean op2) { return op1 == op2; } + public bool Inequality (Boolean op1, Boolean op2) { return op1 != op2; } + public bool GreaterThan (Boolean op1, Boolean op2) { throw new InvalidOperationException(); } + public bool GreaterThanOrEqual(Boolean op1, Boolean op2) { throw new InvalidOperationException(); } + public bool LessThan (Boolean op1, Boolean op2) { throw new InvalidOperationException(); } + public bool LessThanOrEqual (Boolean op1, Boolean op2) { throw new InvalidOperationException(); } + } + + #endregion + + #region Char + + private class C : IOperable<Char> + { + public Char Addition (Char op1, Char op2) { return (Char)(op1 + op2); } + public Char Subtraction (Char op1, Char op2) { return (Char)(op1 - op2); } + public Char Multiply (Char op1, Char op2) { return (Char)(op1 * op2); } + public Char Division (Char op1, Char op2) { return (Char)(op1 / op2); } + public Char Modulus (Char op1, Char op2) { return (Char)(op1 % op2); } + + public Char BitwiseAnd (Char op1, Char op2) { return (Char)(op1 & op2); } + public Char BitwiseOr (Char op1, Char op2) { return (Char)(op1 | op2); } + public Char ExclusiveOr (Char op1, Char op2) { return (Char)(op1 ^ op2); } + + public Char UnaryNegation (Char op) { return (Char)(-op); } + public Char OnesComplement (Char op) { return (Char)(~op); } + + public bool Equality (Char op1, Char op2) { return op1 == op2; } + public bool Inequality (Char op1, Char op2) { return op1 != op2; } + public bool GreaterThan (Char op1, Char op2) { return op1 > op2; } + public bool GreaterThanOrEqual(Char op1, Char op2) { return op1 >= op2; } + public bool LessThan (Char op1, Char op2) { return op1 < op2; } + public bool LessThanOrEqual (Char op1, Char op2) { return op1 <= op2; } + } + + #endregion + + #region Single + + private class R4 : IOperable<Single> + { + public Single Addition (Single op1, Single op2) { return (op1 + op2); } + public Single Subtraction (Single op1, Single op2) { return (op1 - op2); } + public Single Multiply (Single op1, Single op2) { return (op1 * op2); } + public Single Division (Single op1, Single op2) { return (op1 / op2); } + public Single Modulus (Single op1, Single op2) { return (op1 % op2); } + + public Single BitwiseAnd (Single op1, Single op2) { throw new InvalidOperationException(); } + public Single BitwiseOr (Single op1, Single op2) { throw new InvalidOperationException(); } + public Single ExclusiveOr (Single op1, Single op2) { throw new InvalidOperationException(); } + + public Single UnaryNegation (Single op) { return (-op); } + public Single OnesComplement (Single op) { throw new InvalidOperationException(); } + + public bool Equality (Single op1, Single op2) { return op1 == op2; } + public bool Inequality (Single op1, Single op2) { return op1 != op2; } + public bool GreaterThan (Single op1, Single op2) { return op1 > op2; } + public bool GreaterThanOrEqual(Single op1, Single op2) { return op1 >= op2; } + public bool LessThan (Single op1, Single op2) { return op1 < op2; } + public bool LessThanOrEqual (Single op1, Single op2) { return op1 <= op2; } + } + + #endregion + + #region Double + + private class R8 : IOperable<Double> + { + public Double Addition (Double op1, Double op2) { return (op1 + op2); } + public Double Subtraction (Double op1, Double op2) { return (op1 - op2); } + public Double Multiply (Double op1, Double op2) { return (op1 * op2); } + public Double Division (Double op1, Double op2) { return (op1 / op2); } + public Double Modulus (Double op1, Double op2) { return (op1 % op2); } + + public Double BitwiseAnd (Double op1, Double op2) { throw new InvalidOperationException(); } + public Double BitwiseOr (Double op1, Double op2) { throw new InvalidOperationException(); } + public Double ExclusiveOr (Double op1, Double op2) { throw new InvalidOperationException(); } + + public Double UnaryNegation (Double op) { return (-op); } + public Double OnesComplement (Double op) { throw new InvalidOperationException(); } + + public bool Equality (Double op1, Double op2) { return op1 == op2; } + public bool Inequality (Double op1, Double op2) { return op1 != op2; } + public bool GreaterThan (Double op1, Double op2) { return op1 > op2; } + public bool GreaterThanOrEqual(Double op1, Double op2) { return op1 >= op2; } + public bool LessThan (Double op1, Double op2) { return op1 < op2; } + public bool LessThanOrEqual (Double op1, Double op2) { return op1 <= op2; } + } + + #endregion + + #region Decimal + + private class D : IOperable<Decimal> + { + public Decimal Addition (Decimal op1, Decimal op2) { return (op1 + op2); } + public Decimal Subtraction (Decimal op1, Decimal op2) { return (op1 - op2); } + public Decimal Multiply (Decimal op1, Decimal op2) { return (op1 * op2); } + public Decimal Division (Decimal op1, Decimal op2) { return (op1 / op2); } + public Decimal Modulus (Decimal op1, Decimal op2) { return (op1 % op2); } + + public Decimal BitwiseAnd (Decimal op1, Decimal op2) { throw new InvalidOperationException(); } + public Decimal BitwiseOr (Decimal op1, Decimal op2) { throw new InvalidOperationException(); } + public Decimal ExclusiveOr (Decimal op1, Decimal op2) { throw new InvalidOperationException(); } + + public Decimal UnaryNegation (Decimal op) { return (-op); } + public Decimal OnesComplement (Decimal op) { throw new InvalidOperationException(); } + + public bool Equality (Decimal op1, Decimal op2) { return op1 == op2; } + public bool Inequality (Decimal op1, Decimal op2) { return op1 != op2; } + public bool GreaterThan (Decimal op1, Decimal op2) { return op1 > op2; } + public bool GreaterThanOrEqual(Decimal op1, Decimal op2) { return op1 >= op2; } + public bool LessThan (Decimal op1, Decimal op2) { return op1 < op2; } + public bool LessThanOrEqual (Decimal op1, Decimal op2) { return op1 <= op2; } + } + + #endregion + + #region DateTime + + private class DT : IOperable<DateTime> + { + public DateTime Addition (DateTime op1, DateTime op2) { throw new InvalidOperationException(); } + public DateTime Subtraction (DateTime op1, DateTime op2) { throw new InvalidOperationException(); } + public DateTime Multiply (DateTime op1, DateTime op2) { throw new InvalidOperationException(); } + public DateTime Division (DateTime op1, DateTime op2) { throw new InvalidOperationException(); } + public DateTime Modulus (DateTime op1, DateTime op2) { throw new InvalidOperationException(); } + + public DateTime BitwiseAnd (DateTime op1, DateTime op2) { throw new InvalidOperationException(); } + public DateTime BitwiseOr (DateTime op1, DateTime op2) { throw new InvalidOperationException(); } + public DateTime ExclusiveOr (DateTime op1, DateTime op2) { throw new InvalidOperationException(); } + + public DateTime UnaryNegation (DateTime op) { throw new InvalidOperationException(); } + public DateTime OnesComplement(DateTime op) { throw new InvalidOperationException(); } + + public bool Equality (DateTime op1, DateTime op2) { return op1 == op2; } + public bool Inequality (DateTime op1, DateTime op2) { return op1 != op2; } + public bool GreaterThan (DateTime op1, DateTime op2) { return op1 > op2; } + public bool GreaterThanOrEqual(DateTime op1, DateTime op2) { return op1 >= op2; } + public bool LessThan (DateTime op1, DateTime op2) { return op1 < op2; } + public bool LessThanOrEqual (DateTime op1, DateTime op2) { return op1 <= op2; } + } + + #endregion + + #region TimeSpan + + private class TS : IOperable<TimeSpan> + { + public TimeSpan Addition (TimeSpan op1, TimeSpan op2) { return (op1 + op2); } + public TimeSpan Subtraction (TimeSpan op1, TimeSpan op2) { return (op1 - op2); } + public TimeSpan Multiply (TimeSpan op1, TimeSpan op2) { throw new InvalidOperationException(); } + public TimeSpan Division (TimeSpan op1, TimeSpan op2) { throw new InvalidOperationException(); } + public TimeSpan Modulus (TimeSpan op1, TimeSpan op2) { throw new InvalidOperationException(); } + + public TimeSpan BitwiseAnd (TimeSpan op1, TimeSpan op2) { throw new InvalidOperationException(); } + public TimeSpan BitwiseOr (TimeSpan op1, TimeSpan op2) { throw new InvalidOperationException(); } + public TimeSpan ExclusiveOr (TimeSpan op1, TimeSpan op2) { throw new InvalidOperationException(); } + + public TimeSpan UnaryNegation (TimeSpan op) { return (-op); } + public TimeSpan OnesComplement(TimeSpan op) { throw new InvalidOperationException(); } + + public bool Equality (TimeSpan op1, TimeSpan op2) { return op1 == op2; } + public bool Inequality (TimeSpan op1, TimeSpan op2) { return op1 != op2; } + public bool GreaterThan (TimeSpan op1, TimeSpan op2) { return op1 > op2; } + public bool GreaterThanOrEqual(TimeSpan op1, TimeSpan op2) { return op1 >= op2; } + public bool LessThan (TimeSpan op1, TimeSpan op2) { return op1 < op2; } + public bool LessThanOrEqual (TimeSpan op1, TimeSpan op2) { return op1 <= op2; } + } + + #endregion + + #region Guid + + private class G : IOperable<Guid> + { + public Guid Addition (Guid op1, Guid op2) { throw new InvalidOperationException(); } + public Guid Subtraction (Guid op1, Guid op2) { throw new InvalidOperationException(); } + public Guid Multiply (Guid op1, Guid op2) { throw new InvalidOperationException(); } + public Guid Division (Guid op1, Guid op2) { throw new InvalidOperationException(); } + public Guid Modulus (Guid op1, Guid op2) { throw new InvalidOperationException(); } + + public Guid BitwiseAnd (Guid op1, Guid op2) { throw new InvalidOperationException(); } + public Guid BitwiseOr (Guid op1, Guid op2) { throw new InvalidOperationException(); } + public Guid ExclusiveOr (Guid op1, Guid op2) { throw new InvalidOperationException(); } + + public Guid UnaryNegation (Guid op) { throw new InvalidOperationException(); } + public Guid OnesComplement (Guid op) { throw new InvalidOperationException(); } + + public bool Equality (Guid op1, Guid op2) { return op1 == op2; } + public bool Inequality (Guid op1, Guid op2) { return op1 != op2; } + public bool GreaterThan (Guid op1, Guid op2) { throw new InvalidOperationException(); } + public bool GreaterThanOrEqual(Guid op1, Guid op2) { throw new InvalidOperationException(); } + public bool LessThan (Guid op1, Guid op2) { throw new InvalidOperationException(); } + public bool LessThanOrEqual (Guid op1, Guid op2) { throw new InvalidOperationException(); } + } + + #endregion + + #endregion + + #region Nullable Types. + + #region SByte + + private class NS8 : IOperable<SByte?> + { + public SByte? Addition (SByte? op1, SByte? op2) { return (SByte?)(op1 + op2); } + public SByte? Subtraction (SByte? op1, SByte? op2) { return (SByte?)(op1 - op2); } + public SByte? Multiply (SByte? op1, SByte? op2) { return (SByte?)(op1 * op2); } + public SByte? Division (SByte? op1, SByte? op2) { return (SByte?)(op1 / op2); } + public SByte? Modulus (SByte? op1, SByte? op2) { return (SByte?)(op1 % op2); } + + public SByte? BitwiseAnd (SByte? op1, SByte? op2) { return (SByte?)(op1 & op2); } + public SByte? BitwiseOr (SByte? op1, SByte? op2) { return (SByte?)(op1 | op2); } + public SByte? ExclusiveOr (SByte? op1, SByte? op2) { return (SByte?)(op1 ^ op2); } + + public SByte? UnaryNegation (SByte? op) { return (SByte)(- op); } + public SByte? OnesComplement (SByte? op) { return (SByte)(~op); } + + public bool Equality (SByte? op1, SByte? op2) { return op1 == op2; } + public bool Inequality (SByte? op1, SByte? op2) { return op1 != op2; } + public bool GreaterThan (SByte? op1, SByte? op2) { return op1 > op2; } + public bool GreaterThanOrEqual(SByte? op1, SByte? op2) { return op1 >= op2; } + public bool LessThan (SByte? op1, SByte? op2) { return op1 < op2; } + public bool LessThanOrEqual (SByte? op1, SByte? op2) { return op1 <= op2; } + } + + #endregion + + #region Int16 + + private class NS16 : IOperable<Int16?> + { + public Int16? Addition (Int16? op1, Int16? op2) { return (Int16?)(op1 + op2); } + public Int16? Subtraction (Int16? op1, Int16? op2) { return (Int16?)(op1 - op2); } + public Int16? Multiply (Int16? op1, Int16? op2) { return (Int16?)(op1 * op2); } + public Int16? Division (Int16? op1, Int16? op2) { return (Int16?)(op1 / op2); } + public Int16? Modulus (Int16? op1, Int16? op2) { return (Int16?)(op1 % op2); } + + public Int16? BitwiseAnd (Int16? op1, Int16? op2) { return (Int16?)(op1 & op2); } + public Int16? BitwiseOr (Int16? op1, Int16? op2) { return (Int16?)(op1 | op2); } + public Int16? ExclusiveOr (Int16? op1, Int16? op2) { return (Int16?)(op1 ^ op2); } + + public Int16? UnaryNegation (Int16? op) { return (Int16)(- op); } + public Int16? OnesComplement (Int16? op) { return (Int16)(~op); } + + public bool Equality (Int16? op1, Int16? op2) { return op1 == op2; } + public bool Inequality (Int16? op1, Int16? op2) { return op1 != op2; } + public bool GreaterThan (Int16? op1, Int16? op2) { return op1 > op2; } + public bool GreaterThanOrEqual(Int16? op1, Int16? op2) { return op1 >= op2; } + public bool LessThan (Int16? op1, Int16? op2) { return op1 < op2; } + public bool LessThanOrEqual (Int16? op1, Int16? op2) { return op1 <= op2; } + } + + #endregion + + #region Int32 + + private class NS32 : IOperable<Int32?> + { + public Int32? Addition (Int32? op1, Int32? op2) { return (op1 + op2); } + public Int32? Subtraction (Int32? op1, Int32? op2) { return (op1 - op2); } + public Int32? Multiply (Int32? op1, Int32? op2) { return (op1 * op2); } + public Int32? Division (Int32? op1, Int32? op2) { return (op1 / op2); } + public Int32? Modulus (Int32? op1, Int32? op2) { return (op1 % op2); } + + public Int32? BitwiseAnd (Int32? op1, Int32? op2) { return (op1 & op2); } + public Int32? BitwiseOr (Int32? op1, Int32? op2) { return (op1 | op2); } + public Int32? ExclusiveOr (Int32? op1, Int32? op2) { return (op1 ^ op2); } + + public Int32? UnaryNegation (Int32? op) { return (- op); } + public Int32? OnesComplement (Int32? op) { return (~op); } + + public bool Equality (Int32? op1, Int32? op2) { return op1 == op2; } + public bool Inequality (Int32? op1, Int32? op2) { return op1 != op2; } + public bool GreaterThan (Int32? op1, Int32? op2) { return op1 > op2; } + public bool GreaterThanOrEqual(Int32? op1, Int32? op2) { return op1 >= op2; } + public bool LessThan (Int32? op1, Int32? op2) { return op1 < op2; } + public bool LessThanOrEqual (Int32? op1, Int32? op2) { return op1 <= op2; } + } + + #endregion + + #region Int64 + + private class NS64 : IOperable<Int64?> + { + public Int64? Addition (Int64? op1, Int64? op2) { return (op1 + op2); } + public Int64? Subtraction (Int64? op1, Int64? op2) { return (op1 - op2); } + public Int64? Multiply (Int64? op1, Int64? op2) { return (op1 * op2); } + public Int64? Division (Int64? op1, Int64? op2) { return (op1 / op2); } + public Int64? Modulus (Int64? op1, Int64? op2) { return (op1 % op2); } + + public Int64? BitwiseAnd (Int64? op1, Int64? op2) { return (op1 & op2); } + public Int64? BitwiseOr (Int64? op1, Int64? op2) { return (op1 | op2); } + public Int64? ExclusiveOr (Int64? op1, Int64? op2) { return (op1 ^ op2); } + + public Int64? UnaryNegation (Int64? op) { return (- op); } + public Int64? OnesComplement (Int64? op) { return (~op); } + + public bool Equality (Int64? op1, Int64? op2) { return op1 == op2; } + public bool Inequality (Int64? op1, Int64? op2) { return op1 != op2; } + public bool GreaterThan (Int64? op1, Int64? op2) { return op1 > op2; } + public bool GreaterThanOrEqual(Int64? op1, Int64? op2) { return op1 >= op2; } + public bool LessThan (Int64? op1, Int64? op2) { return op1 < op2; } + public bool LessThanOrEqual (Int64? op1, Int64? op2) { return op1 <= op2; } + } + + #endregion + + #region Byte + + private class NU8 : IOperable<Byte?> + { + public Byte? Addition (Byte? op1, Byte? op2) { return (Byte?)(op1 + op2); } + public Byte? Subtraction (Byte? op1, Byte? op2) { return (Byte?)(op1 - op2); } + public Byte? Multiply (Byte? op1, Byte? op2) { return (Byte?)(op1 * op2); } + public Byte? Division (Byte? op1, Byte? op2) { return (Byte?)(op1 / op2); } + public Byte? Modulus (Byte? op1, Byte? op2) { return (Byte?)(op1 % op2); } + + public Byte? BitwiseAnd (Byte? op1, Byte? op2) { return (Byte?)(op1 & op2); } + public Byte? BitwiseOr (Byte? op1, Byte? op2) { return (Byte?)(op1 | op2); } + public Byte? ExclusiveOr (Byte? op1, Byte? op2) { return (Byte?)(op1 ^ op2); } + + public Byte? UnaryNegation (Byte? op) { throw new InvalidOperationException(); } + public Byte? OnesComplement (Byte? op) { return (Byte?)(~op); } + + public bool Equality (Byte? op1, Byte? op2) { return op1 == op2; } + public bool Inequality (Byte? op1, Byte? op2) { return op1 != op2; } + public bool GreaterThan (Byte? op1, Byte? op2) { return op1 > op2; } + public bool GreaterThanOrEqual(Byte? op1, Byte? op2) { return op1 >= op2; } + public bool LessThan (Byte? op1, Byte? op2) { return op1 < op2; } + public bool LessThanOrEqual (Byte? op1, Byte? op2) { return op1 <= op2; } + } + + #endregion + + #region UInt16 + + private class NU16 : IOperable<UInt16?> + { + public UInt16? Addition (UInt16? op1, UInt16? op2) { return (UInt16?)(op1 + op2); } + public UInt16? Subtraction (UInt16? op1, UInt16? op2) { return (UInt16?)(op1 - op2); } + public UInt16? Multiply (UInt16? op1, UInt16? op2) { return (UInt16?)(op1 * op2); } + public UInt16? Division (UInt16? op1, UInt16? op2) { return (UInt16?)(op1 / op2); } + public UInt16? Modulus (UInt16? op1, UInt16? op2) { return (UInt16?)(op1 % op2); } + + public UInt16? BitwiseAnd (UInt16? op1, UInt16? op2) { return (UInt16?)(op1 & op2); } + public UInt16? BitwiseOr (UInt16? op1, UInt16? op2) { return (UInt16?)(op1 | op2); } + public UInt16? ExclusiveOr (UInt16? op1, UInt16? op2) { return (UInt16?)(op1 ^ op2); } + + public UInt16? UnaryNegation (UInt16? op) { throw new InvalidOperationException(); } + public UInt16? OnesComplement (UInt16? op) { return (UInt16?)(~op); } + + public bool Equality (UInt16? op1, UInt16? op2) { return op1 == op2; } + public bool Inequality (UInt16? op1, UInt16? op2) { return op1 != op2; } + public bool GreaterThan (UInt16? op1, UInt16? op2) { return op1 > op2; } + public bool GreaterThanOrEqual(UInt16? op1, UInt16? op2) { return op1 >= op2; } + public bool LessThan (UInt16? op1, UInt16? op2) { return op1 < op2; } + public bool LessThanOrEqual (UInt16? op1, UInt16? op2) { return op1 <= op2; } + } + + #endregion + + #region UInt32 + + private class NU32 : IOperable<UInt32?> + { + public UInt32? Addition (UInt32? op1, UInt32? op2) { return (op1 + op2); } + public UInt32? Subtraction (UInt32? op1, UInt32? op2) { return (op1 - op2); } + public UInt32? Multiply (UInt32? op1, UInt32? op2) { return (op1 * op2); } + public UInt32? Division (UInt32? op1, UInt32? op2) { return (op1 / op2); } + public UInt32? Modulus (UInt32? op1, UInt32? op2) { return (op1 % op2); } + + public UInt32? BitwiseAnd (UInt32? op1, UInt32? op2) { return (op1 & op2); } + public UInt32? BitwiseOr (UInt32? op1, UInt32? op2) { return (op1 | op2); } + public UInt32? ExclusiveOr (UInt32? op1, UInt32? op2) { return (op1 ^ op2); } + + public UInt32? UnaryNegation (UInt32? op) { throw new InvalidOperationException(); } + public UInt32? OnesComplement (UInt32? op) { return (~op); } + + public bool Equality (UInt32? op1, UInt32? op2) { return op1 == op2; } + public bool Inequality (UInt32? op1, UInt32? op2) { return op1 != op2; } + public bool GreaterThan (UInt32? op1, UInt32? op2) { return op1 > op2; } + public bool GreaterThanOrEqual(UInt32? op1, UInt32? op2) { return op1 >= op2; } + public bool LessThan (UInt32? op1, UInt32? op2) { return op1 < op2; } + public bool LessThanOrEqual (UInt32? op1, UInt32? op2) { return op1 <= op2; } + } + + #endregion + + #region UInt64 + + private class NU64 : IOperable<UInt64?> + { + public UInt64? Addition (UInt64? op1, UInt64? op2) { return (op1 + op2); } + public UInt64? Subtraction (UInt64? op1, UInt64? op2) { return (op1 - op2); } + public UInt64? Multiply (UInt64? op1, UInt64? op2) { return (op1 * op2); } + public UInt64? Division (UInt64? op1, UInt64? op2) { return (op1 / op2); } + public UInt64? Modulus (UInt64? op1, UInt64? op2) { return (op1 % op2); } + + public UInt64? BitwiseAnd (UInt64? op1, UInt64? op2) { return (op1 & op2); } + public UInt64? BitwiseOr (UInt64? op1, UInt64? op2) { return (op1 | op2); } + public UInt64? ExclusiveOr (UInt64? op1, UInt64? op2) { return (op1 ^ op2); } + + public UInt64? UnaryNegation (UInt64? op) { throw new InvalidOperationException(); } + public UInt64? OnesComplement (UInt64? op) { return (~op); } + + public bool Equality (UInt64? op1, UInt64? op2) { return op1 == op2; } + public bool Inequality (UInt64? op1, UInt64? op2) { return op1 != op2; } + public bool GreaterThan (UInt64? op1, UInt64? op2) { return op1 > op2; } + public bool GreaterThanOrEqual(UInt64? op1, UInt64? op2) { return op1 >= op2; } + public bool LessThan (UInt64? op1, UInt64? op2) { return op1 < op2; } + public bool LessThanOrEqual (UInt64? op1, UInt64? op2) { return op1 <= op2; } + } + + #endregion + + #region Boolean + + private class NB : IOperable<Boolean?> + { + public Boolean? Addition (Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); } + public Boolean? Subtraction (Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); } + public Boolean? Multiply (Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); } + public Boolean? Division (Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); } + public Boolean? Modulus (Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); } + + public Boolean? BitwiseAnd (Boolean? op1, Boolean? op2) { return (op1 & op2); } + public Boolean? BitwiseOr (Boolean? op1, Boolean? op2) { return (op1 | op2); } + public Boolean? ExclusiveOr (Boolean? op1, Boolean? op2) { return (op1 ^ op2); } + + public Boolean? UnaryNegation (Boolean? op) { throw new InvalidOperationException(); } + public Boolean? OnesComplement(Boolean? op) { return !op; } + + public bool Equality (Boolean? op1, Boolean? op2) { return op1 == op2; } + public bool Inequality (Boolean? op1, Boolean? op2) { return op1 != op2; } + public bool GreaterThan (Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); } + public bool GreaterThanOrEqual(Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); } + public bool LessThan (Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); } + public bool LessThanOrEqual (Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); } + } + + #endregion + + #region Char + + private class NC : IOperable<Char?> + { + public Char? Addition (Char? op1, Char? op2) { return (Char?)(op1 + op2); } + public Char? Subtraction (Char? op1, Char? op2) { return (Char?)(op1 - op2); } + public Char? Multiply (Char? op1, Char? op2) { return (Char?)(op1 * op2); } + public Char? Division (Char? op1, Char? op2) { return (Char?)(op1 / op2); } + public Char? Modulus (Char? op1, Char? op2) { return (Char?)(op1 % op2); } + + public Char? BitwiseAnd (Char? op1, Char? op2) { return (Char?)(op1 & op2); } + public Char? BitwiseOr (Char? op1, Char? op2) { return (Char?)(op1 | op2); } + public Char? ExclusiveOr (Char? op1, Char? op2) { return (Char?)(op1 ^ op2); } + + public Char? UnaryNegation (Char? op) { return (Char?)(-op); } + public Char? OnesComplement (Char? op) { return (Char?)(~op); } + + public bool Equality (Char? op1, Char? op2) { return op1 == op2; } + public bool Inequality (Char? op1, Char? op2) { return op1 != op2; } + public bool GreaterThan (Char? op1, Char? op2) { return op1 > op2; } + public bool GreaterThanOrEqual(Char? op1, Char? op2) { return op1 >= op2; } + public bool LessThan (Char? op1, Char? op2) { return op1 < op2; } + public bool LessThanOrEqual (Char? op1, Char? op2) { return op1 <= op2; } + } + + #endregion + + #region Single + + private class NR4 : IOperable<Single?> + { + public Single? Addition (Single? op1, Single? op2) { return (op1 + op2); } + public Single? Subtraction (Single? op1, Single? op2) { return (op1 - op2); } + public Single? Multiply (Single? op1, Single? op2) { return (op1 * op2); } + public Single? Division (Single? op1, Single? op2) { return (op1 / op2); } + public Single? Modulus (Single? op1, Single? op2) { return (op1 % op2); } + + public Single? BitwiseAnd (Single? op1, Single? op2) { throw new InvalidOperationException(); } + public Single? BitwiseOr (Single? op1, Single? op2) { throw new InvalidOperationException(); } + public Single? ExclusiveOr (Single? op1, Single? op2) { throw new InvalidOperationException(); } + + public Single? UnaryNegation (Single? op) { return (- op); } + public Single? OnesComplement (Single? op) { throw new InvalidOperationException(); } + + public bool Equality (Single? op1, Single? op2) { return op1 == op2; } + public bool Inequality (Single? op1, Single? op2) { return op1 != op2; } + public bool GreaterThan (Single? op1, Single? op2) { return op1 > op2; } + public bool GreaterThanOrEqual(Single? op1, Single? op2) { return op1 >= op2; } + public bool LessThan (Single? op1, Single? op2) { return op1 < op2; } + public bool LessThanOrEqual (Single? op1, Single? op2) { return op1 <= op2; } + } + + #endregion + + #region Double + + private class NR8 : IOperable<Double?> + { + public Double? Addition (Double? op1, Double? op2) { return (op1 + op2); } + public Double? Subtraction (Double? op1, Double? op2) { return (op1 - op2); } + public Double? Multiply (Double? op1, Double? op2) { return (op1 * op2); } + public Double? Division (Double? op1, Double? op2) { return (op1 / op2); } + public Double? Modulus (Double? op1, Double? op2) { return (op1 % op2); } + + public Double? BitwiseAnd (Double? op1, Double? op2) { throw new InvalidOperationException(); } + public Double? BitwiseOr (Double? op1, Double? op2) { throw new InvalidOperationException(); } + public Double? ExclusiveOr (Double? op1, Double? op2) { throw new InvalidOperationException(); } + + public Double? UnaryNegation (Double? op) { return (- op); } + public Double? OnesComplement (Double? op) { throw new InvalidOperationException(); } + + public bool Equality (Double? op1, Double? op2) { return op1 == op2; } + public bool Inequality (Double? op1, Double? op2) { return op1 != op2; } + public bool GreaterThan (Double? op1, Double? op2) { return op1 > op2; } + public bool GreaterThanOrEqual(Double? op1, Double? op2) { return op1 >= op2; } + public bool LessThan (Double? op1, Double? op2) { return op1 < op2; } + public bool LessThanOrEqual (Double? op1, Double? op2) { return op1 <= op2; } + } + + #endregion + + #region Decimal + + private class ND : IOperable<Decimal?> + { + public Decimal? Addition (Decimal? op1, Decimal? op2) { return (op1 + op2); } + public Decimal? Subtraction (Decimal? op1, Decimal? op2) { return (op1 - op2); } + public Decimal? Multiply (Decimal? op1, Decimal? op2) { return (op1 * op2); } + public Decimal? Division (Decimal? op1, Decimal? op2) { return (op1 / op2); } + public Decimal? Modulus (Decimal? op1, Decimal? op2) { return (op1 % op2); } + + public Decimal? BitwiseAnd (Decimal? op1, Decimal? op2) { throw new InvalidOperationException(); } + public Decimal? BitwiseOr (Decimal? op1, Decimal? op2) { throw new InvalidOperationException(); } + public Decimal? ExclusiveOr (Decimal? op1, Decimal? op2) { throw new InvalidOperationException(); } + + public Decimal? UnaryNegation (Decimal? op) { return (- op); } + public Decimal? OnesComplement(Decimal? op) { throw new InvalidOperationException(); } + + public bool Equality (Decimal? op1, Decimal? op2) { return op1 == op2; } + public bool Inequality (Decimal? op1, Decimal? op2) { return op1 != op2; } + public bool GreaterThan (Decimal? op1, Decimal? op2) { return op1 > op2; } + public bool GreaterThanOrEqual(Decimal? op1, Decimal? op2) { return op1 >= op2; } + public bool LessThan (Decimal? op1, Decimal? op2) { return op1 < op2; } + public bool LessThanOrEqual (Decimal? op1, Decimal? op2) { return op1 <= op2; } + } + + #endregion + + #region DateTime + + private class NDT : IOperable<DateTime?> + { + public DateTime? Addition (DateTime? op1, DateTime? op2) { throw new InvalidOperationException(); } + public DateTime? Subtraction (DateTime? op1, DateTime? op2) { throw new InvalidOperationException(); } + public DateTime? Multiply (DateTime? op1, DateTime? op2) { throw new InvalidOperationException(); } + public DateTime? Division (DateTime? op1, DateTime? op2) { throw new InvalidOperationException(); } + public DateTime? Modulus (DateTime? op1, DateTime? op2) { throw new InvalidOperationException(); } + + public DateTime? BitwiseAnd (DateTime? op1, DateTime? op2) { throw new InvalidOperationException(); } + public DateTime? BitwiseOr (DateTime? op1, DateTime? op2) { throw new InvalidOperationException(); } + public DateTime? ExclusiveOr (DateTime? op1, DateTime? op2) { throw new InvalidOperationException(); } + + public DateTime? UnaryNegation (DateTime? op) { throw new InvalidOperationException(); } + public DateTime? OnesComplement(DateTime? op) { throw new InvalidOperationException(); } + + public bool Equality (DateTime? op1, DateTime? op2) { return op1 == op2; } + public bool Inequality (DateTime? op1, DateTime? op2) { return op1 != op2; } + public bool GreaterThan (DateTime? op1, DateTime? op2) { return op1 > op2; } + public bool GreaterThanOrEqual (DateTime? op1, DateTime? op2) { return op1 >= op2; } + public bool LessThan (DateTime? op1, DateTime? op2) { return op1 < op2; } + public bool LessThanOrEqual (DateTime? op1, DateTime? op2) { return op1 <= op2; } + } + + #endregion + + #region TimeSpan + + private class NTS : IOperable<TimeSpan?> + { + public TimeSpan? Addition (TimeSpan? op1, TimeSpan? op2) { return (op1 + op2); } + public TimeSpan? Subtraction (TimeSpan? op1, TimeSpan? op2) { return (op1 - op2); } + public TimeSpan? Multiply (TimeSpan? op1, TimeSpan? op2) { throw new InvalidOperationException(); } + public TimeSpan? Division (TimeSpan? op1, TimeSpan? op2) { throw new InvalidOperationException(); } + public TimeSpan? Modulus (TimeSpan? op1, TimeSpan? op2) { throw new InvalidOperationException(); } + + public TimeSpan? BitwiseAnd (TimeSpan? op1, TimeSpan? op2) { throw new InvalidOperationException(); } + public TimeSpan? BitwiseOr (TimeSpan? op1, TimeSpan? op2) { throw new InvalidOperationException(); } + public TimeSpan? ExclusiveOr (TimeSpan? op1, TimeSpan? op2) { throw new InvalidOperationException(); } + + public TimeSpan? UnaryNegation (TimeSpan? op) { return (- op); } + public TimeSpan? OnesComplement(TimeSpan? op) { throw new InvalidOperationException(); } + + public bool Equality (TimeSpan? op1, TimeSpan? op2) { return op1 == op2; } + public bool Inequality (TimeSpan? op1, TimeSpan? op2) { return op1 != op2; } + public bool GreaterThan (TimeSpan? op1, TimeSpan? op2) { return op1 > op2; } + public bool GreaterThanOrEqual (TimeSpan? op1, TimeSpan? op2) { return op1 >= op2; } + public bool LessThan (TimeSpan? op1, TimeSpan? op2) { return op1 < op2; } + public bool LessThanOrEqual (TimeSpan? op1, TimeSpan? op2) { return op1 <= op2; } + } + + #endregion + + #region Guid? + + private class NG : IOperable<Guid?> + { + public Guid? Addition (Guid? op1, Guid? op2) { throw new InvalidOperationException(); } + public Guid? Subtraction (Guid? op1, Guid? op2) { throw new InvalidOperationException(); } + public Guid? Multiply (Guid? op1, Guid? op2) { throw new InvalidOperationException(); } + public Guid? Division (Guid? op1, Guid? op2) { throw new InvalidOperationException(); } + public Guid? Modulus (Guid? op1, Guid? op2) { throw new InvalidOperationException(); } + + public Guid? BitwiseAnd (Guid? op1, Guid? op2) { throw new InvalidOperationException(); } + public Guid? BitwiseOr (Guid? op1, Guid? op2) { throw new InvalidOperationException(); } + public Guid? ExclusiveOr (Guid? op1, Guid? op2) { throw new InvalidOperationException(); } + + public Guid? UnaryNegation (Guid? op) { throw new InvalidOperationException(); } + public Guid? OnesComplement (Guid? op) { throw new InvalidOperationException(); } + + public bool Equality (Guid? op1, Guid? op2) { return op1 == op2; } + public bool Inequality (Guid? op1, Guid? op2) { return op1 != op2; } + public bool GreaterThan (Guid? op1, Guid? op2) { throw new InvalidOperationException(); } + public bool GreaterThanOrEqual(Guid? op1, Guid? op2) { throw new InvalidOperationException(); } + public bool LessThan (Guid? op1, Guid? op2) { throw new InvalidOperationException(); } + public bool LessThanOrEqual (Guid? op1, Guid? op2) { throw new InvalidOperationException(); } + } + + #endregion + + #endregion + + #region Sql types. + + #region SqlString + + private class DBS : IOperable<SqlString> + { + public SqlString Addition (SqlString op1, SqlString op2) { return (op1 + op2); } + public SqlString Subtraction (SqlString op1, SqlString op2) { throw new InvalidOperationException(); } + public SqlString Multiply (SqlString op1, SqlString op2) { throw new InvalidOperationException(); } + public SqlString Division (SqlString op1, SqlString op2) { throw new InvalidOperationException(); } + public SqlString Modulus (SqlString op1, SqlString op2) { throw new InvalidOperationException(); } + + public SqlString BitwiseAnd (SqlString op1, SqlString op2) { throw new InvalidOperationException(); } + public SqlString BitwiseOr (SqlString op1, SqlString op2) { throw new InvalidOperationException(); } + public SqlString ExclusiveOr (SqlString op1, SqlString op2) { throw new InvalidOperationException(); } + + public SqlString UnaryNegation (SqlString op) { throw new InvalidOperationException(); } + public SqlString OnesComplement(SqlString op) { throw new InvalidOperationException(); } + + public bool Equality (SqlString op1, SqlString op2) { return (op1 == op2).IsTrue; } + public bool Inequality (SqlString op1, SqlString op2) { return (op1 != op2).IsTrue; } + public bool GreaterThan (SqlString op1, SqlString op2) { throw new InvalidOperationException(); } + public bool GreaterThanOrEqual (SqlString op1, SqlString op2) { throw new InvalidOperationException(); } + public bool LessThan (SqlString op1, SqlString op2) { throw new InvalidOperationException(); } + public bool LessThanOrEqual (SqlString op1, SqlString op2) { throw new InvalidOperationException(); } + } + + #endregion + + #region SqlByte + + private class DBU8 : IOperable<SqlByte> + { + public SqlByte Addition (SqlByte op1, SqlByte op2) { return (op1 + op2); } + public SqlByte Subtraction (SqlByte op1, SqlByte op2) { return (op1 - op2); } + public SqlByte Multiply (SqlByte op1, SqlByte op2) { return (op1 * op2); } + public SqlByte Division (SqlByte op1, SqlByte op2) { return (op1 / op2); } + public SqlByte Modulus (SqlByte op1, SqlByte op2) { return (op1 % op2); } + + public SqlByte BitwiseAnd (SqlByte op1, SqlByte op2) { return (op1 & op2); } + public SqlByte BitwiseOr (SqlByte op1, SqlByte op2) { return (op1 | op2); } + public SqlByte ExclusiveOr (SqlByte op1, SqlByte op2) { return (op1 ^ op2); } + + public SqlByte UnaryNegation (SqlByte op) { throw new InvalidOperationException(); } + public SqlByte OnesComplement (SqlByte op) { return (~op); } + + public bool Equality (SqlByte op1, SqlByte op2) { return (op1 == op2).IsTrue; } + public bool Inequality (SqlByte op1, SqlByte op2) { return (op1 != op2).IsTrue; } + public bool GreaterThan (SqlByte op1, SqlByte op2) { return (op1 > op2).IsTrue; } + public bool GreaterThanOrEqual(SqlByte op1, SqlByte op2) { return (op1 >= op2).IsTrue; } + public bool LessThan (SqlByte op1, SqlByte op2) { return (op1 < op2).IsTrue; } + public bool LessThanOrEqual (SqlByte op1, SqlByte op2) { return (op1 <= op2).IsTrue; } + } + + #endregion + + #region Int16 + + private class DBS16 : IOperable<SqlInt16> + { + public SqlInt16 Addition (SqlInt16 op1, SqlInt16 op2) { return (op1 + op2); } + public SqlInt16 Subtraction (SqlInt16 op1, SqlInt16 op2) { return (op1 - op2); } + public SqlInt16 Multiply (SqlInt16 op1, SqlInt16 op2) { return (op1 * op2); } + public SqlInt16 Division (SqlInt16 op1, SqlInt16 op2) { return (op1 / op2); } + public SqlInt16 Modulus (SqlInt16 op1, SqlInt16 op2) { return (op1 % op2); } + + public SqlInt16 BitwiseAnd (SqlInt16 op1, SqlInt16 op2) { return (op1 & op2); } + public SqlInt16 BitwiseOr (SqlInt16 op1, SqlInt16 op2) { return (op1 | op2); } + public SqlInt16 ExclusiveOr (SqlInt16 op1, SqlInt16 op2) { return (op1 ^ op2); } + + public SqlInt16 UnaryNegation (SqlInt16 op) { return (-op); } + public SqlInt16 OnesComplement(SqlInt16 op) { return (~op); } + + public bool Equality (SqlInt16 op1, SqlInt16 op2) { return (op1 == op2).IsTrue; } + public bool Inequality (SqlInt16 op1, SqlInt16 op2) { return (op1 != op2).IsTrue; } + public bool GreaterThan (SqlInt16 op1, SqlInt16 op2) { return (op1 > op2).IsTrue; } + public bool GreaterThanOrEqual(SqlInt16 op1, SqlInt16 op2) { return (op1 >= op2).IsTrue; } + public bool LessThan (SqlInt16 op1, SqlInt16 op2) { return (op1 < op2).IsTrue; } + public bool LessThanOrEqual (SqlInt16 op1, SqlInt16 op2) { return (op1 <= op2).IsTrue; } + } + + #endregion + + #region SqlInt32 + + private class DBS32 : IOperable<SqlInt32> + { + public SqlInt32 Addition (SqlInt32 op1, SqlInt32 op2) { return (op1 + op2); } + public SqlInt32 Subtraction (SqlInt32 op1, SqlInt32 op2) { return (op1 - op2); } + public SqlInt32 Multiply (SqlInt32 op1, SqlInt32 op2) { return (op1 * op2); } + public SqlInt32 Division (SqlInt32 op1, SqlInt32 op2) { return (op1 / op2); } + public SqlInt32 Modulus (SqlInt32 op1, SqlInt32 op2) { return (op1 % op2); } + + public SqlInt32 BitwiseAnd (SqlInt32 op1, SqlInt32 op2) { return (op1 & op2); } + public SqlInt32 BitwiseOr (SqlInt32 op1, SqlInt32 op2) { return (op1 | op2); } + public SqlInt32 ExclusiveOr (SqlInt32 op1, SqlInt32 op2) { return (op1 ^ op2); } + + public SqlInt32 UnaryNegation (SqlInt32 op) { return (-op); } + public SqlInt32 OnesComplement(SqlInt32 op) { return (~op); } + + public bool Equality (SqlInt32 op1, SqlInt32 op2) { return (op1 == op2).IsTrue; } + public bool Inequality (SqlInt32 op1, SqlInt32 op2) { return (op1 != op2).IsTrue; } + public bool GreaterThan (SqlInt32 op1, SqlInt32 op2) { return (op1 > op2).IsTrue; } + public bool GreaterThanOrEqual(SqlInt32 op1, SqlInt32 op2) { return (op1 >= op2).IsTrue; } + public bool LessThan (SqlInt32 op1, SqlInt32 op2) { return (op1 < op2).IsTrue; } + public bool LessThanOrEqual (SqlInt32 op1, SqlInt32 op2) { return (op1 <= op2).IsTrue; } + } + + #endregion + + #region SqlInt64 + + private class DBS64 : IOperable<SqlInt64> + { + public SqlInt64 Addition (SqlInt64 op1, SqlInt64 op2) { return (op1 + op2); } + public SqlInt64 Subtraction (SqlInt64 op1, SqlInt64 op2) { return (op1 - op2); } + public SqlInt64 Multiply (SqlInt64 op1, SqlInt64 op2) { return (op1 * op2); } + public SqlInt64 Division (SqlInt64 op1, SqlInt64 op2) { return (op1 / op2); } + public SqlInt64 Modulus (SqlInt64 op1, SqlInt64 op2) { return (op1 % op2); } + + public SqlInt64 BitwiseAnd (SqlInt64 op1, SqlInt64 op2) { return (op1 & op2); } + public SqlInt64 BitwiseOr (SqlInt64 op1, SqlInt64 op2) { return (op1 | op2); } + public SqlInt64 ExclusiveOr (SqlInt64 op1, SqlInt64 op2) { return (op1 ^ op2); } + + public SqlInt64 UnaryNegation (SqlInt64 op) { return (-op); } + public SqlInt64 OnesComplement(SqlInt64 op) { return (~op); } + + public bool Equality (SqlInt64 op1, SqlInt64 op2) { return (op1 == op2).IsTrue; } + public bool Inequality (SqlInt64 op1, SqlInt64 op2) { return (op1 != op2).IsTrue; } + public bool GreaterThan (SqlInt64 op1, SqlInt64 op2) { return (op1 > op2).IsTrue; } + public bool GreaterThanOrEqual(SqlInt64 op1, SqlInt64 op2) { return (op1 >= op2).IsTrue; } + public bool LessThan (SqlInt64 op1, SqlInt64 op2) { return (op1 < op2).IsTrue; } + public bool LessThanOrEqual (SqlInt64 op1, SqlInt64 op2) { return (op1 <= op2).IsTrue; } + } + + #endregion + + #region SqlBoolean + + private class DBB : IOperable<SqlBoolean> + { + public SqlBoolean Addition (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); } + public SqlBoolean Subtraction (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); } + public SqlBoolean Multiply (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); } + public SqlBoolean Division (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); } + public SqlBoolean Modulus (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); } + + public SqlBoolean BitwiseAnd (SqlBoolean op1, SqlBoolean op2) { return (op1 & op2); } + public SqlBoolean BitwiseOr (SqlBoolean op1, SqlBoolean op2) { return (op1 | op2); } + public SqlBoolean ExclusiveOr (SqlBoolean op1, SqlBoolean op2) { return (op1 ^ op2); } + + public SqlBoolean UnaryNegation (SqlBoolean op) { throw new InvalidOperationException(); } + public SqlBoolean OnesComplement(SqlBoolean op) { return !op; } + + public bool Equality (SqlBoolean op1, SqlBoolean op2) { return (op1 == op2).IsTrue; } + public bool Inequality (SqlBoolean op1, SqlBoolean op2) { return (op1 != op2).IsTrue; } + public bool GreaterThan (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); } + public bool GreaterThanOrEqual (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); } + public bool LessThan (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); } + public bool LessThanOrEqual (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); } + } + + #endregion + + #region SqlSingle + + private class DBR4 : IOperable<SqlSingle> + { + public SqlSingle Addition (SqlSingle op1, SqlSingle op2) { return (op1 + op2); } + public SqlSingle Subtraction (SqlSingle op1, SqlSingle op2) { return (op1 - op2); } + public SqlSingle Multiply (SqlSingle op1, SqlSingle op2) { return (op1 * op2); } + public SqlSingle Division (SqlSingle op1, SqlSingle op2) { return (op1 / op2); } + public SqlSingle Modulus (SqlSingle op1, SqlSingle op2) { throw new InvalidOperationException(); } + + public SqlSingle BitwiseAnd (SqlSingle op1, SqlSingle op2) { throw new InvalidOperationException(); } + public SqlSingle BitwiseOr (SqlSingle op1, SqlSingle op2) { throw new InvalidOperationException(); } + public SqlSingle ExclusiveOr (SqlSingle op1, SqlSingle op2) { throw new InvalidOperationException(); } + + public SqlSingle UnaryNegation (SqlSingle op) { return (-op); } + public SqlSingle OnesComplement(SqlSingle op) { throw new InvalidOperationException(); } + + public bool Equality (SqlSingle op1, SqlSingle op2) { return (op1 == op2).IsTrue; } + public bool Inequality (SqlSingle op1, SqlSingle op2) { return (op1 != op2).IsTrue; } + public bool GreaterThan (SqlSingle op1, SqlSingle op2) { return (op1 > op2).IsTrue; } + public bool GreaterThanOrEqual (SqlSingle op1, SqlSingle op2) { return (op1 >= op2).IsTrue; } + public bool LessThan (SqlSingle op1, SqlSingle op2) { return (op1 < op2).IsTrue; } + public bool LessThanOrEqual (SqlSingle op1, SqlSingle op2) { return (op1 <= op2).IsTrue; } + } + + #endregion + + #region SqlDouble + + private class DBR8 : IOperable<SqlDouble> + { + public SqlDouble Addition (SqlDouble op1, SqlDouble op2) { return (op1 + op2); } + public SqlDouble Subtraction (SqlDouble op1, SqlDouble op2) { return (op1 - op2); } + public SqlDouble Multiply (SqlDouble op1, SqlDouble op2) { return (op1 * op2); } + public SqlDouble Division (SqlDouble op1, SqlDouble op2) { return (op1 / op2); } + public SqlDouble Modulus (SqlDouble op1, SqlDouble op2) { throw new InvalidOperationException(); } + + public SqlDouble BitwiseAnd (SqlDouble op1, SqlDouble op2) { throw new InvalidOperationException(); } + public SqlDouble BitwiseOr (SqlDouble op1, SqlDouble op2) { throw new InvalidOperationException(); } + public SqlDouble ExclusiveOr (SqlDouble op1, SqlDouble op2) { throw new InvalidOperationException(); } + + public SqlDouble UnaryNegation (SqlDouble op) { return (-op); } + public SqlDouble OnesComplement(SqlDouble op) { throw new InvalidOperationException(); } + + public bool Equality (SqlDouble op1, SqlDouble op2) { return (op1 == op2).IsTrue; } + public bool Inequality (SqlDouble op1, SqlDouble op2) { return (op1 != op2).IsTrue; } + public bool GreaterThan (SqlDouble op1, SqlDouble op2) { return (op1 > op2).IsTrue; } + public bool GreaterThanOrEqual (SqlDouble op1, SqlDouble op2) { return (op1 >= op2).IsTrue; } + public bool LessThan (SqlDouble op1, SqlDouble op2) { return (op1 < op2).IsTrue; } + public bool LessThanOrEqual (SqlDouble op1, SqlDouble op2) { return (op1 <= op2).IsTrue; } + } + + #endregion + + #region SqlDecimal + + private class DBD : IOperable<SqlDecimal> + { + public SqlDecimal Addition (SqlDecimal op1, SqlDecimal op2) { return (op1 + op2); } + public SqlDecimal Subtraction (SqlDecimal op1, SqlDecimal op2) { return (op1 - op2); } + public SqlDecimal Multiply (SqlDecimal op1, SqlDecimal op2) { return (op1 * op2); } + public SqlDecimal Division (SqlDecimal op1, SqlDecimal op2) { return (op1 / op2); } + public SqlDecimal Modulus (SqlDecimal op1, SqlDecimal op2) { throw new InvalidOperationException(); } + + public SqlDecimal BitwiseAnd (SqlDecimal op1, SqlDecimal op2) { throw new InvalidOperationException(); } + public SqlDecimal BitwiseOr (SqlDecimal op1, SqlDecimal op2) { throw new InvalidOperationException(); } + public SqlDecimal ExclusiveOr (SqlDecimal op1, SqlDecimal op2) { throw new InvalidOperationException(); } + + public SqlDecimal UnaryNegation (SqlDecimal op) { return (-op); } + public SqlDecimal OnesComplement(SqlDecimal op) { throw new InvalidOperationException(); } + + public bool Equality (SqlDecimal op1, SqlDecimal op2) { return (op1 == op2).IsTrue; } + public bool Inequality (SqlDecimal op1, SqlDecimal op2) { return (op1 != op2).IsTrue; } + public bool GreaterThan (SqlDecimal op1, SqlDecimal op2) { return (op1 > op2).IsTrue; } + public bool GreaterThanOrEqual (SqlDecimal op1, SqlDecimal op2) { return (op1 >= op2).IsTrue; } + public bool LessThan (SqlDecimal op1, SqlDecimal op2) { return (op1 < op2).IsTrue; } + public bool LessThanOrEqual (SqlDecimal op1, SqlDecimal op2) { return (op1 <= op2).IsTrue; } + } + + #endregion + + #region SqlMoney + + private class DBM : IOperable<SqlMoney> + { + public SqlMoney Addition (SqlMoney op1, SqlMoney op2) { return (op1 + op2); } + public SqlMoney Subtraction (SqlMoney op1, SqlMoney op2) { return (op1 - op2); } + public SqlMoney Multiply (SqlMoney op1, SqlMoney op2) { return (op1 * op2); } + public SqlMoney Division (SqlMoney op1, SqlMoney op2) { return (op1 / op2); } + public SqlMoney Modulus (SqlMoney op1, SqlMoney op2) { throw new InvalidOperationException(); } + + public SqlMoney BitwiseAnd (SqlMoney op1, SqlMoney op2) { throw new InvalidOperationException(); } + public SqlMoney BitwiseOr (SqlMoney op1, SqlMoney op2) { throw new InvalidOperationException(); } + public SqlMoney ExclusiveOr (SqlMoney op1, SqlMoney op2) { throw new InvalidOperationException(); } + + public SqlMoney UnaryNegation (SqlMoney op) { return (-op); } + public SqlMoney OnesComplement(SqlMoney op) { throw new InvalidOperationException(); } + + public bool Equality (SqlMoney op1, SqlMoney op2) { return (op1 == op2).IsTrue; } + public bool Inequality (SqlMoney op1, SqlMoney op2) { return (op1 != op2).IsTrue; } + public bool GreaterThan (SqlMoney op1, SqlMoney op2) { return (op1 > op2).IsTrue; } + public bool GreaterThanOrEqual(SqlMoney op1, SqlMoney op2) { return (op1 >= op2).IsTrue; } + public bool LessThan (SqlMoney op1, SqlMoney op2) { return (op1 < op2).IsTrue; } + public bool LessThanOrEqual (SqlMoney op1, SqlMoney op2) { return (op1 <= op2).IsTrue; } + } + + #endregion + + #region SqlDateTime + + private class DBDT : IOperable<SqlDateTime> + { + public SqlDateTime Addition (SqlDateTime op1, SqlDateTime op2) { throw new InvalidOperationException(); } + public SqlDateTime Subtraction (SqlDateTime op1, SqlDateTime op2) { throw new InvalidOperationException(); } + public SqlDateTime Multiply (SqlDateTime op1, SqlDateTime op2) { throw new InvalidOperationException(); } + public SqlDateTime Division (SqlDateTime op1, SqlDateTime op2) { throw new InvalidOperationException(); } + public SqlDateTime Modulus (SqlDateTime op1, SqlDateTime op2) { throw new InvalidOperationException(); } + + public SqlDateTime BitwiseAnd (SqlDateTime op1, SqlDateTime op2) { throw new InvalidOperationException(); } + public SqlDateTime BitwiseOr (SqlDateTime op1, SqlDateTime op2) { throw new InvalidOperationException(); } + public SqlDateTime ExclusiveOr (SqlDateTime op1, SqlDateTime op2) { throw new InvalidOperationException(); } + + public SqlDateTime UnaryNegation (SqlDateTime op) { throw new InvalidOperationException(); } + public SqlDateTime OnesComplement(SqlDateTime op) { throw new InvalidOperationException(); } + + public bool Equality (SqlDateTime op1, SqlDateTime op2) { return (op1 == op2).IsTrue; } + public bool Inequality (SqlDateTime op1, SqlDateTime op2) { return (op1 != op2).IsTrue; } + public bool GreaterThan (SqlDateTime op1, SqlDateTime op2) { return (op1 > op2).IsTrue; } + public bool GreaterThanOrEqual (SqlDateTime op1, SqlDateTime op2) { return (op1 >= op2).IsTrue; } + public bool LessThan (SqlDateTime op1, SqlDateTime op2) { return (op1 < op2).IsTrue; } + public bool LessThanOrEqual (SqlDateTime op1, SqlDateTime op2) { return (op1 <= op2).IsTrue; } + } + + #endregion + + #region SqlBinary + + private class DBBin : IOperable<SqlBinary> + { + public SqlBinary Addition (SqlBinary op1, SqlBinary op2) { return (op1 + op2); } + public SqlBinary Subtraction (SqlBinary op1, SqlBinary op2) { throw new InvalidOperationException(); } + public SqlBinary Multiply (SqlBinary op1, SqlBinary op2) { throw new InvalidOperationException(); } + public SqlBinary Division (SqlBinary op1, SqlBinary op2) { throw new InvalidOperationException(); } + public SqlBinary Modulus (SqlBinary op1, SqlBinary op2) { throw new InvalidOperationException(); } + + public SqlBinary BitwiseAnd (SqlBinary op1, SqlBinary op2) { throw new InvalidOperationException(); } + public SqlBinary BitwiseOr (SqlBinary op1, SqlBinary op2) { throw new InvalidOperationException(); } + public SqlBinary ExclusiveOr (SqlBinary op1, SqlBinary op2) { throw new InvalidOperationException(); } + + public SqlBinary UnaryNegation (SqlBinary op) { throw new InvalidOperationException(); } + public SqlBinary OnesComplement(SqlBinary op) { throw new InvalidOperationException(); } + + public bool Equality (SqlBinary op1, SqlBinary op2) { return (op1 == op2).IsTrue; } + public bool Inequality (SqlBinary op1, SqlBinary op2) { return (op1 != op2).IsTrue; } + public bool GreaterThan (SqlBinary op1, SqlBinary op2) { return (op1 > op2).IsTrue; } + public bool GreaterThanOrEqual (SqlBinary op1, SqlBinary op2) { return (op1 >= op2).IsTrue; } + public bool LessThan (SqlBinary op1, SqlBinary op2) { return (op1 < op2).IsTrue; } + public bool LessThanOrEqual (SqlBinary op1, SqlBinary op2) { return (op1 <= op2).IsTrue; } + } + + #endregion + + #region SqlGuid + + private class DBG : IOperable<SqlGuid> + { + public SqlGuid Addition (SqlGuid op1, SqlGuid op2) { throw new InvalidOperationException(); } + public SqlGuid Subtraction (SqlGuid op1, SqlGuid op2) { throw new InvalidOperationException(); } + public SqlGuid Multiply (SqlGuid op1, SqlGuid op2) { throw new InvalidOperationException(); } + public SqlGuid Division (SqlGuid op1, SqlGuid op2) { throw new InvalidOperationException(); } + public SqlGuid Modulus (SqlGuid op1, SqlGuid op2) { throw new InvalidOperationException(); } + + public SqlGuid BitwiseAnd (SqlGuid op1, SqlGuid op2) { throw new InvalidOperationException(); } + public SqlGuid BitwiseOr (SqlGuid op1, SqlGuid op2) { throw new InvalidOperationException(); } + public SqlGuid ExclusiveOr (SqlGuid op1, SqlGuid op2) { throw new InvalidOperationException(); } + + public SqlGuid UnaryNegation (SqlGuid op) { throw new InvalidOperationException(); } + public SqlGuid OnesComplement (SqlGuid op) { throw new InvalidOperationException(); } + + public bool Equality (SqlGuid op1, SqlGuid op2) { return (op1 == op2).IsTrue; } + public bool Inequality (SqlGuid op1, SqlGuid op2) { return (op1 != op2).IsTrue; } + public bool GreaterThan (SqlGuid op1, SqlGuid op2) { return (op1 > op2).IsTrue; } + public bool GreaterThanOrEqual(SqlGuid op1, SqlGuid op2) { return (op1 >= op2).IsTrue; } + public bool LessThan (SqlGuid op1, SqlGuid op2) { return (op1 < op2).IsTrue; } + public bool LessThanOrEqual (SqlGuid op1, SqlGuid op2) { return (op1 <= op2).IsTrue; } + } + + #endregion + + #endregion + } + + public static class Operator + { + public static T Addition <T>(T a, T b) { return Operator<T>.Op.Addition (a, b); } + public static T Subtraction <T>(T a, T b) { return Operator<T>.Op.Subtraction (a, b); } + public static T Multiply <T>(T a, T b) { return Operator<T>.Op.Multiply (a, b); } + public static T Division <T>(T a, T b) { return Operator<T>.Op.Division (a, b); } + public static T Modulus <T>(T a, T b) { return Operator<T>.Op.Modulus (a, b); } + + public static T BitwiseAnd <T>(T a, T b) { return Operator<T>.Op.BitwiseAnd (a, b); } + public static T BitwiseOr <T>(T a, T b) { return Operator<T>.Op.BitwiseOr (a, b); } + public static T ExclusiveOr <T>(T a, T b) { return Operator<T>.Op.ExclusiveOr (a, b); } + + public static T UnaryNegation <T>(T a) { return Operator<T>.Op.UnaryNegation (a); } + public static T OnesComplement <T>(T a) { return Operator<T>.Op.OnesComplement (a); } + + public static bool Equality <T>(T a, T b) { return Operator<T>.Op.Equality (a, b); } + public static bool Inequality <T>(T a, T b) { return Operator<T>.Op.Inequality (a, b); } + public static bool GreaterThan <T>(T a, T b) { return Operator<T>.Op.GreaterThan (a, b); } + public static bool GreaterThanOrEqual<T>(T a, T b) { return Operator<T>.Op.GreaterThanOrEqual(a, b); } + public static bool LessThan <T>(T a, T b) { return Operator<T>.Op.LessThan (a, b); } + public static bool LessThanOrEqual <T>(T a, T b) { return Operator<T>.Op.LessThanOrEqual (a, b); } + } +}