• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.fasterxml.jackson.databind.node;
2 
3 import java.io.IOException;
4 import java.math.BigDecimal;
5 import java.math.BigInteger;
6 
7 import com.fasterxml.jackson.core.*;
8 import com.fasterxml.jackson.core.io.NumberOutput;
9 import com.fasterxml.jackson.databind.SerializerProvider;
10 
11 /**
12  * <code>JsonNode</code> implementation for efficiently containing 32-bit
13  * `float` values.
14  *
15  * @since 2.2
16  */
17 @SuppressWarnings("serial")
18 public class FloatNode extends NumericNode
19 {
20     protected final float _value;
21 
22     /*
23     /**********************************************************
24     /* Construction
25     /**********************************************************
26      */
27 
FloatNode(float v)28     public FloatNode(float v) { _value = v; }
29 
valueOf(float v)30     public static FloatNode valueOf(float v) { return new FloatNode(v); }
31 
32     /*
33     /**********************************************************
34     /* BaseJsonNode extended API
35     /**********************************************************
36      */
37 
asToken()38     @Override public JsonToken asToken() { return JsonToken.VALUE_NUMBER_FLOAT; }
39 
40     @Override
numberType()41     public JsonParser.NumberType numberType() { return JsonParser.NumberType.FLOAT; }
42 
43     /*
44     /**********************************************************
45     /* Overrridden JsonNode methods
46     /**********************************************************
47      */
48 
49     @Override
isFloatingPointNumber()50     public boolean isFloatingPointNumber() { return true; }
51 
52     @Override
isFloat()53     public boolean isFloat() { return true; }
54 
canConvertToInt()55     @Override public boolean canConvertToInt() {
56         return (_value >= Integer.MIN_VALUE && _value <= Integer.MAX_VALUE);
57     }
58 
canConvertToLong()59     @Override public boolean canConvertToLong() {
60         return (_value >= Long.MIN_VALUE && _value <= Long.MAX_VALUE);
61     }
62 
63     @Override
numberValue()64     public Number numberValue() {
65         return Float.valueOf(_value);
66     }
67 
68     @Override
shortValue()69     public short shortValue() { return (short) _value; }
70 
71     @Override
intValue()72     public int intValue() { return (int) _value; }
73 
74     @Override
longValue()75     public long longValue() { return (long) _value; }
76 
77     @Override
floatValue()78     public float floatValue() { return _value; }
79 
80     @Override
doubleValue()81     public double doubleValue() { return _value; }
82 
83     @Override
decimalValue()84     public BigDecimal decimalValue() { return BigDecimal.valueOf(_value); }
85 
86     @Override
bigIntegerValue()87     public BigInteger bigIntegerValue() {
88         return decimalValue().toBigInteger();
89     }
90 
91     @Override
asText()92     public String asText() {
93         return NumberOutput.toString(_value);
94     }
95 
96     // @since 2.9
97     @Override
isNaN()98     public boolean isNaN() {
99         return Float.isNaN(_value) || Float.isInfinite(_value);
100     }
101 
102     @Override
serialize(JsonGenerator g, SerializerProvider provider)103     public final void serialize(JsonGenerator g, SerializerProvider provider) throws IOException {
104         g.writeNumber(_value);
105     }
106 
107     @Override
equals(Object o)108     public boolean equals(Object o)
109     {
110         if (o == this) return true;
111         if (o == null) return false;
112         if (o instanceof FloatNode) {
113             // We must account for NaNs: NaN does not equal NaN, therefore we have
114             // to use Double.compare().
115             final float otherValue = ((FloatNode) o)._value;
116             return Float.compare(_value, otherValue) == 0;
117         }
118         return false;
119     }
120 
121     @Override
hashCode()122     public int hashCode() {
123         return Float.floatToIntBits(_value);
124     }
125 }
126