2 translator-group.cc -- implement Translator_group
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
9 #include "translator-group.hh"
11 #include "output-def.hh"
13 #include "scm-hash.hh"
14 #include "context-def.hh"
20 Translator_group::get_daddy_translator () const
22 return context ()->get_parent_context ()->implementation ();
26 translator_each (SCM list
, Translator_method method
)
28 for (SCM p
= list
; scm_is_pair (p
); p
= scm_cdr (p
))
29 (unsmob_translator (scm_car (p
))->*method
) ();
33 Translator_group::initialize ()
35 precompute_method_bindings ();
39 Translator_group::finalize ()
44 translator_accepts_any_of (Translator
*tr
, SCM ifaces
)
46 SCM ack_ifs
= scm_assoc (ly_symbol2scm ("events-accepted"),
47 tr
->translator_description ());
48 ack_ifs
= scm_cdr (ack_ifs
);
49 for (SCM s
= ifaces
; scm_is_pair (s
); s
= scm_cdr (s
))
50 if (scm_c_memq (scm_car (s
), ack_ifs
) != SCM_BOOL_F
)
56 find_accept_translators (SCM gravlist
, SCM ifaces
)
59 for (SCM s
= gravlist
; scm_is_pair (s
); s
= scm_cdr (s
))
61 Translator
*tr
= unsmob_translator (scm_car (s
));
62 if (translator_accepts_any_of (tr
, ifaces
))
63 l
= scm_cons (tr
->self_scm (), l
);
65 l
= scm_reverse_x (l
, SCM_EOL
);
71 Translator_group::try_music (Music
*m
)
73 SCM name
= scm_sloppy_assq (ly_symbol2scm ("name"),
74 m
->get_property_alist (false));
76 if (!scm_is_pair (name
))
79 name
= scm_cdr (name
);
80 SCM accept_list
= scm_hashq_ref (accept_hash_table_
, name
, SCM_UNDEFINED
);
81 if (accept_list
== SCM_BOOL_F
)
83 accept_list
= find_accept_translators (get_simple_trans_list (),
84 m
->get_property ("types"));
85 scm_hashq_set_x (accept_hash_table_
, name
, accept_list
);
88 for (SCM p
= accept_list
; scm_is_pair (p
); p
= scm_cdr (p
))
90 Translator
*t
= unsmob_translator (scm_car (p
));
91 if (t
&& t
->try_music (m
))
98 Translator_group::get_simple_trans_list ()
100 return simple_trans_list_
;
104 precomputed_recurse_over_translators (Context
*c
, Translator_precompute_index idx
, Direction dir
)
107 = dynamic_cast<Translator_group
*> (c
->implementation ());
111 tg
->precomputed_translator_foreach (idx
);
112 tg
->call_precomputed_self_method (idx
);
115 for (SCM s
= c
->children_contexts (); scm_is_pair (s
);
117 precomputed_recurse_over_translators (unsmob_context (scm_car (s
)), idx
, dir
);
121 tg
->precomputed_translator_foreach (idx
);
122 tg
->call_precomputed_self_method (idx
);
127 recurse_over_translators (Context
*c
, Translator_method ptr
, Translator_group_method tg_ptr
, Direction dir
)
130 = dynamic_cast<Translator_group
*> (c
->implementation ());
135 translator_each (tg
->get_simple_trans_list (), ptr
);
138 for (SCM s
= c
->children_contexts (); scm_is_pair (s
);
140 recurse_over_translators (unsmob_context (scm_car (s
)), ptr
, tg_ptr
, dir
);
144 translator_each (tg
->get_simple_trans_list (),
151 Translator_group::Translator_group ()
153 simple_trans_list_
= SCM_EOL
;
154 accept_hash_table_
= SCM_EOL
;
158 accept_hash_table_
= scm_c_make_hash_table (19);
162 Translator_group::derived_mark () const
167 Translator_group::precompute_method_bindings ()
169 for (SCM s
= simple_trans_list_
; scm_is_pair (s
); s
= scm_cdr (s
))
171 Translator
*tr
= unsmob_translator (scm_car (s
));
172 Translator_void_method_ptr ptrs
[TRANSLATOR_METHOD_PRECOMPUTE_COUNT
];
173 tr
->fetch_precomputable_methods (ptrs
);
176 for (int i
= 0; i
< TRANSLATOR_METHOD_PRECOMPUTE_COUNT
; i
++)
179 precomputed_method_bindings_
[i
].push (Translator_method_binding (tr
, ptrs
[i
]));
183 fetch_precomputable_methods (precomputed_self_method_bindings_
);
187 Translator_group::precomputed_translator_foreach (Translator_precompute_index idx
)
189 Array
<Translator_method_binding
> &bindings (precomputed_method_bindings_
[idx
]);
190 for (int i
= 0; i
< bindings
.size (); i
++)
191 bindings
[i
].invoke ();
195 Translator_group::fetch_precomputable_methods (Translator_group_void_method ptrs
[])
197 for (int i
= 0; i
< TRANSLATOR_METHOD_PRECOMPUTE_COUNT
; i
++)
202 Translator_group::call_precomputed_self_method (Translator_precompute_index idx
)
204 if (precomputed_self_method_bindings_
[idx
])
205 (*precomputed_self_method_bindings_
[idx
]) (this);
208 Translator_group::~Translator_group ()
212 #include "ly-smobs.icc"
214 IMPLEMENT_SMOBS (Translator_group
);
215 IMPLEMENT_DEFAULT_EQUAL_P (Translator_group
);
216 IMPLEMENT_TYPE_P (Translator_group
, "ly:translator-group?");
219 Translator_group::print_smob (SCM s
, SCM port
, scm_print_state
*)
221 Translator_group
*me
= (Translator_group
*) SCM_CELL_WORD_1 (s
);
222 scm_puts ("#<Translator_group ", port
);
223 scm_puts (me
->class_name (), port
);
224 scm_display (me
->simple_trans_list_
, port
);
225 scm_puts (" >", port
);
230 Translator_group::mark_smob (SCM smob
)
232 Translator_group
*me
= (Translator_group
*)SCM_CELL_WORD_1 (smob
);
235 scm_gc_mark (me
->accept_hash_table_
);
236 return me
->simple_trans_list_
;