X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=flower%2Finclude%2Fstd-vector.hh;h=76a11bb9252237189463c667290df2cd01ecc183;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=db6cb9241e486d287eecf32786353a62fa5b8e52;hpb=04b270fd7b1e63fb30c45f661a7492020526f0a9;p=lilypond.git diff --git a/flower/include/std-vector.hh b/flower/include/std-vector.hh index db6cb9241e..76a11bb925 100644 --- a/flower/include/std-vector.hh +++ b/flower/include/std-vector.hh @@ -1,291 +1,266 @@ /* - std-vector.hh -- declare std::vector + std-vector.hh -- declare vector source file of the GNU LilyPond music typesetter - (c) 2006 Jan Nieuwenhuizen + (c) 2006--2008 Jan Nieuwenhuizen */ #ifndef STD_VECTOR_HH #define STD_VECTOR_HH -#include // reverse, sort +#if 0 -#if !STD_VECTOR -/* Also declare vector, in the wrong way. */ -#include -#include -#include +/* + leads to dubious crashes - libstdc++ bug? +*/ +#ifndef NDEBUG +#define _GLIBCXX_DEBUG 1 +#endif #endif +#include /* find, reverse, sort */ +#include /* unary_function */ +#include +#include + +using namespace std; + +#if HAVE_BOOST_LAMBDA_LAMBDA_HPP +#include +#endif + +template +int default_compare (T const &a, T const &b) +{ + if (a < b) + return -1; + else if (b < a) + return 1; + else + return 0; +} + +template +int default_compare (T *const &a, T *const &b) +{ + if (a < b) + return -1; + else if (a > b) + return 1; + else + return 0; +} #include "compare.hh" -#if STD_VECTOR +#ifndef VSIZE +#define VSIZE +typedef size_t vsize; +#define VPOS ((vsize) -1) +#endif +#if HAVE_STL_DATA_METHOD +#include +#else /* !HAVE_STL_DATA_METHOD */ #define vector __vector #include #undef vector namespace std { - #ifndef VSIZE - #define VSIZE - typedef size_t vsize; - #define VPOS UINT_MAX - #endif - /* Interface without pointer arithmetic (iterator) semantics. */ - template - class vector : public __vector + template > + class vector : public __vector { public: typedef typename __vector::iterator iterator; + typedef typename __vector::const_iterator const_iterator; - vector () : __vector () - { - } - - vector (iterator const b, iterator const e) : __vector (b, e) - { - } - - vector (vsize b, vsize e) : __vector (iter (b), iter (e)) - { - } - - iterator iter (vsize n) + vector () : __vector () { - if (n == VPOS) - return this->end (); - return __vector::begin () + n; } - iterator const iter (vsize n) const + vector (vector const& v) : __vector (v) { - if (n == VPOS) - return this->end (); - return __vector::begin () + n; } - void - insert (T k, vsize i) + vector (const_iterator b, const_iterator e) : __vector (b, e) { - __vector::insert (this->iter (i), k); } - void - insert (vector &v, vsize i) + T* + data () { - __vector::insert (iter (i), v.begin (), v.end ()); + return &(*this)[0]; } - void - concat (vector const &v) + T const* + data () const { - __vector::insert (this->end (), v.begin (), v.end ()); + return &(*this)[0]; } + }; - /* Flower-Array compatibility. */ - T const & - boundary (int dir, vsize i) const - { - assert (dir); - if (dir == 1) - return this->top (i); - else - return this->at (i); - } - - T & - boundary (int dir, vsize i) - { - assert (dir); - if (dir == 1) - return this->top (i); - else - 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); - return p; - } -#endif - - void - reverse () - { - // CHECKME: for a simple vector, like vector, this should - // expand to memrev. - ::std::reverse (this->begin (), this->end ()); - } +} /* namespace std */ - vector - slice (vsize b, vsize e) const - { - return vector (b, e); - } +#endif /* !HAVE_STL_DATA_METHOD */ - void - sort (int vsize=VPOS, vsize b=VPOS, vsize e=VPOS) - { - ::std::sort (iter (b), iter(e)); - } +template +T const & +boundary (vector const &v, int dir, vsize i) +{ + assert (dir); + return v[dir == -1 ? i : v.size () - 1 - i]; +} - void - sort (int (*compare) (T const &, T const &), int b=-1, int e=-1) - { - ::std::sort (iter (b), iter(e), compare); - } +template +T & +boundary (vector &v, int dir, vsize i) +{ + assert (dir); + return v[dir == -1 ? i : v.size () - 1 - i]; +} - void swap (vsize i, vsize j) - { - T t ((*this)[i]); - (*this)[i] = (*this)[j]; - (*this)[j] = t; - } +template +T const & +back (vector const &v, vsize i) +{ + return v[v.size () - i - 1]; +} - T const & - top (vsize i) const - { - return (*this)[this->size () - i - 1]; - } +template +T& +back (vector &v, vsize i) +{ + return v[v.size () - i - 1]; +} - T& - top (vsize i) - { - return (*this)[this->size () - i - 1]; - } - }; - -#if 0 - template - vsize - // binary_search (std::vector const &v, - binary_search (vector const &v, - T const &key, int (*compare) (T const &, T const &), - vsize b=0, vsize e=VPOS) - { - //(void) compare; - vector::iterator const i = find (v.iter (b), v.iter (e), key); - if (i != v.end ()) - return i - v.begin (); - return VPOS; - } -#else // c&p from array.icc; cannot easily use stl_algo:find b.o. compare func. - template - void - binary_search_bounds (vector const &table, - T const &key, int (*compare) (T const &, T const &), - vsize *lo, - vsize *hi) - { - int cmp; - int result; - - /* binary search */ - do - { - cmp = (*lo + *hi) / 2; - - result = (*compare) (key, table[cmp]); - - if (result < 0) - *hi = cmp; - else - *lo = cmp; - } - while (*hi - *lo > 1); - } +template +void +concat (vector &v, vector const& w) +{ + v.insert (v.end (), w.begin (), w.end ()); +} - template - vsize - binary_search (vector const &table, - T const &key, int (*compare) (T const &, T const &), - vsize lo=0, - vsize hi=VPOS) - { - if (hi == VPOS) - hi = table.size (); +template +vsize +lower_bound (vector const &v, + T const &key, + Compare less, + vsize b=0, vsize e=VPOS) +{ + if (e == VPOS) + e = v.size (); + typename vector::const_iterator i = lower_bound (v.begin () + b, + v.begin () + e, + key, + less); + + return i - v.begin (); +} - binary_search_bounds (table, key, compare, &lo, &hi); +template +vsize +upper_bound (vector const &v, + T const &key, + Compare less, + vsize b=0, vsize e=VPOS) +{ + if (e == VPOS) + e = v.size (); + + typename vector::const_iterator i = upper_bound (v.begin () + b, + v.begin () + e, + key, + less); + + return i - v.begin (); +} - if (! (*compare) (key, table[lo])) - return lo; +template +vsize +binary_search (vector const &v, + T const &key, + Compare less=less (), + vsize b=0, vsize e=VPOS) +{ + vsize lb = lower_bound (v, key, less, b, e); - /* not found */ + if (lb == v.size () || less (key, v[lb])) return VPOS; - } -#endif - + return lb; } +template +void +vector_sort (vector &v, + Compare less, + vsize b=0, vsize e=VPOS) +{ + if (e == VPOS) + e = v.size (); + sort (v.begin () + b, v.begin () + e, less); +} -#else /* ! STD_VECTOR */ - -namespace std { +template +void +reverse (vector &v) +{ + // CHECKME: for a simple vector, like vector, this should + // expand to memrev. + reverse (v.begin (), v.end ()); +} -#ifndef Array -#define vector Array -#endif +template +void +uniq (vector &v) +{ + v.erase (unique (v.begin (), v.end ()), v.end ()); +} - using namespace std; - -#ifndef VSIZE -#define VSIZE - typedef int vsize; -#define VPOS -1 -#endif +template +typename vector::const_iterator +find (vector const &v, T const &key) +{ + return find (v.begin (), v.end (), key); +} +#if HAVE_BOOST_LAMBDA_LAMBDA_HPP +#include +using namespace boost::lambda; +template +void +junk_pointers (vector &v) +{ + for_each (v.begin (), v.end (), (delete _1, _1 = 0)); + v.clear (); } +#else +template struct del : public unary_function +{ + void operator() (T x) + { + delete x; + x = 0; + } +}; + +template +void +junk_pointers (vector &v) +{ + // Hmm. + for_each (v.begin (), v.end (), del ()); + v.clear (); +} +#endif /* HAVE_BOOST_LAMBDA */ -#endif /* STD_VECTOR */ +vector string_split (string str, char c); +string string_join (vector const &strs, string infix); -#include "array.hh" +#define iterof(i,s) typeof((s).begin()) i((s).begin()) #endif /* STD_VECTOR_HH */