-Translator_group::Translator_group (Translator_group const&s)
- : Translator (s)
-{
- iterator_count_ =0;
-
- Scheme_hash_table * tab = new Scheme_hash_table (*s.properties_dict ());
- properties_scm_ = tab->self_scm ();
- scm_gc_unprotect_object (tab->self_scm ());
-}
-
-Scheme_hash_table*
-Translator_group::properties_dict () const
-{
- return Scheme_hash_table::unsmob (properties_scm_);
-}
-
-Translator_group::~Translator_group ()
-{
-
- //assert (is_removable ());
-}
-
-
-Translator_group::Translator_group ()
-{
- iterator_count_ = 0;
- Scheme_hash_table *tab = new Scheme_hash_table ;
- properties_scm_ = tab->self_scm ();
-
- scm_gc_unprotect_object (tab->self_scm ());
-}
-
-void
-Translator_group::check_removal ()
-{
- SCM next = SCM_EOL;
- for (SCM p = trans_group_list_; gh_pair_p (p); p = next)
- {
- next = ly_cdr (p);
-
- Translator_group *trg = dynamic_cast<Translator_group*> (unsmob_translator (ly_car (p)));
-
- trg->check_removal ();
- if (trg->is_removable ())
- terminate_translator (trg);
- }
-}
-
-SCM
-Translator_group::add_translator (SCM list, Translator *t)
-{
- /*
- Must append, since list ordering must be preserved.
- */
- list = gh_append2 (list, gh_cons (t->self_scm (), SCM_EOL));
- t->daddy_trans_ = this;
- t->output_def_ = output_def_;
-
- return list;
-}
-
-
-void
-Translator_group::add_used_group_translator (Translator *t)
-{
- trans_group_list_ = add_translator (trans_group_list_,t);
-}
-
-
-void
-Translator_group::add_fresh_group_translator (Translator*t, SCM pre_init_ops)
-{
- Translator_group*tg = dynamic_cast<Translator_group*> (t);
- assert (tg);
-
- trans_group_list_ = add_translator (trans_group_list_,t);
- unsmob_translator_def (tg->definition_)->apply_default_property_operations (tg);
- apply_property_operations (tg, pre_init_ops);
- t->initialize ();
-}
-
-
-bool
-Translator_group::is_removable () const
-{
- return trans_group_list_ == SCM_EOL && ! iterator_count_;
-}
-
-Translator_group *
-Translator_group::find_existing_translator (SCM n, String id)
-{
- if ((is_alias (n) && (id_string_ == id || id.is_empty ())) || n == ly_symbol2scm ("Current"))
- return this;
-
- Translator_group* r = 0;
- for (SCM p = trans_group_list_; !r && gh_pair_p (p); p = ly_cdr (p))
- {
- Translator * t = unsmob_translator (ly_car (p));
-
- r = dynamic_cast<Translator_group*> (t)->find_existing_translator (n, id);
- }
-
- return r;
-}
-
-
-Translator_group*
-Translator_group::find_create_translator (SCM n, String id, SCM operations)
-{
- Translator_group * existing = find_existing_translator (n,id);
- if (existing)
- return existing;
-
- Link_array<Translator_def> path
- = unsmob_translator_def (definition_)->path_to_acceptable_translator (n, get_output_def ());
-
- if (path.size ())
- {
- Translator_group * current = this;
-
- // start at 1. The first one (index 0) will be us.
- for (int i=0; i < path.size (); i++)
- {
- Translator_group * new_group = path[i]->instantiate (output_def_);
-
- SCM ops = SCM_EOL;
- if (i == path.size () -1)
- {
- new_group->id_string_ = id;
- ops = operations;
- }
-
- current->add_fresh_group_translator (new_group, ops);
- current = new_group;
- }
-
- return current;
- }
-
- Translator_group *ret = 0;
- if (daddy_trans_)
- ret = daddy_trans_->find_create_translator (n, id, operations);
- else
- {
- warning (_f ("can't find or create `%s' called `%s'", ly_symbol2string (n).to_str0 (), id));
- ret =0;
- }
- return ret;
-}
-
-bool
-Translator_group::try_music (Music* m)
-{
- bool hebbes_b = try_music_on_nongroup_children (m);
-
- if (!hebbes_b && daddy_trans_)
- hebbes_b = daddy_trans_->try_music (m);
-
- return hebbes_b ;
-}
-
-int
-Translator_group::get_depth () const
-{
- return (daddy_trans_) ? daddy_trans_->get_depth () + 1 : 0;
-}
-
-Translator_group*
-Translator_group::get_ancestor (int level)
-{
- if (!level || !daddy_trans_)
- return this;
-
- return daddy_trans_->get_ancestor (level-1);
-}
-
-void
-Translator_group::terminate_translator (Translator*r)
-{
- r->finalize ();
- /*
- Return value ignored. GC does the rest.
- */
- remove_translator (r);
-}
-
-
-/**
- Remove a translator from the hierarchy.
- */
-Translator *
-Translator_group::remove_translator (Translator*trans)
-{
- assert (trans);
-
- trans_group_list_ = scm_delq_x (trans->self_scm (), trans_group_list_);
- trans->daddy_trans_ = 0;
- return trans;
-}
-
-bool
-Translator_group::is_bottom_translator_b () const
-{
- return !gh_symbol_p (unsmob_translator_def (definition_)->default_child_context_name ());
-}
-