package com.taobao.tddl.optimizer.core.datatype;
import com.taobao.tddl.common.exception.TddlRuntimeException;
/**
* {@linkplain Long}类型
*
* @author jianghang 2014-1-22 上午10:41:28
* @since 5.0.0
*/
public class LongType extends CommonType<Long> {
private final Calculator calculator = new Calculator() {
@Override
public Object add(Object v1, Object v2) {
Long i1 = convertFrom(v1);
Long i2 = convertFrom(v2);
return i1 + i2;
}
@Override
public Object sub(Object v1, Object v2) {
Long i1 = convertFrom(v1);
Long i2 = convertFrom(v2);
return i1 - i2;
}
@Override
public Object multiply(Object v1, Object v2) {
Long i1 = convertFrom(v1);
Long i2 = convertFrom(v2);
return i1 * i2;
}
@Override
public Object divide(Object v1, Object v2) {
Long i1 = convertFrom(v1);
Long i2 = convertFrom(v2);
return i1 / i2;
}
@Override
public Object mod(Object v1, Object v2) {
Long i1 = convertFrom(v1);
Long i2 = convertFrom(v2);
return i1 % i2;
}
@Override
public Object and(Object v1, Object v2) {
Long i1 = convertFrom(v1);
Long i2 = convertFrom(v2);
return (i1 != 0) && (i2 != 0);
}
@Override
public Object or(Object v1, Object v2) {
Long i1 = convertFrom(v1);
Long i2 = convertFrom(v2);
return (i1 != 0) || (i2 != 0);
}
@Override
public Object not(Object v1) {
Long i1 = convertFrom(v1);
return i1 == 0;
}
@Override
public Object bitAnd(Object v1, Object v2) {
Long i1 = convertFrom(v1);
Long i2 = convertFrom(v2);
return i1 & i2;
}
@Override
public Object bitOr(Object v1, Object v2) {
Long i1 = convertFrom(v1);
Long i2 = convertFrom(v2);
return i1 | i2;
}
@Override
public Object bitNot(Object v1) {
Long i1 = convertFrom(v1);
return ~i1;
}
@Override
public Object xor(Object v1, Object v2) {
Long i1 = convertFrom(v1);
Long i2 = convertFrom(v2);
return (i1 != 0) ^ (i2 != 0);
}
@Override
public Object bitXor(Object v1, Object v2) {
Long i1 = convertFrom(v1);
Long i2 = convertFrom(v2);
return i1 ^ i2;
}
};
@Override
public int encodeToBytes(Object value, byte[] dst, int offset) {
return DataEncoder.encode(this.convertFrom(value), dst, offset);
}
@Override
public int getLength(Object value) {
if (value == null) {
return 1;
} else {
return 9;
}
}
@Override
public DecodeResult decodeFromBytes(byte[] bytes, int offset) {
try {
Long v = DataDecoder.decodeLongObj(bytes, offset);
return new DecodeResult(v, getLength(v));
} catch (CorruptEncodingException e) {
throw new TddlRuntimeException(e);
}
}
@Override
public Long incr(Object value) {
return convertFrom(value) + 1;
}
@Override
public Long decr(Object value) {
return convertFrom(value) - 1;
}
@Override
public Long getMaxValue() {
return Long.MAX_VALUE;
}
@Override
public Long getMinValue() {
return Long.MIN_VALUE;
}
@Override
public Calculator getCalculator() {
return calculator;
}
}