package sk.stuba.fiit.perconik.core.resources;
import java.util.Set;
import sk.stuba.fiit.perconik.core.FilteringListener;
import sk.stuba.fiit.perconik.utilities.constant.IntegralConstant;
import sk.stuba.fiit.perconik.utilities.constant.IntegralConstantSupport;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
final class Handlers {
private Handlers() {}
private static final class SafeHandler<T> implements Handler<T> {
private final Handler<T> handler;
private final Class<T> type;
public SafeHandler(final Handler<T> handler, final Class<T> type) {
this.handler = checkNotNull(handler);
this.type = checkNotNull(type);
}
private T check(final T object) {
return this.type.cast(checkNotNull(object));
}
public void register(final T object) {
this.handler.register(check(object));
}
public void unregister(final T object) {
this.handler.unregister(check(object));
}
@Override
public String toString() {
return this.handler.toString();
}
}
static <E extends Enum<E> & IntegralConstant> int mask(final FilteringListener<E> listener) {
Set<E> types = listener.getEventTypes();
checkState(types != null && !types.isEmpty());
return IntegralConstantSupport.constantsAsInteger(types);
}
static <T> Handler<T> safe(final Handler<T> handler, final Class<T> type) {
return new SafeHandler<>(handler, type);
}
}