(c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
+#include "sequential-iterator.hh"
+
#include "translator-group.hh"
#include "context.hh"
-#include "sequential-iterator.hh"
#include "music-list.hh"
-
-Grace_fixup *copy_grace_fixups (Grace_fixup* src);
-Grace_fixup *get_grace_fixups (SCM cursor);
+#include "grace-fixup.hh"
/*
Invariant for the data structure.
- if (gh_pair_p (cursor_))
- iter_->music_ == unsmob_music (ly_car (cursor_))
+ if (scm_is_pair (cursor_))
+ iter_->music_ == unsmob_music (scm_car (cursor_))
else
iter_ == 0;
Sequential_iterator::Sequential_iterator ()
{
here_mom_ = Moment (0);
- list_ = SCM_EOL;
cursor_ = SCM_EOL;
grace_fixups_ = 0;
- iter_ =0;
+ iter_ = 0;
}
SCM
void
-Sequential_iterator::derived_mark ()const
+Sequential_iterator::derived_mark () const
{
if (iter_)
scm_gc_mark (iter_->self_scm ());
- scm_gc_mark (list_);
scm_gc_mark (cursor_);
}
void
-Sequential_iterator::derived_substitute (Context *f,Context *t)
+Sequential_iterator::derived_substitute (Context *f, Context *t)
{
if (iter_)
- iter_->substitute_outlet (f,t);
-
+ iter_->substitute_outlet (f, t);
}
+/*
+ TODO: this should be made lazily.
+ */
Grace_fixup *
-get_grace_fixups (SCM cursor)
+create_grace_fixup_list (SCM cursor)
{
Moment here;
Moment last (-1);
Grace_fixup *head = 0;
Grace_fixup **tail = &head;
- for (; gh_pair_p (cursor); cursor = ly_cdr (cursor))
+ for (; scm_is_pair (cursor); cursor = scm_cdr (cursor))
{
- Music * mus = unsmob_music (ly_car (cursor));
+ Music *mus = unsmob_music (scm_car (cursor));
Moment s = mus->start_mom ();
- Moment l =mus->get_length () - s;
+ Moment l = mus->get_length () - s;
if (s.grace_part_)
{
if (last != Moment (-1))
{
- Grace_fixup *p =new Grace_fixup;
+ Grace_fixup *p = new Grace_fixup;
p->start_ = last;
p->length_ = here - last;
p->grace_start_ = s.grace_part_;
here += l;
}
}
- return head;
-}
-
-Grace_fixup *
-copy_grace_fixups (Grace_fixup* src)
-{
- Grace_fixup * head = 0;
- Grace_fixup **dest = &head;
-
- while (src)
- {
- *dest = new Grace_fixup (*src);
- dest = & (*dest)->next_;
- src = src ->next_;
- }
-
+
return head;
}
void
Sequential_iterator::construct_children ()
{
- list_ = get_music_list ();
- cursor_ = list_;
+ cursor_ = get_music_list ();
iter_ = 0;
- if (gh_pair_p (cursor_))
+ if (scm_is_pair (cursor_))
{
- Music *m =unsmob_music (ly_car (cursor_));
+ Music *m = unsmob_music (scm_car (cursor_));
iter_ = unsmob_iterator (get_iterator (m));
}
next_element (true);
}
+ last_mom_ = Moment (-1);
here_mom_ = get_music ()->start_mom ();
- grace_fixups_ = get_grace_fixups (cursor_);
+ grace_fixups_ = create_grace_fixup_list (cursor_);
/*
iter_->ok () is tautology, but what the heck.
*/
if (iter_ && iter_->ok ())
- descend_to_child ();
+ descend_to_child (iter_->get_outlet ());
}
void
Sequential_iterator::next_element (bool)
{
- Moment len =iter_->music_get_length () - 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_ &&
- grace_fixups_->start_ == here_mom_)
+ if (len.main_part_
+ && get_grace_fixup ())
{
- here_mom_ += grace_fixups_->length_;
- here_mom_.grace_part_ += grace_fixups_->grace_start_;
+ Grace_fixup *gf = get_grace_fixup ();
+
+ last_mom_ = here_mom_;
+ here_mom_ += gf->length_;
+ here_mom_.grace_part_ += gf->grace_start_;
- Grace_fixup * n =grace_fixups_->next_;
- delete grace_fixups_;
- grace_fixups_ = n;
+ next_grace_fixup ();
}
else if (len.grace_part_ && !len.main_part_)
{
- here_mom_.grace_part_ =0;
+ last_mom_ = here_mom_;
+ here_mom_.grace_part_ = 0;
}
else
{
in that chunk should be in len.grace_part_
*/
+ last_mom_ = here_mom_;;
here_mom_ += len;
}
- cursor_ = ly_cdr (cursor_);
+ cursor_ = scm_cdr (cursor_);
iter_->quit ();
- if (gh_pair_p (cursor_))
- iter_ = unsmob_iterator (get_iterator (unsmob_music (ly_car (cursor_))));
+ if (scm_is_pair (cursor_))
+ iter_ = unsmob_iterator (get_iterator (unsmob_music (scm_car (cursor_))));
else
iter_ = 0;
}
-/*
- move to context of child iterator if it is deeper down in the
- hierarchy.
- */
-void
-Sequential_iterator::descend_to_child ()
-{
- Context * child_report = child_report = iter_->get_outlet ();
- Context * me_report = get_outlet ();
-
- Context * c = child_report;
- while (c && c != me_report)
- {
- c= c->daddy_context_;
- }
-
- if (c == me_report)
- set_translator (child_report);
-}
-
void
{
while (iter_)
{
- if (grace_fixups_ &&
- grace_fixups_->start_ == here_mom_
- && (grace_fixups_->start_ + grace_fixups_->length_
- + Moment (Rational (0), grace_fixups_->grace_start_) == until))
+ Grace_fixup * gf = get_grace_fixup ();
+ if (gf
+ && gf->start_ + gf->length_
+ + Moment (Rational (0), gf->grace_start_) == until)
{
/*
do the stuff/note/rest preceding a grace.
else
{
Moment w = until - here_mom_ + iter_->music_start_mom ();
- // if (w >= Moment (0))
iter_->process (w);
}
if (iter_->ok ())
return ;
- descend_to_child ();
+ descend_to_child (iter_->get_outlet ());
next_element (true);
}
}
/*
Fix-up a grace note halfway in the music.
*/
- if (grace_fixups_ && here_mom_ == grace_fixups_->start_
- && grace_fixups_->length_ + iter_->music_start_mom () == cp)
+ Grace_fixup * gf = get_grace_fixup ();
+ if (gf
+ && gf->length_ + iter_->music_start_mom () == cp)
{
- return here_mom_ + grace_fixups_->length_ + Moment (0, grace_fixups_->grace_start_);
+ return here_mom_ + gf->length_ + Moment (0, gf->grace_start_);
}
/*
{
return iter_ ? iter_->run_always () : false;
}
+
+void
+Sequential_iterator::next_grace_fixup ()
+{
+ Grace_fixup * n = grace_fixups_->next_;
+ delete grace_fixups_;
+ grace_fixups_ = n;
+}
+
+Grace_fixup*
+Sequential_iterator::get_grace_fixup () const
+{
+ if (grace_fixups_ && grace_fixups_->start_ == here_mom_)
+ return grace_fixups_;
+ else
+ return 0;
+}