package com.sap.runlet.interpreter.objects;
import java.util.Iterator;
import com.sap.runlet.abstractinterpreter.objects.MultiValuedObject;
import com.sap.runlet.abstractinterpreter.objects.RunletObject;
import com.sap.runlet.interpreter.RunletInterpreter;
import data.classes.AssociationEnd;
import data.classes.ClassTypeDefinition;
import data.classes.TypeDefinition;
/**
* Wraps a {@link MultiValuedObject} and converts the objects on the fly during iteration
* to the {@link #getType() target type}. An object of this type is always tied to a single
* {@link RunletInterpreter interpreter} which is required for performing the actual conversion.
*
* @author Axel Uhl (D043530)
*/
public class ConvertedMultiObject extends MultiValuedObject<AssociationEnd, TypeDefinition, ClassTypeDefinition> {
private MultiValuedObject<AssociationEnd, TypeDefinition, ClassTypeDefinition> wrapped;
/**
* The interpreter is required for performing the actual conversion.
*/
private RunletInterpreter interpreter;
private class ConvertingIterator implements Iterator<RunletObject<AssociationEnd, TypeDefinition, ClassTypeDefinition>> {
Iterator<RunletObject<AssociationEnd, TypeDefinition, ClassTypeDefinition>> wrappedIterator;
public ConvertingIterator() {
wrappedIterator = wrapped.iterator();
}
@Override
public boolean hasNext() {
return wrappedIterator.hasNext();
}
@Override
public RunletObject<AssociationEnd, TypeDefinition, ClassTypeDefinition> next() {
RunletObject<AssociationEnd, TypeDefinition, ClassTypeDefinition> unconverted = wrappedIterator.next();
RunletObject<AssociationEnd, TypeDefinition, ClassTypeDefinition> result = interpreter.convert(unconverted, getType());
return result;
}
@Override
public void remove() {
wrappedIterator.remove();
}
}
public ConvertedMultiObject(MultiValuedObject<AssociationEnd, TypeDefinition, ClassTypeDefinition> wrapped,
TypeDefinition targetType, RunletInterpreter interpreter, boolean ordered, boolean unique) {
super(targetType, /* objects */ null, ordered, unique);
this.wrapped = wrapped;
this.interpreter = interpreter;
}
@Override
public Iterator<RunletObject<AssociationEnd, TypeDefinition, ClassTypeDefinition>> iterator() {
return new ConvertingIterator();
}
@Override
public int size() {
return wrapped.size();
}
}