#include "grob.hh"
+/*
+ This special add_thing routine is slightly more efficient than
+
+ set_prop (name,cons (thing, get_prop (name)))
+
+ since it can reuse the handle returned by scm_assq().
+*/
+
void
-Group_interface::add_thing (Grob*me, String name, SCM s)
+Group_interface::add_thing (Grob*me, SCM sym, SCM thing)
{
- me->set_grob_property (name.ch_C (),
- gh_cons (s, me->get_grob_property (name.ch_C ())));
+ 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 (Grob*me, String name, SCM thing)
+{
+ add_thing (me, ly_symbol2scm (name.ch_C()), thing);
+}
int
Group_interface::count (Grob *me, String name)
void
-Pointer_group_interface::add_element (Grob*me, String name, Grob*p)
+Pointer_group_interface::add_element (Grob*me, SCM name, Grob*p)
{
Group_interface::add_thing (me, name, p->self_scm ());
}