]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/tie.cc
Issue 5167/6: Changes: show \markup xxx = ... \etc assignments
[lilypond.git] / lily / tie.cc
index 47c5a1c9cfb9809b1d58b6f0186a069dff9bcc9d..dcc53ad44e61c7af5ee5522ce3d8b18a19b56eb4 100644 (file)
 #include "semi-tie-column.hh"
 
 bool
-Tie::less (Grob *const &s1, Grob *const &s2)
+Tie::less (Grob *g1, Grob *g2)
 {
-  return get_position_generic (s1) < get_position_generic (s2);
+  Spanner *s1 = dynamic_cast<Spanner *> (g1);
+  if (!s1)
+    {
+      g1->programming_error ("grob is not a tie");
+      return false;
+    }
+
+  Spanner *s2 = dynamic_cast<Spanner *> (g2);
+  if (!s2)
+    {
+      g2->programming_error ("grob is not a tie");
+      return true;
+    }
+
+  return get_position (s1) < get_position (s2);
 }
 
 void
@@ -57,7 +71,7 @@ Item *
 Tie::head (Spanner *me, Direction d)
 {
   Item *it = me->get_bound (d);
-  return Note_head::has_interface (it) ? it : 0;
+  return has_interface<Note_head> (it) ? it : 0;
 }
 
 int
@@ -86,21 +100,6 @@ Tie::get_position (Spanner *me)
   return 0;
 }
 
-int
-Tie::get_position_generic (Grob *me) // TODO: do away with this
-{
-  Spanner *spanner = dynamic_cast<Spanner *> (me);
-  if (spanner)
-    return get_position (spanner);
-
-  Item *item = dynamic_cast<Item *> (me);
-  if (item)
-    return Semi_tie::get_position (item);
-
-  programming_error ("grob is neither a tie nor a semi-tie");
-  return 0;
-}
-
 /*
   Default:  Put the tie oppositie of the stem [Wanske p231]
 
@@ -112,20 +111,14 @@ Tie::get_position_generic (Grob *me) // TODO: do away with this
   (what about linebreaks? )
 */
 Direction
-Tie::get_default_dir (Grob *me)
+Tie::get_default_dir (Spanner *me)
 {
   Drul_array<Grob *> stems;
   for (LEFT_and_RIGHT (d))
     {
-      Grob *one_head = 0;
-      if (Spanner *spanner = dynamic_cast<Spanner *> (me))
-        {
-          one_head = head (spanner, d);
-          if (!one_head)
-            one_head = head (spanner->broken_neighbor (d), d);
-        }
-      else if (Item *item = dynamic_cast<Item *> (me))
-        one_head = Semi_tie::head (item);
+      Grob *one_head = head (me, d);
+      if (!one_head)
+        one_head = head (me->broken_neighbor (d), d);
 
       Grob *stem = one_head ? Rhythmic_head::get_stem (one_head) : 0;
       stems[d] = (stem && !Stem::is_invisible (stem)) ? stem : 0;
@@ -146,7 +139,7 @@ Tie::get_default_dir (Grob *me)
     return -get_grob_direction (stems[LEFT]);
   else if (stems[RIGHT])
     return -get_grob_direction (stems[RIGHT]);
-  else if (int p = get_position_generic (me))
+  else if (int p = get_position (me))
     return Direction (sign (p));
 
   return to_dir (me->get_property ("neutral-direction"));
@@ -156,10 +149,12 @@ MAKE_SCHEME_CALLBACK (Tie, calc_direction, 1);
 SCM
 Tie::calc_direction (SCM smob)
 {
+  // In this method, Tie and Semi_tie require the same logic with different
+  // types.  It might be clearer to use a template.
   Grob *me = unsmob<Grob> (smob);
   Grob *yparent = me->get_parent (Y_AXIS);
-  if ((Tie_column::has_interface (yparent)
-       || Semi_tie_column::has_interface (yparent))
+  if ((has_interface<Tie_column> (yparent)
+       || has_interface<Semi_tie_column> (yparent))
       && unsmob<Grob_array> (yparent->get_object ("ties"))
       //      && unsmob<Grob_array> (yparent->get_object ("ties"))->size () > 1
      )
@@ -169,8 +164,10 @@ Tie::calc_direction (SCM smob)
 
       return me->get_property_data ("direction");
     }
-  else
-    return scm_from_int (Tie::get_default_dir (me));
+
+  programming_error ("no Tie_column or Semi_tie_column.  Killing grob.");
+  me->suicide ();
+  return scm_from_int (CENTER);
 }
 
 SCM
@@ -219,8 +216,8 @@ Tie::calc_control_points (SCM smob)
   Spanner *me = LY_ASSERT_SMOB(Spanner, smob, 1);
 
   Grob *yparent = me->get_parent (Y_AXIS);
-  if ((Tie_column::has_interface (yparent)
-       || Semi_tie_column::has_interface (yparent))
+  if ((has_interface<Tie_column> (yparent)
+       || has_interface<Semi_tie_column> (yparent))
       && unsmob<Grob_array> (yparent->get_object ("ties")))
     {
       extract_grob_set (yparent, "ties", ties);