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