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);
			}
			map.put(itf.getNumber(), clazz.cast(itf));
		}
	}

	@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();
	}
}