1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package net.sf.zel.nr;
19
20 import java.math.BigDecimal;
21 import java.math.BigInteger;
22 import javax.annotation.concurrent.Immutable;
23 import net.sf.zel.nr.ExtendedNumber.Type;
24
25 @Immutable
26 public final class OperableLong extends OperableNumber
27 {
28
29 private static final long serialVersionUID = 6989912035116276536L;
30 public static final OperableLong ZERO = new OperableLong(0L);
31 public static final OperableLong ONE = new OperableLong(1L);
32 private final long number;
33
34 public OperableLong(final long n)
35 {
36 number = n;
37 }
38
39 public OperableLong(final String val)
40 {
41 number = Long.parseLong(val);
42 }
43
44
45 @Override
46 public OperableNumber zero()
47 {
48 return ZERO;
49 }
50
51 @Override
52 public OperableNumber add(OperableNumber addend)
53 {
54 long b = addend.longValue();
55 long result = number + b;
56 if (((number ^ result) & (b ^ result)) < 0)
57 {
58 return new OperableBigInteger(BigInteger.valueOf(number).add(BigInteger.valueOf(b)));
59 } else
60 {
61 return new OperableLong(result);
62 }
63 }
64
65 @Override
66 public OperableNumber subtract(OperableNumber subtrahend)
67 {
68 long b = subtrahend.longValue();
69 long result = number - b;
70 if (((number ^ result) & ((-b) ^ result)) < 0)
71 {
72 return new OperableBigInteger(BigInteger.valueOf(number).subtract(BigInteger.valueOf(b)));
73 } else
74 {
75 return new OperableLong(result);
76 }
77 }
78
79 @Override
80 public OperableNumber multiply(OperableNumber multiplier)
81 {
82 return new OperableBigInteger(BigInteger.valueOf(number).multiply(BigInteger.valueOf(multiplier.longValue())));
83 }
84
85 @Override
86 public OperableNumber divide(OperableNumber divisor)
87 {
88 return new OperableLong(number / divisor.longValue());
89 }
90
91 @Override
92 public OperableNumber mod(OperableNumber divisor)
93 {
94 return new OperableLong(number % divisor.longValue());
95 }
96
97 @Override
98 public BigDecimal bigDecimalValue()
99 {
100 return BigDecimal.valueOf(number);
101 }
102
103 @Override
104 public BigInteger bigIntegerValue()
105 {
106 return BigInteger.valueOf(number);
107 }
108
109 public int compareTo(OperableNumber o)
110 {
111 long other = o.longValue();
112 if (number > other)
113 {
114 return 1;
115 } else if (number == other)
116 {
117 return 0;
118 } else
119 {
120 return -1;
121 }
122 }
123
124 @Override
125 public Type getType()
126 {
127 return Type.INTEGER;
128 }
129
130 @Override
131 public OperableGNUBigInteger gnuBigIntegerValue()
132 {
133 return new OperableGNUBigInteger(toString());
134 }
135
136 @Override
137 public int intValue()
138 {
139 return (int) number;
140 }
141
142 @Override
143 public long longValue()
144 {
145 return (long) number;
146 }
147
148 @Override
149 public float floatValue()
150 {
151 return (float) number;
152 }
153
154 @Override
155 public double doubleValue()
156 {
157 return (double) number;
158 }
159
160 @Override
161 public int compareTo(final Object o)
162 {
163 long other = ((OperableNumber) o).longValue();
164 if (number > other)
165 {
166 return 1;
167 } else if (number == other)
168 {
169 return 0;
170 } else
171 {
172 return -1;
173 }
174 }
175
176 @Override
177 public String toString()
178 {
179 return Long.toString(number);
180 }
181
182 @Override
183 public boolean equals(Object obj)
184 {
185 if (obj == null)
186 {
187 return false;
188 }
189 if (getClass() != obj.getClass())
190 {
191 return false;
192 }
193 final OperableLong other = (OperableLong) obj;
194 if (this.number != other.number)
195 {
196 return false;
197 }
198 return true;
199 }
200
201 @Override
202 public int hashCode()
203 {
204 return (int) number;
205 }
206
207 @Override
208 public OperableGNUBigFloat gnuBigFloatValue()
209 {
210 return new OperableGNUBigFloat(toString());
211 }
212
213 @Override
214 public int getPrecision()
215 {
216 return 64;
217 }
218
219 @Override
220 public OperableNumber create(final String val)
221 {
222 if ("0".equals(val))
223 return ZERO;
224 else
225 return new OperableLong(val);
226 }
227
228 @Override
229 public ExtendedNumber one()
230 {
231 return ONE;
232 }
233
234 @Override
235 public OperableNumber convert(ExtendedNumber val)
236 {
237 return new OperableLong(val.longValue());
238 }
239
240
241 }