]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/score-element.cc
release: 1.3.13
[lilypond.git] / lily / score-element.cc
index 5e958affaa55c2e37e07620603939f6750690ddf..7e0c8e60b10ac4eab8ba28c92be88ef8cdfe3c4e 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <string.h>
 
+#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<Score_element> 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<Score_element> 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<Score_element> 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 ("#<Score_element ", port);
   scm_puts ((char *)sc->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
 {