1 29 30 package com.caucho.quercus.env; 31 32 import com.caucho.vfs.WriteStream; 33 34 import java.io.IOException ; 35 import java.io.PrintWriter ; 36 import java.io.Serializable ; 37 import java.util.IdentityHashMap ; 38 39 42 public class LongValue extends NumberValue 43 implements Serializable 44 { 45 public static final LongValue MINUS_ONE = new LongValue(-1); 46 public static final LongValue ZERO = new LongValue(0); 47 public static final LongValue ONE = new LongValue(1); 48 49 public static final int STATIC_MIN = -256; 50 public static final int STATIC_MAX = 256; 51 52 public static final LongValue[]STATIC_VALUES; 53 54 private final long _value; 55 56 public LongValue(long value) 57 { 58 _value = value; 59 } 60 61 public static LongValue create(long value) 62 { 63 if (STATIC_MIN <= value && value <= STATIC_MAX) 64 return STATIC_VALUES[(int) (value - STATIC_MIN)]; 65 else 66 return new LongValue(value); 67 } 68 69 public static LongValue create(Number value) 70 { 71 if (value == null) 72 return LongValue.ZERO; 73 else 74 return new LongValue(value.longValue()); 75 } 76 77 80 public String getType() 81 { 82 return "integer"; 83 } 84 85 88 public boolean isLongConvertible() 89 { 90 return true; 91 } 92 93 96 @Override 97 public boolean isNumeric() 98 { 99 return true; 100 } 101 102 105 public boolean isScalar() 106 { 107 return true; 108 } 109 110 113 public boolean toBoolean() 114 { 115 return _value != 0; 116 } 117 118 121 public long toLong() 122 { 123 return _value; 124 } 125 126 129 public double toDouble() 130 { 131 return _value; 132 } 133 134 137 public String toString() 138 { 139 return String.valueOf(_value); 140 } 141 142 145 public Value toLongValue() 146 { 147 return this; 148 } 149 150 153 public Value toKey() 154 { 155 return this; 156 } 157 158 161 public Object toObject() 162 { 163 return String.valueOf(_value); 164 } 165 166 169 public Object toJavaObject() 170 { 171 return new Long (_value); 172 } 173 174 177 public Value neg() 178 { 179 return new LongValue(- _value); 180 } 181 182 185 public Value pos() 186 { 187 return this; 188 } 189 190 193 public Value preincr(int incr) 194 { 195 return LongValue.create(_value + incr); 196 } 197 198 201 public Value postincr(int incr) 202 { 203 return LongValue.create(_value + incr); 204 } 205 206 209 @Override 210 public Value add(long lLong) 211 { 212 return LongValue.create(lLong + _value); 213 } 214 215 218 public Value sub(long rLong) 219 { 220 return LongValue.create(_value - rLong); 221 } 222 223 226 public boolean eql(Value rValue) 227 { 228 rValue = rValue.toValue(); 229 230 if (! (rValue instanceof LongValue)) 231 return false; 232 233 long rLong = ((LongValue) rValue)._value; 234 235 return _value == rLong; 236 } 237 238 242 public void print(Env env) 243 { 244 env.print(_value); 245 } 246 247 250 @Override 251 public void appendTo(StringBuilderValue sb) 252 { 253 sb.append(_value); 254 } 255 256 259 @Override 260 public void appendTo(BinaryBuilderValue sb) 261 { 262 sb.append(_value); 263 } 264 265 268 public void serialize(StringBuilder sb) 269 { 270 sb.append("i:"); 271 sb.append(_value); 272 sb.append(";"); 273 } 274 275 278 public void varExport(StringBuilder sb) 279 { 280 sb.append(_value); 281 } 282 283 287 292 public void generate(PrintWriter out) 293 throws IOException 294 { 295 if (_value == 0) 296 out.print("LongValue.ZERO"); 297 else if (_value == 1) 298 out.print("LongValue.ONE"); 299 else if (_value == -1) 300 out.print("LongValue.MINUS_ONE"); 301 else if (STATIC_MIN <= _value && _value <= STATIC_MAX) 302 out.print("LongValue.STATIC_VALUES[" + (_value - STATIC_MIN) + "]"); 303 else 304 out.print("new LongValue(" + _value + "L)"); 305 } 306 307 310 public final int hashCode() 311 { 312 long v = _value; 313 314 return (int) (17 * v + 65537 * (v >> 32)); 315 } 316 317 320 public boolean equals(Object o) 321 { 322 if (this == o) 323 return true; 324 else if (! (o instanceof LongValue)) 325 return false; 326 327 LongValue value = (LongValue) o; 328 329 return _value == value._value; 330 } 331 332 public void varDumpImpl(Env env, 333 WriteStream out, 334 int depth, 335 IdentityHashMap <Value,String > valueSet) 336 throws IOException 337 { 338 out.print("int(" + toLong() + ")"); 339 } 340 341 345 private Object readResolve() 346 { 347 if (STATIC_MIN <= _value && _value <= STATIC_MAX) 348 return STATIC_VALUES[(int) (_value - STATIC_MIN)]; 349 else 350 return this; 351 } 352 353 static { 354 STATIC_VALUES = new LongValue[STATIC_MAX - STATIC_MIN + 1]; 355 356 for (int i = STATIC_MIN; i <= STATIC_MAX; i++) { 357 STATIC_VALUES[i - STATIC_MIN] = new LongValue(i); 358 } 359 } 360 } 361 | Popular Tags |