2 Implement storage and manipulation of grob properties.
9 #include "input-smob.hh"
10 #include "group-interface.hh"
12 #include "paper-score.hh"
13 #include "paper-def.hh"
22 Grob::get_property_alist_chain (SCM def
) const
24 return scm_list_n (mutable_property_alist_
,
25 immutable_property_alist_
,
33 This special add_thing routine is slightly more efficient than
35 set_prop (name,cons (thing, get_prop (name)))
37 since it can reuse the handle returned by scm_assq().
40 Grob::add_to_list_property (SCM sym
, SCM thing
)
43 = scm_sloppy_assq (sym
, mutable_property_alist_
)
46 if (handle
!= SCM_BOOL_F
)
48 gh_set_cdr_x (handle
, gh_cons (thing
, gh_cdr (handle
)));
53 There is no mutable prop yet, so create an entry, and put it in front of the
56 handle
= scm_sloppy_assq (sym
, immutable_property_alist_
);
57 SCM tail
= (handle
!= SCM_BOOL_F
) ? gh_cdr(handle
) : SCM_EOL
;
58 SCM val
= gh_cons (thing
, tail
);
60 mutable_property_alist_
= gh_cons (gh_cons (sym
, val
),
61 mutable_property_alist_
);
66 extern void check_interfaces_for_property (Grob
const *me
, SCM sym
);
69 Grob::internal_set_grob_property (SCM s
, SCM v
)
71 /* Perhaps we simply do the assq_set, but what the heck. */
75 if (internal_type_checking_global_b
)
77 if (!type_check_assignment (s
, v
, ly_symbol2scm ("backend-type?")))
79 check_interfaces_for_property (this, s
);
82 mutable_property_alist_
= scm_assq_set_x (mutable_property_alist_
, s
, v
);
87 Grob::internal_get_grob_property (SCM sym
) const
89 SCM s
= scm_sloppy_assq (sym
, mutable_property_alist_
);
93 s
= scm_sloppy_assq (sym
, immutable_property_alist_
);
95 if (internal_type_checking_global_b
&& gh_pair_p (s
))
97 if (!type_check_assignment (sym
, gh_cdr (s
),
98 ly_symbol2scm ("backend-type?")))
100 check_interfaces_for_property (this, sym
);
103 return (s
== SCM_BOOL_F
) ? SCM_EOL
: ly_cdr (s
);
107 Grob::substitute_mutable_properties (SCM crit
, SCM orig
)
109 set_break_subsititution(crit
);
110 mutable_property_alist_
= substitute_mutable_property_alist (orig
);
117 return immutable_property_alist_
!= SCM_EOL
;