#define INLINE inline
#endif
+#if !STD_VECTOR
+#define index_assert(i) (assert (i >= 0 && i < size_));
+#else
+#define index_assert(i) (assert (i != VPOS && i < size_));
+#endif
+
namespace std {
/// copy a bare (C-)array from #src# to #dest# sized #count#
template<class T> void arrcpy (T *dest, T const *src, int count);
size_ = 0;
}
- /* std::vector uses unchecked variant for [] */
+ T &
+ at (vsize i)
+ {
+ return (*this)[i];
+ }
+
+ T const &
+ at (vsize i) const
+ {
+ return (*this)[i];
+ }
+
T &operator [] (vsize i)
{
- return elem_ref (i);
+ return array_[i];
}
- /* std::vector uses unchecked variant for [] */
T const &operator [] (vsize i) const
{
- return elem_ref (i);
+ return array_[i];
}
iterator
erase (iterator p)
{
vsize i = p - data ();
-#if !STD_VECTOR
- assert (i >= 0 && i < size_);
-#else
- assert (i < size_);
-#endif
+ index_assert (i);
arrcpy (array_ + i, array_ + i + 1, size_ - i - 1);
size_--;
return p;
}
+ /// add to the end of array
+ void push_back (T x)
+ {
+ if (size_ == max_)
+ remax (2 * max_ + 1);
+ // T::operator= (T &) is called here. Safe to use with automatic
+ // vars
+ array_[size_++] = x;
+ }
/* Flower intererface */
T *remove_array ();
- /// access element
- T &elem_ref (vsize i) const
- {
-#if !STD_VECTOR
- assert (i >= 0 && i < size_);
-#else
- assert (i < size_);
-#endif
- return ((T *)array_)[i];
- }
- /// access element
- T elem (vsize i) const
- {
- return elem_ref (i);
- }
-
- /// add to the end of array
- void push_back (T x)
- {
- if (size_ == max_)
- remax (2 * max_ + 1);
-
- // T::operator= (T &) is called here. Safe to use with automatic
- // vars
- array_[size_++] = x;
- }
-#if 0
- /// remove and return last entry
- T pop ()
- {
- assert (!empty ());
- T l = top (0);
- resize (size () - 1);
- return l;
- }
-#endif
-
/// access last entry
T &top (vsize j)
{
if (dir == 1)
return top (idx);
else
- return elem_ref (idx);
+ return at (idx);
}
T boundary (int dir, vsize idx) const
{
if (dir == 1)
return top (idx);
else
- return elem (idx);
+ return at (idx);
}
void swap (vsize i, vsize j)
{
void unordered_del (vsize i)
{
- elem_ref (i) = back ();
+ at (i) = back ();
resize (size () -1);
}
void concat (Array<T> const &src)
struct Drul_array
{
T array_[2];
- T &elem_ref (Direction d)
+ T &at (Direction d)
{
assert (d == 1 || d == -1);
return array_[ (d + 1) / 2];
}
- T elem (Direction d) const
+ T const &at (Direction d) const
{
assert (d == 1 || d == -1);
return array_[ (d + 1) / 2];
}
T &operator [] (Direction d)
{
- return elem_ref (d);
+ return at (d);
}
- T operator [] (Direction d) const
+ T const& operator [] (Direction d) const
{
- return elem (d);
+ return at (d);
}
Drul_array ()
{
void
scale_drul (Drul_array<T> *dr, T x)
{
- dr->elem_ref (LEFT) *= x;
- dr->elem_ref (RIGHT) *= x;
+ dr->at (LEFT) *= x;
+ dr->at (RIGHT) *= x;
}
inline Real
linear_combination (Drul_array<Real> const &d, Real x)
{
- return ((1.0 - x) * Real (d.elem (LEFT))
- + (x + 1.0) * Real (d.elem (RIGHT))) * 0.5;
+ return ((1.0 - x) * Real (d.at (LEFT))
+ + (x + 1.0) * Real (d.at (RIGHT))) * 0.5;
}
#endif /* DRUL_ARRAY_HH */
template<class T>
struct Interval_t : public Drul_array<T>
{
- Drul_array<T>::elem;
- Drul_array<T>::elem_ref;
+ Drul_array<T>::at;
static T infinity ();
static std::string T_to_string (T arg);
T center () const;
void translate (T t)
{
- elem_ref (LEFT) += t;
- elem_ref (RIGHT) += t;
+ at (LEFT) += t;
+ at (RIGHT) += t;
}
void widen (T t)
{
- elem_ref (LEFT) -= t;
- elem_ref (RIGHT) += t;
+ at (LEFT) -= t;
+ at (RIGHT) += t;
}
T distance (T t) const
{
- if (t > elem (RIGHT))
- return T (t - elem (RIGHT));
- else if (t < elem (LEFT))
- return T (elem (LEFT) - t);
+ if (t > at (RIGHT))
+ return T (t - at (RIGHT));
+ else if (t < at (LEFT))
+ return T (at (LEFT) - t);
else
return T (0);
}
void intersect (Interval_t<T> h);
void add_point (T p)
{
- elem_ref (LEFT) = min (elem (LEFT), p);
- elem_ref (RIGHT) = max (elem (RIGHT), p);
+ at (LEFT) = min (at (LEFT), p);
+ at (RIGHT) = max (at (RIGHT), p);
}
T length () const;
T delta () const;
*/
bool is_empty () const
{
- return elem (LEFT) > elem (RIGHT);
+ return at (LEFT) > at (RIGHT);
}
bool superset (Interval_t<T> const &) const;
Interval_t ()
Interval_t<T> &operator += (T r)
{
- elem_ref (LEFT) += r;
- elem_ref (RIGHT) += r;
+ at (LEFT) += r;
+ at (RIGHT) += r;
return *this;
}
Interval_t<T> &operator *= (T r)
{
if (!is_empty ())
{
- elem_ref (LEFT) *= r;
- elem_ref (RIGHT) *= r;
+ at (LEFT) *= r;
+ at (RIGHT) *= r;
if (r < T (0))
swap ();
}
Real linear_combination (Real x) const
{
- Drul_array<Real> da (elem (LEFT), elem (RIGHT));
+ Drul_array<Real> da (at (LEFT), at (RIGHT));
return ::linear_combination (da, x);
}
std::string to_string () const;
bool contains (T r) const;
void negate ()
{
- T r = -elem (LEFT);
- T l = -elem (RIGHT);
- elem_ref (LEFT) = l;
- elem_ref (RIGHT) = r;
+ T r = -at (LEFT);
+ T l = -at (RIGHT);
+ at (LEFT) = l;
+ at (RIGHT) = r;
}
void swap ()
{
- T t = elem (LEFT);
- elem_ref (LEFT) = elem (RIGHT);
- elem_ref (RIGHT) = t;
+ T t = at (LEFT);
+ at (LEFT) = at (RIGHT);
+ at (RIGHT) = t;
}
static int left_comparison (Interval_t<T> const &a, Interval_t<T> const &b)
Interval_t<T>::center () const
{
assert (!is_empty ());
- return (elem (LEFT) + elem (RIGHT)) / T (2);
+ return (at (LEFT) + at (RIGHT)) / T (2);
}
typedef Interval_t<Real> Interval;
int
_Interval__compare (const Interval_t<T> &a, Interval_t<T> const &b)
{
- if (a.elem (LEFT) == b.elem (LEFT) && a.elem (RIGHT) == b.elem (RIGHT))
+ if (a.at (LEFT) == b.at (LEFT) && a.at (RIGHT) == b.at (RIGHT))
return 0;
- if (a.elem (LEFT) <= b.elem (LEFT) && a.elem (RIGHT) >= b.elem (RIGHT))
+ if (a.at (LEFT) <= b.at (LEFT) && a.at (RIGHT) >= b.at (RIGHT))
return 1;
- if (a.elem (LEFT) >= b.elem (LEFT) && a.elem (RIGHT) <= b.elem (RIGHT))
+ if (a.at (LEFT) >= b.at (LEFT) && a.at (RIGHT) <= b.at (RIGHT))
return -1;
return -2;
void
Interval_t<T>::set_empty ()
{
- elem_ref (LEFT) = (T) infinity ();
- elem_ref (RIGHT) = (T) -infinity ();
+ at (LEFT) = (T) infinity ();
+ at (RIGHT) = (T) -infinity ();
}
template<class T>
void
Interval_t<T>::set_full ()
{
- elem_ref (LEFT) = (T) -infinity ();
- elem_ref (RIGHT) = (T) infinity ();
+ at (LEFT) = (T) -infinity ();
+ at (RIGHT) = (T) infinity ();
}
template<class T>
T
Interval_t<T>::length () const
{
- if (elem (RIGHT) <= elem (LEFT))
+ if (at (RIGHT) <= at (LEFT))
return 0;
else
- return elem (RIGHT) - elem (LEFT);
+ return at (RIGHT) - at (LEFT);
}
template<class T>
T
Interval_t<T>::delta () const
{
- return elem (RIGHT) - elem (LEFT);
+ return at (RIGHT) - at (LEFT);
}
/* smallest Interval which includes *this and #h# */
void
Interval_t<T>::unite (Interval_t<T> h)
{
- elem_ref (LEFT) = min (h.elem (LEFT), elem (LEFT));
- elem_ref (RIGHT) = max (h.elem (RIGHT), elem (RIGHT));
+ at (LEFT) = min (h.at (LEFT), at (LEFT));
+ at (RIGHT) = max (h.at (RIGHT), at (RIGHT));
}
template<class T>
void
Interval_t<T>::intersect (Interval_t<T> h)
{
- elem_ref (LEFT) = max (h.elem (LEFT), elem (LEFT));
- elem_ref (RIGHT) = min (h.elem (RIGHT), elem (RIGHT));
+ at (LEFT) = max (h.at (LEFT), at (LEFT));
+ at (RIGHT) = min (h.at (RIGHT), at (RIGHT));
}
template<class T>
return "[empty]";
std::string s ("[");
- return (s + T_to_string (elem (LEFT)) + std::string (",")
- + T_to_string (elem (RIGHT)) + std::string ("]"));
+ return (s + T_to_string (at (LEFT)) + std::string (",")
+ + T_to_string (at (RIGHT)) + std::string ("]"));
}
template<class T>
bool
Interval_t<T>::contains (T r) const
{
- return r >= elem (LEFT) && r <= elem (RIGHT);
+ return r >= at (LEFT) && r <= at (RIGHT);
}
#define INTERVAL__INSTANTIATE(T) struct Interval_t<T>; \
{
}
- /// access element
- T *elem (int i) const
+ T *at (int i)
{
- return elem_ref (i);
+ return (T *) Array<void *>::at (i);
}
- T *&elem_ref (int i) const
+ T const *at (int i) const
{
- return (T *&) Array<void *>::elem_ref (i);
+ return (T const *) Array<void *>::at (i);
}
/// access element
T *&operator [] (int i)
{
- return (T *&) Array<void *>::elem_ref (i);
+ return (T *&) Array<void *>::at (i);
}
/// access element
T *const operator [] (int i) const
{
- return (T *const) Array<void *>::elem (i);
+ return (T *const) Array<void *>::at (i);
}
T *pop ()
{
int i;
while ((i = find_index (old)) >= 0)
if (new_p)
- elem_ref (i) = new_p;
+ at (i) = new_p;
else
erase (begin () + i);
}
int i;
while ((i = find_index (old)) >= 0)
if (new_p)
- elem_ref (i) = new_p;
+ at (i) = new_p;
else
unordered_del (i);
}
{
Link_array<T> ls;
for (vsize i = 0; i < size (); i++)
- if (!i || elem (i - 1) != elem (i))
- ls.push_back (elem (i));
+ if (!i || at (i - 1) != at (i))
+ ls.push_back (at (i));
*this = ls;
}
if (d == 1)
return top (i);
else
- return elem_ref (i);
+ return at (i);
}
T *boundary (int d, int i)const
{
if (d == 1)
return top (i);
else
- return elem_ref (i);
+ return at (i);
}
T ** accesses () const
*/
T *get (vsize i)
{
- T *t = elem (i);
+ T *t = at (i);
Array<void*>::erase (Array<void*>::begin () + i);
return t;
}
int find_index (T const *t) const
{
for (vsize i = 0; i < size (); i++)
- if (elem (i) == t)
+ if (at (i) == t)
return i;
return -1;
}
- T *find (T const *t) const
+ T const *find (T const *t) const
{
int i = find_index (t);
if (i >= 0)
- return elem (i);
+ return at (i);
else
return 0;
}
swap (lower, (lower + upper) / 2);
int last = lower;
for (int i = lower +1; i <= upper; i++)
- if (compare (elem (i), elem (lower)) < 0)
+ if (compare (at (i), at (lower)) < 0)
swap (++last, i);
swap (lower, last);
sort (compare, lower, last - 1);
{
}
+ /* Flower-Array compatibility. */
void
concat (vector<T> const &v)
{
__vector<T>::insert (this->end (), v.begin (), v.end ());
}
- /* Flower-Array compatibility. */
T const &
boundary (int dir, vsize i) const
{
return this->at (i);
}
- T const &
- elem (vsize i) const
- {
- return this->at (i);
- }
-
- T &
- elem (vsize i)
- {
- return this->at (i);
- }
-
-#if 1 // FIXME, silly, but keep for s/r
- T const &
- elem_ref (vsize i) const
- {
- return elem (i);
- }
-
- T &
- elem_ref (vsize i)
- {
- return elem (i);
- }
-#endif
-
-#if 0
- T *
- remove_array ()
- {
- // FIXME, no algorithm for this?
- T *p = new T[this->size ()];
- for (vsize i = 0; i < this->size (); i++)
- p[i] = (*this)[i];
- this->clear ();
- return p;
- }
-#else
T *
remove_array ()
{
T *p = &(*this)[0];
- // forget array?
- //this->resize (0);
+ /* FIXME: forget array? */
+ /* this->resize (0); */
return p;
}
-#endif
void
reverse ()
Interval extent;
for (vsize i = 0; i < which->size (); i++)
- extent.unite (which->elem (i)->extent (item_col, X_AXIS));
+ extent.unite (which->at (i)->extent (item_col, X_AXIS));
if (!extent.is_empty ())
{
if (beaming_prop == SCM_EOL
|| index_get_cell (beaming_prop, d) == SCM_EOL)
{
- int b = beaming->infos_.elem (i).beams_i_drul_[d];
+ int b = beaming->infos_.at (i).beams_i_drul_[d];
if (i > 0
&& i < stems.size () -1
&& Stem::is_invisible (stem))
- b = min (b, beaming->infos_.elem (i).beams_i_drul_[-d]);
+ b = min (b, beaming->infos_.at (i).beams_i_drul_[-d]);
Stem::set_beaming (stem, b, d);
}
call_constructors ()
{
for (vsize i = 0; i < ctor_global_statics_->size (); i++)
- (ctor_global_statics_->elem (i)) ();
+ (ctor_global_statics_->at (i)) ();
}
Item *
Grob_array::item (vsize i)
{
- return dynamic_cast<Item *> (grobs_.elem (i));
+ return dynamic_cast<Item *> (grobs_.at (i));
}
Spanner *
Grob_array::spanner (vsize i)
{
- return dynamic_cast<Spanner *> (grobs_.elem (i));
+ return dynamic_cast<Spanner *> (grobs_.at (i));
}
Grob_array::Grob_array ()
void set_ordered (bool b) { ordered_ = b; }
Item *item (vsize i);
Spanner *spanner (vsize i);
- Grob *grob (vsize i) { return grobs_.elem (i); }
+ Grob *grob (vsize i) { return grobs_.at (i); }
vsize size () const { return grobs_.size (); }
bool empty () const;
void clear ();
&& !staff_extent.contains (i->second[d].position_
- sign (i->second[d].position_)));
Real limit = (center + (both ? which * gap / 2 : 0));
- lr.ledger_extent_.elem_ref (-which)
+ lr.ledger_extent_.at (-which)
= which * max (which * lr.ledger_extent_[-which], which * limit);
}
while (flip (&which) != LEFT);
ly_init_ly_module (void *)
{
for (vsize i = scm_init_funcs_->size (); i--;)
- (scm_init_funcs_->elem (i)) ();
+ (scm_init_funcs_->at (i)) ();
if (be_verbose_global)
{
std::vector<Finger_tuple> *scripts)
{
for (vsize i = 0; i < scripts->size (); i++)
- if (stem_ && to_boolean (scripts->elem (i).script_->get_property ("add-stem-support")))
- Side_position_interface::add_support (scripts->elem (i).script_, stem_);
+ if (stem_ && to_boolean (scripts->at (i).script_->get_property ("add-stem-support")))
+ Side_position_interface::add_support (scripts->at (i).script_, stem_);
/*
This is not extremely elegant, but we have to do a little
Pitch_interval::Pitch_interval (Pitch p1, Pitch p2)
{
- elem_ref (LEFT) = p1;
- elem_ref (RIGHT) = p2;
+ at (LEFT) = p1;
+ at (RIGHT) = p2;
}
Pitch_interval::Pitch_interval ()
{
- elem_ref (LEFT) = Pitch (100, 0, 0);
- elem_ref (RIGHT) = Pitch (-100, 0, 0);
+ at (LEFT) = Pitch (100, 0, 0);
+ at (RIGHT) = Pitch (-100, 0, 0);
}
bool
Pitch_interval::is_empty () const
{
- return elem (LEFT) > elem (RIGHT);
+ return at (LEFT) > at (RIGHT);
}
void
Pitch_interval::add_point (Pitch p)
{
- if (elem_ref (LEFT) > p)
- elem_ref (LEFT) = p;
- if (elem_ref (RIGHT) < p)
- elem_ref (RIGHT) = p;
+ if (at (LEFT) > p)
+ at (LEFT) = p;
+ if (at (RIGHT) < p)
+ at (RIGHT) = p;
}
*/
for (vsize i = line->size (); i--;)
{
- Interval w = line->elem (i).width_;
+ Interval w = line->at (i).width_;
w.intersect (extent);
if (extent[LEFT] >= w[RIGHT])
break;
- Real my_height = line->elem (i).height_;
+ Real my_height = line->at (i).height_;
if (!w.is_empty ()
&& w.length () > EPS
&& d * (my_height - stick_out) < 0)
{
- Interval e1 (line->elem (i).width_[LEFT], extent[LEFT]);
- Interval e3 (extent[RIGHT], line->elem (i).width_[RIGHT]);
+ Interval e1 (line->at (i).width_[LEFT], extent[LEFT]);
+ Interval e3 (extent[RIGHT], line->at (i).width_[RIGHT]);
if (!e3.is_empty () && e3.length () > EPS)
line->insert (line->begin () + i + 1, Skyline_entry (e3, my_height));
- line->elem_ref (i).height_ = stick_out;
- line->elem_ref (i).width_ = w;
+ line->at (i).height_ = stick_out;
+ line->at (i).width_ = w;
if (!e1.is_empty () && e1.length () > EPS)
line->insert (line->begin () + i, Skyline_entry (e1, my_height));
}
heighten_skyline (std::vector<Skyline_entry> *buildings, Real ground)
{
for (vsize i = 0; i < buildings->size (); i++)
- buildings->elem_ref (i).height_ += ground;
+ buildings->at (i).height_ += ground;
}
Real
for (vsize i = 0; i < cols->size (); i++)
{
- Grob *c = cols->elem (i);
+ Grob *c = cols->at (i);
bool loose = (i > 0 && i < cols->size () - 1)
- && is_loose_column (cols->elem (i - 1), c, cols->elem (i + 1), options);
+ && is_loose_column (cols->at (i - 1), c, cols->at (i + 1), options);
if (loose)
{
Set distance constraints for loose columns
*/
Drul_array<Grob *> next_door;
- next_door[LEFT] = cols->elem (i - 1);
- next_door[RIGHT] = cols->elem (i + 1);
+ next_door[LEFT] = cols->at (i - 1);
+ next_door[RIGHT] = cols->at (i + 1);
Direction d = LEFT;
Drul_array<Real> dists (0, 0);
Rod r;
r.distance_ = dists[LEFT] + dists[RIGHT];
- r.item_drul_[LEFT] = dynamic_cast<Item *> (cols->elem (i - 1));
- r.item_drul_[RIGHT] = dynamic_cast<Item *> (cols->elem (i + 1));
+ r.item_drul_[LEFT] = dynamic_cast<Item *> (cols->at (i - 1));
+ r.item_drul_[RIGHT] = dynamic_cast<Item *> (cols->at (i + 1));
r.add_to_cols ();
}
{
if (!all_elements_->empty ())
{
- Grob **ptr = &all_elements_->array_reference ().elem_ref (0);
+ Grob **ptr = &all_elements_->array_reference ()[0];
Grob **end = ptr + all_elements_->size ();
while (ptr < end)
{
if (bounds[0]->break_status_dir ())
{
Real x = robust_relative_extent (bounds[0], x_refpoint_, X_AXIS)[-d];
- chord_outlines_[d].elem_ref (0).height_ = x;
+ chord_outlines_[d].at (0).height_ = x;
}
for (vsize i = 0; i < boxes.size (); i++)
if (tie_configs->empty ())
return ;
- if (!tie_configs->elem (0).dir_)
- tie_configs->elem_ref (0).dir_ = DOWN;
+ if (!tie_configs->at (0).dir_)
+ tie_configs->at (0).dir_ = DOWN;
if (!tie_configs->back ().dir_)
tie_configs->back ().dir_ = UP;
*/
for (vsize i = 1; i < tie_configs->size (); i++)
{
- Real diff = (tie_configs->elem (i-1).position_
- - tie_configs->elem (i).position_);
+ Real diff = (tie_configs->at (i-1).position_
+ - tie_configs->at (i).position_);
if (fabs (diff) <= 1)
{
- if (!tie_configs->elem (i-1).dir_)
- tie_configs->elem_ref (i-1).dir_ = DOWN;
- if (!tie_configs->elem (i).dir_)
- tie_configs->elem_ref (i).dir_ = UP;
+ if (!tie_configs->at (i-1).dir_)
+ tie_configs->at (i-1).dir_ = DOWN;
+ if (!tie_configs->at (i).dir_)
+ tie_configs->at (i).dir_ = UP;
}
}
for (vsize i = 1; i < tie_configs->size() - 1; i++)
{
- Tie_configuration &conf = tie_configs->elem_ref (i);
+ Tie_configuration &conf = tie_configs->at (i);
if (conf.dir_)
continue;
{
for (vsize i = 0; i < ack_array->size (); i++)
{
- if (ack_array->elem (i).symbol_ == sym)
- return ack_array->elem (i).function_;
+ if (ack_array->at (i).symbol_ == sym)
+ return ack_array->at (i).function_;
}
return 0;
}