2006-02-02 Jan Nieuwenhuizen <janneke@gnu.org>
- * flower/include/std-vector.hh (slice): Remove.
+ * flower/include/std-vector.hh (sort): Remove, replace by
+ ::vector_sort. Update callers.
+
+ * flower/include/std-vector.hh (slice): Remove. Update callers.
(sort): Bugfix.
* flower/test-std.cc (vector_sort): New test.
elem_ref (i) = back ();
resize (size () -1);
}
- // quicksort.
- void sort (int (*compare) (T const &, T const &),
- vsize lower=VPOS, vsize upper=VPOS);
void concat (Array<T> const &src)
{
vsize s = size_;
void reverse ();
};
-template<class T>
-int default_compare (T const &a, T const &b)
-{
- if (a < b)
- return -1;
- else if (a > b)
- return 1;
- else
- return 0;
-}
-
#include "array.icc"
}
array_[j] = k;
}
-template<class T> INLINE void
-Array<T>::sort (int (*compare) (T const &, T const &), vsize lower, vsize upper)
+template<typename T> INLINE void
+vector_sort (Array<T> &v, int (*compare) (T const &, T const &),
+ vsize lower=-1, vsize upper=-1)
{
if (lower < 0)
{
lower = 0;
- upper = size () - 1;
+ upper = v.size () - 1;
}
if (lower >= upper)
return;
- swap (lower, (lower + upper) / 2);
+ v.swap (lower, (lower + upper) / 2);
vsize last = lower;
for (vsize i = lower +1; i <= upper; i++)
- if (compare (array_[i], array_[lower]) < 0)
- swap (++last, i);
+ if (compare (v.array_[i], v.array_[lower]) < 0)
+ v.swap (++last, i);
swap (lower, last);
- sort (compare, lower, last - 1);
- sort (compare, last + 1, upper);
+ vector_sort (v, compare, lower, last - 1);
+ vector_sort (v, compare, last + 1, upper);
}
template<class T> INLINE void
}
Array<void *>::begin;
+ Array<void *>::end;
Array<void *>::clear;
Array<void *>::erase;
Array<void *>::resize;
::std::reverse (this->begin (), this->end ());
}
- void
- sort (int (*compare) (T const &, T const &), vsize b=0, int e=VPOS)
- {
- ::std::sort (iter (b), iter(e), compare);
- }
-
void swap (vsize i, vsize j)
{
T t ((*this)[i]);
}
#endif
+
+#if 0
+ /* FIXME: the simple test works, but lily barfs. */
+ template<typename T>
+ void
+ vector_sort (vector<T> &v, int (*compare) (T const &, T const &),
+ vsize lower=VPOS, vsize upper=VPOS)
+ {
+ typename vector<T>::iterator b = v.begin ();
+ typename vector<T>::iterator e = v.begin ();
+ if (lower == VPOS)
+ {
+ lower = 0;
+ upper = v.size ();
+ }
+ ::std::sort (b + lower, e + upper, compare);
+ }
+#else
+ // ugh, c&p
+template<typename T> void
+vector_sort (vector<T> &v, int (*compare) (T const &, T const &),
+ vsize lower=VPOS, vsize upper=VPOS)
+{
+ if (lower == VPOS)
+ {
+ lower = 0;
+ upper = v.size () - 1;
+ }
+ if (upper == VPOS || lower >= upper)
+ return;
+ v.swap (lower, (lower + upper) / 2);
+ vsize last = lower;
+ for (vsize i = lower +1; i <= upper; i++)
+ if (compare (v[i], v[lower]) < 0)
+ v.swap (++last, i);
+ v.swap (lower, last);
+ vector_sort (v, compare, lower, last - 1);
+ vector_sort (v, compare, last + 1, upper);
+}
+
+#endif
+
}
#endif /* STD_VECTOR */
+template<typename T>
+int default_compare (T const &a, T const &b)
+{
+ if (a < b)
+ return -1;
+ else if (a > b)
+ return 1;
+ else
+ return 0;
+}
+
+
#include "array.hh"
#endif /* STD_VECTOR_HH */
#endif
}
-BOOST_AUTO_UNIT_TEST (vector_sort)
+BOOST_AUTO_UNIT_TEST (vector_sorting)
{
vector<int> v;
v.push_back (2);
v.push_back (1);
v.push_back (0);
+#if VECTOR_SORT
v.sort (default_compare);
+#else
+ vector_sort (v, default_compare);
+#endif
print (v);
BOOST_CHECK_EQUAL (v[0], 0);
BOOST_CHECK_EQUAL (v[1], 1);
test_suite *test = BOOST_TEST_SUITE("std::Flower");
test->add (BOOST_TEST_CASE (vector_erase));
test->add (BOOST_TEST_CASE (vector_slice));
- test->add (BOOST_TEST_CASE (vector_sort));
+ test->add (BOOST_TEST_CASE (vector_sorting));
return test;
}
gap_count = scm_to_int (me->get_property ("gap-count"));
gapped = Lookup::beam (slope, w - 2 * gap_length, thick, blot);
- full_beams.sort (default_compare);
+ vector_sort (full_beams, default_compare);
if (stem_dir == UP)
full_beams.reverse ();
}
while (scm_is_pair (busy) && *unsmob_moment (scm_caar (busy)) == now)
busy = scm_cdr (busy);
- started_now_.sort (Grob_pq_entry::compare);
+ vector_sort (started_now_, Grob_pq_entry::compare);
SCM lst = SCM_EOL;
SCM *tail = &lst;
for (vsize i = 0; i < started_now_.size (); i++)
while (tab->name_)
table_.push_back (*tab++);
- table_.sort (tabcmp);
+ vector_sort (table_, tabcmp);
}
vsize
}
}
- scripts->sort (&Finger_tuple::compare);
+ vector_sort (*scripts, Finger_tuple::compare);
bool up_p = scm_c_memq (ly_symbol2scm ("up"), orientations) != SCM_BOOL_F;
bool down_p = scm_c_memq (ly_symbol2scm ("down"), orientations) != SCM_BOOL_F;
}
std::string help ("Options supported by ly:set-option\n\n");
- opts.sort (string_compare);
+ vector_sort (opts, string_compare);
for (vsize i = 0; i < opts.size (); i++)
help += opts[i];
if (!model_bar)
model_bar = me;
- extents.sort (&Interval::left_comparison);
+ vector_sort (extents, Interval::left_comparison);
Stencil span_bar;
for (vsize i = 1; i < extents.size (); i++)
ps.push_back (p);
}
- ps.sort (integer_compare);
+ vector_sort (ps, integer_compare);
return ps;
}
if (!tuplets_.size ())
return;
- tuplets_.sort (&Tuplet_description::compare);
+ vector_sort (tuplets_, Tuplet_description::compare);
for (vsize i = 0; i < tuplets_.size (); i++)
{
if (tuplets_[i].bracket_)