View Javadoc

1   /*
2    * Copyright (c) 2001, Zoltan Farkas All Rights Reserved.
3    *
4    * This library is free software; you can redistribute it and/or
5    * modify it under the terms of the GNU Lesser General Public
6    * License as published by the Free Software Foundation; either
7    * version 2.1 of the License, or (at your option) any later version.
8    *
9    * This library is distributed in the hope that it will be useful,
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   * GNU General Public License for more details.
13   *
14   * You should have received a copy of the GNU Lesser General Public
15   * License along with this program; if not, write to the Free Software
16   * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
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 }