⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qgarray.cpp

📁 doxygen(一个自动从源代码生成文档的工具)的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************** $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 + -