diff options
Diffstat (limited to 'tqtinterface/qt4/src/tools/tqgarray.cpp')
-rw-r--r-- | tqtinterface/qt4/src/tools/tqgarray.cpp | 830 |
1 files changed, 0 insertions, 830 deletions
diff --git a/tqtinterface/qt4/src/tools/tqgarray.cpp b/tqtinterface/qt4/src/tools/tqgarray.cpp deleted file mode 100644 index ca26750..0000000 --- a/tqtinterface/qt4/src/tools/tqgarray.cpp +++ /dev/null @@ -1,830 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQGArray class -** -** Created : 930906 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqglobal.h" -#if defined(TQ_CC_BOR) - // needed for qsort() because of a std namespace problem on Borland -# include "tqplatformdefs.h" -#elif defined(TQ_WS_WIN) - // needed for bsearch on some platforms -# include "tqt_windows.h" -#endif - -#define TQGARRAY_CPP -#include "tqgarray.h" -#include <stdlib.h> -#include <string.h> - -#ifdef TQT_THREAD_SUPPORT -# include <private/tqmutexpool_p.h> -#endif // TQT_THREAD_SUPPORT - -/* - If USE_MALLOC isn't defined, we use new[] and delete[] to allocate - memory. The documentation for TQMemArray<T>::assign() explicitly - mentions that the array is freed using free(), so don't mess around - with USE_MALLOC unless you know what you're doing. -*/ -#define USE_MALLOC - -#undef NEW -#undef DELETE - -#if defined(USE_MALLOC) -#define NEW(type,size) ((type*)malloc(size*sizeof(type))) -#define DELETE(array) (free((char*)array)) -#else -#define NEW(type,size) (new type[size]) -#define DELETE(array) (delete[] array) -#define DONT_USE_REALLOC // comment to use realloc() -#endif - -/*! - \class TQShared tqshared.h - \reentrant - \ingroup shared - \brief The TQShared class is used internally for implementing shared classes. - - \internal - - It only contains a reference count and member functions to increment and - decrement it. - - Shared classes normally have internal classes that inherit TQShared and - add the shared data. - - \sa \link shclass.html Shared Classes\endlink -*/ - -/*! - \class TQGArray tqgarray.h - \reentrant - \ingroup shared - \ingroup collection - \brief The TQGArray class is an internal class for implementing the TQMemArray class. - - \internal - - TQGArray is a strictly internal class that acts as base class for the - TQMemArray template array. - - It contains an array of bytes and has no notion of an array element. -*/ - - -/*! - Constructs a null array. -*/ - -TQGArray::TQGArray() -{ - shd = newData(); - TQ_CHECK_PTR( shd ); -} - -/*! - Dummy constructor; does not allocate any data. - - This constructor does not initialize any array data so subclasses - must do it. The intention is to make the code more efficient. -*/ - -TQGArray::TQGArray( int, int ) -{ -} - -/*! - Constructs an array with room for \a size bytes. -*/ - -TQGArray::TQGArray( int size ) -{ - if ( size < 0 ) { -#if defined(TQT_CHECK_RANGE) - qWarning( "TQGArray: Cannot allocate array with negative length" ); -#endif - size = 0; - } - shd = newData(); - TQ_CHECK_PTR( shd ); - if ( size == 0 ) // zero length - return; - shd->data = NEW(char,size); - TQ_CHECK_PTR( shd->data ); - shd->len = -#ifdef TQT_TQGARRAY_SPEED_OPTIM - shd->maxl = -#endif - size; -} - -/*! - Constructs a shallow copy of \a a. -*/ - -TQGArray::TQGArray( const TQGArray &a ) -{ - shd = a.shd; - shd->ref(); -} - -/*! - Dereferences the array data and deletes it if this was the last - reference. -*/ - -TQGArray::~TQGArray() -{ - if ( shd && shd->deref() ) { // delete when last reference - if ( shd->data ) // is lost - DELETE(shd->data); - deleteData( shd ); - shd = 0; - } -} - - -/*! - \fn TQGArray &TQGArray::operator=( const TQGArray &a ) - - Assigns a shallow copy of \a a to this array and returns a reference to - this array. Equivalent to assign(). -*/ - -/*! - \fn void TQGArray::detach() - - Detaches this array from shared array data. -*/ - -/*! - \fn char *TQGArray::data() const - - Returns a pointer to the actual array data. -*/ - -/*! - \fn uint TQGArray::nrefs() const - - Returns the reference count. -*/ - -/*! - \fn uint TQGArray::size() const - - Returns the size of the array, in bytes. -*/ - - -/*! - Returns TRUE if this array is equal to \a a, otherwise FALSE. - The comparison is bitwise, of course. -*/ - -bool TQGArray::isEqual( const TQGArray &a ) const -{ - if ( size() != a.size() ) // different size - return FALSE; - if ( data() == a.data() ) // has same data - return TRUE; - return (size() ? memcmp( data(), a.data(), size() ) : 0) == 0; -} - - -/*! - Resizes the array to \a newsize bytes. \a optim is either - \c MemOptim (the default) or \c SpeedOptim. - - <b>Note:</b> \c SpeedOptim is only available if TQt is built in a - particular configuration. By default, \c SpeedOptim is not available - for general use. -*/ -bool TQGArray::resize( uint newsize, Optimization optim ) -{ -#ifndef TQT_TQGARRAY_SPEED_OPTIM - TQ_UNUSED(optim); -#endif - - if ( newsize == shd->len -#ifdef TQT_TQGARRAY_SPEED_OPTIM - && newsize == shd->maxl -#endif - ) // nothing to do - return TRUE; - if ( newsize == 0 ) { // remove array - if ( shd->data ) - DELETE(shd->data); - shd->data = 0; - shd->len = 0; -#ifdef TQT_TQGARRAY_SPEED_OPTIM - shd->maxl = 0; -#endif - return TRUE; - } - - uint newmaxl = newsize; -#ifdef TQT_TQGARRAY_SPEED_OPTIM - if ( optim == SpeedOptim ) { - if ( newsize <= shd->maxl && - ( newsize * 4 > shd->maxl || shd->maxl <= 4 ) ) { - shd->len = newsize; - return TRUE; - } - newmaxl = 4; - while ( newmaxl < newsize ) - newmaxl *= 2; - // try to spare some memory - if ( newmaxl >= 1024 * 1024 && newsize <= newmaxl - (newmaxl >> 2) ) - newmaxl -= newmaxl >> 2; - } - shd->maxl = newmaxl; -#endif - - if ( shd->data ) { // existing data -#if defined(DONT_USE_REALLOC) - char *newdata = NEW(char,newsize); // manual realloc - memcpy( newdata, shd->data, TQMIN(shd->len,newmaxl) ); - DELETE(shd->data); - shd->data = newdata; -#else - shd->data = (char *)realloc( shd->data, newmaxl ); -#endif - } else { - shd->data = NEW(char,newmaxl); - } - if ( !shd->data ) // no memory - return FALSE; - shd->len = newsize; - return TRUE; -} - -/*!\overload -*/ -bool TQGArray::resize( uint newsize ) -{ - return resize( newsize, MemOptim ); -} - - -/*! - Fills the array with the repeated occurrences of \a d, which is - \a sz bytes long. - If \a len is specified as different from -1, then the array will be - resized to \a len*sz before it is filled. - - Returns TRUE if successful, or FALSE if the memory cannot be allocated - (only when \a len != -1). - - \sa resize() -*/ - -bool TQGArray::fill( const char *d, int len, uint sz ) -{ - if ( len < 0 ) - len = shd->len/sz; // default: use array length - else if ( !resize( len*sz ) ) - return FALSE; - if ( sz == 1 ) // 8 bit elements - memset( data(), *d, len ); - else if ( sz == 4 ) { // 32 bit elements - register TQ_INT32 *x = (TQ_INT32*)data(); - TQ_INT32 v = *((TQ_INT32*)d); - while ( len-- ) - *x++ = v; - } else if ( sz == 2 ) { // 16 bit elements - register TQ_INT16 *x = (TQ_INT16*)data(); - TQ_INT16 v = *((TQ_INT16*)d); - while ( len-- ) - *x++ = v; - } else { // any other size elements - register char *x = data(); - while ( len-- ) { // more complicated - memcpy( x, d, sz ); - x += sz; - } - } - return TRUE; -} - -/*! - \overload - Shallow copy. Dereference the current array and references the data - contained in \a a instead. Returns a reference to this array. - \sa operator=() -*/ - -TQGArray &TQGArray::assign( const TQGArray &a ) -{ - a.shd->ref(); // avoid 'a = a' - if ( shd->deref() ) { // delete when last reference - if ( shd->data ) // is lost - DELETE(shd->data); - deleteData( shd ); - } - shd = a.shd; - return *this; -} - -/*! - Shallow copy. Dereference the current array and references the - array data \a d, which contains \a len bytes. - Returns a reference to this array. - - Do not delete \a d later, because TQGArray takes care of that. -*/ - -TQGArray &TQGArray::assign( const char *d, uint len ) -{ - if ( shd->count > 1 ) { // disconnect this - shd->count--; - shd = newData(); - TQ_CHECK_PTR( shd ); - } else { - if ( shd->data ) - DELETE(shd->data); - } - shd->data = (char *)d; - shd->len = -#ifdef TQT_TQGARRAY_SPEED_OPTIM - shd->maxl = -#endif - len; - return *this; -} - -/*! - Deep copy. Dereference the current array and obtains a copy of the data - contained in \a a instead. Returns a reference to this array. - \sa assign(), operator=() -*/ - -TQGArray &TQGArray::duplicate( const TQGArray &a ) -{ - if ( a.shd == shd ) { // a.duplicate(a) ! - if ( shd->count > 1 ) { - shd->count--; - register array_data *n = newData(); - TQ_CHECK_PTR( n ); - if ( (n->len=shd->len) ) { - n->data = NEW(char,n->len); - TQ_CHECK_PTR( n->data ); - if ( n->data ) - memcpy( n->data, shd->data, n->len ); - } else { - n->data = 0; - } - shd = n; - } - return *this; - } - char *oldptr = 0; - if ( shd->count > 1 ) { // disconnect this - shd->count--; - shd = newData(); - TQ_CHECK_PTR( shd ); - } else { // delete after copy was made - oldptr = shd->data; - } - if ( a.shd->len ) { // duplicate data - shd->data = NEW(char,a.shd->len); - TQ_CHECK_PTR( shd->data ); - if ( shd->data ) - memcpy( shd->data, a.shd->data, a.shd->len ); - } else { - shd->data = 0; - } - shd->len = -#ifdef TQT_TQGARRAY_SPEED_OPTIM - shd->maxl = -#endif - a.shd->len; - if ( oldptr ) - DELETE(oldptr); - return *this; -} - -/*! - \overload - Deep copy. Dereferences the current array and obtains a copy of - \a len characters from array data \a d instead. Returns a reference - to this array. - \sa assign(), operator=() -*/ - -TQGArray &TQGArray::duplicate( const char *d, uint len ) -{ - char *data; - if ( d == 0 || len == 0 ) { - data = 0; - len = 0; - } else { - if ( shd->count == 1 && shd->len == len ) { - if ( shd->data != d ) // avoid self-assignment - memcpy( shd->data, d, len ); // use same buffer - return *this; - } - data = NEW(char,len); - TQ_CHECK_PTR( data ); - memcpy( data, d, len ); - } - if ( shd->count > 1 ) { // detach - shd->count--; - shd = newData(); - TQ_CHECK_PTR( shd ); - } else { // just a single reference - if ( shd->data ) - DELETE(shd->data); - } - shd->data = data; - shd->len = -#ifdef TQT_TQGARRAY_SPEED_OPTIM - shd->maxl = -#endif - len; - return *this; -} - -/*! - Resizes this array to \a len bytes and copies the \a len bytes at - address \a d into it. - - \warning This function disregards the reference count mechanism. If - other TQGArrays reference the same data as this, all will be updated. -*/ - -void TQGArray::store( const char *d, uint len ) -{ // store, but not deref - resize( len ); - memcpy( shd->data, d, len ); -} - - -/*! - \fn array_data *TQGArray::sharedBlock() const - - Returns a pointer to the shared array block. - - \warning - - Do not use this function. Using it is begging for trouble. We dare - not remove it, for fear of breaking code, but we \e strongly - discourage new use of it. -*/ - -/*! - \fn void TQGArray::setSharedBlock( array_data *p ) - - Sets the shared array block to \a p. - - \warning - - Do not use this function. Using it is begging for trouble. We dare - not remove it, for fear of breaking code, but we \e strongly - discourage new use of it. -*/ - - -/*! - Sets raw data and returns a reference to the array. - - Dereferences the current array and sets the new array data to \a d and - the new array size to \a len. Do not attempt to resize or re-assign the - array data when raw data has been set. - Call resetRawData(d,len) to reset the array. - - Setting raw data is useful because it sets TQMemArray data without - allocating memory or copying data. - - Example of intended use: - \code - static uchar bindata[] = { 231, 1, 44, ... }; - TQByteArray a; - a.setRawData( bindata, sizeof(bindata) ); // a points to bindata - TQDataStream s( a, IO_ReadOnly ); // open on a's data - s >> <something>; // read raw bindata - s.close(); - a.resetRawData( bindata, sizeof(bindata) ); // finished - \endcode - - Example of misuse (do not do this): - \code - static uchar bindata[] = { 231, 1, 44, ... }; - TQByteArray a, b; - a.setRawData( bindata, sizeof(bindata) ); // a points to bindata - a.resize( 8 ); // will crash - b = a; // will crash - a[2] = 123; // might crash - // forget to resetRawData - will crash - \endcode - - \warning If you do not call resetRawData(), TQGArray will attempt to - deallocate or reallocate the raw data, which might not be too good. - Be careful. -*/ - -TQGArray &TQGArray::setRawData( const char *d, uint len ) -{ - duplicate( 0, 0 ); // set null data - shd->data = (char *)d; - shd->len = len; - return *this; -} - -/*! - Resets raw data. - - The arguments must be the data, \a d, and length \a len, that were - passed to setRawData(). This is for consistency checking. -*/ - -void TQGArray::resetRawData( const char *d, uint len ) -{ - if ( d != shd->data || len != shd->len ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQGArray::resetRawData: Inconsistent arguments" ); -#endif - return; - } - shd->data = 0; - shd->len = 0; -} - - -/*! - Finds the first occurrence of \a d in the array from position \a index, - where \a sz is the size of the \a d element. - - Note that \a index is given in units of \a sz, not bytes. - - This function only compares whole cells, not bytes. -*/ - -int TQGArray::find( const char *d, uint index, uint sz ) const -{ - index *= sz; - if ( index >= shd->len ) { -#if defined(TQT_CHECK_RANGE) - qWarning( "TQGArray::find: Index %d out of range", index/sz ); -#endif - return -1; - } - register uint i; - uint ii; - switch ( sz ) { - case 1: { // 8 bit elements - register char *x = data() + index; - char v = *d; - for ( i=index; i<shd->len; i++ ) { - if ( *x++ == v ) - break; - } - ii = i; - } - break; - case 2: { // 16 bit elements - register TQ_INT16 *x = (TQ_INT16*)(data() + index); - TQ_INT16 v = *((TQ_INT16*)d); - for ( i=index; i<shd->len; i+=2 ) { - if ( *x++ == v ) - break; - } - ii = i/2; - } - break; - case 4: { // 32 bit elements - register TQ_INT32 *x = (TQ_INT32*)(data() + index); - TQ_INT32 v = *((TQ_INT32*)d); - for ( i=index; i<shd->len; i+=4 ) { - if ( *x++ == v ) - break; - } - ii = i/4; - } - break; - default: { // any size elements - for ( i=index; i<shd->len; i+=sz ) { - if ( memcmp( d, &shd->data[i], sz ) == 0 ) - break; - } - ii = i/sz; - } - break; - } - return i<shd->len ? (int)ii : -1; -} - -/*! - Returns the number of occurrences of \a d in the array, where \a sz is - the size of the \a d element. - - This function only compares whole cells, not bytes. -*/ - -int TQGArray::contains( const char *d, uint sz ) const -{ - register uint i = shd->len; - int count = 0; - switch ( sz ) { - case 1: { // 8 bit elements - register char *x = data(); - char v = *d; - while ( i-- ) { - if ( *x++ == v ) - count++; - } - } - break; - case 2: { // 16 bit elements - register TQ_INT16 *x = (TQ_INT16*)data(); - TQ_INT16 v = *((TQ_INT16*)d); - i /= 2; - while ( i-- ) { - if ( *x++ == v ) - count++; - } - } - break; - case 4: { // 32 bit elements - register TQ_INT32 *x = (TQ_INT32*)data(); - TQ_INT32 v = *((TQ_INT32*)d); - i /= 4; - while ( i-- ) { - if ( *x++ == v ) - count++; - } - } - break; - default: { // any size elements - for ( i=0; i<shd->len; i+=sz ) { - if ( memcmp(d, &shd->data[i], sz) == 0 ) - count++; - } - } - break; - } - return count; -} - -static int cmp_item_size = 0; - -#if defined(TQ_C_CALLBACKS) -extern "C" { -#endif - -#ifdef TQ_OS_TEMP -static int __cdecl cmp_arr( const void *n1, const void *n2 ) -#else -static int cmp_arr( const void *n1, const void *n2 ) -#endif -{ - return ( n1 && n2 ) ? memcmp( n1, n2, cmp_item_size ) - : ( n1 ? 1 : ( n2 ? -1 : 0 ) ); - // ### TQt 3.0: Add a virtual compareItems() method and call that instead -} - -#if defined(TQ_C_CALLBACKS) -} -#endif - -/*! - Sorts the first \a sz items of the array. -*/ - -void TQGArray::sort( uint sz ) -{ - int numItems = size() / sz; - if ( numItems < 2 ) - return; - -#ifdef TQT_THREAD_SUPPORT - TQMutexLocker locker( tqt_global_mutexpool ? - tqt_global_mutexpool->get( &cmp_item_size ) : 0 ); -#endif // TQT_THREAD_SUPPORT - - cmp_item_size = sz; - qsort( shd->data, numItems, sz, cmp_arr ); -} - -/*! - Binary search; assumes that \a d is a sorted array of size \a sz. -*/ - -int TQGArray::bsearch( const char *d, uint sz ) const -{ - int numItems = size() / sz; - if ( !numItems ) - return -1; - -#ifdef TQT_THREAD_SUPPORT - TQMutexLocker locker( tqt_global_mutexpool ? - tqt_global_mutexpool->get( &cmp_item_size ) : 0 ); -#endif // TQT_THREAD_SUPPORT - - cmp_item_size = sz; - char* r = (char*)::bsearch( d, shd->data, numItems, sz, cmp_arr ); - if ( !r ) - return -1; - while( (r >= shd->data + sz) && (cmp_arr( r - sz, d ) == 0) ) - r -= sz; // search to first of equal elements; bsearch is undef - return (int)(( r - shd->data ) / sz); -} - - -/*! - \fn char *TQGArray::at( uint index ) const - - Returns a pointer to the byte at offset \a index in the array. -*/ - -/*! - Expand the array if necessary, and copies (the first part of) its - contents from the \a index * \a sz bytes at \a d. - - Returns TRUE if the operation succeeds, FALSE if it runs out of - memory. - - \warning This function disregards the reference count mechanism. If - other TQGArrays reference the same data as this, all will be changed. -*/ - -bool TQGArray::setExpand( uint index, const char *d, uint sz ) -{ - index *= sz; - if ( index >= shd->len ) { - if ( !resize( index+sz ) ) // no memory - return FALSE; - } - memcpy( data() + index, d, sz ); - return TRUE; -} - - -/*! - Prints a warning message if at() or [] is given a bad index. -*/ - -void TQGArray::msg_index( uint index ) -{ -#if defined(TQT_CHECK_RANGE) - qWarning( "TQGArray::at: Absolute index %d out of range", index ); -#else - TQ_UNUSED( index ) -#endif -} - - -/*! - Returns a new shared array block. -*/ - -TQGArray::array_data * TQGArray::newData() -{ - return new array_data; -} - - -/*! - Deletes the shared array block \a p. -*/ - -void TQGArray::deleteData( array_data *p ) -{ - delete p; -} |