Newer
Older
KeeperJerry_Launcher / Launcher / source / serialize / stream / EnumSerializer.java
package launcher.serialize.stream;

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

import launcher.LauncherAPI;
import launcher.helper.VerifyHelper;
import launcher.serialize.HInput;
import launcher.serialize.HOutput;
import launcher.serialize.stream.EnumSerializer.Itf;

public final class EnumSerializer<E extends Enum<?> & Itf> {
    private final Map<Integer, E> map = new HashMap<>(16);

    @LauncherAPI
    public EnumSerializer(Class<E> clazz) {
        for (Field field : clazz.getFields()) {
            if (!field.isEnumConstant()) {
                continue;
            }

            // Add to map
            Itf itf;
            try {
                itf = (Itf) field.get(null);
            } catch (IllegalAccessException e) {
                throw new InternalError(e);
            }
            VerifyHelper.putIfAbsent(map, itf.getNumber(), clazz.cast(itf),
                "Duplicate number for enum constant " + field.getName());
        }
    }

    @LauncherAPI
    public E read(HInput input) throws IOException {
        int n = input.readVarInt();
        return VerifyHelper.getMapValue(map, n, "Unknown enum number: " + n);
    }

    @LauncherAPI
    public static void write(HOutput output, Itf itf) throws IOException {
        output.writeVarInt(itf.getNumber());
    }

    @FunctionalInterface
    public interface Itf {
        @LauncherAPI
        int getNumber();
    }
}