2 object-key.cc -- implement Object_key
4 source file of the GNU LilyPond music typesetter
6 (c) 2004--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
9 #include "lilypond-key.hh"
10 #include "ly-smobs.icc"
13 Object_key::mark_smob (SCM key)
15 Object_key *k = (Object_key *) SCM_CELL_WORD_1 (key);
21 Object_key::derived_mark () const
25 Object_key::~Object_key ()
30 Object_key::get_type () const
36 Object_key::print_smob (SCM smob, SCM port, scm_print_state*)
38 Object_key *k = (Object_key *) SCM_CELL_WORD_1 (smob);
39 scm_puts ("#<Object_key ", port);
40 scm_display (scm_from_int (k->get_type ()), port);
45 Object_key::Object_key ()
51 Object_key::compare (Object_key const *other) const
56 int c = sign (get_type () - other->get_type ());
60 return do_compare (other);
63 IMPLEMENT_SMOBS (Object_key);
66 Object_key::equal_p (SCM a, SCM b)
68 Object_key *ka = unsmob_key (a);
69 Object_key *kb = unsmob_key (b);
71 return (ka->compare (kb)) ? SCM_BOOL_F : SCM_BOOL_T;
75 Object_key::do_compare (Object_key const *) const
81 Object_key::dump () const
83 return scm_cons (scm_from_int (get_type ()),
88 Object_key::as_scheme () const
94 Object_key::from_scheme (SCM)
96 return new Object_key ();
99 struct Object_dumper_table_entry
101 Object_key_type type_;
102 Object_key *(*ctor_) (SCM);
105 static Object_dumper_table_entry undumpers[]
107 {BASE_KEY, Object_key::from_scheme},
108 {COPIED_KEY, Copied_key::from_scheme},
109 {GENERAL_KEY, Lilypond_general_key::from_scheme},
110 {GROB_KEY, Lilypond_grob_key::from_scheme},
111 {CONTEXT_KEY, Lilypond_context_key::from_scheme},
116 Object_key::undump (SCM scm_key)
118 int t = scm_to_int (scm_car (scm_key));
119 assert (t == undumpers[t].type_);
120 return (undumpers[t].ctor_) (scm_cdr (scm_key));
123 /****************************************************************/
125 Copied_key::Copied_key (Object_key const *key, int count)
132 Copied_key::get_type () const
138 Copied_key::do_compare (Object_key const *key) const
140 Copied_key const *other = dynamic_cast<Copied_key const *> (key);
142 int c = original_->compare (other->original_);
146 return sign (copy_count_ - other->copy_count_);
150 Copied_key::derived_mark () const
152 scm_gc_mark (original_->self_scm ());
156 Copied_key::as_scheme () const
158 return scm_list_2 (original_
159 ? original_->self_scm ()
160 : SCM_BOOL_F, scm_from_int (copy_count_));
164 Copied_key::from_scheme (SCM a)
166 return new Copied_key (unsmob_key (scm_car (a)),
167 scm_to_int (scm_list_ref (a, scm_from_int (1))));