package php.runtime.memory.support.operation.iterator;
import php.runtime.Memory;
import php.runtime.common.HintType;
import php.runtime.env.Environment;
import php.runtime.env.TraceInfo;
import php.runtime.exceptions.CriticalException;
import php.runtime.lang.ForeachIterator;
import php.runtime.memory.support.MemoryOperation;
import php.runtime.memory.support.operation.GenericMemoryOperation;
import php.runtime.reflection.ParameterEntity;
import java.lang.reflect.Type;
import java.util.Iterator;
public class IterableMemoryOperation extends GenericMemoryOperation<Iterable> {
public IterableMemoryOperation(Type... genericTypes) {
super(genericTypes);
if (genericTypes == null) {
operations = new MemoryOperation[] { MemoryOperation.get(Memory.class, null) };
}
}
@Override
public Class<?>[] getOperationClasses() {
return new Class<?>[] { Iterable.class };
}
@Override
public Iterable convert(final Environment env, final TraceInfo trace, Memory arg) throws Throwable {
final ForeachIterator iterator = arg.getNewIterator(env);
return new Iterable() {
@Override
public Iterator iterator() {
return new Iterator() {
protected Boolean hasNext;
@Override
public boolean hasNext() {
if (hasNext == null) {
hasNext = iterator.next();
}
return hasNext;
}
@Override
public Object next() {
if (hasNext == null) {
next();
} else {
hasNext = null;
}
return operations[0].convertNoThrow(env, trace, iterator.getValue());
}
@Override
public void remove() {
throw new IllegalStateException("Unsupported remove() method");
}
};
}
};
}
@Override
public Memory unconvert(Environment env, TraceInfo trace, Iterable arg) throws Throwable {
throw new CriticalException("Unsupported operation");
}
@Override
public void applyTypeHinting(ParameterEntity parameter) {
parameter.setType(HintType.TRAVERSABLE);
}
}