source file of the GNU LilyPond music typesetter
- (c) 1997--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
#include "translator-group.hh"
*/
-/*
-
- TODO: the grace note handling hasn't been done for skip() and
- get_music(), meaning that staff-switching and partcombining will be
- broken with grace notes.
-
- */
-/*
-
- TODO: the grace note handling hasn't been done for skip() and
- get_music(), meaning that staff-switching and partcombining will be
- broken with grace notes.
-
- */
/*
Invariant for the data structure.
if (gh_pair_p (cursor_))
- iter_p_->music_l_ == unsmob_music (ly_car (cursor_))
+ iter_->music_ == unsmob_music (ly_car (cursor_))
else
- iter_p_ == 0;
+ iter_ == 0;
The length of musiclist from start to up to cursor_ (cursor_ not
including), is summed
Sequential_iterator::Sequential_iterator ()
{
here_mom_ = Moment (0);
+ list_ = SCM_EOL;
+ cursor_ = SCM_EOL;
grace_fixups_ = 0;
- iter_p_ =0;
+ iter_ =0;
}
SCM
return SCM_EOL;
}
-Sequential_iterator::Sequential_iterator (Sequential_iterator const &src)
- : Music_iterator (src)
+void
+Sequential_iterator::do_quit ()
{
- grace_fixups_ = copy_grace_fixups (src.grace_fixups_);
- cursor_ = src.cursor_;
- here_mom_ = src.here_mom_;
- if (src.iter_p_)
- iter_p_ = src.iter_p_->clone ();
- else
- iter_p_ = 0;
+ if (iter_)
+ iter_->quit();
}
-Sequential_iterator::~Sequential_iterator ()
+
+
+
+void
+Sequential_iterator::derived_mark ()const
{
- delete iter_p_;
+ if (iter_)
+ scm_gc_mark (iter_->self_scm());
+ scm_gc_mark (list_);
+ scm_gc_mark (cursor_);
}
+void
+Sequential_iterator::derived_substitute (Translator_group*f,Translator_group*t)
+{
+ if (iter_)
+ iter_->substitute_outlet (f,t);
+
+}
+
Grace_fixup *
get_grace_fixups (SCM cursor)
{
{
Music * mus = unsmob_music (ly_car (cursor));
Moment s = mus->start_mom ();
- Moment l =mus->length_mom () - s;
+ Moment l =mus->get_length () - s;
if (s.grace_part_)
{
void
Sequential_iterator::construct_children ()
{
- cursor_ = get_music_list ();
+ list_ = get_music_list ();
+ cursor_ = list_;
- iter_p_ = gh_pair_p (cursor_) ? get_iterator_p (unsmob_music (ly_car (cursor_))) : 0;
- while (iter_p_ && !iter_p_->ok ())
+ iter_ = 0;
+ if (gh_pair_p (cursor_))
+ {
+ Music *m =unsmob_music (ly_car (cursor_));
+ iter_ = unsmob_iterator (get_iterator (m));
+ }
+
+ while (iter_ && !iter_->ok ())
{
next_element (true);
}
- here_mom_ = music_l ()->start_mom ();
+ here_mom_ = get_music ()->start_mom ();
grace_fixups_ = get_grace_fixups (cursor_);
/*
- iter_p_->ok () is tautology, but what the heck.
+ iter_->ok () is tautology, but what the heck.
*/
- if (iter_p_ && iter_p_->ok ())
+ if (iter_ && iter_->ok ())
descend_to_child ();
}
swoop.
*/
void
-Sequential_iterator::next_element (bool side_effect)
+Sequential_iterator::next_element (bool)
{
- Moment len =iter_p_->music_length_mom () - iter_p_->music_start_mom ();
+ Moment len =iter_->music_get_length () - iter_->music_start_mom ();
assert (!grace_fixups_ || grace_fixups_->start_ >= here_mom_);
if (len.main_part_ && grace_fixups_ &&
here_mom_ += len;
}
- delete iter_p_;
cursor_ = ly_cdr (cursor_);
+ iter_->quit();
if (gh_pair_p (cursor_))
- iter_p_ = get_iterator_p (unsmob_music (ly_car (cursor_)));
+ iter_ = unsmob_iterator (get_iterator (unsmob_music (ly_car (cursor_))));
else
- iter_p_ = 0;
+ iter_ = 0;
}
/*
void
Sequential_iterator::descend_to_child ()
{
-}
-
-
-/*
- Retrieve all music (starting at HERE), until a music with length L >
- 0 is found. From the precondition, we know that UNTIL is later than
- the earliest event. Hence we know
-
- L >= (UNTIL - HERE)
-
- so something that comes after this thing with L > 0 happens after
-
- HERE + L >= HERE + (UNTIL - HERE) = UNTIL
-
- Hence all events after the one with L>0 are uninteresting, so we
- ignore them.
-
-*/
-
-SCM
-Sequential_iterator::get_music (Moment until)const
-{
- SCM s = SCM_EOL;
- if (until < pending_moment ())
- return s;
+ Translator_group * child_report = child_report = iter_->get_outlet ();
+ Translator_group * me_report = get_outlet ();
- Sequential_iterator * me =
- dynamic_cast<Sequential_iterator*> (clone ());
- while (me->ok ())
+ Translator_group * c = child_report;
+ while (c && c != me_report)
{
- SCM nm = me->iter_p_->get_music (until - me->here_mom_);
- s = gh_append2 (nm, s);
-
- Moment m = 0;
- for (SCM i = nm; gh_pair_p (i); i = ly_cdr (i))
- {
- Music *mus=unsmob_music (ly_car (i));
- m = m >? (mus->length_mom () - mus->start_mom ());
- }
- if (m > Moment (0))
- break ;
- else
- me->next_element (false);
+ c= c->daddy_trans_;
}
- delete me;
- return s;
+ if (c == me_report)
+ set_translator (child_report);
}
-/*
- Skip events till UNTIL. We don't do any other side effects such as
- descending to child iterator contexts, because they might depend on
- \context specs and \translator changes being executed
-
- TODO: check support for grace notes here.
- */
-void
-Sequential_iterator::skip (Moment until)
-{
- while (ok ())
- {
- if (grace_fixups_ &&
- grace_fixups_->start_ == here_mom_
- && (grace_fixups_->start_ + grace_fixups_->length_
- + Moment (Rational (0), grace_fixups_->grace_start_) == until))
- {
- /*
- do the stuff/note/rest preceding a grace.
- */
- iter_p_->skip (iter_p_->music_length_mom ());
- }
- else if (iter_p_->music_length_mom () >= until - here_mom_)
- iter_p_->skip (until - here_mom_ + iter_p_->music_start_mom ());
-
- if (iter_p_->ok ())
- return ;
-
- next_element (false);
- }
-}
void
Sequential_iterator::process (Moment until)
{
- while (iter_p_)
+ while (iter_)
{
if (grace_fixups_ &&
grace_fixups_->start_ == here_mom_
/*
do the stuff/note/rest preceding a grace.
*/
- iter_p_->process (iter_p_->music_length_mom ());
+ iter_->process (iter_->music_get_length ());
}
else
- iter_p_->process (until - here_mom_ + iter_p_->music_start_mom ());
+ iter_->process (until - here_mom_ + iter_->music_start_mom ());
/*
if the iter is still OK, there must be events left that have
TIME > LEFT
*/
- if (iter_p_->ok ())
+ if (iter_->ok ())
return ;
descend_to_child ();
Moment
Sequential_iterator::pending_moment () const
{
- Moment cp = iter_p_->pending_moment ();
+ Moment cp = iter_->pending_moment ();
/*
Fix-up a grace note halfway in the music.
*/
if (grace_fixups_ && here_mom_ == grace_fixups_->start_
- && grace_fixups_->length_ + iter_p_->music_start_mom () == cp)
+ && grace_fixups_->length_ + iter_->music_start_mom () == cp)
{
return here_mom_ + grace_fixups_->length_ + Moment (0, grace_fixups_->grace_start_);
}
/*
Fix-up a grace note at the start of the music.
*/
- return cp + here_mom_ - iter_p_->music_start_mom ();
+ return cp + here_mom_ - iter_->music_start_mom ();
}
bool
Sequential_iterator::ok () const
{
- return iter_p_;
+ return iter_;
}
Music_iterator*
Sequential_iterator::try_music_in_children (Music *m) const
{
- return iter_p_ ? iter_p_->try_music (m) : 0;
+ return iter_ ? iter_->try_music (m) : 0;
}
IMPLEMENT_CTOR_CALLBACK (Sequential_iterator);
+
+bool
+Sequential_iterator::run_always () const
+{
+ return iter_ ? iter_->run_always () : false;
+}