-rw-r--r-- | qmake/tools/qgarray.cpp | 97 |
1 files changed, 80 insertions, 17 deletions
diff --git a/qmake/tools/qgarray.cpp b/qmake/tools/qgarray.cpp index 45c45ce..0a522e4 100644 --- a/qmake/tools/qgarray.cpp +++ b/qmake/tools/qgarray.cpp | |||
@@ -37,5 +37,9 @@ | |||
37 | 37 | ||
38 | #include "qglobal.h" // needed to define Q_WS_WIN | 38 | #include "qglobal.h" |
39 | #ifdef Q_WS_WIN | 39 | #if defined(Q_CC_BOR) |
40 | #include "qt_windows.h" // needed for bsearch on some platforms | 40 | // needed for qsort() because of a std namespace problem on Borland |
41 | # include "qplatformdefs.h" | ||
42 | #elif defined(Q_WS_WIN) | ||
43 | // needed for bsearch on some platforms | ||
44 | # include "qt_windows.h" | ||
41 | #endif | 45 | #endif |
@@ -51,3 +55,9 @@ | |||
51 | 55 | ||
52 | #define USE_MALLOC // comment to use new/delete | 56 | /* |
57 | If USE_MALLOC isn't defined, we use new[] and delete[] to allocate | ||
58 | memory. The documentation for QMemArray<T>::assign() explicitly | ||
59 | mentions that the array is freed using free(), so don't mess around | ||
60 | with USE_MALLOC unless you know what you're doing. | ||
61 | */ | ||
62 | #define USE_MALLOC | ||
53 | 63 | ||
@@ -137,3 +147,7 @@ QGArray::QGArray( int size ) | |||
137 | Q_CHECK_PTR( shd->data ); | 147 | Q_CHECK_PTR( shd->data ); |
138 | shd->len = size; | 148 | shd->len = |
149 | #ifdef QT_QGARRAY_SPEED_OPTIM | ||
150 | shd->maxl = | ||
151 | #endif | ||
152 | size; | ||
139 | } | 153 | } |
@@ -214,8 +228,16 @@ bool QGArray::isEqual( const QGArray &a ) const | |||
214 | /*! | 228 | /*! |
215 | Resizes the array to \a newsize bytes. | 229 | Resizes the array to \a newsize bytes. \a optim is either |
230 | MemOptim (the default) or SpeedOptim. | ||
216 | */ | 231 | */ |
217 | 232 | bool QGArray::resize( uint newsize, Optimization optim ) | |
218 | bool QGArray::resize( uint newsize ) | ||
219 | { | 233 | { |
220 | if ( newsize == shd->len ) // nothing to do | 234 | #ifndef QT_QGARRAY_SPEED_OPTIM |
235 | Q_UNUSED(optim); | ||
236 | #endif | ||
237 | |||
238 | if ( newsize == shd->len | ||
239 | #ifdef QT_QGARRAY_SPEED_OPTIM | ||
240 | && newsize == shd->maxl | ||
241 | #endif | ||
242 | ) // nothing to do | ||
221 | return TRUE; | 243 | return TRUE; |
@@ -225,2 +247,21 @@ bool QGArray::resize( uint newsize ) | |||
225 | } | 247 | } |
248 | |||
249 | uint newmaxl = newsize; | ||
250 | #ifdef QT_QGARRAY_SPEED_OPTIM | ||
251 | if ( optim == SpeedOptim ) { | ||
252 | if ( newsize <= shd->maxl && | ||
253 | ( newsize * 4 > shd->maxl || shd->maxl <= 4 ) ) { | ||
254 | shd->len = newsize; | ||
255 | return TRUE; | ||
256 | } | ||
257 | newmaxl = 4; | ||
258 | while ( newmaxl < newsize ) | ||
259 | newmaxl *= 2; | ||
260 | // try to spare some memory | ||
261 | if ( newmaxl >= 1024 * 1024 && newsize <= newmaxl - (newmaxl >> 2) ) | ||
262 | newmaxl -= newmaxl >> 2; | ||
263 | } | ||
264 | shd->maxl = newmaxl; | ||
265 | #endif | ||
266 | |||
226 | if ( shd->data ) { // existing data | 267 | if ( shd->data ) { // existing data |
@@ -228,3 +269,3 @@ bool QGArray::resize( uint newsize ) | |||
228 | char *newdata = NEW(char,newsize);// manual realloc | 269 | char *newdata = NEW(char,newsize);// manual realloc |
229 | memcpy( newdata, shd->data, QMIN(shd->len,newsize) ); | 270 | memcpy( newdata, shd->data, QMIN(shd->len,newmaxl) ); |
230 | DELETE(shd->data); | 271 | DELETE(shd->data); |
@@ -232,6 +273,6 @@ bool QGArray::resize( uint newsize ) | |||
232 | #else | 273 | #else |
233 | shd->data = (char *)realloc( shd->data, newsize ); | 274 | shd->data = (char *)realloc( shd->data, newmaxl ); |
234 | #endif | 275 | #endif |
235 | } else { | 276 | } else { |
236 | shd->data = NEW(char,newsize); | 277 | shd->data = NEW(char,newmaxl); |
237 | } | 278 | } |
@@ -243,2 +284,10 @@ bool QGArray::resize( uint newsize ) | |||
243 | 284 | ||
285 | /*!\overload | ||
286 | */ | ||
287 | bool QGArray::resize( uint newsize ) | ||
288 | { | ||
289 | return resize( newsize, MemOptim ); | ||
290 | } | ||
291 | |||
292 | |||
244 | /*! | 293 | /*! |
@@ -321,3 +370,7 @@ QGArray &QGArray::assign( const char *d, uint len ) | |||
321 | shd->data = (char *)d; | 370 | shd->data = (char *)d; |
322 | shd->len = len; | 371 | shd->len = |
372 | #ifdef QT_QGARRAY_SPEED_OPTIM | ||
373 | shd->maxl = | ||
374 | #endif | ||
375 | len; | ||
323 | return *this; | 376 | return *this; |
@@ -366,3 +419,7 @@ QGArray &QGArray::duplicate( const QGArray &a ) | |||
366 | } | 419 | } |
367 | shd->len = a.shd->len; | 420 | shd->len = |
421 | #ifdef QT_QGARRAY_SPEED_OPTIM | ||
422 | shd->maxl = | ||
423 | #endif | ||
424 | a.shd->len; | ||
368 | if ( oldptr ) | 425 | if ( oldptr ) |
@@ -404,3 +461,7 @@ QGArray &QGArray::duplicate( const char *d, uint len ) | |||
404 | shd->data = data; | 461 | shd->data = data; |
405 | shd->len = len; | 462 | shd->len = |
463 | #ifdef QT_QGARRAY_SPEED_OPTIM | ||
464 | shd->maxl = | ||
465 | #endif | ||
466 | len; | ||
406 | return *this; | 467 | return *this; |
@@ -661,3 +722,4 @@ void QGArray::sort( uint sz ) | |||
661 | #ifdef QT_THREAD_SUPPORT | 722 | #ifdef QT_THREAD_SUPPORT |
662 | QMutexLocker locker( qt_global_mutexpool->get( &cmp_item_size ) ); | 723 | QMutexLocker locker( qt_global_mutexpool ? |
724 | qt_global_mutexpool->get( &cmp_item_size ) : 0 ); | ||
663 | #endif // QT_THREAD_SUPPORT | 725 | #endif // QT_THREAD_SUPPORT |
@@ -679,3 +741,4 @@ int QGArray::bsearch( const char *d, uint sz ) const | |||
679 | #ifdef QT_THREAD_SUPPORT | 741 | #ifdef QT_THREAD_SUPPORT |
680 | QMutexLocker locker( qt_global_mutexpool->get( &cmp_item_size ) ); | 742 | QMutexLocker locker( qt_global_mutexpool ? |
743 | qt_global_mutexpool->get( &cmp_item_size ) : 0 ); | ||
681 | #endif // QT_THREAD_SUPPORT | 744 | #endif // QT_THREAD_SUPPORT |