+1.3.1.3.54.hwn1
+===========
+
+* Massive search replace patch: store pointers and properties
+separately, in preparation of property collapse.
+
1.3.53.uu1
==========
MAJOR_VERSION=1
MINOR_VERSION=3
PATCH_LEVEL=54
-MY_PATCH_LEVEL=
+MY_PATCH_LEVEL=hwn1
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
Real
Align_interface::center_on_element (Score_element const *me, Axis a)
{
- Score_element *cent = unsmob_element (me->get_elt_property ("group-center-element"));
+ Score_element *cent = unsmob_element (me->get_elt_pointer ("group-center-element"));
if (cent)
{
Link_array<Score_element> elems;
Link_array<Score_element> all_elts
- = Group_interface__extract_elements ( elt_l_, (Score_element*) 0, "elements");
+ = Pointer_group_interface__extract_elements ( elt_l_, (Score_element*) 0, "elements");
for (int i=0; i < all_elts.size(); i++)
{
Interval y = all_elts[i]->extent(a) + all_elts[i]->relative_coordinate (elt_l_, a);
int
Align_interface::get_count (Score_element*s)const
{
- SCM e = elt_l_->get_elt_property ("elements");
+ SCM e = elt_l_->get_elt_pointer ("elements");
int c =0;
while (gh_pair_p (e))
{
e->set_parent (elt_l_, a);
}
- Group_interface (elt_l_).add_element (e);
+ Pointer_group_interface (elt_l_).add_element (e);
elt_l_->add_dependency (e);
}
{
Score_element * common =(Score_element*) me;
- for (SCM s = me->get_elt_property ("elements"); gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = me->get_elt_pointer ("elements"); gh_pair_p (s); s = gh_cdr (s))
{
Score_element * se = unsmob_element (gh_car (s));
common = se->common_refpoint (common, a);
}
Real my_coord = me->relative_coordinate (common, a);
- Interval r (relative_group_extent (a, common, me->get_elt_property ("elements")));
+ Interval r (relative_group_extent (a, common, me->get_elt_pointer ("elements")));
return r - my_coord;
}
{
if (!has_interface_b ())
{
- elt_l_->set_elt_property ("elements", SCM_EOL);
+ elt_l_->set_elt_pointer ("elements", SCM_EOL);
elt_l_->set_elt_property ("transparent", SCM_BOOL_T); // junk this?
elt_l_->set_elt_property ("axes" , SCM_EOL);
- group (elt_l_, "interfaces").add_thing (ly_symbol2scm ("Axis_group"));
+ Group_interface (elt_l_, "interfaces").add_thing (ly_symbol2scm ("Axis_group"));
}
}
if (!has_interface_b ())
return childs;
- for (SCM ep = elt_l_->get_elt_property ("elements"); gh_pair_p (ep); ep = gh_cdr (ep))
+ for (SCM ep = elt_l_->get_elt_pointer ("elements"); gh_pair_p (ep); ep = gh_cdr (ep))
{
Score_element* e = unsmob_element (gh_car (ep));
if (e)
{
if (text_p_)
{
- text_p_->set_elt_property ("side-support", staffs_);
+ text_p_->set_elt_pointer ("side-support", staffs_);
typeset_element (text_p_);
text_p_ =0;
}
Beam::Beam ()
{
- Group_interface g (this, "stems");
+ Pointer_group_interface g (this, "stems");
g.set_interface ();
set_elt_property ("height", gh_int2scm (0)); // ugh.
void
Beam::add_stem (Stem*s)
{
- Group_interface gi (this, "stems");
+ Pointer_group_interface gi (this, "stems");
gi.add_element (s);
s->add_dependency (this);
assert (!s->beam_l ());
- s->set_elt_property ("beam", self_scm_);
+ s->set_elt_pointer ("beam", self_scm_);
if (!get_bound (LEFT))
set_bound (LEFT,s);
Beam::get_multiplicity () const
{
int m = 0;
- for (SCM s = get_elt_property ("stems"); gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = get_elt_pointer ("stems"); gh_pair_p (s); s = gh_cdr (s))
{
Score_element * sc = unsmob_element (gh_car (s));
Stem *
Beam::stem (int i) const
{
- return Group_interface__extract_elements ((Beam*) this, (Stem*) 0, "stems")[i];
+ return Pointer_group_interface__extract_elements ((Beam*) this, (Stem*) 0, "stems")[i];
}
int
Beam::stem_count () const
{
- Group_interface gi (this, "stems");
+ Pointer_group_interface gi (this, "stems");
return gi.count ();
}
Stem*
Beam::stem_top () const
{
- SCM s = get_elt_property ("stems");
+ SCM s = get_elt_pointer ("stems");
return gh_pair_p (s) ? dynamic_cast<Stem*> (unsmob_element (gh_car (s))) : 0;
}
*/
edge->set_extent_callback (Score_element::point_dimension_callback,X_AXIS);
- align_l_->set_elt_property ("group-center-element", edge->self_scm_);
+ align_l_->set_elt_pointer ("group-center-element", edge->self_scm_);
announce_element (Score_element_info(edge, 0));
column_alist_ = scm_assoc_set_x (column_alist_, edge_sym, edge->self_scm_);
Real interline= paper_l ()->get_var ("interline");
Link_array<Score_element> elems;
Link_array<Score_element> all_elems
- = Group_interface__extract_elements (this, (Score_element*)0,
+ = Pointer_group_interface__extract_elements (this, (Score_element*)0,
"elements");
for (int i=0; i < all_elems.size(); i++)
Drul_array<Array<int> > shifts;
SCM tups = SCM_EOL;
- SCM s = get_elt_property ("elements");
+ SCM s = get_elt_pointer ("elements");
for (; gh_pair_p (s); s = gh_cdr (s))
{
SCM car = gh_car (s);
{
SCM tups = SCM_EOL;
- SCM s = get_elt_property ("elements");
+ SCM s = get_elt_pointer ("elements");
for (; gh_pair_p (s); s = gh_cdr (s))
{
- Score_element * se = unsmob_element ( gh_car (s));
+ Score_element * se = unsmob_element (gh_car (s));
SCM force = se->remove_elt_property ("force-hshift");
if (gh_number_p (force))
void
Dot_column::add_dots (Dots *d)
{
- Group_interface gi (this, "dots");
+ Pointer_group_interface gi (this, "dots");
gi.add_element (d);
add_dependency (d);
Dot_column::Dot_column ()
{
- Group_interface gi (this, "dots");
+ Pointer_group_interface gi (this, "dots");
gi.set_interface ();
directional_element (this).set (RIGHT);
void
Dot_column::after_line_breaking ()
{
- Link_array<Dots> dots = Group_interface__extract_elements (this, (Dots*)0 , "dots");
+ Link_array<Dots> dots = Pointer_group_interface__extract_elements (this, (Dots*)0 , "dots");
dots.sort (Dot_column::compare);
if (dots.size () < 2)
void
Dynamic_engraver::announce_element (Score_element_info i)
{
- group (i.elem_l_, "interfaces").add_thing (ly_symbol2scm ("dynamic"));
+ Group_interface (i.elem_l_, "interfaces").add_thing (ly_symbol2scm ("dynamic"));
Engraver::announce_element (i);
}
Score_element * e = i.elem_l_;
if (e->get_elt_property ("interfaces") == SCM_EOL)
- group (e, "interfaces").add_thing (ly_symbol2scm (e->name()));
+ Group_interface (e, "interfaces").add_thing (ly_symbol2scm (e->name()));
if (!i.origin_trans_l_)
i.origin_trans_l_ = this;
}
-void
-Group_interface::add_element (Score_element*p)
-{
- p->used_b_ = true;
- elt_l_->used_b_ = true;
-
- add_thing (p->self_scm_);
-}
void
Group_interface::add_thing (SCM s)
}
}
-Group_interface
-group (Score_element*s,String n)
-{
- Group_interface gi (s,n);
- return gi;
-}
-
-Group_interface
-group (Score_element*s)
-{
- Group_interface gi (s);
- return gi;
-}
Hara_kiri_group_spanner::Hara_kiri_group_spanner()
{
- set_elt_property ("items-worth-living", SCM_EOL);
+ set_elt_pointer ("items-worth-living", SCM_EOL);
}
void
Hara_kiri_group_spanner::add_interesting_item (Item* n)
{
add_dependency (n);
- set_elt_property ("items-worth-living",
- gh_cons (n->self_scm_,
- get_elt_property ("items-worth-living")));
+ Pointer_group_interface (this, "items-worth-living").add_element (n);
}
void
Hara_kiri_group_spanner::after_line_breaking ()
{
- SCM worth = get_elt_property ("items-worth-living");
+ SCM worth = get_elt_pointer ("items-worth-living");
if (gh_pair_p (worth))
return;
void add_thing (SCM);
bool has_interface_b ();
void set_interface ();
- void add_element (Score_element*);
};
-Group_interface group (Score_element*);
-Group_interface group (Score_element*, String);
-
+struct Pointer_group_interface {
+ Score_element * elt_l_;
+ String name_;
+public:
+ Pointer_group_interface (Score_element const*);
+ Pointer_group_interface (Score_element const*, String);
+ int count ();
+ void set_interface ();
+ bool has_interface_b ();
+ void add_element (Score_element*);
+};
/**
Put all score elements of ELT's property called NAME into an array,
and return it. */
template<class T>
Link_array<T>
-Group_interface__extract_elements (Score_element const *elt, T *, String name)
+Pointer_group_interface__extract_elements (Score_element const *elt, T *, const char* name)
{
Link_array<T> arr;
- for (SCM s = elt->get_elt_property (name); gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = elt->get_elt_pointer (name); gh_pair_p (s); s = gh_cdr (s))
{
SCM e = gh_car (s);
assert (SMOB_IS_TYPE_B(Score_element,e));
The lookup, determined by the font size. Cache this value.
*/
Lookup * lookup_l_;
-public:
+
/**
properties specific for this element. Destructor will not call
scm_unprotect, so as to allow more flexible GC arrangements. The
need for more scm_protect calls.
*/
- SCM element_property_alist_;
-
+public: // ugh.
+ SCM property_alist_;
+ SCM pointer_alist_;
+public:
Score_element *original_l_;
/**
SCM get_elt_property (String nm) const;
void set_elt_property (String, SCM val);
+ /**
+ Pointers are like properties, but they are subject to a substitution
+ after line breaking.
+ */
+ SCM get_elt_pointer (const char*) const;
+ void set_elt_pointer (const char*, SCM val);
+ friend class Property_engraver; // UGHUGHUGH.
/**
UGH! JUNKME ?
twice may do weird things if Bar::foo has a default set.
*/
- SCM remove_elt_property (String nm);
+ SCM remove_elt_property (const char* nm);
/*
related classes.
{
if (original_l_)
{
- element_property_alist_
- = handle_broken_smobs (original_l_->element_property_alist_,
+ property_alist_
+ = handle_broken_smobs (original_l_->property_alist_,
+ gh_int2scm (break_status_dir ()));
+ pointer_alist_
+ = handle_broken_smobs (original_l_->pointer_alist_,
gh_int2scm (break_status_dir ()));
}
Line_of_score::Line_of_score()
{
- set_elt_property ("columns", SCM_EOL);
- set_elt_property ("all-elements", SCM_EOL);
+ set_elt_pointer ("columns", SCM_EOL);
+ set_elt_pointer ("all-elements", SCM_EOL);
Axis_group_interface (this).set_interface ();
Axis_group_interface (this).set_axes (Y_AXIS,X_AXIS);
int
Line_of_score::element_count () const
{
- return scm_ilength ( get_elt_property ("all-elements"));
+ return scm_ilength ( get_elt_pointer ("all-elements"));
}
Line_of_score::typeset_element (Score_element * elem_p)
{
elem_p->pscore_l_ = pscore_l_;
- Group_interface (this, "all-elements").add_element (elem_p);
+ Pointer_group_interface (this, "all-elements").add_element (elem_p);
scm_unprotect_object (elem_p->self_scm_);
}
void
Line_of_score::output_lines ()
{
- for (SCM s = get_elt_property ("all-elements");
+ for (SCM s = get_elt_pointer ("all-elements");
gh_pair_p (s); s = gh_cdr (s))
{
unsmob_element (gh_car (s))->do_break_processing ();
for (int i=0; i < broken_into_l_arr_.size (); i++)
{
Score_element *se = broken_into_l_arr_[i];
- SCM all = se->get_elt_property ("all-elements");
+ SCM all = se->get_elt_pointer ("all-elements");
for (SCM s = all; gh_pair_p (s); s = gh_cdr (s))
{
unsmob_element (gh_car (s))->fixup_refpoint ();
/*
needed for doing items.
*/
- for (SCM s = get_elt_property ("all-elements");
+ for (SCM s = get_elt_pointer ("all-elements");
gh_pair_p (s); s = gh_cdr (s))
{
unsmob_element (gh_car (s))->fixup_refpoint ();
}
- for (SCM s = get_elt_property ("all-elements");
+ for (SCM s = get_elt_pointer ("all-elements");
gh_pair_p (s); s = gh_cdr (s))
{
unsmob_element (gh_car (s))->handle_broken_dependencies ();
void
Line_of_score::add_column (Paper_column*p)
{
- SCM cs = get_elt_property ("columns");
+ SCM cs = get_elt_pointer ("columns");
Score_element * prev = gh_pair_p (cs) ? unsmob_element (gh_car (cs)) : 0;
int rank = prev ? dynamic_cast<Paper_column*> (prev)->rank_i () + 1 : 0;
p->set_rank (rank);
- set_elt_property ("columns", gh_cons (p->self_scm_, cs));
+ set_elt_pointer ("columns", gh_cons (p->self_scm_, cs));
Axis_group_interface (this).add_element (p);
typeset_element (p);
Line_of_score::column_l_arr ()const
{
Link_array<Paper_column> acs
- = Group_interface__extract_elements (this, (Paper_column*) 0, "columns");
+ = Pointer_group_interface__extract_elements (this, (Paper_column*) 0, "columns");
bool bfound = false;
for (int i= acs.size (); i -- ; )
{
someone forced a breakpoint.
*/
if (!bfound
- || (acs[i]->get_elt_property ("elements") == SCM_EOL
+ || (acs[i]->get_elt_pointer ("elements") == SCM_EOL
&& !brb))
acs.del (i);
}
void
Line_of_score::pre_processing ()
{
- for (SCM s = get_elt_property ("all-elements"); gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = get_elt_pointer ("all-elements"); gh_pair_p (s); s = gh_cdr (s))
unsmob_element (gh_car (s))->discretionary_processing ();
progress_indication ( _f("Element count %d ", element_count ()));
- for (SCM s = get_elt_property ("all-elements"); gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = get_elt_pointer ("all-elements"); gh_pair_p (s); s = gh_cdr (s))
unsmob_element (gh_car (s))->handle_prebroken_dependencies ();
- fixup_refpoints (get_elt_property ("all-elements"));
+ fixup_refpoints (get_elt_pointer ("all-elements"));
- for (SCM s = get_elt_property ("all-elements"); gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = get_elt_pointer ("all-elements"); gh_pair_p (s); s = gh_cdr (s))
{
Score_element* sc = unsmob_element (gh_car (s));
sc->calculate_dependencies (PRECALCED, PRECALCING, &Score_element::before_line_breaking);
}
progress_indication ("\n" + _ ("Calculating column positions...") + " " );
- for (SCM s = get_elt_property ("all-elements"); gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = get_elt_pointer ("all-elements"); gh_pair_p (s); s = gh_cdr (s))
unsmob_element (gh_car (s))->do_space_processing ();
}
void
Line_of_score::post_processing ()
{
- for (SCM s = get_elt_property ("all-elements");
+ for (SCM s = get_elt_pointer ("all-elements");
gh_pair_p (s); s = gh_cdr (s))
{
Score_element* sc = unsmob_element (gh_car (s));
generate all molecules to trigger all font loads.
(ugh. This is not very memory efficient.) */
- for (SCM s = get_elt_property ("all-elements"); gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = get_elt_pointer ("all-elements"); gh_pair_p (s); s = gh_cdr (s))
unsmob_element (gh_car (s))->get_molecule ();
/*
/*
all elements.
*/
- for (SCM s = get_elt_property ("all-elements"); gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = get_elt_pointer ("all-elements"); gh_pair_p (s); s = gh_cdr (s))
{
Score_element * sc = unsmob_element (gh_car (s));
Molecule m = sc->get_molecule ();
l = l->column_l ();
r = r->column_l ();
- SCM s = get_elt_property ("columns");
+ SCM s = get_elt_pointer ("columns");
while (gh_car (s) != r->self_scm_)
s = gh_cdr (s);
if (mmrest_p_ && (now_mom () >= start_moment_)
&& !mp
- && (scm_ilength (mmrest_p_->get_elt_property ("columns")) >= 2))
+ && (scm_ilength (mmrest_p_->get_elt_pointer ("columns")) >= 2))
{
typeset_element (mmrest_p_);
/*
Multi_measure_rest::Multi_measure_rest ()
{
- set_elt_property ("columns", SCM_EOL);
+ set_elt_pointer ("columns", SCM_EOL);
}
void
Multi_measure_rest::do_add_processing ()
{
- if (gh_pair_p (get_elt_property ("columns")))
+ if (gh_pair_p (get_elt_pointer ("columns")))
{
- Link_array<Item> column_arr (Group_interface__extract_elements (this, (Item*)0, "columns"));
+ Link_array<Item> column_arr (Pointer_group_interface__extract_elements (this, (Item*)0, "columns"));
set_bound (LEFT, column_arr[0 >? column_arr.size () - 2]);
set_bound (RIGHT, column_arr.top ());
void
Multi_measure_rest::after_line_breaking ()
{
- if (!gh_pair_p (get_elt_property ("columns")))
+ if (!gh_pair_p (get_elt_pointer ("columns")))
set_elt_property ("transparent", SCM_BOOL_T);
}
void
Multi_measure_rest::add_column (Item* c)
{
- Group_interface gi (this, "columns");
+ Pointer_group_interface gi (this, "columns");
gi.add_element (c);
bool
Note_column::rest_b () const
{
- SCM r = get_elt_property ("rests");
+ SCM r = get_elt_pointer ("rests");
return gh_pair_p (r);
}
Note_column::Note_column()
{
- set_elt_property ("rests", SCM_EOL);
- set_elt_property ("note-heads", SCM_EOL);
+ set_elt_pointer ("rests", SCM_EOL);
+ set_elt_pointer ("note-heads", SCM_EOL);
Axis_group_interface (this).set_interface ();
Axis_group_interface (this).set_axes (X_AXIS, Y_AXIS);
Group_interface (this, "interfaces").add_thing (ly_symbol2scm ("Note_column"));
Stem *
Note_column::stem_l () const
{
- SCM s = get_elt_property ("stem");
+ SCM s = get_elt_pointer ("stem");
return dynamic_cast<Stem*> (unsmob_element (s));
}
iv.set_empty ();
- SCM h = get_elt_property ("note-heads");
+ SCM h = get_elt_pointer ("note-heads");
for (; gh_pair_p (h); h = gh_cdr (h))
{
Score_element *se = unsmob_element (gh_car (h));
{
if (stem_l ())
return stem_l ()->get_direction ();
- else if (gh_pair_p (get_elt_property ("note-heads")))
+ else if (gh_pair_p (get_elt_pointer ("note-heads")))
return (Direction)sign (head_positions_interval().center ());
programming_error ("Note column without heads and stem!");
void
Note_column::set_stem (Stem * stem_l)
{
- set_elt_property ("stem", stem_l->self_scm_);
+ set_elt_pointer ("stem", stem_l->self_scm_);
add_dependency (stem_l);
Axis_group_interface (this).add_element (stem_l);
{
if (Rest*r=dynamic_cast<Rest *> (h))
{
- Group_interface gi (this, "rests");
+ Pointer_group_interface gi (this, "rests");
gi.add_element (h);
}
if (Note_head *nh=dynamic_cast<Note_head *> (h))
{
- Group_interface gi (this, "note-heads");
+ Pointer_group_interface gi (this, "note-heads");
gi.add_element (nh);
}
Axis_group_interface (this).add_element (h);
void
Note_column::translate_rests (int dy_i)
{
- SCM s = get_elt_property ("rests");
+ SCM s = get_elt_pointer ("rests");
for (; gh_pair_p (s); s = gh_cdr (s))
{
Score_element * se = unsmob_element (gh_car (s));
Direction d = stem_l ()->get_direction ();
Real beamy = (stem_l ()->relative_coordinate (0, X_AXIS) - x0) * dydx + beam_y;
- s = get_elt_property ("rests");
+ s = get_elt_pointer ("rests");
Score_element * se = unsmob_element (gh_car (s));
Staff_symbol_referencer_interface si (se);
Note_column::rest_dim () const
{
Interval restdim;
- SCM s = get_elt_property ("rests");
+ SCM s = get_elt_pointer ("rests");
for (; gh_pair_p (s); s = gh_cdr (s))
{
Score_element * sc = unsmob_element ( gh_car (s));
--- /dev/null
+/*
+ group-interface.cc -- implement Pointer_group_interface
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1999--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+#include "group-interface.hh"
+#include "score-element.hh"
+
+Pointer_group_interface::Pointer_group_interface (Score_element const* e)
+{
+ elt_l_ = (Score_element*)e;
+ name_ = "elements";
+}
+
+
+Pointer_group_interface::Pointer_group_interface (Score_element const *e, String s)
+{
+ elt_l_ =(Score_element*)e;
+ name_ = s;
+}
+bool
+Pointer_group_interface::has_interface_b ()
+{
+ SCM el = elt_l_->get_elt_pointer (name_.ch_C());
+
+ return el == SCM_EOL || gh_pair_p (el);
+}
+
+
+void
+Pointer_group_interface::add_element (Score_element*p)
+{
+ p->used_b_ = true;
+ elt_l_->used_b_ = true;
+
+ elt_l_->set_elt_pointer (name_.ch_C(),
+ gh_cons (p->self_scm_,
+ elt_l_->get_elt_pointer (name_.ch_C())));
+}
+
+int
+Pointer_group_interface::count ()
+{
+ return scm_ilength (elt_l_->get_elt_pointer (name_.ch_C()));
+}
+
+void
+Pointer_group_interface::set_interface ()
+{
+ if (!has_interface_b ())
+ {
+ elt_l_->set_elt_pointer (name_.ch_C(), SCM_EOL);
+ }
+}
+
SCM type_p = gh_cadr (entry);
SCM elt_prop_sym = gh_caddr (entry);
- SCM preset = scm_assq(elt_prop_sym, e->element_property_alist_);
+ SCM preset = scm_assq(elt_prop_sym, e->property_alist_);
if (preset != SCM_BOOL_F)
continue;
Rest_collision::add_column (Note_column *nc_l)
{
add_dependency (nc_l);
- Group_interface gi (this);
+ Pointer_group_interface gi (this);
if (nc_l->rest_b ())
gi.name_ = "rests";
else
static Rhythmic_head*
col2rhythmic_head (Note_column* c)
{
- SCM s = c->get_elt_property ("rests");
+ SCM s = c->get_elt_pointer ("rests");
assert (gh_pair_p (s));
Score_element* e = unsmob_element (gh_car (s));
return dynamic_cast<Rhythmic_head*> (e);
Rest_collision::before_line_breaking ()
{
Link_array<Note_column> rest_l_arr =
- Group_interface__extract_elements (this, (Note_column*) 0, "rests");
+ Pointer_group_interface__extract_elements (this, (Note_column*) 0, "rests");
Link_array<Note_column> ncol_l_arr =
- Group_interface__extract_elements (this, (Note_column*) 0, "notes");
+ Pointer_group_interface__extract_elements (this, (Note_column*) 0, "notes");
/*
Rest_collision::Rest_collision()
{
- set_elt_property ("rests", SCM_EOL);
- set_elt_property ("notes", SCM_EOL);
+ set_elt_pointer ("rests", SCM_EOL);
+ set_elt_pointer ("notes", SCM_EOL);
set_elt_property ("transparent", SCM_BOOL_T);
set_extent_callback (0, X_AXIS);
set_extent_callback (0, Y_AXIS);
Dots*
Rhythmic_head::dots_l () const
{
- SCM s = get_elt_property ("dot");
+ SCM s = get_elt_pointer ("dot");
return dynamic_cast<Dots*> (unsmob_element (s));
}
Stem*
Rhythmic_head::stem_l () const
{
- SCM s = get_elt_property ("stem");
+ SCM s = get_elt_pointer ("stem");
return dynamic_cast<Stem*> (unsmob_element (s));
}
void
Rhythmic_head::add_dots (Dots *dot_l)
{
- set_elt_property ("dot", dot_l->self_scm_);
+ set_elt_pointer ("dot", dot_l->self_scm_);
dot_l->add_dependency (this);
}
sprintf (str, "#<Scheme_hash_table 0x%0x ", s);
scm_puts (str, p);
Scheme_hash_table *me = SMOB_TO_TYPE(Scheme_hash_table,s);
- for (Scm_stl_map ::const_iterator i = me->begin (); i != me->end(); i++)
+ for (Scm_stl_map::const_iterator i = me->begin (); i != me->end(); i++)
{
scm_display ((*i).first, p);
scm_puts (" = ",p);
status_i_ = 0;
self_scm_ = SCM_EOL;
original_l_ = 0;
- element_property_alist_ = SCM_EOL;
-
+ property_alist_ = SCM_EOL;
+ pointer_alist_ = SCM_EOL;
+
smobify_self ();
- set_elt_property ("dependencies", SCM_EOL);
+ set_elt_pointer ("dependencies", SCM_EOL);
set_elt_property ("interfaces", SCM_EOL);
}
self_scm_ = SCM_EOL;
used_b_ = true;
original_l_ =(Score_element*) &s;
- element_property_alist_ = SCM_EOL; // onstack;
-
+ property_alist_ = SCM_EOL;
+ pointer_alist_ = SCM_EOL;
+
status_i_ = s.status_i_;
lookup_l_ = s.lookup_l_;
pscore_l_ = s.pscore_l_;
Score_element::get_elt_property (String nm) const
{
SCM sym = ly_symbol2scm (nm.ch_C());
- SCM s = scm_assq(sym, element_property_alist_);
+ SCM s = scm_assq(sym, property_alist_);
if (s != SCM_BOOL_F)
return gh_cdr (s);
-
+
+ /*
+ JUNKME
+ */
if (pscore_l_)
{
SCM sym2 = ly_symbol2scm ((name () + ("::" + nm)).ch_C());
}
SCM
-Score_element::remove_elt_property (String key)
+Score_element::get_elt_pointer (const char *nm) const
+{
+ SCM sym = ly_symbol2scm (nm);
+ SCM s = scm_assq(sym, pointer_alist_);
+
+ return (s == SCM_BOOL_F) ? SCM_UNDEFINED : gh_cdr (s);
+}
+
+SCM
+Score_element::remove_elt_property (const char* key)
{
SCM s = get_elt_property (key);
- SCM sym = ly_symbol2scm (key.ch_C());
- element_property_alist_ = scm_assq_remove_x (element_property_alist_, sym);
+ SCM sym = ly_symbol2scm (key);
+ property_alist_ = scm_assq_remove_x (property_alist_, sym);
return s;
}
-/*
- UGH. assoc vs. assq
- */
void
Score_element::set_elt_property (String k, SCM v)
{
- SCM s = ly_symbol2scm (k.ch_C( ));
- element_property_alist_ = scm_assoc_set_x (element_property_alist_, s, v);
+ SCM s = ly_symbol2scm (k.ch_C ());
+ property_alist_ = scm_assq_set_x (property_alist_, s, v);
+}
+
+void
+Score_element::set_elt_pointer (const char* k, SCM v)
+{
+ SCM s = ly_symbol2scm (k);
+ pointer_alist_ = scm_assq_set_x (pointer_alist_, s, v);
}
+
Interval
Score_element::molecule_extent (Score_element const *s, Axis a )
{
status_i_= busy;
- for (SCM d= get_elt_property ("dependencies"); gh_pair_p (d); d = gh_cdr (d))
+ for (SCM d= get_elt_pointer ("dependencies"); gh_pair_p (d); d = gh_cdr (d))
{
unsmob_element (gh_car (d))
->calculate_dependencies (final, busy, funcptr);
{
if (e)
{
- Group_interface gi (this, "dependencies");
+ Pointer_group_interface gi (this, "dependencies");
gi.add_element (e);
}
else
{
Score_element * sc = s->broken_into_l_arr_[i];
Line_of_score * l = sc->line_l ();
- s->broken_into_l_arr_[i]->element_property_alist_ =
- handle_broken_smobs (element_property_alist_,
+ s->broken_into_l_arr_[i]->property_alist_ =
+ handle_broken_smobs (property_alist_,
+ l ? l->self_scm_ : SCM_UNDEFINED);
+ s->broken_into_l_arr_[i]->pointer_alist_ =
+ handle_broken_smobs (pointer_alist_,
l ? l->self_scm_ : SCM_UNDEFINED);
}
}
if (line && common_refpoint (line, X_AXIS) && common_refpoint (line, Y_AXIS))
{
- element_property_alist_
- = handle_broken_smobs (element_property_alist_,
+ pointer_alist_
+ = handle_broken_smobs (pointer_alist_,
line ? line->self_scm_ : SCM_UNDEFINED);
}
else if (dynamic_cast <Line_of_score*> (this))
{
- element_property_alist_ = handle_broken_smobs (element_property_alist_,
- SCM_UNDEFINED);
+ pointer_alist_ = handle_broken_smobs (pointer_alist_,
+ SCM_UNDEFINED);
}
else
{
void
Score_element::suicide ()
{
- element_property_alist_ = SCM_EOL;
+ property_alist_ = SCM_EOL;
+ pointer_alist_ = SCM_EOL;
set_extent_callback (0, Y_AXIS);
set_extent_callback (0, X_AXIS);
}
programming_error ("SMOB marking gone awry");
return SCM_EOL;
}
- return s->element_property_alist_;
+ scm_gc_mark (s->pointer_alist_);
+ return s->property_alist_;
}
int
if (sc)
{
- sc->element_property_alist_ = scm_assoc_set_x (sc->element_property_alist_, sym, val);
+ sc->property_alist_ = scm_assq_set_x (sc->property_alist_, sym, val);
}
else
{
if (sc)
{
- SCM s = scm_assq(sym, sc->element_property_alist_);
+ SCM s = scm_assq(sym, sc->property_alist_);
if (s != SCM_BOOL_F)
return gh_cdr (s);
/*
- score-grav.cc -- implement Score_engraver
+ score-engraver.cc -- implement Score_engraver
source file of the GNU LilyPond music typesetter
return;
- Group_interface gi (this, "scripts");
+ Pointer_group_interface gi (this, "scripts");
gi.add_element (i);
add_dependency (i);
{
Drul_array<Link_array<Item> > arrs;
Link_array<Item> staff_sided
- = Group_interface__extract_elements (this, (Item*)0, "scripts");
+ = Pointer_group_interface__extract_elements (this, (Item*)0, "scripts");
for (int i=0; i < staff_sided.size (); i++)
#include "paper-column.hh"
#include "paper-def.hh"
#include "dimensions.hh"
+#include "group-interface.hh"
static Rod
make_rod (Single_malt_grouping_item *l, Single_malt_grouping_item *r)
{
Array<Rod> a;
- for (SCM s = get_elt_property ("elements"); gh_pair_p (s) && gh_pair_p (gh_cdr (s)); s = gh_cdr (s))
+ for (SCM s = get_elt_pointer ("elements"); gh_pair_p (s) && gh_pair_p (gh_cdr (s)); s = gh_cdr (s))
{
/*
Order of elements is reversed!
/*
We've done our job, so we get lost.
*/
- for (SCM s = get_elt_property ("elements"); gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = get_elt_pointer ("elements"); gh_pair_p (s); s = gh_cdr (s))
{
Item * it =dynamic_cast<Item*>(unsmob_element (gh_car (s)));
if (it && it->broken_b ())
void
Separating_group_spanner::add_spacing_unit (Single_malt_grouping_item*i)
{
- set_elt_property ("elements",
- gh_cons (i->self_scm_,
- get_elt_property ("elements")));
+ Pointer_group_interface (this, "elements").add_element (i);
add_dependency (i);
}
Separating_group_spanner::Separating_group_spanner ()
{
- set_elt_property ("elements", SCM_EOL);
+ set_elt_pointer ("elements", SCM_EOL);
}
#include "dimensions.hh"
#include "dimension-cache.hh"
#include "staff-symbol-referencer.hh"
+#include "group-interface.hh"
Side_position_interface::Side_position_interface (Score_element const *e)
{
void
Side_position_interface::add_support (Score_element*e)
{
- SCM sup = elt_l_->get_elt_property ("side-support");
- elt_l_->set_elt_property ("side-support",
- gh_cons (e->self_scm_,sup));
+ Pointer_group_interface (elt_l_, "side-support").add_element (e);
}
relative_dir = to_dir (reldir);
}
- SCM other_elt = elt_l_->get_elt_property ("direction-source");
+ SCM other_elt = elt_l_->get_elt_pointer ("direction-source");
Score_element * e = unsmob_element(other_elt);
if (e)
{
{
Score_element* me = (Score_element*)cme;
Score_element *common = me->parent_l (axis);
- SCM support = me->get_elt_property ("side-support");
+ SCM support = me->get_elt_pointer ("side-support");
for (SCM s = support; s != SCM_EOL; s = gh_cdr (s))
{
Score_element * e = unsmob_element (gh_car (s));
#include "single-malt-grouping-item.hh"
#include "paper-column.hh"
#include "debug.hh"
+#include "group-interface.hh"
Single_malt_grouping_item ::Single_malt_grouping_item()
{
set_elt_property ("transparent", SCM_BOOL_T);
- set_elt_property ("elements", SCM_EOL);
+ set_elt_pointer ("elements", SCM_EOL);
// this is weird! , but needed!
set_extent_callback (0, X_AXIS);
Single_malt_grouping_item::add_item (Item* i)
{
assert (i);
- set_elt_property ("elements",
- gh_cons (i->self_scm_,
- get_elt_property ("elements")));
+ Pointer_group_interface (this).add_element (i);
add_dependency (i);
}
Paper_column * pc = column_l ();
Interval w;
- for (SCM s = get_elt_property ("elements"); gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = get_elt_pointer ("elements"); gh_pair_p (s); s = gh_cdr (s))
{
SCM elt = gh_car (s);
if (!SMOB_IS_TYPE_B(Score_element, elt))
warning (_ ("Putting slur over rest. Ignoring."));
else
{
- Group_interface (this, "note-columns").add_element (n);
+ Pointer_group_interface (this, "note-columns").add_element (n);
add_dependency (n);
}
}
Slur::get_default_dir () const
{
Link_array<Note_column> encompass_arr =
- Group_interface__extract_elements (this, (Note_column*)0, "note-columns");
+ Pointer_group_interface__extract_elements (this, (Note_column*)0, "note-columns");
Direction d = DOWN;
for (int i=0; i < encompass_arr.size (); i ++)
Slur::do_add_processing ()
{
Link_array<Note_column> encompass_arr =
- Group_interface__extract_elements (this, (Note_column*)0, "note-columns");
+ Pointer_group_interface__extract_elements (this, (Note_column*)0, "note-columns");
if (encompass_arr.size ())
{
Slur::set_extremities ()
{
Link_array<Note_column> encompass_arr =
- Group_interface__extract_elements (this, (Note_column*)0, "note-columns");
+ Pointer_group_interface__extract_elements (this, (Note_column*)0, "note-columns");
if (!encompass_arr.size ())
{
Slur::cross_staff_count ()const
{
Link_array<Note_column> encompass_arr =
- Group_interface__extract_elements (this, (Note_column*)0, "note-columns");
+ Pointer_group_interface__extract_elements (this, (Note_column*)0, "note-columns");
int k=0;
Slur::get_encompass_offset_arr () const
{
Link_array<Note_column> encompass_arr =
- Group_interface__extract_elements (this, (Note_column*)0, "note-columns");
+ Pointer_group_interface__extract_elements (this, (Note_column*)0, "note-columns");
Array<Offset> offset_arr;
void
Span_bar::add_bar (Score_element*b)
{
- Group_interface gi (this);
+ Pointer_group_interface gi (this);
gi.add_element (b);
add_dependency (b);
Interval
-Span_bar::width_callback (Score_element const *se, Axis a)
+Span_bar::width_callback (Score_element const *se, Axis )
{
Span_bar* s= dynamic_cast<Span_bar*> ((Score_element*)se);
String gl = ly_scm2string (s->get_elt_property ("glyph"));
Span_bar::Span_bar ()
{
- group (this).set_interface ();
+ Pointer_group_interface(this).set_interface ();
set_extent_callback (width_callback, X_AXIS);
// dim_cache_[Y_AXIS]->set_extent_callback (Axis_group_interface::group_extent_callback);
void
Staff_symbol_engraver::acknowledge_element (Score_element_info s)
{
- s.elem_l_->set_elt_property ("staff-symbol", span_p_->self_scm_);
+ s.elem_l_->set_elt_pointer ("staff-symbol", span_p_->self_scm_);
s.elem_l_->add_dependency (span_p_); // UGH. UGH. UGH
}
bool
Staff_symbol_referencer_interface::has_interface_b ()
{
- return unsmob_element (elt_l_->get_elt_property ("staff-symbol"))
+ return unsmob_element (elt_l_->get_elt_pointer ("staff-symbol"))
|| gh_number_p (elt_l_->get_elt_property ("staff-position"));
}
Staff_symbol*
Staff_symbol_referencer_interface::staff_symbol_l () const
{
- SCM st = elt_l_->get_elt_property ("staff-symbol");
+ SCM st = elt_l_->get_elt_pointer ("staff-symbol");
return dynamic_cast<Staff_symbol* > (unsmob_element(st));
}
Stem_tremolo::Stem_tremolo ()
{
- set_elt_property ("stem", SCM_EOL);
+ set_elt_pointer ("stem", SCM_EOL);
}
Stem *
Stem_tremolo::stem_l ()const
{
- SCM s = get_elt_property ("stem");
+ SCM s = get_elt_pointer ("stem");
return dynamic_cast<Stem*> ( unsmob_element (s));
}
void
Stem_tremolo::set_stem (Stem *s)
{
- set_elt_property ("stem", s->self_scm_);
+ set_elt_pointer ("stem", s->self_scm_);
add_dependency (s);
}
Score_element*
Stem::support_head ()const
{
- SCM h = get_elt_property ("support-head");
+ SCM h = get_elt_pointer ("support-head");
Score_element * nh = unsmob_element (h);
if (nh)
return nh;
UGH.
*/
- return unsmob_element (gh_car (get_elt_property ("heads")));
+ return unsmob_element (gh_car (get_elt_pointer ("heads")));
}
else
return first_head ();
int
Stem::heads_i ()const
{
- Group_interface gi (this, "heads");
+ Pointer_group_interface gi (this, "heads");
return gi.count ();
}
Drul_array<Note_head *> exthead;
exthead[LEFT] = exthead[RIGHT] =0;
- for (SCM s = get_elt_property ("heads"); gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = get_elt_pointer ("heads"); gh_pair_p (s); s = gh_cdr (s))
{
Note_head * n = dynamic_cast<Note_head*> (unsmob_element (gh_car (s)));
Staff_symbol_referencer_interface si (n);
void
Stem::add_head (Rhythmic_head *n)
{
- n->set_elt_property ("stem", this->self_scm_);
+ n->set_elt_pointer ("stem", this->self_scm_);
n->add_dependency (this);
- Group_interface gi (this);
+ Pointer_group_interface gi (this);
if (Note_head *nh = dynamic_cast<Note_head *> (n))
gi.name_ = "heads";
else
Stem::Stem ()
{
- set_elt_property ("heads", SCM_EOL);
- set_elt_property ("rests", SCM_EOL);
+ set_elt_pointer ("heads", SCM_EOL);
+ set_elt_pointer ("rests", SCM_EOL);
add_offset_callback ( &Stem::off_callback, X_AXIS);
}
return;
Link_array<Score_element> heads =
- Group_interface__extract_elements (this, (Score_element*)0, "heads");
+ Pointer_group_interface__extract_elements (this, (Score_element*)0, "heads");
heads.sort (compare_position);
Direction dir =get_direction ();
Stem * s = dynamic_cast<Stem*> ((Score_element*)se);
Interval r (0, 0);
- if (unsmob_element (s->get_elt_property ("beam")) || abs (s->flag_i ()) <= 2)
+ if (unsmob_element (s->get_elt_pointer ("beam")) || abs (s->flag_i ()) <= 2)
; // TODO!
else
{
Beam*
Stem::beam_l ()const
{
- SCM b= get_elt_property ("beam");
+ SCM b= get_elt_pointer ("beam");
return dynamic_cast<Beam*> (unsmob_element (b));
}
don't add as Axis_group_interface (delim_).add_element (),
because that would set the parent as well */
- Group_interface (delim_).add_element (inf.elem_l_);
+ Pointer_group_interface (delim_).add_element (inf.elem_l_);
}
else if (System_start_delimiter * b = dynamic_cast<System_start_delimiter *> (inf.elem_l_))
{
System_start_delimiter::System_start_delimiter ()
{
set_extent_callback (0, Y_AXIS);
- Group_interface (this).set_interface();
+ Pointer_group_interface (this).set_interface();
}
Molecule
{
SCM gl = get_elt_property ("glyph");
- if (scm_ilength (get_elt_property ("elements")) <= 1 && gl == ly_symbol2scm ("bar-line"))
+ if (scm_ilength (get_elt_pointer ("elements")) <= 1 && gl == ly_symbol2scm ("bar-line"))
{
set_elt_property ("transparent", SCM_BOOL_T);
set_extent_callback (0, X_AXIS);
Tie_column::Tie_column ()
{
- set_elt_property ("ties", SCM_EOL);
+ set_elt_pointer ("ties", SCM_EOL);
set_extent_callback (0, X_AXIS);
set_extent_callback (0, Y_AXIS);
set_elt_property ("transparent", SCM_BOOL_T);
void
Tie_column::add_tie (Tie *s)
{
- Group_interface g (this, "ties");
+ Pointer_group_interface g (this, "ties");
if (!g.count ())
{
set_bound (LEFT, s->head (LEFT));
set_bound (RIGHT, s->head (RIGHT));
}
- group (this, "ties").add_element (s);
+ Pointer_group_interface (this, "ties").add_element (s);
s->add_dependency (this);
}
Tie_column::set_directions ()
{
Link_array<Tie> s =
- Group_interface__extract_elements (this, (Tie*)0, "ties");
+ Pointer_group_interface__extract_elements (this, (Tie*)0, "ties");
Direction d = directional_element (this).get ();
Tie::set_head (Direction d, Item * head_l)
{
assert (!head (d));
- index_set_cell (get_elt_property ("heads"), d, head_l->self_scm_);
+ index_set_cell (get_elt_pointer ("heads"), d, head_l->self_scm_);
set_bound (d, head_l);
add_dependency (head_l);
Tie::Tie()
{
- set_elt_property ("heads", gh_cons (SCM_EOL, SCM_EOL));
+ set_elt_pointer ("heads", gh_cons (SCM_EOL, SCM_EOL));
dy_f_drul_[LEFT] = dy_f_drul_[RIGHT] = 0.0;
dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
Note_head*
Tie::head (Direction d) const
{
- SCM c = get_elt_property ("heads");
+ SCM c = get_elt_pointer ("heads");
c = index_cell (c, d);
return dynamic_cast<Note_head*> (unsmob_element (c));
new_head_drul[d] = head((Direction)-d);
} while (flip(&d) != LEFT);
- index_set_cell (get_elt_property ("heads"), LEFT, new_head_drul[LEFT]->self_scm_ );
- index_set_cell (get_elt_property ("heads"), RIGHT, new_head_drul[RIGHT]->self_scm_ );
+ index_set_cell (get_elt_pointer ("heads"), LEFT, new_head_drul[LEFT]->self_scm_ );
+ index_set_cell (get_elt_pointer ("heads"), RIGHT, new_head_drul[RIGHT]->self_scm_ );
}
void
Tuplet_spanner::Tuplet_spanner ()
{
- set_elt_property ("beams", SCM_EOL);
- set_elt_property ("columns", SCM_EOL);
+ set_elt_pointer ("beams", SCM_EOL);
+ set_elt_pointer ("columns", SCM_EOL);
// ugh.
set_elt_property ("delta-y", gh_int2scm (0));
else if (bracket == ly_symbol2scm ("if-no-beam"))
number_visibility = !par_beam;
- if (gh_pair_p (get_elt_property ("columns")))
+ if (gh_pair_p (get_elt_pointer ("columns")))
{
Link_array<Note_column> column_arr=
- Group_interface__extract_elements (this, (Note_column*)0, "columns");
+ Pointer_group_interface__extract_elements (this, (Note_column*)0, "columns");
Real ncw = column_arr.top ()->extent(X_AXIS).length ();
Real w = spanner_length () + ncw;
void
Tuplet_spanner::do_add_processing ()
{
- if (gh_pair_p (get_elt_property ("columns")))
+ if (gh_pair_p (get_elt_pointer ("columns")))
{
Link_array<Note_column> column_arr=
- Group_interface__extract_elements (this, (Note_column*)0, "columns");
+ Pointer_group_interface__extract_elements (this, (Note_column*)0, "columns");
set_bound (LEFT, column_arr[0]);
set_bound (RIGHT, column_arr.top ());
Tuplet_spanner::calc_position_and_height (Real *offset, Real * dy) const
{
Link_array<Note_column> column_arr=
- Group_interface__extract_elements (this, (Note_column*)0, "columns");
+ Pointer_group_interface__extract_elements (this, (Note_column*)0, "columns");
- Score_element * common = common_refpoint (get_elt_property ("columns"), Y_AXIS);
+ Score_element * common = common_refpoint (get_elt_pointer ("columns"), Y_AXIS);
Direction d = directional_element (this).get ();
Tuplet_spanner::calc_dy (Real * dy) const
{
Link_array<Note_column> column_arr=
- Group_interface__extract_elements (this, (Note_column*)0, "columns");
+ Pointer_group_interface__extract_elements (this, (Note_column*)0, "columns");
Direction d = directional_element (this).get ();
Tuplet_spanner::after_line_breaking ()
{
Link_array<Note_column> column_arr=
- Group_interface__extract_elements (this, (Note_column*)0, "columns");
+ Pointer_group_interface__extract_elements (this, (Note_column*)0, "columns");
if (!column_arr.size ())
{
translate_axis (offset, Y_AXIS);
- if (scm_ilength (get_elt_property ("beams")) == 1)
+ if (scm_ilength (get_elt_pointer ("beams")) == 1)
{
- SCM bs = get_elt_property ("beams");
+ SCM bs = get_elt_pointer ("beams");
Score_element *b = unsmob_element (gh_car (bs));
Beam * beam_l = dynamic_cast<Beam*> (b);
if (!broken_b ()
}
d = UP ;
- for (SCM s = get_elt_property ("columns"); gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = get_elt_pointer ("columns"); gh_pair_p (s); s = gh_cdr (s))
{
Score_element * sc = unsmob_element (gh_car (s));
Note_column * nc = dynamic_cast<Note_column*> (sc);
Tuplet_spanner::add_beam (Beam *b)
{
add_dependency (b);
- Group_interface gi (this, "beams");
+ Pointer_group_interface gi (this, "beams");
gi.add_element (b);
}
void
Tuplet_spanner::add_column (Note_column*n)
{
- Group_interface gi (this, "columns");
+ Pointer_group_interface gi (this, "columns");
gi.add_element (n);
add_dependency (n);
Volta_spanner::Volta_spanner ()
{
- set_elt_property ("bars", SCM_EOL);
+ set_elt_pointer ("bars", SCM_EOL);
Side_position_interface (this).set_axis (Y_AXIS);
directional_element (this).set (UP);
}
Molecule mol;
Link_array<Bar> bar_arr
- = Group_interface__extract_elements (this, (Bar*)0, "bars");
+ = Pointer_group_interface__extract_elements (this, (Bar*)0, "bars");
if (!bar_arr.size ())
return mol;
{
Link_array<Bar> bar_arr
- = Group_interface__extract_elements (this, (Bar*)0, "bars");
+ = Pointer_group_interface__extract_elements (this, (Bar*)0, "bars");
if (bar_arr.size ())
{
void
Volta_spanner::add_bar (Bar* b)
{
- Group_interface gi(this, "bars");
+ Pointer_group_interface gi(this, "bars");
gi.add_element (b);
Side_position_interface (this).add_support (b);