📄 qgarray.cpp
字号:
/****************************************************************************** $Id: qt/src/tools/qgarray.cpp 2.2.3 edited 2000-08-25 $**** Implementation of QGArray class**** Created : 930906**** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.**** This file is part of the tools module of the Qt GUI Toolkit.**** This file may be distributed under the terms of the Q Public License** as defined by Trolltech AS of Norway and appearing in the file** LICENSE.QPL included in the packaging of this file.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition** licenses may use this file in accordance with the Qt Commercial License** Agreement provided with the Software.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for** information about Qt Commercial License Agreements.** See http://www.trolltech.com/qpl/ for QPL licensing information.** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#define QGARRAY_CPP#include "qgarray.h"#include "qstring.h"#include <stdlib.h>#define USE_MALLOC // comment to use new/delete#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// NOT REVISED/*! \class QShared qshared.h \brief The QShared struct is internally used for implementing shared classes. It only contains a reference count and member functions to increment and decrement it. Shared classes normally have internal classes that inherit QShared and add the shared data. \sa \link shclass.html Shared Classes\endlink*//*! \class QGArray qgarray.h \brief The QGArray class is an internal class for implementing the QArray class. QGArray is a strictly internal class that acts as base class for the QArray template array. It contains an array of bytes and has no notion of an array element.*//*! \internal Constructs a null array.*/QGArray::QGArray(){ shd = newData(); CHECK_PTR( shd );}/*! \internal 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.*/QGArray::QGArray( int, int ){}/*! \internal Constructs an array with room for \e size bytes.*/QGArray::QGArray( int size ){ if ( size < 0 ) {#if defined(CHECK_RANGE) qWarning( "QGArray: Cannot allocate array with negative length" );#endif size = 0; } shd = newData(); CHECK_PTR( shd ); if ( size == 0 ) // zero length return; shd->data = NEW(char,size); CHECK_PTR( shd->data ); shd->len = size;}/*! \internal Constructs a shallow copy of \e a.*/QGArray::QGArray( const QGArray &a ){ shd = a.shd; shd->ref();}/*! \internal Dereferences the array data and deletes it if this was the last reference.*/QGArray::~QGArray(){ if ( shd && shd->deref() ) { // delete when last reference if ( shd->data ) // is lost DELETE(shd->data); deleteData( shd ); }}/*! \fn QGArray &QGArray::operator=( const QGArray &a ) \internal Assigns a shallow copy of \e a to this array and returns a reference to this array. Equivalent to assign().*//*! \fn void QGArray::detach() \internal Detaches this array from shared array data.*//*! \fn char *QGArray::data() const \internal Returns a pointer to the actual array data.*//*! \fn uint QGArray::nrefs() const \internal Returns the reference count.*//*! \fn uint QGArray::size() const \internal Returns the size of the array, in bytes.*//*! \internal Returns TRUE if this array is equal to \e a, otherwise FALSE. The comparison is bitwise, of course.*/bool QGArray::isEqual( const QGArray &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;}/*! \internal Resizes the array to \e newsize bytes.*/bool QGArray::resize( uint newsize ){ if ( newsize == shd->len ) // nothing to do return TRUE; if ( newsize == 0 ) { // remove array duplicate( 0, 0 ); return TRUE; } if ( shd->data ) { // existing data#if defined(DONT_USE_REALLOC) char *newdata = NEW(char,newsize); // manual realloc memcpy( newdata, shd->data, QMIN(shd->len,newsize) ); DELETE(shd->data); shd->data = newdata;#else shd->data = (char *)realloc( shd->data, newsize );#endif } else { shd->data = NEW(char,newsize); } CHECK_PTR( shd->data ); if ( !shd->data ) // no memory return FALSE; shd->len = newsize; return TRUE;}/*! \internal Fills the array with the repeated occurrences of \e d, which is \e sz bytes long. If \e len is specified as different from -1, then the array will be resized to \e len*sz before it is filled. Returns TRUE if successful, or FALSE if the memory cannot be allocated (only when \e len != -1). \sa resize()*/bool QGArray::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 Q_INT32 *x = (Q_INT32*)data(); Q_INT32 v = *((Q_INT32*)d); while ( len-- ) *x++ = v; } else if ( sz == 2 ) { // 16 bit elements register Q_INT16 *x = (Q_INT16*)data(); Q_INT16 v = *((Q_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;}/*! \internal Shallow copy. Dereference the current array and references the data contained in \e a instead. Returns a reference to this array. \sa operator=()*/QGArray &QGArray::assign( const QGArray &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;}/*! \internal Shallow copy. Dereference the current array and references the array data \e d, which contains \e len bytes. Returns a reference to this array. Do not delete \e d later, because QGArray takes care of that.*/QGArray &QGArray::assign( const char *d, uint len ){ if ( shd->count > 1 ) { // disconnect this shd->count--; shd = newData(); CHECK_PTR( shd ); } else { if ( shd->data ) DELETE(shd->data); } shd->data = (char *)d; shd->len = len; return *this;}/*! \internal Deep copy. Dereference the current array and obtains a copy of the data contained in \e a instead. Returns a reference to this array. \sa assign(), operator=()*/QGArray &QGArray::duplicate( const QGArray &a ){ if ( a.shd == shd ) { // a.duplicate(a) ! if ( shd->count > 1 ) { shd->count--; register array_data *n = newData(); CHECK_PTR( n ); if ( (n->len=shd->len) ) { n->data = NEW(char,n->len); 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(); 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); CHECK_PTR( shd->data ); if ( shd->data ) memcpy( shd->data, a.shd->data, a.shd->len ); } else { shd->data = 0; } shd->len = a.shd->len; if ( oldptr ) DELETE(oldptr); return *this;}/*! \internal Deep copy. Dereferences the current array and obtains a copy of the array data \e d instead. Returns a reference to this array. \sa assign(), operator=()*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -