source file of the GNU LilyPond music typesetter
- (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1999--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
#include "group-interface.hh"
-#include "score-element.hh"
-
-Group_interface::Group_interface (Score_element const* e)
-{
- elt_l_ = (Score_element*)e;
- name_ = "elements";
-}
+#include "grob.hh"
-Group_interface::Group_interface (Score_element const *e, String s)
-{
- elt_l_ =(Score_element*)e;
- name_ = s;
-}
-bool
-Group_interface::has_interface_b ()
-{
- SCM el = elt_l_->get_elt_property (name_);
+/*
+ This special add_thing routine is slightly more efficient than
- return el == SCM_EOL || gh_pair_p (el);
-}
+ set_prop (name,cons (thing, get_prop (name)))
+ since it can reuse the handle returned by scm_assq().
+*/
void
-Group_interface::add_element (Score_element*p)
+Group_interface::add_thing (Grob*me, SCM sym, SCM thing)
{
- p->used_b_ = true;
- elt_l_->used_b_ = true;
-
- add_thing (p->self_scm_);
+ SCM handle = scm_sloppy_assq (sym, me->mutable_property_alist_);
+ if (handle != SCM_BOOL_F)
+ {
+ gh_set_cdr_x (handle, gh_cons (thing, gh_cdr (handle)));
+
+ }
+ else
+ {
+ /*
+ There is no mutable prop yet, so create an entry, and put it in front of the
+ mutable prop list.
+ */
+ handle = scm_sloppy_assq (sym, me->immutable_property_alist_);
+ SCM tail = (handle != SCM_BOOL_F) ? gh_cdr(handle) : SCM_EOL;
+ me->mutable_property_alist_ = gh_cons (gh_cons (sym, gh_cons (thing, tail)),
+ me->mutable_property_alist_);
+ }
}
void
-Group_interface::add_thing (SCM s)
+Group_interface::add_thing (Grob*me, String name, SCM thing)
{
- elt_l_->set_elt_property (name_,
- gh_cons (s, elt_l_->get_elt_property (name_)));
-
+ add_thing (me, ly_symbol2scm (name.ch_C()), thing);
}
-
int
-Group_interface::count ()
+Group_interface::count (Grob *me, String name)
{
- return scm_ilength (elt_l_->get_elt_property (name_));
+ return scm_ilength (me->get_grob_property (name.ch_C ()));
}
-void
-Group_interface::set_interface ()
-{
- if (!has_interface_b ())
- {
- elt_l_->set_elt_property (name_, SCM_EOL);
- }
-}
-Group_interface
-group (Score_element*s,String n)
-{
- Group_interface gi (s,n);
- return gi;
-}
-
-Group_interface
-group (Score_element*s)
+void
+Pointer_group_interface::add_grob (Grob*me, SCM name, Grob*p)
{
- Group_interface gi (s);
- return gi;
+ Group_interface::add_thing (me, name, p->self_scm ());
}