2 tweak-registration.cc -- implement Tweak_registry
4 source file of the GNU LilyPond music typesetter
6 (c) 2004--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
9 #include "tweak-registration.hh"
11 #include "object-key-undumper.hh"
14 #include "ly-smobs.icc"
16 Tweak_registry::Tweak_registry ()
20 undumper_ = new Object_key_undumper ();
21 scm_gc_unprotect_object (undumper_->self_scm ());
24 Tweak_registry::~Tweak_registry ()
29 Tweak_registry::clear ()
32 undumper_ = new Object_key_undumper ();
33 scm_gc_unprotect_object (undumper_->self_scm ());
37 Tweak_registry::insert_tweak_from_file (SCM tweak)
39 SCM skey = scm_car (tweak);
41 assert (scm_is_pair (skey)
42 && scm_car (skey) == ly_symbol2scm ("key"));
44 Object_key const *key = undumper_->get_key (scm_to_int (scm_cadr (skey)));
46 SCM existing = SCM_EOL;
47 Tweak_map::const_iterator prev = tweaks_.find (key);
48 if (prev != tweaks_.end ())
49 existing = (*prev).second;
51 tweaks_[key] = scm_cons (scm_cdr (tweak), existing);
55 Tweak_registry::insert_grob_tweak (Grob *g, SCM tweak)
57 Object_key const *key = g->get_key ();
58 if (tweaks_.find (key) == tweaks_.end ())
59 tweaks_[key] = SCM_EOL;
61 tweaks_[key] = scm_cons (tweak, tweaks_[key]);
65 Tweak_registry::replace_grob_tweak (Grob *g, SCM tweak)
67 Object_key const *key = g->get_key ();
68 tweaks_[key] = scm_cons (tweak, SCM_EOL);
72 Tweak_registry::get_tweaks (Grob *g)
74 Object_key const *key = g->get_key ();
75 if (tweaks_.find (key) == tweaks_.end ())
81 Tweak_registry::list_tweaks ()
84 for (Tweak_map::const_iterator i (tweaks_.begin ());
88 Object_key const *key = (*i).first;
89 for (SCM t = (*i).second; scm_is_pair (t); t = scm_cdr (t))
90 retval = scm_cons (scm_cons (key->self_scm (), scm_car (t)), retval);
97 Tweak_registry::mark_smob (SCM smob)
99 Tweak_registry *me = (Tweak_registry *) SCM_CELL_WORD_1 (smob);
101 for (Tweak_map::const_iterator i (me->tweaks_.begin ());
102 i != me->tweaks_.end ();
105 scm_gc_mark ((*i).first->self_scm ());
106 scm_gc_mark ((*i).second);
110 scm_gc_mark (me->undumper_->self_scm ());
116 Tweak_registry::print_smob (SCM smob, SCM port, scm_print_state*)
118 (void) smob; // smother warning.
119 scm_puts ("#<Tweak_registry>", port);
123 Object_key_undumper *
124 Tweak_registry::undumper () const
129 IMPLEMENT_DEFAULT_EQUAL_P (Tweak_registry);
130 IMPLEMENT_SMOBS (Tweak_registry);
132 Tweak_registry *global_registry_;
135 init_global_tweak_registry ()
137 global_registry_ = new Tweak_registry ();