package com.jsoniter;
import com.jsoniter.spi.Decoder;
import com.jsoniter.spi.JsoniterSpi;
import com.jsoniter.spi.TypeLiteral;
import java.io.IOException;
import java.lang.reflect.Array;
class ReflectionArrayDecoder implements Decoder {
private final Class componentType;
private final Decoder compTypeDecoder;
public ReflectionArrayDecoder(Class clazz) {
componentType = clazz.getComponentType();
compTypeDecoder = Codegen.getDecoder(TypeLiteral.create(componentType).getDecoderCacheKey(), componentType);
}
@Override
public Object decode(JsonIterator iter) throws IOException {
CodegenAccess.resetExistingObject(iter);
if (iter.readNull()) {
return null;
}
if (!CodegenAccess.readArrayStart(iter)) {
return Array.newInstance(componentType, 0);
}
Object a1 = compTypeDecoder.decode(iter);
if (CodegenAccess.nextToken(iter) != ',') {
Object arr = Array.newInstance(componentType, 1);
Array.set(arr, 0, a1);
return arr;
}
Object a2 = compTypeDecoder.decode(iter);
if (CodegenAccess.nextToken(iter) != ',') {
Object arr = Array.newInstance(componentType, 2);
Array.set(arr, 0, a1);
Array.set(arr, 1, a2);
return arr;
}
Object a3 = compTypeDecoder.decode(iter);
if (CodegenAccess.nextToken(iter) != ',') {
Object arr = Array.newInstance(componentType, 3);
Array.set(arr, 0, a1);
Array.set(arr, 1, a2);
Array.set(arr, 2, a3);
return arr;
}
Object a4 = compTypeDecoder.decode(iter);
Object arr = Array.newInstance(componentType, 8);
Array.set(arr, 0, a1);
Array.set(arr, 1, a2);
Array.set(arr, 2, a3);
Array.set(arr, 3, a4);
int i = 4;
int arrLen = 8;
while (CodegenAccess.nextToken(iter) == ',') {
if (i == arrLen) {
Object newArr = Array.newInstance(componentType, 2 * arrLen);
System.arraycopy(arr, 0, newArr, 0, arrLen);
arr = newArr;
arrLen = 2 * arrLen;
}
Array.set(arr, i++, compTypeDecoder.decode(iter));
}
if (i == arrLen) {
return arr;
}
Object newArr = Array.newInstance(componentType, i);
System.arraycopy(arr, 0, newArr, 0, i);
return newArr;
}
}