X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fscore-element.cc;h=7e0c8e60b10ac4eab8ba28c92be88ef8cdfe3c4e;hb=fd7e615444cf58b38283a59b56d3457c07778397;hp=5e958affaa55c2e37e07620603939f6750690ddf;hpb=f9eafe65e3d281e6cd07a25d8b6b19cc1eada1de;p=lilypond.git diff --git a/lily/score-element.cc b/lily/score-element.cc index 5e958affaa..7e0c8e60b1 100644 --- a/lily/score-element.cc +++ b/lily/score-element.cc @@ -9,6 +9,7 @@ #include +#include "group-interface.hh" #include "misc.hh" #include "paper-score.hh" #include "paper-def.hh" @@ -24,7 +25,7 @@ #include "misc.hh" #include "paper-outputter.hh" #include "dimension-cache.hh" -#include "staff-side.hh" +#include "side-position-interface.hh" #include "item.hh" Score_element::Score_element() @@ -47,6 +48,9 @@ Score_element::Score_element() element_property_alist_ = SCM_EOL; smobify_self (); + + + set_elt_property ("dependencies", SCM_EOL); } SCM ly_deep_copy (SCM); @@ -77,7 +81,7 @@ Score_element::Score_element (Score_element const&s) should protect because smobify_self () might trigger GC. */ element_property_alist_ = scm_protect_object (ly_deep_copy (s.element_property_alist_)); - dependency_arr_ = s.dependency_arr_; + output_p_ =0; status_i_ = s.status_i_; lookup_l_ = s.lookup_l_; @@ -96,17 +100,6 @@ Score_element::~Score_element() delete dim_cache_[Y_AXIS]; } -Score_element* -Score_element::dependency (int i) const -{ - return dependency_arr_ [i]; -} - -int -Score_element::dependency_size () const -{ - return dependency_arr_.size (); -} Real Score_element::get_real (String s) const @@ -128,7 +121,7 @@ Score_element::get_elt_property (String nm) const SCM s = scm_assq(sym, element_property_alist_); if (s != SCM_BOOL_F) - return SCM_CDR (s); + return gh_cdr (s); if (pscore_l_) { @@ -184,7 +177,6 @@ Score_element::print() const if (flower_dstream && !flower_dstream->silent_b ("Score_element")) ly_display_scm (element_property_alist_); - DEBUG_OUT << "dependencies: " << dependency_size(); if (original_l_) DEBUG_OUT << "Copy "; do_print(); @@ -196,7 +188,7 @@ Score_element::print() const Paper_def* Score_element::paper_l () const { - return pscore_l_->paper_l_; + return pscore_l_ ? pscore_l_->paper_l_ : 0; } Lookup const * @@ -256,8 +248,11 @@ Score_element::calculate_dependencies (int final, int busy, assert (status_i_!= busy); status_i_= busy; - for (int i=0; i < dependency_arr_.size(); i++) - dependency_arr_[i]->calculate_dependencies (final, busy, funcptr); + Link_array dependency_arr = + Group_interface__extract_elements (this, (Score_element*)0, "dependencies"); + + for (int i=0; i < dependency_arr.size(); i++) + dependency_arr[i]->calculate_dependencies (final, busy, funcptr); Link_array extra (get_extra_dependencies()); for (int i=0; i < extra.size(); i++) @@ -304,7 +299,6 @@ Score_element::output_processing () void Score_element::do_break_processing() { - handle_broken_dependencies(); } void @@ -356,8 +350,8 @@ Score_element::add_dependency (Score_element*e) { if (e) { - dependency_arr_.push (e); - e->used_b_ = true; + Group_interface gi (this, "dependencies"); + gi.add_element (e); } else programming_error ("Null dependency added"); @@ -411,62 +405,26 @@ Score_element::handle_broken_smobs (SCM s, SCM criterion) gh_set_car_x (s, handle_broken_smobs (gh_car (s), criterion)); gh_set_cdr_x (s, handle_broken_smobs (gh_cdr (s), criterion)); - if (gh_car (s) == SCM_UNDEFINED && gh_list_p (gh_cdr(s))) - return gh_cdr (s); - } - return s; -} + SCM c = gh_cdr(s); -void -Score_element::recurse_into_smobs (SCM s, void (Score_element::*meth_ptr)()) -{ - Score_element * sc = unsmob_element ( s); - if (sc) - { - (sc->*meth_ptr) (); - } - else if (gh_pair_p (s)) - { - recurse_into_smobs (gh_car (s), meth_ptr); - recurse_into_smobs (gh_cdr (s), meth_ptr); + // gh_list_p () is linear, this is O(1) + bool list = gh_pair_p (c) || c == SCM_EOL; + + if (gh_car (s) == SCM_UNDEFINED && list) + return c; } + return s; } void Score_element::handle_broken_dependencies() { Line_of_score *line = line_l(); - - SCM rec = get_elt_property ("handle-broken-deps"); - if (gh_boolean_p (rec) && gh_scm2bool (rec)) - return; - - set_elt_property ("handle-broken-deps", SCM_BOOL_T); element_property_alist_ = handle_broken_smobs (element_property_alist_, line ? line->self_scm_ : SCM_UNDEFINED); - - recurse_into_smobs (element_property_alist_, - &Score_element::handle_broken_dependencies); - if (!line) return; - - - Link_array new_deps; - - for (int i=0; i < dependency_size(); i++) - { - Score_element * elt = dependency (i); - if (elt->line_l() != line) - { - Score_element * broken = elt->find_broken_piece (line); - elt = broken ; - } - if (elt) - new_deps.push (elt); - } - dependency_arr_ = new_deps; } @@ -515,7 +473,7 @@ Score_element::find_broken_piece (Line_of_score*) const SCM Score_element::mark_smob (SCM ses) { - void * mp = (void*) SCM_CDR(ses); + void * mp = (void*) gh_cdr(ses); Score_element * s = (Score_element*) mp; assert (s->self_scm_ == ses); @@ -526,7 +484,7 @@ Score_element::mark_smob (SCM ses) int Score_element::print_smob (SCM s, SCM port, scm_print_state *) { - Score_element *sc = (Score_element *) SCM_CDR (s); + Score_element *sc = (Score_element *) gh_cdr (s); scm_puts ("#name (), port); @@ -548,7 +506,7 @@ IMPLEMENT_SMOBS(Score_element); SCM Score_element::equal_p (SCM a, SCM b) { - return SCM_CDR(a) == SCM_CDR(b) ? SCM_BOOL_T : SCM_BOOL_F; + return gh_cdr(a) == gh_cdr(b) ? SCM_BOOL_T : SCM_BOOL_F; } void @@ -602,15 +560,6 @@ unsmob_element (SCM s) } -/* - JUNKME - */ -void -Score_element::invalidate_cache (Axis a) -{ - dim_cache_[a]->invalidate (); -} - Score_element* Score_element::parent_l (Axis a) const {