Tie::less (Grob *g1, Grob *g2)
{
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 (s1 && s2) {
- return get_position (s1) < get_position (s2);
- }
+ if (!s2)
+ {
+ g2->programming_error ("grob is not a tie");
+ return true;
+ }
- programming_error ("grob is not a tie");
- return false;
+ return get_position (s1) < get_position (s2);
}
void
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
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]
(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;
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"));
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
)
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
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);