#include <string.h>
+#include "group-interface.hh"
#include "misc.hh"
#include "paper-score.hh"
#include "paper-def.hh"
#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()
element_property_alist_ = SCM_EOL;
smobify_self ();
+
+
+ set_elt_property ("dependencies", SCM_EOL);
}
SCM ly_deep_copy (SCM);
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_;
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
SCM s = scm_assq(sym, element_property_alist_);
if (s != SCM_BOOL_F)
- return SCM_CDR (s);
+ return gh_cdr (s);
if (pscore_l_)
{
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();
Paper_def*
Score_element::paper_l () const
{
- return pscore_l_->paper_l_;
+ return pscore_l_ ? pscore_l_->paper_l_ : 0;
}
Lookup const *
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++)
void
Score_element::do_break_processing()
{
- handle_broken_dependencies();
}
void
{
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");
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;
}
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);
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);
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
}
-/*
- JUNKME
- */
-void
-Score_element::invalidate_cache (Axis a)
-{
- dim_cache_[a]->invalidate ();
-}
-
Score_element*
Score_element::parent_l (Axis a) const
{