package com.xenoage.zong.core.util; import com.xenoage.zong.core.Score; import com.xenoage.zong.core.music.VoiceElement; import com.xenoage.zong.core.music.beam.Beam; import com.xenoage.zong.core.music.chord.Chord; import com.xenoage.zong.core.position.MP; import lombok.Getter; import java.util.Iterator; import java.util.NoSuchElementException; import static com.xenoage.zong.core.position.MP.mp0; /** * An iterator over all {@link Beam}s in a score. * * @author Andreas Wenger */ public class BeamIterator implements Iterator<Beam>, Iterable<Beam> { private VoiceElementIterator it; @Getter private MP mp = mp0; private MP nextMp = null; private Beam nextBeam = null; public BeamIterator(Score score) { it = new VoiceElementIterator(score); findNext(); } @Override public boolean hasNext() { return nextBeam != null; } @Override public Beam next() { if (!hasNext()) throw new NoSuchElementException(); Beam ret = nextBeam; mp = nextMp; findNext(); return ret; } private void findNext() { while (it.hasNext()) { VoiceElement e = it.next(); if (e instanceof Chord) { Chord c = (Chord) e; Beam beam = c.getBeam(); //return beam when its beginning was found if (beam != null && beam.getStart().getChord() == c) { nextMp = it.getMp(); nextBeam = beam; return; } } } nextMp = null; nextBeam = null; } @Override public Iterator<Beam> iterator() { return this; } @Override public void remove() { throw new UnsupportedOperationException(); } }