using System;\r
using System.Collections.Generic;\r
using System.Text;\r
-using o = System.Object;\r
\r
namespace Karinto.Numeric\r
{\r
- public class Operator<T> \r
+ public class Operator<T>\r
where T : IComparable, new()\r
{\r
public delegate T BinaryOperator(T left, T right);\r
public delegate T UnaryOperator(T number);\r
\r
- public static readonly BinaryOperator Add;\r
- public static readonly BinaryOperator Sub;\r
- public static readonly BinaryOperator Mul;\r
- public static readonly BinaryOperator Div;\r
- public static readonly T Zero;\r
- public static readonly T One;\r
+ public static BinaryOperator Add;\r
+ public static BinaryOperator Sub;\r
+ public static BinaryOperator Mul;\r
+ public static BinaryOperator Div;\r
+ public static UnaryOperator Neg;\r
+ public static T Zero;\r
+ public static T One;\r
+\r
+ private static BinaryOperator invalidOp2 = \r
+ delegate(T left, T right)\r
+ {\r
+ throw new InvalidOperationException();\r
+ };\r
+\r
+ private static UnaryOperator invalidOp1 = \r
+ delegate(T number)\r
+ {\r
+ throw new InvalidOperationException();\r
+ };\r
\r
static Operator()\r
- { \r
+ {\r
T prototype = new T();\r
if (prototype is int)\r
{\r
Operator<int>.Zero = 0;\r
Operator<int>.One = 1;\r
- Operator<int>.Add = delegate(int left, int right) \r
+ Operator<int>.Add = delegate(int left, int right)\r
{\r
return left + right;\r
};\r
{\r
return left / right;\r
};\r
+ Operator<int>.Neg = delegate(int number)\r
+ {\r
+ return -number;\r
+ };\r
return;\r
}\r
if (prototype is long)\r
{\r
return left / right;\r
};\r
+ Operator<long>.Neg = delegate(long number)\r
+ {\r
+ return -number;\r
+ };\r
return;\r
}\r
if (prototype is decimal)\r
{\r
return left / right;\r
};\r
+ Operator<decimal>.Neg = delegate(decimal number)\r
+ {\r
+ return -number;\r
+ };\r
return;\r
}\r
if (prototype is double)\r
{\r
return left / right;\r
};\r
+ Operator<double>.Neg = delegate(double number)\r
+ {\r
+ return -number;\r
+ };\r
return;\r
}\r
- throw new NotSupportedException(\r
- "The specified type-parameter is not supported.");\r
+ if (prototype is float)\r
+ {\r
+ Operator<float>.Zero = 0.0f;\r
+ Operator<float>.One = 1.0f;\r
+ Operator<float>.Add = delegate(float left, float right)\r
+ {\r
+ return left + right;\r
+ };\r
+ Operator<float>.Sub = delegate(float left, float right)\r
+ {\r
+ return left - right;\r
+ };\r
+ Operator<float>.Mul = delegate(float left, float right)\r
+ {\r
+ return left * right;\r
+ };\r
+ Operator<float>.Div = delegate(float left, float right)\r
+ {\r
+ return left / right;\r
+ };\r
+ Operator<float>.Neg = delegate(float number)\r
+ {\r
+ return -number;\r
+ };\r
+ return;\r
+ }\r
+ Add = invalidOp2;\r
+ Sub = invalidOp2;\r
+ Mul = invalidOp2;\r
+ Div = invalidOp2;\r
+ Neg = delegate(T number)\r
+ {\r
+ return Sub(Zero, number);\r
+ };\r
}\r
-\r
}\r
}\r