source file of the GNU LilyPond music typesetter
- (c) 1997--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1997--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
#include "translator-group.hh"
*/
-/*
-
- TODO: the grace note handling hasn't been done for skip() and
- get_pending_events(), 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_pending_events(), meaning that staff-switching and partcombining will be
- broken with grace notes.
-
- */
/*
Invariant for the data structure.
Sequential_iterator::Sequential_iterator ()
{
here_mom_ = Moment (0);
+ list_ = SCM_EOL;
+ cursor_ = SCM_EOL;
grace_fixups_ = 0;
iter_ =0;
}
return SCM_EOL;
}
+void
+Sequential_iterator::do_quit ()
+{
+ if (iter_)
+ iter_->quit();
+}
+
+
Sequential_iterator::Sequential_iterator (Sequential_iterator const &src)
: Music_iterator (src)
{
cursor_ = src.cursor_;
list_ = src.cursor_;
here_mom_ = src.here_mom_;
+ iter_ = 0;
+
if (src.iter_)
- iter_ = src.iter_->clone ();
- else
- iter_ = 0;
+ {
+ iter_ = src.iter_->clone ();
+ scm_gc_unprotect_object (iter_->self_scm());
+ }
}
-Sequential_iterator::~Sequential_iterator ()
+void
+Sequential_iterator::derived_mark ()const
{
- delete iter_;
+ if (iter_)
+ scm_gc_mark (iter_->self_scm());
+ scm_gc_mark (list_);
+ scm_gc_mark (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_)
{
list_ = get_music_list ();
cursor_ = list_;
- iter_ = gh_pair_p (cursor_) ? get_iterator (unsmob_music (ly_car (cursor_))) : 0;
+ 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);
swoop.
*/
void
-Sequential_iterator::next_element (bool side_effect)
+Sequential_iterator::next_element (bool)
{
- Moment len =iter_->music_length_mom () - iter_->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_;
cursor_ = ly_cdr (cursor_);
+ iter_->quit();
if (gh_pair_p (cursor_))
- iter_ = get_iterator (unsmob_music (ly_car (cursor_)));
+ iter_ = unsmob_iterator (get_iterator (unsmob_music (ly_car (cursor_))));
else
iter_ = 0;
}
void
Sequential_iterator::descend_to_child ()
{
+ Translator_group * child_report = child_report = iter_->report_to ();
+ Translator_group * me_report = report_to ();
+
+ Translator_group * c = child_report;
+ while (c && c != me_report)
+ {
+ c= c->daddy_trans_;
+ }
+
+ if (c == me_report)
+ set_translator (child_report);
}
*/
SCM
-Sequential_iterator::get_pending_events (Moment until)const
+Sequential_iterator::get_pending_events (Moment until) const
{
SCM s = SCM_EOL;
if (until < pending_moment ())
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 ());
+ m = m >? (mus->get_length () - mus->start_mom ());
}
if (m > Moment (0))
break ;
else
me->next_element (false);
}
- delete me;
-
+
+ scm_gc_unprotect_object (me->self_scm());
return s;
}
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)
/*
do the stuff/note/rest preceding a grace.
*/
- iter_->skip (iter_->music_length_mom ());
+ iter_->skip (iter_->music_get_length ());
}
- else if (iter_->music_length_mom () >= until - here_mom_)
+ else if (iter_->music_get_length () >= until - here_mom_)
iter_->skip (until - here_mom_ + iter_->music_start_mom ());
if (iter_->ok ())
/*
do the stuff/note/rest preceding a grace.
*/
- iter_->process (iter_->music_length_mom ());
+ iter_->process (iter_->music_get_length ());
}
else
iter_->process (until - here_mom_ + iter_->music_start_mom ());