Нужны current/key/next/rewind/valid; инварианты foreach зависят от корректного состояния курсора.
Разбор
- rewind вызывается в начале foreach.
- valid=false завершает.
- Сложные итераторы лучше через IteratorAggregate.
- Тестируйте повторный foreach.
Итог
Корректный Iterator соблюдает контракт курсора foreach.