Source code: com/memoire/foo/FooReal.java
1 /**
2 * @modification $Date: 2002/12/16 18:56:26 $
3 * @statut unstable
4 * @file FooReal.java
5 * @version 0.08
6 * @author Guillaume Desnoix
7 * @email guillaume@desnoix.com
8 * @license GNU General Public License 2 (GPL2)
9 * @copyright 1999-2001 Guillaume Desnoix
10 */
11
12 package com.memoire.foo;
13 import com.memoire.foo.*;
14
15 public class FooReal
16 {
17 private static FooCategory pkg_=null;
18
19 public static final FooCategory init()
20 {
21 if(pkg_==null)
22 {
23 pkg_=FooCategory.create("&real");
24 FooCategory.create(Double.class).alias("&double").extend(pkg_);
25 FooCategory.create(Float.class ).alias("&float" ).extend(pkg_);
26
27 pkg_.setMessage("+" ,FooReal.class,"addMsg");
28 pkg_.setMessage("-" ,FooReal.class,"subMsg");
29 pkg_.setMessage("*" ,FooReal.class,"mulMsg");
30 pkg_.setMessage("/" ,FooReal.class,"divMsg");
31 pkg_.setMessage("<" ,FooReal.class,"ltMsg");
32 pkg_.setMessage("<=",FooReal.class,"leMsg");
33 pkg_.setMessage(">" ,FooReal.class,"gtMsg");
34 pkg_.setMessage(">=",FooReal.class,"geMsg");
35 pkg_.setMessage("==",FooReal.class,"eqMsg");
36 pkg_.setMessage("!=",FooReal.class,"neMsg");
37 pkg_.setMessage("~" ,FooReal.class,"mtMsg");
38 pkg_.setMessage("!~",FooReal.class,"nmMsg");
39 pkg_.setMessage("²" ,FooReal.class,"sqrMsg");
40 pkg_.setMessage("**",Math.class ,"pow(double,double)");
41 }
42
43 return pkg_;
44 }
45
46 private static final Double ZERO=new Double(0.);
47 private static final Double ONE =new Double(1.);
48 private static final Double TWO =new Double(2.);
49
50 public static Double create(double _value)
51 {
52 Double r;
53 if(_value==0.) r=ZERO;
54 else if(_value==1.) r=ONE;
55 else if(_value==2.) r=TWO;
56 else r=new Double(_value);
57 return r;
58 }
59
60 public static Number addMsg(Object[] _n)
61 {
62 return operation(_n,0);
63 }
64
65 public static Number subMsg(Object[] _n)
66 {
67 return operation(_n,1);
68 }
69
70 public static Number mulMsg(Object[] _n)
71 {
72 return operation(_n,2);
73 }
74
75 public static Number divMsg(Object[] _n)
76 {
77 return operation(_n,3);
78 }
79
80 private static Number operation(Object[] _n, int _op)
81 {
82 FooLib.checkClassArgument(Number.class,_n[0],0);
83 double r=((Number)_n[0]).doubleValue();
84 for(int i=1;i<_n.length;i++)
85 {
86 FooLib.checkClassArgument(Number.class,_n[i],i);
87 double a=((Number)_n[i]).doubleValue();
88 switch(_op)
89 {
90 case 0: r+=a; break;
91 case 1: r-=a; break;
92 case 2: r*=a; break;
93 case 3: r/=a; break;
94 }
95 }
96 return create(r);
97 }
98
99 public static Boolean ltMsg(Object[] _n)
100 {
101 return comparison(_n,0);
102 }
103
104 public static Boolean leMsg(Object[] _n)
105 {
106 return comparison(_n,1);
107 }
108
109 public static Boolean gtMsg(Object[] _n)
110 {
111 return comparison(_n,2);
112 }
113
114 public static Boolean geMsg(Object[] _n)
115 {
116 return comparison(_n,3);
117 }
118
119 public static Boolean eqMsg(Object[] _n)
120 {
121 return comparison(_n,4);
122 }
123
124 public static Boolean neMsg(Object[] _n)
125 {
126 return comparison(_n,5);
127 }
128
129 public static Boolean mtMsg(Object[] _n)
130 {
131 return comparison(_n,6);
132 }
133
134 public static Boolean nmMsg(Object[] _n)
135 {
136 return comparison(_n,7);
137 }
138
139 private static Boolean comparison(Object[] _n, int _op)
140 {
141 FooLib.checkClassArgument(Number.class,_n[0],0);
142 boolean r=true;
143 double v=((Number)_n[0]).doubleValue();
144 for(int i=1;i<_n.length;i++)
145 {
146 FooLib.checkClassArgument(Number.class,_n[i],i);
147 double a=((Number)_n[i]).doubleValue();
148 switch(_op)
149 {
150 case 0: r&=(v< a); break;
151 case 1: r&=(v<=a); break;
152 case 2: r&=(v> a); break;
153 case 3: r&=(v>=a); break;
154 case 4: r&=(v==a); break;
155 case 5: r&=(v!=a); break;
156 case 6: r&=(Math.round(v-a)==0.); break;
157 case 7: r&=(Math.round(v-a)!=0.); break;
158 }
159 }
160 return FooBoolean.create(r);
161 }
162
163 public static Number sqrMsg(Number _a)
164 {
165 double a=_a.doubleValue();
166 return create(a*a);
167 }
168 }