16c68365bd7e7ab52a7278b640c1230e7da0876c
[org.ibex.core.git] / src / org / ibex / js / JSNumber.java
1 package org.ibex.js;
2
3 abstract class JSNumber extends JSPrimitive {
4     boolean jsequals(JS o) {
5         if(o == this) return true;
6         if(o instanceof JSNumber) {
7             JSNumber n = (JSNumber) o;
8             if(this instanceof D || n instanceof D) return n.toDouble() == toDouble();
9             return n.toLong() == toLong();
10         } else if(o instanceof JSString) {
11             String s = ((JSString)o).s.trim();
12             try {
13                 if(this instanceof D || s.indexOf('.') != -1) return Double.parseDouble(s) == toDouble();
14                 return Long.parseLong(s) == toLong();
15             } catch(NumberFormatException e) {
16                 return false;
17             }
18         } else {
19             return false;
20         }
21     }
22     // FEATURE: Better hash function? (if d != (int) d then do something double specific)
23     public int hashCode() { return toInt(); }
24     
25     abstract int toInt();
26     long toLong() { return toInt(); }
27     boolean toBoolean() { return toInt() != 0; }
28     double toDouble() { return toLong(); }
29     float toFloat() { return (float) toDouble(); }
30     // FIXME: Number functions
31
32     final static class I extends JSNumber {
33         final int i;
34         I(int i) { this.i = i; }
35         int toInt() { return i; }
36         public String coerceToString() { return Integer.toString(i); }
37     }
38     
39     final static class L extends JSNumber {
40         private final long l;
41         L(long l) { this.l = l; }
42         int toInt() { return (int) l; }
43         long toLong() { return l; }
44         public String coerceToString() { return Long.toString(l); }
45     }
46     
47     final static class D extends JSNumber {
48         private final double d;
49         D(double d) { this.d = d; }
50         int toInt() { return (int) d; }
51         long toLong() { return (long) d; }
52         double toDouble()  { return d; }
53         boolean toBoolean() { return d == d && d != 0.0; }
54         public String coerceToString() { return d == (long) d ? Long.toString((long)d) : Double.toString(d); }
55     }
56     
57     final static class B extends JSNumber {
58         private final boolean b;
59         B(boolean b) { this.b = b; }
60         int toInt() { return b ? 1 : 0; }
61         public String coerceToString() { return b ? "true" : "false"; }
62     }
63 }