]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/lilypond-key.cc
* mf/feta-macros.mf (soft_start_penstroke, soft_end_penstroke): New
[lilypond.git] / lily / lilypond-key.cc
index df8d027caf2a9850e8ebe1c62fc02dbb7714082e..bf05aebf3cc1d5a78515d37312865345f7fd807e 100644 (file)
@@ -7,8 +7,6 @@
 
 */
 
-
-#include "object-key.hh"
 #include "lilypond-key.hh"
 
 Lilypond_grob_key::Lilypond_grob_key (Object_key const *context,
@@ -28,6 +26,7 @@ Lilypond_grob_key::derived_mark () const
   scm_gc_mark (context_->self_scm ());
 }
 
+// todo: reverse order of comparison for efficiency reasons.
 int
 Lilypond_grob_key::do_compare (Object_key const* key) const
 {
@@ -60,8 +59,28 @@ Lilypond_grob_key::get_type () const
   return GROB_KEY;
 }
 
-/****************************************************************/
 
+SCM
+Lilypond_grob_key::as_scheme () const
+{
+  return scm_list_4 (context_ ? context_->self_scm() : SCM_BOOL_F,
+                    creation_moment_.smobbed_copy(),
+                    scm_makfrom0str (grob_name_.to_str0()),
+                    scm_from_int (disambiguation_count_)); 
+}
+
+
+Object_key *
+Lilypond_grob_key::from_scheme (SCM a) 
+{
+  return new Lilypond_grob_key (unsmob_key (scm_car (a)),
+                               *unsmob_moment (scm_cadr (a)),
+                               ly_scm2string  (scm_caddr (a)),
+                               scm_to_int  (scm_list_ref (a, scm_from_int (3))));
+}
+
+
+/****************************************************************/
 
 void
 Lilypond_context_key::derived_mark () const
@@ -91,12 +110,17 @@ Lilypond_context_key::do_compare (Object_key const *key) const
     = dynamic_cast<Lilypond_context_key const*> (key); 
 
   int c;
-  if (parent_context_)
+  if (parent_context_ && other->parent_context_)
     {
       c = parent_context_->compare (other->parent_context_);
       if (c)
        return c;
     }
+  else if (parent_context_)
+    return -1 ;
+  else if (other->parent_context_)
+    return 1;
+  
   
   c = Moment::compare (start_moment_, other->start_moment_);
   if (c)
@@ -122,3 +146,90 @@ Lilypond_context_key::get_type () const
 {
   return CONTEXT_KEY;
 }
+
+
+SCM
+Lilypond_context_key::as_scheme () const
+{
+  return scm_list_5 (parent_context_ ? parent_context_->self_scm() : SCM_BOOL_F,
+                    start_moment_.smobbed_copy(),
+                    scm_makfrom0str (context_name_.to_str0()),
+                    scm_makfrom0str (id_.to_str0()),
+                    scm_from_int (disambiguation_count_)); 
+}
+
+Object_key *
+Lilypond_context_key::from_scheme (SCM a) 
+{
+  return new Lilypond_context_key (unsmob_key (scm_car (a)),
+                                  *unsmob_moment (scm_cadr (a)),
+                                  ly_scm2string  (scm_list_ref (a, scm_from_int (2))),
+                                  ly_scm2string  (scm_list_ref (a, scm_from_int (3))),
+                                  scm_to_int  (scm_list_ref (a, scm_from_int (4))));
+}
+
+
+/****************************************************************/
+
+int
+Lilypond_general_key::get_type () const
+{
+  return GENERAL_KEY;
+}
+
+void
+Lilypond_general_key::derived_mark () const
+{
+  if (parent_)
+    scm_gc_mark (parent_->self_scm ());
+}
+
+Lilypond_general_key::Lilypond_general_key (Object_key const*parent,
+                                           String name,
+                                           int count)
+{
+  parent_ = parent;
+  name_ = name;
+  disambiguation_count_ = count; 
+}
+
+
+int
+Lilypond_general_key::do_compare (Object_key const* key)const
+{
+  Lilypond_general_key const* other
+    = dynamic_cast<Lilypond_general_key const*> (key);
+
+  if (parent_ && other->parent_)
+    parent_->compare (other->parent_);
+  else if (parent_)
+    return -1 ;
+  else if (other->parent_)
+    return 1;
+
+  int c = String::compare (name_, other->name_);
+  if (c)
+    return c;
+
+  c = sign (disambiguation_count_ - other->disambiguation_count_);
+  if (c)
+    return c;
+
+  return 0;  
+}
+
+SCM
+Lilypond_general_key::as_scheme () const
+{
+  return scm_list_3 (parent_ ? parent_->self_scm() : SCM_BOOL_F,
+                    scm_makfrom0str (name_.to_str0()),
+                    scm_from_int (disambiguation_count_)); 
+}
+
+Object_key *
+Lilypond_general_key::from_scheme (SCM a) 
+{
+  return new Lilypond_general_key (unsmob_key (scm_car (a)),
+                                  ly_scm2string  (scm_list_ref (a, scm_from_int (1))),
+                                  scm_to_int  (scm_list_ref (a, scm_from_int (2))));
+}