diff options
Diffstat (limited to 'sfx2/inc/sfx2/minarray.hxx')
-rw-r--r-- | sfx2/inc/sfx2/minarray.hxx | 532 |
1 files changed, 532 insertions, 0 deletions
diff --git a/sfx2/inc/sfx2/minarray.hxx b/sfx2/inc/sfx2/minarray.hxx new file mode 100644 index 000000000000..76d060fd5640 --- /dev/null +++ b/sfx2/inc/sfx2/minarray.hxx @@ -0,0 +1,532 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: minarray.hxx,v $ + * $Revision: 1.3 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef _SFXVARARR_HXX +#define _SFXVARARR_HXX + +#include "sal/config.h" +#include "sfx2/dllapi.h" + +#include <limits.h> +#include <string.h> +#include <tools/solar.h> +#include <tools/debug.hxx> +//#include "typecast.hxx" + +#if defined (ALPHA) && defined (UNX) +#define DEL_ARRAY( X ) +#else +#define DEL_ARRAY( X ) X +#endif + +#define DECL_OBJARRAY( ARR, T, nI, nG ) \ +class ARR\ +{\ +private:\ + T* pData;\ + USHORT nUsed;\ + BYTE nGrow;\ + BYTE nUnused;\ +public:\ + ARR( BYTE nInitSize = nI, BYTE nGrowSize = nG );\ + ARR( const ARR& rOrig );\ + ~ARR();\ +\ + ARR& operator= ( const ARR& rOrig );\ +\ + const T& GetObject( USHORT nPos ) const; \ + T& GetObject( USHORT nPos ); \ +\ + void Insert( USHORT nPos, ARR& rIns, USHORT nStart = 0, USHORT nEnd = USHRT_MAX );\ + void Insert( USHORT nPos, const T& rElem );\ + void Insert( USHORT nPos, const T& rElems, USHORT nLen );\ + void Append( const T& rElem );\ +\ + BOOL Remove( const T& rElem );\ + USHORT Remove( USHORT nPos, USHORT nLen );\ +\ + USHORT Count() const { return nUsed; }\ + T* operator*();\ + const T& operator[]( USHORT nPos ) const;\ + T& operator[]( USHORT nPos );\ +\ + BOOL Contains( const T& rItem ) const;\ + void Clear() { Remove( 0, Count() ); }\ +};\ +\ +inline void ARR::Insert( USHORT nPos, ARR& rIns, USHORT nStart, USHORT nEnd )\ +{\ + Insert( nPos, *(rIns.pData+(sizeof(T)*nStart)), nStart-nEnd+1 );\ +}\ +\ +inline void ARR::Insert( USHORT nPos, const T& rElem )\ +{\ + Insert( nPos, rElem, 1 );\ +}\ +\ +inline T* ARR::operator*()\ +{\ + return ( nUsed==0 ? 0 : pData );\ +} \ +inline const T& ARR::operator[]( USHORT nPos ) const\ +{\ + DBG_ASSERT( nPos < nUsed, "" ); \ + return *(pData+nPos);\ +} \ +inline T& ARR::operator [] (USHORT nPos) \ +{\ + DBG_ASSERT( nPos < nUsed, "" ); \ + return *(pData+nPos); \ +} \ +inline const T& ARR::GetObject( USHORT nPos ) const { return operator[](nPos); } \ +inline T& ARR::GetObject( USHORT nPos ) { return operator[](nPos); } \ + +#ifndef _lint +// String too long + +#define IMPL_OBJARRAY( ARR, T ) \ +ARR::ARR( BYTE nInitSize, BYTE nGrowSize ): \ + nUsed(0), \ + nGrow( nGrowSize ? nGrowSize : 1 ), \ + nUnused(nInitSize) \ +{ \ + if ( nInitSize != 0 ) \ + { \ + size_t nBytes = nInitSize * sizeof(T); \ + pData = (T*) new char[ nBytes ]; \ + memset( pData, 0, nBytes ); \ + } \ + else \ + pData = 0; \ +} \ +\ +ARR::ARR( const ARR& rOrig ) \ +{ \ + nUsed = rOrig.nUsed; \ + nGrow = rOrig.nGrow; \ + nUnused = rOrig.nUnused; \ +\ + if ( rOrig.pData != 0 ) \ + { \ + size_t nBytes = (nUsed + nUnused) * sizeof(T); \ + pData = (T*) new char [ nBytes ]; \ + memset( pData, 0, nBytes ); \ + for ( USHORT n = 0; n < nUsed; ++n ) \ + *(pData+n) = *(rOrig.pData+n); \ + } \ + else \ + pData = 0; \ +} \ +\ +ARR::~ARR() \ +{ \ + for ( USHORT n = 0; n < nUsed; ++n ) \ + ( pData+n )->T::~T(); \ + delete[] (char*) pData;\ +} \ +\ +ARR& ARR::operator= ( const ARR& rOrig )\ +{ \ + for ( USHORT n = 0; n < nUsed; ++n ) \ + ( pData+n )->T::~T(); \ + delete[] (char*) pData;\ +\ + nUsed = rOrig.nUsed; \ + nGrow = rOrig.nGrow; \ + nUnused = rOrig.nUnused; \ +\ + if ( rOrig.pData != 0 ) \ + { \ + size_t nBytes = (nUsed + nUnused) * sizeof(T); \ + pData = (T*) new char[ nBytes ]; \ + memset( pData, 0, nBytes ); \ + for ( USHORT n = 0; n < nUsed; ++n ) \ + *(pData+n) = *(rOrig.pData+n); \ + } \ + else \ + pData = 0; \ + return *this; \ +} \ +\ +void ARR::Append( const T& aElem ) \ +{ \ + \ + if ( nUnused == 0 ) \ + { \ + USHORT nNewSize = (nUsed == 1) ? (nGrow==1 ? 2 : nGrow) : nUsed+nGrow; \ + size_t nBytes = nNewSize * sizeof(T); \ + T* pNewData = (T*) new char[ nBytes ]; \ + memset( pNewData, 0, nBytes ); \ + if ( pData ) \ + { \ + memcpy( pNewData, pData, nUsed * sizeof(T) ); \ + delete[] (char*) pData;\ + } \ + nUnused = (BYTE)(nNewSize-nUsed); \ + pData = pNewData; \ + } \ +\ + \ + pData[nUsed] = aElem; \ + ++nUsed; \ + --nUnused; \ +} \ +\ +USHORT ARR::Remove( USHORT nPos, USHORT nLen ) \ +{ \ + DBG_ASSERT( (nPos+nLen) < (nUsed+1), "" ); \ + DBG_ASSERT( nLen > 0, "" ); \ +\ + nLen = Min( (USHORT)(nUsed-nPos), (USHORT)nLen ); \ +\ + if ( nLen == 0 ) \ + return 0; \ +\ + for ( USHORT n = nPos; n < (nPos+nLen); ++n ) \ + ( pData+n )->T::~T(); \ +\ + if ( (nUsed-nLen) == 0 ) \ + { \ + delete[] (char*) pData;\ + pData = 0; \ + nUsed = 0; \ + nUnused = 0; \ + return nLen; \ + } \ +\ + if ( (nUnused+nLen) >= nGrow ) \ + { \ + USHORT nNewUsed = nUsed-nLen; \ + USHORT nNewSize = ((nNewUsed+nGrow-1)/nGrow) * nGrow; \ + DBG_ASSERT( nNewUsed <= nNewSize && nNewUsed+nGrow > nNewSize, \ + "shrink size computation failed" ); \ + size_t nBytes = nNewSize * sizeof(T); \ + T* pNewData = (T*) new char[ nBytes ]; \ + memset( pNewData, 0, nBytes ); \ + if ( nPos > 0 ) \ + memcpy( pNewData, pData, nPos * sizeof(T) ); \ + if ( nNewUsed != nPos ) \ + memcpy(pNewData+nPos, pData+nPos+nLen, (nNewUsed-nPos) * sizeof(T) ); \ + delete[] (char*) pData;\ + pData = pNewData; \ + nUsed = nNewUsed; \ + nUnused = (BYTE)(nNewSize - nNewUsed); \ + return nLen; \ + } \ +\ + \ + if ( nUsed-nPos-nLen > 0 ) \ + { \ + memmove(pData+nPos, pData+nPos+nLen, (nUsed-nPos-nLen) * sizeof(T));\ + } \ + nUsed = nUsed - nLen; \ + nUnused = sal::static_int_cast< BYTE >(nUnused + nLen); \ + return nLen; \ +} \ +\ +BOOL ARR::Remove( const T& aElem ) \ +{ \ + if ( nUsed == 0 ) \ + return FALSE; \ +\ + const T *pIter = pData + nUsed - 1; \ + for ( USHORT n = 0; n < nUsed; ++n, --pIter ) \ + if ( *pIter == aElem ) \ + { \ + Remove(nUsed-n-1, 1); \ + return TRUE; \ + } \ + return FALSE; \ +} \ +\ +BOOL ARR::Contains( const T& rItem ) const \ +{ \ + if ( !nUsed ) \ + return FALSE; \ + for ( USHORT n = 0; n < nUsed; ++n ) \ + { \ + const T& r2ndItem = GetObject(n); \ + if ( r2ndItem == rItem ) \ + return TRUE; \ + } \ + return FALSE; \ +} \ +\ +void ARR::Insert( USHORT nPos, const T& rElems, USHORT nLen ) \ +{ \ + DBG_ASSERT( nPos <= nUsed, "" ); \ + \ + if ( nUnused == 0 ) \ + { \ + \ + /* auf die naechste Grow-Grenze aufgerundet vergroeszern */ \ + USHORT nNewSize; \ + for ( nNewSize = nUsed+nGrow; nNewSize < (nUsed + nLen); ++nNewSize ) \ + /* empty loop */; \ + size_t nBytes = nNewSize * sizeof(T); \ + T* pNewData = (T*) new char[ nBytes ]; \ + memset( pNewData, 0, nBytes ); \ + \ + if ( pData ) \ + { \ + DBG_ASSERT( nUsed < nNewSize, "" ); \ + memcpy( pNewData, pData, nUsed * sizeof(T) ); \ + delete (char*) pData;\ + } \ + nUnused = (BYTE)(nNewSize-nUsed); \ + pData = pNewData; \ + } \ +\ + \ + if ( nPos < nUsed ) \ + { \ + memmove(pData+nPos+nLen-1, pData+nPos-1, sizeof(T) * (nUsed-nPos)); \ + } \ +\ + memmove(pData+nPos, &rElems, sizeof(T) * nLen); \ + nUsed = nUsed + nLen; \ + nUnused = sal::static_int_cast< BYTE >(nUnused - nLen); \ +} + +// _lint +#endif + +class SFX2_DLLPUBLIC SfxPtrArr +{ +private: + void** pData; + USHORT nUsed; + BYTE nGrow; + BYTE nUnused; +public: + SfxPtrArr( BYTE nInitSize = 0, BYTE nGrowSize = 8 ); + SfxPtrArr( const SfxPtrArr& rOrig ); + ~SfxPtrArr(); + SfxPtrArr& operator= ( const SfxPtrArr& rOrig ); + void* GetObject( USHORT nPos ) const { return operator[](nPos); } + void*& GetObject( USHORT nPos ) { return operator[](nPos); } + void Insert( USHORT nPos, void* rElem ); + void Append( void* rElem ); + BOOL Replace( void* pOldElem, void* pNewElem ); + BOOL Remove( void* rElem ); + USHORT Remove( USHORT nPos, USHORT nLen ); + USHORT Count() const { return nUsed; } + inline void** operator*(); + inline void* operator[]( USHORT nPos ) const; + inline void*& operator[]( USHORT nPos ); + BOOL Contains( const void* rItem ) const; + void Clear() { Remove( 0, Count() ); } +}; + +inline void** SfxPtrArr::operator*() +{ + return ( nUsed==0 ? 0 : pData ); +} + +inline void* SfxPtrArr::operator[]( USHORT nPos ) const +{ + DBG_ASSERT( nPos < nUsed, "" ); + return *(pData+nPos); +} + +inline void*& SfxPtrArr::operator [] (USHORT nPos) +{ + DBG_ASSERT( nPos < nUsed, "" ); + return *(pData+nPos); +} + + +#define DECL_PTRARRAY(ARR, T, nI, nG)\ +class ARR: public SfxPtrArr\ +{\ +public:\ + ARR( BYTE nIni=nI, BYTE nGrowValue=nG ):\ + SfxPtrArr(nIni,nGrowValue) \ + {}\ + ARR( const ARR& rOrig ):\ + SfxPtrArr(rOrig) \ + {}\ + T GetObject( USHORT nPos ) const { return operator[](nPos); } \ + T& GetObject( USHORT nPos ) { return operator[](nPos); } \ + void Insert( USHORT nPos, T aElement ) {\ + SfxPtrArr::Insert(nPos,(void *)aElement);\ + }\ + void Append( T aElement ) {\ + SfxPtrArr::Append((void *)aElement);\ + }\ + BOOL Replace( T aOldElem, T aNewElem ) {\ + return SfxPtrArr::Replace((void *)aOldElem, (void*) aNewElem);\ + }\ + void Remove( T aElement ) {\ + SfxPtrArr::Remove((void*)aElement);\ + }\ + void Remove( USHORT nPos, USHORT nLen = 1 ) {\ + SfxPtrArr::Remove( nPos, nLen ); \ + }\ + T* operator *() {\ + return (T*) SfxPtrArr::operator*();\ + }\ + T operator[]( USHORT nPos ) const { \ + return (T) SfxPtrArr::operator[](nPos); } \ + T& operator[]( USHORT nPos ) { \ + return (T&) SfxPtrArr::operator[](nPos); } \ + void Clear() { Remove( 0, Count() ); }\ +}; + +class ByteArr +{ +private: + char* pData; + USHORT nUsed; + BYTE nGrow; + BYTE nUnused; +public: + ByteArr( BYTE nInitSize = 0, BYTE nGrowSize = 8 ); + ByteArr( const ByteArr& rOrig ); + ~ByteArr(); + ByteArr& operator= ( const ByteArr& rOrig ); + char GetObject( USHORT nPos ) const { return operator[](nPos); } + char& GetObject( USHORT nPos ) { return operator[](nPos); } + void Insert( USHORT nPos, char rElem ); + void Append( char rElem ); + BOOL Remove( char rElem ); + USHORT Remove( USHORT nPos, USHORT nLen ); + USHORT Count() const { return nUsed; } + char* operator*(); + char operator[]( USHORT nPos ) const; + char& operator[]( USHORT nPos ); + BOOL Contains( const char rItem ) const; + void Clear() { Remove( 0, Count() ); } +}; + +inline char* ByteArr::operator*() +{ + return ( nUsed==0 ? 0 : pData ); +} + +#define DECL_1BYTEARRAY(ARR, T, nI, nG)\ +class ARR: public ByteArr\ +{\ +public:\ + ARR( BYTE nIni=nI, BYTE nGrow=nG ):\ + ByteArr(nIni,nGrow) \ + {}\ + ARR( const ARR& rOrig ):\ + ByteArr(rOrig) \ + {}\ + T GetObject( USHORT nPos ) const { return operator[](nPos); } \ + T& GetObject( USHORT nPos ) { return operator[](nPos); } \ + void Insert( USHORT nPos, T aElement ) {\ + ByteArr::Insert(nPos,(char)aElement);\ + }\ + void Append( T aElement ) {\ + ByteArr::Append((char)aElement);\ + }\ + void Remove( T aElement ) {\ + ByteArr::Remove((char)aElement);\ + }\ + void Remove( USHORT nPos, USHORT nLen = 1 ) {\ + ByteArr::Remove( nPos, nLen ); \ + }\ + T* operator *() {\ + return (T*) ByteArr::operator*();\ + }\ + T operator[]( USHORT nPos ) const { \ + return (T) ByteArr::operator[](nPos); } \ + T& operator[]( USHORT nPos ) { \ + return (T&) ByteArr::operator[](nPos); } \ + void Clear() { Remove( 0, Count() ); }\ +}; + +class WordArr +{ +private: + short* pData; + USHORT nUsed; + BYTE nGrow; + BYTE nUnused; +public: + WordArr( BYTE nInitSize = 0, BYTE nGrowSize = 8 ); + WordArr( const WordArr& rOrig ); + ~WordArr(); + WordArr& operator= ( const WordArr& rOrig ); + short GetObject( USHORT nPos ) const { return operator[](nPos); } + short& GetObject( USHORT nPos ) { return operator[](nPos); } + void Insert( USHORT nPos, short rElem ); + void Append( short rElem ); + BOOL Remove( short rElem ); + USHORT Remove( USHORT nPos, USHORT nLen ); + USHORT Count() const { return nUsed; } + short* operator*(); + short operator[]( USHORT nPos ) const; + short& operator[]( USHORT nPos ); + BOOL Contains( const short rItem ) const; + void Clear() { Remove( 0, Count() ); } +}; + +inline short* WordArr::operator*() +{ + return ( nUsed==0 ? 0 : pData ); +} + +#define DECL_2BYTEARRAY(ARR, T, nI, nG)\ +class ARR: public WordArr\ +{\ +public:\ + ARR( BYTE nIni=nI, BYTE nGrowValue=nG ):\ + WordArr(nIni,nGrowValue) \ + {}\ + ARR( const ARR& rOrig ):\ + WordArr(rOrig) \ + {}\ + T GetObject( USHORT nPos ) const { return operator[](nPos); } \ + T& GetObject( USHORT nPos ) { return operator[](nPos); } \ + void Insert( USHORT nPos, T aElement ) {\ + WordArr::Insert(nPos,(short)aElement);\ + }\ + void Append( T aElement ) {\ + WordArr::Append((short)aElement);\ + }\ + void Remove( T aElement ) {\ + WordArr::Remove((short)aElement);\ + }\ + void Remove( USHORT nPos, USHORT nLen = 1 ) {\ + WordArr::Remove( nPos, nLen ); \ + }\ + T* operator *() {\ + return (T*) WordArr::operator*();\ + }\ + T operator[]( USHORT nPos ) const { \ + return (T) WordArr::operator[](nPos); } \ + T& operator[]( USHORT nPos ) { \ + return (T&) WordArr::operator[](nPos); } \ + void Clear() { Remove( 0, Count() ); }\ +}; + +#endif |