OSDN Git Service

ユーザ定義型に対応
[karinto/karinto.git] / Karinto / Numeric / Operator.cs
index a9a2b78..44f789b 100755 (executable)
@@ -8,31 +8,43 @@
 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
@@ -48,6 +60,10 @@ namespace Karinto.Numeric
                 {\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
@@ -70,6 +86,10 @@ namespace Karinto.Numeric
                 {\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
@@ -92,6 +112,10 @@ namespace Karinto.Numeric
                 {\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
@@ -114,11 +138,46 @@ namespace Karinto.Numeric
                 {\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