package com.linkedin.thirdeye.util;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import com.linkedin.thirdeye.api.MetricType;
/**
* Helper class to convert to and from Number data type. - supports arithmetic
* on two number data types
* @author kgopalak
*/
public class NumberUtils {
public static Number sum(Number a, Number b, MetricType type) {
switch (type) {
case SHORT:
return a.shortValue() + b.shortValue();
case INT:
return a.intValue() + b.intValue();
case LONG:
return a.longValue() + b.longValue();
case FLOAT:
return a.floatValue() + b.floatValue();
case DOUBLE:
return a.doubleValue() + b.doubleValue();
default:
return null;
}
}
public static Number difference(Number a, Number b, MetricType type) {
switch (type) {
case SHORT:
return a.shortValue() - b.shortValue();
case INT:
return a.intValue() - b.intValue();
case LONG:
return a.longValue() - b.longValue();
case FLOAT:
return a.floatValue() - b.floatValue();
case DOUBLE:
return a.doubleValue() - b.doubleValue();
default:
return null;
}
}
public static void addToBuffer(ByteBuffer buffer, Number value, MetricType type) {
switch (type) {
case SHORT:
buffer.putShort(value.shortValue());
break;
case INT:
buffer.putInt(value.intValue());
break;
case LONG:
buffer.putLong(value.longValue());
break;
case FLOAT:
buffer.putFloat(value.floatValue());
break;
case DOUBLE:
buffer.putDouble(value.doubleValue());
break;
}
}
public static Number readFromBuffer(ByteBuffer buffer, MetricType type) {
switch (type) {
case SHORT:
return buffer.getShort();
case INT:
return buffer.getInt();
case LONG:
return buffer.getLong();
case FLOAT:
return buffer.getFloat();
case DOUBLE:
return buffer.getDouble();
}
return null;
}
public static void addToDataOutputStream(DataOutputStream dataOutputStream, Number value,
MetricType type) throws IOException {
switch (type) {
case SHORT:
dataOutputStream.writeShort(value.shortValue());
break;
case INT:
dataOutputStream.writeInt(value.intValue());
break;
case LONG:
dataOutputStream.writeLong(value.longValue());
break;
case FLOAT:
dataOutputStream.writeFloat(value.floatValue());
break;
case DOUBLE:
dataOutputStream.writeDouble(value.doubleValue());
break;
}
}
// TODO: Remove
public static int byteSize(MetricType type) {
return type.byteSize();
}
public static Number divide(Number numerator, Number denominator, MetricType type) {
switch (type) {
case SHORT:
return numerator.shortValue() / denominator.shortValue();
case INT:
return numerator.intValue() / denominator.intValue();
case LONG:
return numerator.longValue() / denominator.longValue();
case FLOAT:
return numerator.floatValue() / denominator.floatValue();
case DOUBLE:
return numerator.doubleValue() / denominator.doubleValue();
}
return -1;
}
public static boolean isZero(Number value, MetricType type) {
switch (type) {
case SHORT:
return value.shortValue() == 0;
case INT:
return value.intValue() == 0;
case LONG:
return value.longValue() == 0L;
case FLOAT:
return value.floatValue() == 0.0;
case DOUBLE:
return value.doubleValue() == 0.0;
}
throw new IllegalArgumentException("Invalid type " + type);
}
public static Number valueOf(String value, MetricType type) {
switch (type) {
case SHORT:
return Short.valueOf(value);
case INT:
return Integer.valueOf(value);
case LONG:
return Long.valueOf(value);
case FLOAT:
return Float.valueOf(value);
case DOUBLE:
return Double.valueOf(value);
}
throw new IllegalArgumentException("Invalid type " + type);
}
}