/*
* Copyright 2015 Odnoklassniki Ltd, Mail.Ru Group
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package one.nio.serial.gen;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
enum FieldType implements Opcodes {
Object (Object.class, 0, 0, new int[] { NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, POP }),
Int (int.class, T_INT, 4, new int[] { NOP, NOP, I2L, I2B, I2B, I2S, I2C, I2F, I2D, POP }),
Long (long.class, T_LONG, 8, new int[] { NOP, L2I, NOP, L2I | I2B << 8, L2I | I2B << 8, L2I | I2S << 8, L2I | I2C << 8, L2F, L2D, POP2}),
Boolean(boolean.class, T_BOOLEAN, 1, new int[] { NOP, NOP, I2L, NOP, NOP, I2S, I2C, I2F, I2D, POP }),
Byte (byte.class, T_BYTE, 1, new int[] { NOP, NOP, I2L, NOP, NOP, I2S, I2C, I2F, I2D, POP }),
Short (short.class, T_SHORT, 2, new int[] { NOP, NOP, I2L, I2B, I2B, NOP, I2C, I2F, I2D, POP }),
Char (char.class, T_CHAR, 2, new int[] { NOP, NOP, I2L, I2B, I2B, I2S, NOP, I2F, I2D, POP }),
Float (float.class, T_FLOAT, 4, new int[] { NOP, F2I, F2L, F2I | I2B << 8, F2I | I2B << 8, F2I | I2S << 8, F2I | I2C << 8, NOP, F2D, POP }),
Double (double.class, T_DOUBLE, 8, new int[] { NOP, D2I, D2L, D2I | I2B << 8, D2I | I2B << 8, D2I | I2S << 8, D2I | I2C << 8, D2F, NOP, POP2 }),
Void (void.class, 0, 0, new int[] { ACONST_NULL, ICONST_0, LCONST_0, ICONST_0, ICONST_0, ICONST_0, ICONST_0, FCONST_0, DCONST_0, NOP });
private static final FieldType[] VALUES = values();
final Class cls;
final String sig;
final int bytecodeType;
final int dataSize;
final int[] convertOpcodes;
private FieldType(Class cls, int bytecodeType, int dataSize, int[] convertOpcodes) {
this.cls = cls;
this.sig = Type.getDescriptor(cls);
this.bytecodeType = bytecodeType;
this.dataSize = dataSize;
this.convertOpcodes = convertOpcodes;
}
public String readMethod() {
return "read" + name();
}
public String readSignature() {
return "()" + sig;
}
public String writeMethod() {
return this == Byte ? "write" : "write" + name();
}
public String writeSignature() {
return this == Byte || this == Short || this == Char ? "(I)V" : "(" + sig + ")V";
}
public String appendSignature() {
return this == Byte || this == Short || this == Char ? "(I)Ljava/lang/StringBuilder;" : "(" + sig + ")Ljava/lang/StringBuilder;";
}
public String putMethod() {
return "put" + name();
}
public String putSignature() {
return "(Ljava/lang/Object;J" + sig + ")V";
}
public int convertTo(FieldType target) {
return convertOpcodes[target.ordinal()];
}
public static FieldType valueOf(Class cls) {
if (cls.isPrimitive()) {
for (FieldType value : VALUES) {
if (value.cls == cls) {
return value;
}
}
}
return Object;
}
}