Closer API to what I would like, still requires better type inference on Reader

This commit is contained in:
Collin Smith
2020-09-29 01:14:06 -07:00
parent 9d7ee8450e
commit d3a9511a35
3 changed files with 74 additions and 6 deletions

View File

@ -1,7 +1,66 @@
package com.riiablo.assets;
public interface AsyncAssetLoader<T, V> extends AssetLoader<T> {
void loadAsync(AssetManager assets, Asset<T> asset, V data);
void unloadAsync(AssetManager assets, Asset<T> asset, V data);
T loadSync(AssetManager assets, Asset<T> asset, V data);
import io.netty.buffer.ByteBuf;
import java.io.InputStream;
import com.badlogic.gdx.files.FileHandle;
public abstract class AsyncAssetLoader<T, F extends FileHandle, V> implements AssetLoader<T> {
final Reader<F, V> reader;
public AsyncAssetLoader(Reader<F, V> reader) {
this.reader = reader;
}
protected Reader<F, V> reader() {
return reader;
}
void loadAsync(AssetManager assets, Asset<T> asset, FileHandleAdapter<F> adapter, F handle) {
loadAsync(assets, asset, reader.get(adapter, handle));
}
void unloadAsync(AssetManager assets, Asset<T> asset, FileHandleAdapter<F> adapter, F handle) {
unloadAsync(assets, asset, reader.get(adapter, handle));
}
T loadSync(AssetManager assets, Asset<T> asset, FileHandleAdapter<F> adapter, F handle) {
return loadSync(assets, asset, reader.get(adapter, handle));
}
protected abstract void loadAsync(AssetManager assets, Asset<T> asset, V data);
protected abstract void unloadAsync(AssetManager assets, Asset<T> asset, V data);
protected abstract T loadSync(AssetManager assets, Asset<T> asset, V data);
public interface Reader<F extends FileHandle, V> {
V get(FileHandleAdapter<F> adapter, F handle);
}
public static final class InputStreamReader<F extends FileHandle> implements Reader<F, InputStream> {
@Override
public InputStream get(FileHandleAdapter<F> adapter, F handle) {
return adapter.read(handle);
}
}
public static final class ByteArrayReader<F extends FileHandle> implements Reader<F, byte[]> {
@Override
public byte[] get(FileHandleAdapter<F> adapter, F handle) {
return adapter.readBytes(handle);
}
}
public static final class ByteBufReader<F extends FileHandle> implements Reader<F, ByteBuf> {
@Override
public ByteBuf get(FileHandleAdapter<F> adapter, F handle) {
return adapter.readByteBuf(handle);
}
}
public static final class ReflectiveReader<F extends FileHandle> implements Reader<F, F> {
@Override
public F get(FileHandleAdapter<F> adapter, F handle) {
return handle;
}
}
}

View File

@ -10,8 +10,13 @@ import com.riiablo.assets.AsyncAssetLoader;
import com.riiablo.assets.FileHandleResolver;
import com.riiablo.assets.MPQFileHandleResolver;
import com.riiablo.codec.DCC;
import com.riiablo.mpq.MPQFileHandle;
public class DCCLoader extends AsyncAssetLoader<DCC, MPQFileHandle, ByteBuf> {
DCCLoader() {
super(new ByteBufReader<MPQFileHandle>());
}
public class DCCLoader implements AsyncAssetLoader<DCC, ByteBuf> {
@Override
public FileHandleResolver resolver() {
return new MPQFileHandleResolver();

View File

@ -12,7 +12,11 @@ import com.riiablo.assets.AsyncAssetLoader;
import com.riiablo.assets.DelimiterPathTransformer;
import com.riiablo.assets.FileHandleResolver;
public class MusicLoader implements AsyncAssetLoader<Music, FileHandle> {
public class MusicLoader extends AsyncAssetLoader<Music, FileHandle, FileHandle> {
MusicLoader() {
super(new ReflectiveReader<>());
}
@Override
public FileHandleResolver resolver() {
return new FileHandleResolver(DelimiterPathTransformer.INSTANCE) {