package php.runtime.lang.spl.iterator; import php.runtime.Memory; import php.runtime.common.HintType; import php.runtime.env.Environment; import php.runtime.lang.BaseObject; import php.runtime.lang.ForeachIterator; import php.runtime.lang.spl.Traversable; import php.runtime.memory.ObjectMemory; import php.runtime.reflection.ClassEntity; import static php.runtime.annotation.Reflection.*; @Name("IteratorIterator") public class IteratorIterator extends BaseObject implements Iterator, OuterIterator, Traversable { protected Memory iterator; protected ForeachIterator foreachIterator; protected boolean valid = true; public IteratorIterator(Environment env) { super(env); } public IteratorIterator(Environment env, ClassEntity clazz) { super(env, clazz); } @Signature(@Arg(value = "iterator", type = HintType.TRAVERSABLE)) public Memory __construct(Environment env, Memory... args) { iterator = args[0].toImmutable(); foreachIterator = iterator.getNewIterator(env); return iterator; } @Override @Signature public Memory getInnerIterator(Environment env, Memory... args) { return iterator; } @Override @Signature public Memory current(Environment env, Memory... args) { return foreachIterator.getValue(); } @Override @Signature public Memory key(Environment env, Memory... args) { return foreachIterator.getMemoryKey(); } @Override @Signature public Memory next(Environment env, Memory... args) { valid = foreachIterator.next(); return Memory.NULL; } @Override @Signature public Memory rewind(Environment env, Memory... args) { foreachIterator.reset(); valid = foreachIterator.next(); return Memory.NULL; } @Override @Signature public Memory valid(Environment env, Memory... args) { return valid ? Memory.TRUE : Memory.FALSE; } @Override public ForeachIterator getNewIterator(Environment env, boolean getReferences, boolean getKeyReferences) { return ObjectMemory.valueOf(this).getNewIterator(env, getReferences, getKeyReferences); } @Override public ForeachIterator getNewIterator(Environment env) { return ObjectMemory.valueOf(this).getNewIterator(env); } }