mirror of
https://github.com/collinsmith/riiablo.git
synced 2025-07-07 00:39:13 +07:00
Closer API to what I would like, still requires better type inference on Reader
This commit is contained in:
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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) {
|
||||
|
Reference in New Issue
Block a user