+ if (request_suicide (me, start, end))
+ return ly_interval2scm (Interval ());
+
+ return ly_interval2scm (Axis_group_interface::pure_group_height (me, start, end));
+}
+
+/* there is probably a way that doesn't involve re-implementing a binary
+ search (I would love some proper closures right now) */
+bool find_in_range (SCM vector, int low, int hi, int min, int max)
+{
+ if (low >= hi)
+ return false;
+
+ int mid = low + (hi - low) / 2;
+ int val = scm_to_int (scm_c_vector_ref (vector, mid));
+ if (val >= min && val <= max)
+ return true;
+ else if (val < min)
+ return find_in_range (vector, mid + 1, hi, min, max);
+ return find_in_range (vector, low, mid, min, max);
+}
+
+bool
+Hara_kiri_group_spanner::request_suicide (Grob *me, int start, int end)
+{
+ extract_grob_set (me, "make-dead-when", foes);
+ for (vsize i = 0; i < foes.size (); i++)
+ if (foes[i]->is_live () && !request_suicide_alone (foes[i], start, end))
+ return true;
+
+ if (!request_suicide_alone (me, start, end))
+ return false;
+
+ extract_grob_set (me, "keep-alive-with", friends);
+ for (vsize i = 0; i < friends.size (); ++i)
+ if (friends[i]->is_live () && !request_suicide_alone (friends[i], start, end))
+ return false;
+
+ return true;
+}
+
+bool
+Hara_kiri_group_spanner::request_suicide_alone (Grob *me, int start, int end)
+{
+ if (!to_boolean (me->get_property ("remove-empty")))
+ return false;