package php.runtime.memory.support.operation.collection; import php.runtime.Memory; import php.runtime.common.HintType; import php.runtime.env.Environment; import php.runtime.env.TraceInfo; import php.runtime.memory.ArrayMemory; 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.Set; import java.util.TreeSet; public class SetMemoryOperation extends GenericMemoryOperation<Set> { public SetMemoryOperation(Type... genericTypes) { super(genericTypes); if (genericTypes == null) { operations = new MemoryOperation[] { MemoryOperation.get(Memory.class, null) }; } } @Override public Class<?>[] getOperationClasses() { return new Class<?>[] { Set.class, TreeSet.class }; } @Override @SuppressWarnings("unchecked") public Set convert(Environment env, TraceInfo trace, Memory arg) throws Throwable { Set result = createTreeSet(); for (Memory el : arg.getNewIterator(env)) { result.add(operations[0].convert(env, trace, el)); } return result; } @Override @SuppressWarnings("unchecked") public Memory unconvert(Environment env, TraceInfo trace, Set arg) throws Throwable { if (arg == null) { return Memory.NULL; } ArrayMemory result = new ArrayMemory(); for (Object el : arg) { result.add(operations[0].unconvert(env, trace, el)); } return result.toConstant(); } @Override public void applyTypeHinting(ParameterEntity parameter) { parameter.setType(HintType.TRAVERSABLE); } protected Set createTreeSet() { return new TreeSet(); } }