X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=flower%2Finclude%2Fstd-vector.hh;h=bb2103235edf518361e1be3fed8a96b6bf7c0f6b;hb=47db9a3883d726ca53e2133a3b2298f78dd6a32e;hp=d7056b62c42c26761ac9520c8773944607fcc96f;hpb=0505ebfe07188748acc17575c88704f398bfa67b;p=lilypond.git diff --git a/flower/include/std-vector.hh b/flower/include/std-vector.hh index d7056b62c4..bb2103235e 100644 --- a/flower/include/std-vector.hh +++ b/flower/include/std-vector.hh @@ -1,31 +1,52 @@ /* - std-vector.hh -- declare std::vector + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2006--2015 Jan Nieuwenhuizen - (c) 2006 Jan Nieuwenhuizen + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #ifndef STD_VECTOR_HH #define STD_VECTOR_HH +#if 0 + +/* + leads to dubious crashes - libstdc++ bug? +*/ +#ifndef NDEBUG +#define _GLIBCXX_DEBUG 1 +#endif +#endif + +#include "config.hh" /* needed at least for HAVE_STL_DATA_METHOD */ #include /* find, reverse, sort */ #include /* unary_function */ #include +#include -#if HAVE_BOOST_LAMBDA -#include -#endif +using namespace std; template int default_compare (T const &a, T const &b) { - if (a < b) - return -1; - else if (a > b) - return 1; - else - return 0; + if (a < b) + return -1; + else if (b < a) + return 1; + else + return 0; } template @@ -40,299 +61,206 @@ int default_compare (T *const &a, T *const &b) } #include "compare.hh" -#include "config.hh" + +#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 +#define vector __flower_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 - { - public: - typedef typename __vector::iterator iterator; - typedef typename __vector::const_iterator const_iterator; - - vector () : __vector () - { - } - - vector (const_iterator b, const_iterator e) : __vector (b, e) - { - } - - T* - data () - { - return &(*this)[0]; - } - - T const* - data () const - { - return &(*this)[0]; - } - }; - - /* FIXME: it appears that choosing this function is broken when stl - has no data () member too... */ - template - void - binary_search_bounds (vector const &table, - T const *key, int (*compare) (T *const &, T *const &), - vsize *lo, - vsize *hi) - { - vsize cmp; - int result; - - /* binary search */ - do - { - cmp = (*lo + *hi) / 2; - - result = (*compare) ((T *) key, table[cmp]); - - if (result < 0) - *hi = cmp; - else - *lo = cmp; - } - while (*hi - *lo > 1); - } -} - -#endif /* !HAVE_STL_DATA_METHOD */ - -namespace std { +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 __flower_vector +{ +public: + typedef typename __flower_vector::iterator iterator; + typedef typename __flower_vector::const_iterator const_iterator; - template - T const & - boundary (vector const &v, int dir, vsize i) + vector () : __flower_vector () { - assert (dir); - return v[dir == -1 ? i : v.size () - 1 - i]; } - template - T & - boundary (vector &v, int dir, vsize i) + vector (size_t n) : __flower_vector (n) { - assert (dir); - return v[dir == -1 ? i : v.size () - 1 - i]; } - template - T const & - back (vector const &v, vsize i) + vector (vector const &v) : __flower_vector (v) { - return v[v.size () - i - 1]; } - template - T& - back (vector &v, vsize i) + vector (const_iterator b, const_iterator e) : __flower_vector (b, e) { - return v[v.size () - i - 1]; } - template - void - concat (vector &v, vector const& w) + T * + data () { - v.insert (v.end (), w.begin (), w.end ()); + return &(*this)[0]; } - - template - void - binary_search_bounds (vector const &table, - T const &key, int (*compare) (T const &, T const &), - vsize *lo, - vsize *hi) + + T const * + data () const { - if (*lo >= *hi) - return; + return &(*this)[0]; + } +}; - int cmp; - int result; +} /* namespace std */ - /* binary search */ - do - { - cmp = (*lo + *hi) / 2; +#endif /* !HAVE_STL_DATA_METHOD */ - result = (*compare) (key, table[cmp]); +template +T const & +boundary (vector const &v, int dir, vsize i) +{ + assert (dir); + return v[dir == -1 ? i : v.size () - 1 - i]; +} - if (result < 0) - *hi = cmp; - else - *lo = cmp; - } - while (*hi - *lo > 1); - } +template +T & +boundary (vector &v, int dir, vsize i) +{ + assert (dir); + return v[dir == -1 ? i : v.size () - 1 - i]; +} -#if 0 - /* FIXME: what if COMPARE is named: int operator == (T const&, T const&), - wouldn't that work for most uses of BINARY_SEARCH? - */ - template - vsize - binary_search (vector const &v, - T const &key, int (*compare) (T const &, T const &), - vsize b=0, vsize e=VPOS) - { - if (e == VPOS) - e = v.size (); - typename vector::const_iterator i = find (v.begin () + b, - v.begin () + 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 - 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 +T const & +back (vector const &v, vsize i) +{ + return v[v.size () - i - 1]; +} - if (lo >= hi) - return VPOS; +template +T & +back (vector &v, vsize i) +{ + return v[v.size () - i - 1]; +} - binary_search_bounds (table, key, compare, &lo, &hi); +template +void +concat (vector &v, vector const &w) +{ + v.insert (v.end (), w.begin (), w.end ()); +} - if (! (*compare) (key, table[lo])) - return lo; +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 (); +} - /* not found */ - return VPOS; - } +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); -#endif + return i - v.begin (); +} +template +vsize +binary_search (vector const &v, + T const &key, + Compare less, + vsize b = 0, vsize e = VPOS) +{ + vsize lb = lower_bound (v, key, less, b, e); -#if 0 - /* FIXME: the COMPARE functionality is broken? */ - template - void - vector_sort (vector &v, int (*compare) (T const &, T const &), - vsize lower=VPOS, vsize upper=VPOS) - { - typename vector::iterator b = v.begin (); - typename vector::iterator e = v.begin (); - if (lower == VPOS) - { - lower = 0; - upper = v.size (); - } - ::std::sort (b + lower, e + upper, compare); - } -#else + if (lb == v.size () || less (key, v[lb])) + return VPOS; + return lb; +} - // ugh, c&p - template void - vector_sort (vector &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; - swap (v[lower], v[(lower + upper) / 2]); - vsize last = lower; - for (vsize i = lower +1; i <= upper; i++) - if (compare (v[i], v[lower]) < 0) - swap (v[++last], v[i]); - swap (v[lower], v[last]); - vector_sort (v, compare, lower, last - 1); - vector_sort (v, compare, last + 1, upper); - } -#endif - - template - void - reverse (vector &v) - { - // CHECKME: for a simple vector, like vector, this should - // expand to memrev. - ::std::reverse (v.begin (), v.end ()); - } +template +void +vector_sort (vector &v, + Compare less, + vsize b = 0, vsize e = VPOS) +{ + if (e == VPOS) + e = v.size (); - template - void - uniq (vector &v) - { - v.erase (unique (v.begin (), v.end ()), v.end ()); - } + sort (v.begin () + b, v.begin () + e, less); +} - template - typename vector::const_iterator - find (vector const &v, T const &key) - { - return ::std::find (v.begin (), v.end (), key); - } +template +void +reverse (vector &v) +{ + // CHECKME: for a simple vector, like vector, this should + // expand to memrev. + reverse (v.begin (), v.end ()); +} -#if HAVE_BOOST_LAMBDA -#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 +void +uniq (vector &v) +{ + v.erase (unique (v.begin (), v.end ()), v.end ()); +} - template struct del : public unary_function - { - void operator() (T x) - { - delete x; - x = 0; - } - }; - - template - void - junk_pointers (vector &v) +template +typename vector::const_iterator +find (vector const &v, T const &key) +{ + return find (v.begin (), v.end (), key); +} + +template struct del : public unary_function +{ + void operator () (T x) { - // Hmm. - ::std::for_each (v.begin (), v.end (), del ()); - v.clear (); + delete x; + x = 0; } -#endif /* HAVE_BOOST_LAMBDA */ +}; +template +void +junk_pointers (vector &v) +{ + // Hmm. + for_each (v.begin (), v.end (), del ()); + v.clear (); } -using namespace std; +vector string_split (string str, char c); +string string_join (vector const &strs, const string &infix); + +#define iterof(i,s) typeof((s).begin()) i((s).begin()) #endif /* STD_VECTOR_HH */