package com.fourinone;
import java.util.Date;
import java.io.Serializable;
interface ConstantBit<T> extends CoolHashBase{
byte[] getBytes(T value);
T getObject(byte[] bts);
Target tg = Target.POINT;
enum Target implements ConstantBit,Filter.Condition{
STRING(DumpAdapter.ConstBit[0],DumpAdapter.ConstBit[0]){
public boolean matchAction(Object key, Object value){
Filter<String,Object> filter = (Filter)key;
Filter.Condition cd = Filter.Condition.Action.valueOf(filter.getFilterKey());
return cd.matchAction(getObject((byte[])value),filter.getFilterValue());
}
public byte[] getBytes(Object value){
bwp.reset();
bwp.writeChars((String)value);
bwp.writeBytes(new byte[]{(byte)codeKey});
return bwp.getBytes();
}
public String getObject(byte[] bts){
brp.reset(bts);
return brp.readChars(bts.length-1);
}
},
SHORT(DumpAdapter.ConstBit[1],DumpAdapter.ConstBit[1]){
public byte[] getBytes(Object value){
bwp.reset();
bwp.writeShort((short)value);
bwp.writeBytes(new byte[]{(byte)codeKey});
return bwp.getBytes();
}
public Short getObject(byte[] bts){
brp.reset(bts);
return brp.readShort();
}
},
INTEGER(DumpAdapter.ConstBit[2],DumpAdapter.ConstBit[2]){
public byte[] getBytes(Object value){
bwp.reset();
bwp.writeInt((int)value);
bwp.writeBytes(new byte[]{(byte)codeKey});
return bwp.getBytes();
}
public Integer getObject(byte[] bts){
brp.reset(bts);
return brp.readInt();
}
},
FLOAT(DumpAdapter.ConstBit[4],DumpAdapter.ConstBit[2]){
public byte[] getBytes(Object value){
bwp.reset();
bwp.writeFloat((float)value);
bwp.writeBytes(new byte[]{(byte)codeKey});
return bwp.getBytes();
}
public Float getObject(byte[] bts){
brp.reset(bts);
return brp.readFloat();
}
},
LONG(DumpAdapter.ConstBit[3],DumpAdapter.ConstBit[3]){
public byte[] getBytes(Object value){
bwp.reset();
bwp.writeLong((long)value);
bwp.writeBytes(new byte[]{(byte)codeKey});
return bwp.getBytes();
}
public Long getObject(byte[] bts){
brp.reset(bts);
return brp.readLong();
}
},
DOUBLE(DumpAdapter.ConstBit[5],DumpAdapter.ConstBit[3]){
public byte[] getBytes(Object value){
bwp.reset();
bwp.writeDouble((double)value);
bwp.writeBytes(new byte[]{(byte)codeKey});
return bwp.getBytes();
}
public Double getObject(byte[] bts){
brp.reset(bts);
return brp.readDouble();
}
},
DATE(DumpAdapter.ConstBit[6],DumpAdapter.ConstBit[3]){
public boolean matchAction(Object key, Object value){
return LONG.matchAction(key,value);
}
public byte[] getBytes(Object value){
bwp.reset();
bwp.writeDate((Date)value);
bwp.writeBytes(new byte[]{(byte)codeKey});
return bwp.getBytes();
}
public Date getObject(byte[] bts){
brp.reset(bts);
return brp.readDate();
}
},
STATGOBJECT(DumpAdapter.ConstBit[7],DumpAdapter.ConstBit[0]){
public byte[] getBytes(Object value){
bwp.reset();
bwp.writeObject(value);
bwp.writeBytes(new byte[]{(byte)codeKey});
return bwp.getBytes();
}
public Object getObject(byte[] bts){
brp.reset(bts);
return brp.readObject(bts.length-1);
}
},
POINT(DumpAdapter.ConstBit[8],DumpAdapter.ConstBit[0]){
public boolean matchAction(Object key, Object value){
return STRING.matchAction(key,value);
}
public byte[] getBytes(Object value){
byte[] bts = STRING.getBytes(value);
bts[bts.length-1]=(byte)codeKey;
return bts;
}
public Object getObject(byte[] bts){
return STRING.getObject(bts);
}
};
static Target getTarget(byte codeKey){
for(Target tg:Target.values())
if(tg.codeKey==codeKey)
return tg;
return null;
}
private static <T> Target getTarget(Class<T> value, boolean match){
try{
return Target.valueOf(value.getSimpleName().toUpperCase());
}catch(Exception e){
if(!match&&Serializable.class.isAssignableFrom(value))
return STATGOBJECT;
else
LogUtil.info("[CoolHashException]","[IllegalArgumentException]",chex.checkTargetLog(value));
}
return null;
}
static <T> Target getTarget(Class<T> value){
return getTarget(value, false);
}
static <T> Target getTarget(T value){
Target tg=getTarget(value.getClass());
return tg;
}
static <T> Target getTargetMatch(Class<T> value){
return getTarget(value, true);
}
static <T> byte[] getTargetBytes(T value){
ConstantBit<T> cb = ConstantBit.Target.getTarget(value);
byte[] bts = cb.getBytes(value);
return bts;
}
static <T> T getTargetObject(byte[] bts){
return getTargetObject(bts,null);
}
static <T> T getTargetObject(byte[] bts, Class<T> value){
if(bts==null||bts.length==0){
return null;
}else{
ConstantBit<T> cb=value!=null?ConstantBit.Target.getTarget(value):ConstantBit.Target.getTarget(bts[bts.length-1]);
return cb.getObject(bts);
}
}
public boolean matchAction(Object key, Object value){
Filter<String,Object> filter = (Filter)key;
byte[] vb = (byte[])value;
if(vb.length-1==codeValue&&vb[vb.length-1]==codeKey){//+1? type==type
Filter.Condition cd = Filter.Condition.Action.valueOf(filter.getFilterKey());
return cd.matchAction(getObject(vb),filter.getFilterValue());
}
return false;
}
int codeKey;
int codeValue;
Target(int codeKey, int codeValue){
this.codeKey = codeKey;
this.codeValue = codeValue;
}
}
}