KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > presumo > jms > selector > JmsIntegerLiteral


1 /**
2  * This file is part of Presumo.
3  *
4  * Presumo is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * Presumo 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 General Public License
15  * along with Presumo; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  *
19  * Copyright 2001 Dan Greff
20  */

21 package com.presumo.jms.selector;
22
23 import java.util.Hashtable JavaDoc;
24
25 /**
26  * Expression node to represent integer literals.
27  *
28  * @author Dan Greff
29  *
30  */

31 final class JmsIntegerLiteral extends JmsNumericLiteral
32 {
33   // the numeric literal value for this instance
34
private Long JavaDoc data;
35
36   // all instances of JmsIntegerLiteral with (Long, JmsIntegerLiteral instance)
37
// pairs.
38
private static Hashtable JavaDoc instances = null;
39
40
41     /////////////////////////////////////////////////////////////////////////
42
// Static Methods //
43
/////////////////////////////////////////////////////////////////////////
44

45   /**
46    * Psuedo-singleton access point. Only one instance for each long value
47    * will ever be created and returned.
48    */

49   static JmsIntegerLiteral getInstance(long newValue)
50   {
51     JmsIntegerLiteral retval;
52
53     Long JavaDoc search = new Long JavaDoc(newValue);
54   
55     if (instances == null)
56       instances = new Hashtable JavaDoc();
57    
58     retval = (JmsIntegerLiteral) instances.get(search);
59     if (retval == null) {
60       retval = new JmsIntegerLiteral(newValue);
61       instances.put(search, retval);
62     }
63     else {
64       retval.incrementRefCount();
65     }
66        
67     return retval;
68   }
69
70   /**
71    * During evaluation, JmsIdentifier needs to create JmsIntegerLiterals.
72    * These literals need not be singletons. This access point returns
73    * a non-singleton instance.
74    */

75   static JmsIntegerLiteral getUniqueInstance(long newValue)
76   {
77     return new JmsIntegerLiteral(newValue);
78   }
79
80     
81     /////////////////////////////////////////////////////////////////////////
82
// Constructor //
83
/////////////////////////////////////////////////////////////////////////
84

85   /**
86    * Called by getInstance which controls instance creation.
87    */

88   protected JmsIntegerLiteral(long newValue)
89   {
90     super(false); // Make sure this instance isn't tracked
91
this.data = new Long JavaDoc(newValue);
92     this.stringRepresentation = data.toString();
93   }
94
95   
96     /////////////////////////////////////////////////////////////////////////
97
// Package Methods //
98
/////////////////////////////////////////////////////////////////////////
99
Number JavaDoc getNumber() { return data; }
100
101   //////////////////////////////////////////////////////////////////////////////////
102
// Implements methods in JmsNumericLiteral with careful attention to
103
// numeric promotion.
104
//
105

106   JmsBooleanLiteral eq(JmsDataType value) throws SelectorFalseException {
107     if (! (value instanceof JmsNumericLiteral))
108       throw SelectorFalseException.getInstance();
109
110     if (value instanceof JmsFloatLiteral) {
111       if (data.doubleValue() == ( (JmsNumericLiteral)value ).getNumber().doubleValue() )
112         return JmsBooleanLiteral.TRUE;
113       else
114         return JmsBooleanLiteral.FALSE;
115     }
116     else {
117       if (data.longValue() == ( (JmsNumericLiteral)value ).getNumber().longValue() )
118         return JmsBooleanLiteral.TRUE;
119       else
120         return JmsBooleanLiteral.FALSE;
121     }
122   }
123
124   JmsBooleanLiteral lt(JmsNumericLiteral value) {
125     if (value instanceof JmsFloatLiteral) {
126       if (data.doubleValue() < value.getNumber().doubleValue())
127         return JmsBooleanLiteral.TRUE;
128       else
129         return JmsBooleanLiteral.FALSE;
130     }
131     else {
132       if (data.longValue() < value.getNumber().longValue())
133         return JmsBooleanLiteral.TRUE;
134       else
135         return JmsBooleanLiteral.FALSE;
136     }
137   }
138
139   JmsBooleanLiteral gt(JmsNumericLiteral value) {
140     if (value instanceof JmsFloatLiteral) {
141       if (data.doubleValue() > value.getNumber().doubleValue())
142         return JmsBooleanLiteral.TRUE;
143       else
144         return JmsBooleanLiteral.FALSE;
145     }
146     else {
147       if (data.longValue() > value.getNumber().longValue())
148         return JmsBooleanLiteral.TRUE;
149       else
150         return JmsBooleanLiteral.FALSE;
151     }
152   }
153     
154   JmsNumericLiteral mult(JmsNumericLiteral value) {
155     if (value instanceof JmsFloatLiteral) {
156       double result = data.doubleValue() * value.getNumber().doubleValue();
157       return JmsFloatLiteral.getUniqueInstance(result);
158     }
159     else {
160       long result = data.longValue() * value.getNumber().longValue();
161       return JmsIntegerLiteral.getUniqueInstance(result);
162     }
163   }
164     
165   JmsNumericLiteral div(JmsNumericLiteral value) {
166     if (value instanceof JmsFloatLiteral) {
167       double result = data.doubleValue() / value.getNumber().doubleValue();
168       return JmsFloatLiteral.getUniqueInstance(result);
169     }
170     else {
171       long result = data.longValue() / value.getNumber().longValue();
172       return JmsIntegerLiteral.getUniqueInstance(result);
173     }
174   }
175     
176   JmsNumericLiteral add(JmsNumericLiteral value) {
177     if (value instanceof JmsFloatLiteral) {
178       double result = data.doubleValue() + value.getNumber().doubleValue();
179       return JmsFloatLiteral.getUniqueInstance(result);
180     }
181     else {
182       long result = data.longValue() + value.getNumber().longValue();
183       return JmsIntegerLiteral.getUniqueInstance(result);
184     }
185   }
186     
187   JmsNumericLiteral sub(JmsNumericLiteral value) {
188     if (value instanceof JmsFloatLiteral) {
189       double result = data.doubleValue() - value.getNumber().doubleValue();
190       return JmsFloatLiteral.getUniqueInstance(result);
191     }
192     else {
193       long result = data.longValue() - value.getNumber().longValue();
194       return JmsIntegerLiteral.getUniqueInstance(result);
195     }
196   }
197     
198
199   /**
200    * Used to identify this object in places where instanceof is
201    * inapplicable.
202    */

203   short getType() { return JmsOperand.JMS_INTEGER_LITERAL; }
204
205  
206     /////////////////////////////////////////////////////////////////////////
207
// Protected Methods //
208
/////////////////////////////////////////////////////////////////////////
209

210   protected void delete(JmsOperand parent) {
211     super.delete(parent);
212     if (refcount == 0) {
213       instances.remove(data);
214       if (instances.size() == 0) {
215         instances = null;
216       }
217     }
218   }
219
220 }
221
222     
223
Popular Tags