#include "context-def.hh"
#include "context.hh"
#include "warn.hh"
-#include "music-output-def.hh"
+#include "output-def.hh"
#include "scm-hash.hh"
#include "main.hh"
#include "ly-smobs.icc"
Context::is_removable () const
{
return context_list_ == SCM_EOL && ! iterator_count_ &&
- !dynamic_cast<Score_context const*> (this)
- ;
+ !dynamic_cast<Score_context const*> (this);
}
void
Context::check_removal ()
{
- for (SCM p = context_list_; gh_pair_p (p); p = gh_cdr (p))
+ for (SCM p = context_list_; ly_c_pair_p (p); p = ly_cdr (p))
{
Context *trg = unsmob_context (ly_car (p));
trg->check_removal ();
if (trg->is_removable ())
{
- recurse_down_translators (trg, &Translator::finalize, false);
+ recurse_over_translators (trg, &Translator::finalize, UP);
remove_context (trg);
}
}
Context::add_context (Context*t)
{
SCM ts = t->self_scm ();
- context_list_ = gh_append2 (context_list_,
- gh_cons (ts, SCM_EOL));
+ context_list_ = ly_append2 (context_list_,
+ scm_cons (ts, SCM_EOL));
t->daddy_context_ = this;
if (!t->init_)
Context_def * td = unsmob_context_def (t->definition_);
/*
- this can not move before add_context(), because \override
+ this can not move before add_context (), because \override
operations require that we are in the hierarchy.
*/
td->apply_default_property_operations (t);
- recurse_down_translators (t, &Translator::initialize, true);
+ recurse_over_translators (t, &Translator::initialize, DOWN);
}
}
{
daddy_context_ = 0;
init_ = false;
+ aliases_ = SCM_EOL;
iterator_count_ = 0;
implementation_ = SCM_EOL;
properties_scm_ = SCM_EOL;
smobify_self ();
- Scheme_hash_table *tab = new Scheme_hash_table ;
- properties_scm_ = tab->self_scm ();
- scm_gc_unprotect_object (tab->self_scm ());
+ properties_scm_ = (new Scheme_hash_table)->self_scm ();
+ scm_gc_unprotect_object (properties_scm_);
}
-Context *
-Context::find_existing_context (SCM n, String id)
-{
- if ((is_alias (n) && (id_string_ == id || id.is_empty ()))
- || n == ly_symbol2scm ("Current"))
- return this;
-
- Context* r = 0;
- for (SCM p = context_list_; !r && gh_pair_p (p); p = ly_cdr (p))
- {
- Context * t = unsmob_context (ly_car (p));
-
- r = dynamic_cast<Context*> (t)->find_existing_context (n, id);
- }
-
- return r;
-}
Context*
return get_score_context ()->find_create_context (n, id, operations);
- Context * existing = find_existing_context (n,id);
+ Context * existing = find_context_below (this, n,id);
if (existing)
return existing;
return current;
}
+ /*
+ Don't go up to Global_context, because global goes down to
+ Score_context
+ */
Context *ret = 0;
- if (daddy_context_)
+ if (daddy_context_ && !dynamic_cast<Global_context*> (daddy_context_))
ret = daddy_context_->find_create_context (n, id, operations);
else
{
none.
*/
SCM
-default_child_context_name (Context const *tg)
+Context::default_child_context_name () const
{
- return gh_pair_p (tg->accepts_list_)
- ? ly_car (scm_last_pair (tg->accepts_list_))
+ return ly_c_pair_p (accepts_list_)
+ ? ly_car (scm_last_pair (accepts_list_))
: SCM_EOL;
}
bool
Context::is_bottom_context () const
{
- return !gh_symbol_p (default_child_context_name (this));
+ return !scm_is_symbol (default_child_context_name ());
}
Context*
{
if (!is_bottom_context ())
{
- SCM nm = default_child_context_name (this);
- SCM st = get_output_def ()->find_context_def (nm);
+ SCM nm = default_child_context_name ();
+ SCM st = find_context_def (get_output_def (), nm);
Context_def *t = unsmob_context_def (st);
if (!t)
Context::is_alias (SCM sym) const
{
if (sym == ly_symbol2scm ("Bottom")
- && !gh_pair_p (accepts_list_))
+ && !ly_c_pair_p (accepts_list_))
+ return true;
+ if (sym == unsmob_context_def (definition_)->get_context_name ())
return true;
- return unsmob_context_def (definition_)->is_alias (sym);
+
+ return scm_c_memq (sym, aliases_) != SCM_BOOL_F;
}
+void
+Context::add_alias (SCM sym)
+{
+ aliases_ = scm_cons (sym, aliases_);
+}
+
+
+
void
Context::internal_set_property (SCM sym, SCM val)
{
*/
Context *
find_context_below (Context * where,
- String type, String id)
+ SCM type, String id)
{
- if (where->is_alias (ly_symbol2scm (type.to_str0 ())))
+ if (where->is_alias (type))
{
- if (id == "" || where->id_string_ == id)
+ if (id == "" || where->id_string () == id)
return where;
}
Context * found = 0;
- for (SCM s = where->context_list_;
- !found && gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = where->children_contexts ();
+ !found && ly_c_pair_p (s); s = ly_cdr (s))
{
- Context * tr = unsmob_context (gh_car (s));
+ Context * tr = unsmob_context (ly_car (s));
found = find_context_below (tr, type, id);
}
SCM
Context::properties_as_alist () const
{
- return properties_dict()->to_alist();
+ return properties_dict ()->to_alist ();
}
String
return 0;
}
-Music_output_def *
+Output_def *
Context::get_output_def () const
{
return (daddy_context_)
? daddy_context_->get_output_def () : 0;
}
-Context::~Context()
+Context::~Context ()
{
}
Moment
Context::now_mom () const
{
- return daddy_context_->now_mom();
+ return daddy_context_->now_mom ();
}
int
Context * me = (Context*) SCM_CELL_WORD_1 (sm);
scm_gc_mark (me->context_list_);
+ scm_gc_mark (me->aliases_);
scm_gc_mark (me->definition_);
scm_gc_mark (me->properties_scm_);
scm_gc_mark (me->accepts_list_);
IMPLEMENT_SMOBS (Context);
IMPLEMENT_DEFAULT_EQUAL_P (Context);
-IMPLEMENT_TYPE_P(Context,"ly:context?");
+IMPLEMENT_TYPE_P (Context,"ly:context?");
bool
Context::try_music (Music* m)
{
- Translator* t = unsmob_translator (implementation_);
+ Translator* t = implementation ();
if (!t)
return false;
programming_error ("No Global context!");
return 0;
}
+
+Context*
+Context::get_parent_context () const
+{
+ return daddy_context_;
+}
+
+Translator_group*
+Context::implementation () const
+{
+ return dynamic_cast<Translator_group*> (unsmob_translator (implementation_));
+}