From 2d168ee9752bc949e143c87a7975c2c463a300c6 Mon Sep 17 00:00:00 2001 From: hanwen Date: Sat, 10 Jan 2004 18:54:40 +0000 Subject: [PATCH] (get_simple_trans_list): new function; construct simple_trans_list_ lazily. --- ChangeLog | 5 +++ VERSION | 2 +- lily/accidental-engraver.cc | 2 +- lily/engraver-group-engraver.cc | 6 +-- lily/grob-pq-engraver.cc | 2 +- lily/include/translator-group.hh | 1 + lily/include/translator.hh | 18 +++++++-- lily/note-heads-engraver.cc | 5 --- lily/performer-group-performer.cc | 4 +- lily/score-engraver.cc | 1 - lily/timing-translator.cc | 5 +++ lily/translator-def.cc | 27 +------------ lily/translator-group.cc | 63 ++++++++++++++++++++++++++++--- lily/translator.cc | 7 +++- scm/define-music-types.scm | 2 +- 15 files changed, 99 insertions(+), 51 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5153e348ba..65d186628d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-01-10 Han-Wen Nienhuys + + * lily/translator-group.cc (get_simple_trans_list): + new function; construct simple_trans_list_ lazily. + 2004-01-10 Jan Nieuwenhuizen * lily/paper-outputter.cc (output_scope): Check if number before diff --git a/VERSION b/VERSION index 0076e7ac4c..63cc2c5fb2 100644 --- a/VERSION +++ b/VERSION @@ -2,5 +2,5 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=2 MINOR_VERSION=1 PATCH_LEVEL=8 -MY_PATCH_LEVEL= +MY_PATCH_LEVEL=hwn1 diff --git a/lily/accidental-engraver.cc b/lily/accidental-engraver.cc index b4dccfadae..87399e3db7 100644 --- a/lily/accidental-engraver.cc +++ b/lily/accidental-engraver.cc @@ -82,7 +82,7 @@ static void set_property_on_children (Translator_group * trans, const char * sym, SCM val) { trans->set_property (sym, val); - for (SCM p = trans -> trans_group_list_; gh_pair_p (p); p = ly_cdr(p)) { + for (SCM p = trans->trans_group_list_; gh_pair_p (p); p = ly_cdr(p)) { Translator_group *trg = dynamic_cast (unsmob_translator (ly_car (p))); set_property_on_children(trg,sym,ly_deep_copy(val)); } diff --git a/lily/engraver-group-engraver.cc b/lily/engraver-group-engraver.cc index 5cab78639a..58fefce59a 100644 --- a/lily/engraver-group-engraver.cc +++ b/lily/engraver-group-engraver.cc @@ -23,7 +23,7 @@ Engraver_group_engraver::announce_grob (Grob_info info) void Engraver_group_engraver::process_acknowledged_grobs_in_simple_children () { - for (SCM p = simple_trans_list_; gh_pair_p (p); p = ly_cdr (p)) + for (SCM p = get_simple_trans_list (); gh_pair_p (p); p = ly_cdr (p)) { Translator * t = unsmob_translator (ly_car (p)); Engraver * eng = dynamic_cast (t); @@ -71,7 +71,7 @@ Engraver_group_engraver::acknowledge_grobs () SCM acklist = scm_hashq_ref (tab, nm, SCM_UNDEFINED); if (acklist == SCM_BOOL_F) { - acklist= find_acknowledge_engravers (gh_cons (self_scm (), simple_trans_list_), meta); + acklist = find_acknowledge_engravers (gh_cons (self_scm (), get_simple_trans_list ()), meta); scm_hashq_set_x (tab, nm, acklist); } @@ -113,7 +113,7 @@ Engraver_group_engraver::do_announces () void Engraver_group_engraver::process_music () { - for (SCM p = simple_trans_list_; gh_pair_p (p); p =ly_cdr (p)) + for (SCM p = get_simple_trans_list (); gh_pair_p (p); p =ly_cdr (p)) { Translator * t = unsmob_translator (ly_car (p)); Engraver * eng = dynamic_cast (t); diff --git a/lily/grob-pq-engraver.cc b/lily/grob-pq-engraver.cc index 4f7208962b..bf46d20166 100644 --- a/lily/grob-pq-engraver.cc +++ b/lily/grob-pq-engraver.cc @@ -117,7 +117,7 @@ Grob_pq_engraver::stop_translation_timestep () void Grob_pq_engraver::start_translation_timestep () { - Moment now = now_mom(); + Moment now = now_mom(); SCM start_busy = get_property ("busyGrobs"); SCM busy = start_busy; diff --git a/lily/include/translator-group.hh b/lily/include/translator-group.hh index 566e33a42f..54e355692e 100644 --- a/lily/include/translator-group.hh +++ b/lily/include/translator-group.hh @@ -38,6 +38,7 @@ class Translator_group : public virtual Translator { protected: ~Translator_group (); + virtual SCM get_simple_trans_list (); public: void execute_pushpop_property (SCM prop, SCM sym, SCM val); SCM internal_get_property (SCM name_sym) const; diff --git a/lily/include/translator.hh b/lily/include/translator.hh index 9cb6e7c171..e23b68d701 100644 --- a/lily/include/translator.hh +++ b/lily/include/translator.hh @@ -54,13 +54,25 @@ public: virtual Moment now_mom () const; /* - ugh: bubbled up from Translator_group. + ugh: bubbled up. */ - SCM simple_trans_list_; - SCM trans_group_list_; SCM definition_; SCM properties_scm_; + SCM trans_group_list_; + + virtual SCM get_simple_trans_list (); +public: DECLARE_SMOBS (Translator, dummy); +private: + /* + ugh: bubbled up from Translator_group. + */ + +protected: // should be private. + SCM simple_trans_list_; + + // ugr. + // friend SCM Translator_group::get_simple_trans_list (); public: diff --git a/lily/note-heads-engraver.cc b/lily/note-heads-engraver.cc index 55e20f8a6e..0f0c820135 100644 --- a/lily/note-heads-engraver.cc +++ b/lily/note-heads-engraver.cc @@ -30,7 +30,6 @@ public: TRANSLATOR_DECLARATIONS(Note_heads_engraver); protected: - virtual void start_translation_timestep (); virtual bool try_music (Music *req) ; virtual void process_music (); @@ -113,10 +112,6 @@ Note_heads_engraver::stop_translation_timestep () note_reqs_.clear (); } -void -Note_heads_engraver::start_translation_timestep () -{ -} ENTER_DESCRIPTION(Note_heads_engraver, diff --git a/lily/performer-group-performer.cc b/lily/performer-group-performer.cc index b8f4349ef8..74edd0236b 100644 --- a/lily/performer-group-performer.cc +++ b/lily/performer-group-performer.cc @@ -35,7 +35,7 @@ Performer_group_performer::announce_element (Audio_element_info info) void Performer_group_performer::create_audio_elements () { - for (SCM p = simple_trans_list_; gh_pair_p (p); p = ly_cdr (p)) + for (SCM p = get_simple_trans_list (); gh_pair_p (p); p = ly_cdr (p)) { Translator * t = unsmob_translator (ly_car (p)); Performer * eng = dynamic_cast (t); @@ -51,7 +51,7 @@ Performer_group_performer::acknowledge_audio_elements () { Audio_element_info info = announce_infos_[j]; - for (SCM p = simple_trans_list_; gh_pair_p (p); p = ly_cdr (p)) + for (SCM p = get_simple_trans_list (); gh_pair_p (p); p = ly_cdr (p)) { Translator * t = unsmob_translator (ly_car (p)); Performer * eng = dynamic_cast (t); diff --git a/lily/score-engraver.cc b/lily/score-engraver.cc index 6398c0e040..96968bd589 100644 --- a/lily/score-engraver.cc +++ b/lily/score-engraver.cc @@ -88,7 +88,6 @@ Score_engraver::finish () check_removal (); finalize (); - } /* diff --git a/lily/timing-translator.cc b/lily/timing-translator.cc index 9676e98265..3d83282c6c 100644 --- a/lily/timing-translator.cc +++ b/lily/timing-translator.cc @@ -52,6 +52,11 @@ Timing_translator::stop_translation_timestep () void Timing_translator::initialize () { + + /* + move this to engraver-init.ly? + */ + daddy_trans_->set_property ("timing" , SCM_BOOL_T); daddy_trans_->set_property ("currentBarNumber" , gh_int2scm (1)); diff --git a/lily/translator-def.cc b/lily/translator-def.cc index 37bc280533..abe16e0b69 100644 --- a/lily/translator-def.cc +++ b/lily/translator-def.cc @@ -217,29 +217,6 @@ IMPLEMENT_SMOBS (Translator_def); IMPLEMENT_DEFAULT_EQUAL_P (Translator_def); -static SCM -names_to_translators (SCM namelist, Translator_group*tg) -{ - SCM l = SCM_EOL; - for (SCM s = namelist; gh_pair_p (s) ; s = ly_cdr (s)) - { - Translator * t = get_translator (ly_car (s)); - if (!t) - warning (_f ("can't find: `%s'", s)); - else - { - Translator * tr = t->clone (); - SCM str = tr->self_scm (); - l = gh_cons (str, l); - - tr->daddy_trans_ = tg; - tr->output_def_ = tg->output_def_; - - scm_gc_unprotect_object (str); - } - } - return l; -} SCM @@ -284,12 +261,10 @@ Translator_def::instantiate (Music_output_def* md, SCM ops) tg->output_def_ = md; tg->definition_ = self_scm (); - SCM trans_names = get_translator_names (ops); - tg->simple_trans_list_ = names_to_translators (trans_names, tg); - return tg; } + SCM Translator_def::clone_scm () const { diff --git a/lily/translator-group.cc b/lily/translator-group.cc index 14f5321d48..a81f9f1d5a 100644 --- a/lily/translator-group.cc +++ b/lily/translator-group.cc @@ -267,7 +267,7 @@ static_each (SCM list, Method_pointer method) void Translator_group::each (Method_pointer method) { - static_each (simple_trans_list_, method); + static_each (get_simple_trans_list (), method); static_each (trans_group_list_, method); } @@ -404,7 +404,7 @@ Translator_group::initialize () { SCM tab = scm_make_vector (gh_int2scm (19), SCM_BOOL_F); set_property ("acceptHashTable", tab); - each (&Translator::initialize); + static_each (trans_group_list_, &Translator::initialize); } void @@ -413,9 +413,8 @@ Translator_group::finalize () each (&Translator::finalize); } - - -bool translator_accepts_any_of (Translator*tr, SCM ifaces) +bool +translator_accepts_any_of (Translator*tr, SCM ifaces) { SCM ack_ifs = scm_assoc (ly_symbol2scm ("events-accepted"), tr->translator_description()); @@ -455,7 +454,7 @@ Translator_group::try_music_on_nongroup_children (Music *m ) SCM accept_list = scm_hashq_ref (tab, name, SCM_UNDEFINED); if (accept_list == SCM_BOOL_F) { - accept_list = find_accept_translators (simple_trans_list_, + accept_list = find_accept_translators (get_simple_trans_list (), m->get_mus_property ("types")); scm_hashq_set_x (tab, name, accept_list); } @@ -508,3 +507,55 @@ apply_property_operations (Translator_group*tg, SCM pre_init_ops) } } } + +SCM +names_to_translators (SCM namelist, Translator_group*tg) +{ + SCM l = SCM_EOL; + for (SCM s = namelist; gh_pair_p (s) ; s = ly_cdr (s)) + { + Translator * t = get_translator (ly_car (s)); + if (!t) + warning (_f ("can't find: `%s'", s)); + else + { + Translator * tr = t->clone (); + SCM str = tr->self_scm (); + l = gh_cons (str, l); + + tr->daddy_trans_ = tg; + tr->output_def_ = tg->output_def_; + + scm_gc_unprotect_object (str); + } + } + return l; +} + + +SCM +Translator_group::get_simple_trans_list () +{ + if (simple_trans_list_ != SCM_BOOL_F) + return simple_trans_list_; + + Translator_def * td = unsmob_translator_def (definition_); + + /* + The following cannot work, since start_translation_timestep () + triggers this code, and start_translation_timestep happens before + \property Voice.Voice =#'() + + */ + SCM trans_names = internal_get_property (td->get_context_name ()); + if (!gh_pair_p (trans_names)) + { + trans_names = td->get_translator_names (SCM_EOL); + } + + simple_trans_list_ = names_to_translators (trans_names, this); + + + static_each (simple_trans_list_, &Translator::initialize); + return simple_trans_list_; +} diff --git a/lily/translator.cc b/lily/translator.cc index ee40e52e0b..6f323bbfed 100644 --- a/lily/translator.cc +++ b/lily/translator.cc @@ -23,7 +23,7 @@ Translator::~Translator () void Translator::init () { - simple_trans_list_ = SCM_EOL; + simple_trans_list_ = SCM_BOOL_F; trans_group_list_ = SCM_EOL; properties_scm_ = SCM_EOL; definition_ = SCM_EOL; @@ -138,3 +138,8 @@ IMPLEMENT_SMOBS (Translator); IMPLEMENT_DEFAULT_EQUAL_P (Translator); IMPLEMENT_TYPE_P(Translator,"ly:translator?"); +SCM +Translator::get_simple_trans_list() +{ + return SCM_EOL; +} diff --git a/scm/define-music-types.scm b/scm/define-music-types.scm index 67a80cfe26..f994902fc0 100644 --- a/scm/define-music-types.scm +++ b/scm/define-music-types.scm @@ -11,7 +11,7 @@ (AbsoluteDynamicEvent . ( (description . "Creates a dynamic mark. Syntax: @var{note}@code{\\x}, -where x is one of \\@\\{\\ppp, \\pp, \\p, \\mp, \\mf, \\f, \\ff, \\fff.\\@\\}") +where x is one of \\ppp, \\pp, \\p, \\mp, \\mf, \\f, \\ff, \\fff.") (internal-class-name . "Event") (types . (general-music event dynamic-event absolute-dynamic-event)) )) -- 2.39.5