diff options
Diffstat (limited to 'svl/inc/svl/svarray.hxx')
-rw-r--r-- | svl/inc/svl/svarray.hxx | 1056 |
1 files changed, 1056 insertions, 0 deletions
diff --git a/svl/inc/svl/svarray.hxx b/svl/inc/svl/svarray.hxx new file mode 100644 index 000000000000..555b7ad5fe84 --- /dev/null +++ b/svl/inc/svl/svarray.hxx @@ -0,0 +1,1056 @@ +/************************************************************************* + * + * 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: svarray.hxx,v $ + * $Revision: 1.4 $ + * + * 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 _SVARRAY_HXX +#define _SVARRAY_HXX + +#if 0 +*********************************************************************** +* +* Hier folgt die Beschreibung fuer die exportierten Makros: +* +* SV_DECL_VARARR(nm, AE, IS, GS) +* SV_IMPL_VARARR( nm, AE ) +* definiere/implementiere ein Array das einfache Objecte +* enthaelt. (Sie werden im Speicher verschoben, koennen also +* z.B. keine String sein) +* +* SV_DECL_OBJARR(nm, AE, IS, GS) +* SV_IMPL_OBJARR( nm, AE ) +* definiere/implementiere ein Array das Objecte enthaelt. +* (Hier koennen es auch Strings sein) +* +* +* SV_DECL_PTRARR(nm, AE, IS, GS) +* SV_IMPL_PTRARR(nm, AE) +* definiere/implementiere ein Array das Pointer haelt. Diese +* werden von aussen angelegt und zerstoert. Das IMPL-Makro +* wird nur benoetigt, wenn die DeleteAndDestroy Methode genutzt +* wird, diese loescht dann die Pointer und ruft deren Destruktoren +* +* SV_DECL_PTRARR_DEL(nm, AE, IS, GS) +* SV_IMPL_PTRARR(nm, AE) +* definiere/implementiere ein Array das Pointer haelt. Diese +* werden von aussen angelegt und im Destructor zerstoert. +* +* +* SV_DECL_PTRARR_SORT(nm, AE, IS, GS) +* SV_IMPL_PTRARR_SORT( nm,AE ) +* defieniere/implementiere ein Sort-Array mit Pointern, das nach +* Pointern sortiert ist. Basiert auf einem PTRARR +* +* SV_DECL_PTRARR_SORT_DEL(nm, AE, IS, GS) +* SV_IMPL_PTRARR_SORT( nm,AE ) +* defieniere/implementiere ein Sort-Array mit Pointern, das nach +* Pointern sortiert ist. Basiert auf einem PTRARR_DEL +* +* SV_DECL_PTRARR_SORT(nm, AE, IS, GS) +* SV_IMPL_OP_PTRARR_SORT( nm,AE ) +* defieniere/implementiere ein Sort-Array mit Pointern, das nach +* Objecten sortiert ist. Basiert auf einem PTRARR. +* Sortierung mit Hilfe der Object-operatoren "<" und "==" +* +* SV_DECL_PTRARR_SORT_DEL(nm, AE, IS, GS) +* SV_IMPL_OP_PTRARR_SORT( nm,AE ) +* defieniere/implementiere ein Sort-Array mit Pointern, das nach +* Objecten sortiert ist. Basiert auf einem PTRARR_DEL. +* Sortierung mit Hilfe der Object-operatoren "<" und "==" +* +* SV_DECL_VARARR_SORT(nm, AE, IS, GS) +* SV_IMPL_VARARR_SORT( nm,AE ) +* defieniere/implementiere ein Sort-Array mit einfachen Objecten. +* Basiert auf einem VARARR. +* Sortierung mit Hilfe der Object-operatoren "<" und "==" +* +* JP 23.12.94 neu: +* SV_DECL_PTRARR_STACK(nm, AE, IS, GS) +* ein Stack mit einem PtrArray als Grundlage. +* +* JP 09.10.96: vordefinierte Arrays: +* VarArr: SvBools, SvULongs, SvUShorts, SvLongs, SvShorts +* PtrArr: SvStrings, SvStringsDtor +* SortArr: SvStringsSort, SvStringsSortDtor, +* SvStringsISort, SvStringsISortDtor +*********************************************************************** +#endif + +#include "svl/svldllapi.h" + +#ifndef INCLUDED_STRING_H +#include <string.h> // memmove() +#define INCLUDED_STRING_H +#endif + +#ifndef INCLUDED_LIMITS_H +#include <limits.h> // USHRT_MAX +#define INCLUDED_LIMITS_H +#endif +#include <rtl/alloc.h> +#include <tools/solar.h> + +class String; + +#ifndef CONCAT +#define CONCAT(x,y) x##y +#endif + +class DummyType; +inline void* operator new( size_t, DummyType* pPtr ) +{ + return pPtr; +} +inline void operator delete( void*, DummyType* ) {} + +#if defined(PRODUCT) + +#define _SVVARARR_DEF_GET_OP_INLINE( nm, ArrElem ) \ +ArrElem& operator[](USHORT nP) const { return *(pData+nP); }\ +\ +void Insert( const nm * pI, USHORT nP,\ + USHORT nS = 0, USHORT nE = USHRT_MAX )\ +{\ + if( USHRT_MAX == nE ) \ + nE = pI->nA; \ + if( nS < nE ) \ + Insert( (const ArrElem*)pI->pData+nS, (USHORT)nE-nS, nP );\ +} + +#define _SVVARARR_IMPL_GET_OP_INLINE( nm, ArrElem ) + +#else + +#define _SVVARARR_DEF_GET_OP_INLINE( nm,ArrElem )\ +ArrElem& operator[](USHORT nP) const;\ +void Insert( const nm *pI, USHORT nP,\ + USHORT nS = 0, USHORT nE = USHRT_MAX ); + +#define _SVVARARR_IMPL_GET_OP_INLINE( nm, ArrElem )\ +ArrElem& nm::operator[](USHORT nP) const\ +{\ + DBG_ASSERT( pData && nP < nA,"Op[]");\ + return *(pData+nP);\ +}\ +void nm::Insert( const nm *pI, USHORT nP, USHORT nStt, USHORT nE)\ +{\ + DBG_ASSERT(nP<=nA,"Ins,Ar[Start.End]");\ + if( USHRT_MAX == nE ) \ + nE = pI->nA; \ + if( nStt < nE ) \ + Insert( (const ArrElem*)pI->pData+nStt, (USHORT)nE-nStt, nP );\ +} + +#endif + +#define _SV_DECL_VARARR_GEN(nm, AE, IS, GS, AERef, vis )\ +typedef BOOL (*FnForEach_##nm)( const AERef, void* );\ +class vis nm\ +{\ +protected:\ + AE *pData;\ + USHORT nFree;\ + USHORT nA;\ +\ + void _resize(size_t n);\ +\ +public:\ + nm( USHORT= IS, BYTE= GS );\ + ~nm() { rtl_freeMemory( pData ); }\ +\ + _SVVARARR_DEF_GET_OP_INLINE(nm, AE )\ + AERef GetObject(USHORT nP) const { return (*this)[nP]; } \ +\ + void Insert( const AERef aE, USHORT nP );\ + void Insert( const AE *pE, USHORT nL, USHORT nP );\ + void Remove( USHORT nP, USHORT nL = 1 );\ + void Replace( const AERef aE, USHORT nP );\ + void Replace( const AE *pE, USHORT nL, USHORT nP );\ + USHORT Count() const { return nA; }\ + const AE* GetData() const { return (const AE*)pData; }\ +\ + void ForEach( CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ + {\ + _ForEach( 0, nA, fnForEach, pArgs );\ + }\ + void ForEach( USHORT nS, USHORT nE, \ + CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ + {\ + _ForEach( nS, nE, fnForEach, pArgs );\ + }\ +\ + void _ForEach( USHORT nStt, USHORT nE, \ + CONCAT( FnForEach_, nm ) fnCall, void* pArgs = 0 );\ +\ + +#define _SV_DECL_VARARR(nm, AE, IS, GS ) \ +_SV_DECL_VARARR_GEN(nm, AE, IS, GS, AE & ) +#define _SV_DECL_VARARR_PLAIN(nm, AE, IS, GS ) \ +_SV_DECL_VARARR_GEN(nm, AE, IS, GS, AE ) + +#define SV_DECL_VARARR_GEN(nm, AE, IS, GS, AERef, vis )\ +_SV_DECL_VARARR_GEN(nm, AE, IS, GS, AERef, vis )\ +private:\ +nm( const nm& );\ +nm& operator=( const nm& );\ +}; + +#define SV_DECL_VARARR(nm, AE, IS, GS ) \ +SV_DECL_VARARR_GEN(nm, AE, IS, GS, AE &, ) +#define SV_DECL_VARARR_PLAIN(nm, AE, IS, GS ) \ +SV_DECL_VARARR_GEN(nm, AE, IS, GS, AE, ) + +#define SV_DECL_VARARR_VISIBILITY(nm, AE, IS, GS, vis ) \ +SV_DECL_VARARR_GEN(nm, AE, IS, GS, AE &, vis ) + +#define SV_DECL_VARARR_PLAIN_VISIBILITY(nm, AE, IS, GS, vis ) \ +SV_DECL_VARARR_GEN(nm, AE, IS, GS, AE, vis ) + +#define SV_IMPL_VARARR_GEN( nm, AE, AERef )\ +nm::nm( USHORT nInit, BYTE )\ + : pData (0),\ + nFree (nInit),\ + nA (0)\ +{\ + if( nInit )\ + {\ + pData = (AE*)(rtl_allocateMemory(sizeof(AE) * nInit));\ + DBG_ASSERT( pData, "CTOR, allocate");\ + }\ +}\ +\ +void nm::_resize (size_t n)\ +{\ + USHORT nL = ((n < USHRT_MAX) ? USHORT(n) : USHRT_MAX);\ + AE* pE = (AE*)(rtl_reallocateMemory (pData, sizeof(AE) * nL));\ + if ((pE != 0) || (nL == 0))\ + {\ + pData = pE;\ + nFree = nL - nA;\ + }\ +}\ +\ +void nm::Insert( const AERef aE, USHORT nP )\ +{\ + DBG_ASSERT(nP <= nA && nA < USHRT_MAX, "Ins 1");\ + if (nFree < 1)\ + _resize (nA + ((nA > 1) ? nA : 1));\ + if( pData && nP < nA )\ + memmove( pData+nP+1, pData+nP, (nA-nP) * sizeof( AE ));\ + *(pData+nP) = (AE&)aE;\ + ++nA; --nFree;\ +}\ +\ +void nm::Insert( const AE* pE, USHORT nL, USHORT nP )\ +{\ + DBG_ASSERT(nP<=nA && ((long)nA+nL)<USHRT_MAX,"Ins n");\ + if (nFree < nL)\ + _resize (nA + ((nA > nL) ? nA : nL));\ + if( pData && nP < nA )\ + memmove( pData+nP+nL, pData+nP, (nA-nP) * sizeof( AE ));\ + if( pE )\ + memcpy( pData+nP, pE, nL * sizeof( AE ));\ + nA = nA + nL; nFree = nFree - nL;\ +}\ +\ +void nm::Replace( const AERef aE, USHORT nP )\ +{\ + if( nP < nA )\ + *(pData+nP) = (AE&)aE;\ +}\ +\ +void nm::Replace( const AE *pE, USHORT nL, USHORT nP )\ +{\ + if( pE && nP < nA )\ + {\ + if( nP + nL < nA )\ + memcpy( pData + nP, pE, nL * sizeof( AE ));\ + else if( nP + nL < nA + nFree )\ + {\ + memcpy( pData + nP, pE, nL * sizeof( AE ));\ + nP = nP + (nL - nA); \ + nFree = nP;\ + }\ + else \ + {\ + USHORT nTmpLen = nA + nFree - nP; \ + memcpy( pData + nP, pE, nTmpLen * sizeof( AE ));\ + nA = nA + nFree; \ + nFree = 0; \ + Insert( pE + nTmpLen, nL - nTmpLen, nA );\ + }\ + }\ +}\ +\ +void nm::Remove( USHORT nP, USHORT nL )\ +{\ + if( !nL )\ + return;\ + DBG_ASSERT( nP < nA && nP + nL <= nA,"Del");\ + if( pData && nP+1 < nA )\ + memmove( pData+nP, pData+nP+nL, (nA-nP-nL) * sizeof( AE ));\ + nA = nA - nL; nFree = nFree + nL;\ + if (nFree > nA)\ + _resize (nA);\ +}\ +\ +void nm::_ForEach( USHORT nStt, USHORT nE, \ + CONCAT( FnForEach_, nm ) fnCall, void* pArgs )\ +{\ + if( nStt >= nE || nE > nA )\ + return;\ + for( ; nStt < nE && (*fnCall)( *(const AE*)(pData+nStt), pArgs ); nStt++)\ + ;\ +}\ +\ +_SVVARARR_IMPL_GET_OP_INLINE(nm, AE )\ + +#define SV_IMPL_VARARR( nm, AE ) \ +SV_IMPL_VARARR_GEN( nm, AE, AE & ) +#define SV_IMPL_VARARR_PLAIN( nm, AE ) \ +SV_IMPL_VARARR_GEN( nm, AE, AE ) + +#if defined(PRODUCT) + +#define _SVOBJARR_DEF_GET_OP_INLINE( nm,ArrElem )\ +ArrElem& operator[](USHORT nP) const { return *(pData+nP); }\ +\ +void Insert( const nm *pI, USHORT nP,\ + USHORT nS = 0, USHORT nE = USHRT_MAX )\ +{\ + if( USHRT_MAX == nE ) \ + nE = pI->nA; \ + if( nS < nE ) \ + Insert( (const ArrElem*)pI->pData+nS, (USHORT)nE-nS, nP );\ +} + +#define _SVOBJARR_IMPL_GET_OP_INLINE( nm, ArrElem ) + +#else + +#define _SVOBJARR_DEF_GET_OP_INLINE( nm,ArrElem ) \ +ArrElem& operator[](USHORT nP) const;\ +void Insert( const nm *pI, USHORT nP,\ + USHORT nS = 0, USHORT nE = USHRT_MAX ); + +#define _SVOBJARR_IMPL_GET_OP_INLINE( nm, ArrElem )\ +ArrElem& nm::operator[](USHORT nP) const\ +{\ + DBG_ASSERT( pData && nP < nA,"Op[]");\ + return *(pData+nP);\ +}\ +void nm::Insert( const nm *pI, USHORT nP, USHORT nStt, USHORT nE )\ +{\ + DBG_ASSERT( nP <= nA,"Ins,Ar[Start.End]");\ + if( USHRT_MAX == nE ) \ + nE = pI->nA; \ + if( nStt < nE ) \ + Insert( (const ArrElem*)pI->pData+nStt, (USHORT)nE-nStt, nP );\ +} + +#endif + +#define _SV_DECL_OBJARR(nm, AE, IS, GS)\ +typedef BOOL (*FnForEach_##nm)( const AE&, void* );\ +class nm\ +{\ +protected:\ + AE *pData;\ + USHORT nFree;\ + USHORT nA;\ +\ + void _resize(size_t n);\ + void _destroy();\ +\ +public:\ + nm( USHORT= IS, BYTE= GS );\ + ~nm() { _destroy(); }\ +\ + _SVOBJARR_DEF_GET_OP_INLINE(nm,AE)\ + AE& GetObject(USHORT nP) const { return (*this)[nP]; } \ +\ + void Insert( const AE &aE, USHORT nP );\ + void Insert( const AE *pE, USHORT nL, USHORT nP );\ + void Remove( USHORT nP, USHORT nL = 1 );\ + USHORT Count() const { return nA; }\ + const AE* GetData() const { return (const AE*)pData; }\ +\ + void ForEach( CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ + {\ + _ForEach( 0, nA, fnForEach, pArgs );\ + }\ + void ForEach( USHORT nS, USHORT nE, \ + CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ + {\ + _ForEach( nS, nE, fnForEach, pArgs );\ + }\ +\ + void _ForEach( USHORT nStt, USHORT nE, \ + CONCAT( FnForEach_, nm ) fnCall, void* pArgs = 0 );\ +\ + +#define SV_DECL_OBJARR(nm, AE, IS, GS)\ +_SV_DECL_OBJARR(nm, AE, IS, GS)\ +private:\ +nm( const nm& );\ +nm& operator=( const nm& );\ +}; + +#define SV_IMPL_OBJARR( nm, AE )\ +nm::nm( USHORT nInit, BYTE )\ + : pData (0),\ + nFree (nInit),\ + nA (0)\ +{\ + if( nInit )\ + {\ + pData = (AE*)(rtl_allocateMemory(sizeof(AE) * nInit));\ + DBG_ASSERT( pData, "CTOR, allocate");\ + }\ +}\ +\ +void nm::_destroy()\ +{\ + if(pData)\ + {\ + AE* pTmp=pData;\ + for(USHORT n=0; n < nA; n++,pTmp++ )\ + {\ + pTmp->~AE();\ + }\ + rtl_freeMemory(pData);\ + pData = 0;\ + }\ +}\ +\ +void nm::_resize (size_t n)\ +{\ + USHORT nL = ((n < USHRT_MAX) ? USHORT(n) : USHRT_MAX);\ + AE* pE = (AE*)(rtl_reallocateMemory (pData, sizeof(AE) * nL));\ + if ((pE != 0) || (nL == 0))\ + {\ + pData = pE;\ + nFree = nL - nA;\ + }\ +}\ +\ +void nm::Insert( const AE &aE, USHORT nP )\ +{\ + DBG_ASSERT( nP <= nA && nA < USHRT_MAX,"Ins 1");\ + if (nFree < 1)\ + _resize (nA + ((nA > 1) ? nA : 1));\ + if( pData && nP < nA )\ + memmove( pData+nP+1, pData+nP, (nA-nP) * sizeof( AE ));\ + AE* pTmp = pData+nP;\ + new( (DummyType*) pTmp ) AE( (AE&)aE );\ + ++nA; --nFree;\ +}\ +\ +void nm::Insert( const AE* pE, USHORT nL, USHORT nP )\ +{\ + DBG_ASSERT(nP<=nA && ((long)nA+nL) < USHRT_MAX, "Ins n");\ + if (nFree < nL)\ + _resize (nA + ((nA > nL) ? nA : nL));\ + if( pData && nP < nA )\ + memmove( pData+nP+nL, pData+nP, (nA-nP) * sizeof( AE ));\ + if( pE )\ + {\ + AE* pTmp = pData+nP;\ + for( USHORT n = 0; n < nL; n++, pTmp++, pE++)\ + {\ + new( (DummyType*) pTmp ) AE( (AE&)*pE );\ + }\ + }\ + nA = nA + nL; nFree = nFree - nL;\ +}\ +\ +void nm::Remove( USHORT nP, USHORT nL )\ +{\ + if( !nL )\ + return;\ + DBG_ASSERT( nP < nA && nP + nL <= nA,"Del");\ + AE* pTmp=pData+nP;\ + USHORT nCtr = nP;\ + for(USHORT n=0; n < nL; n++,pTmp++,nCtr++)\ + {\ + if( nCtr < nA )\ + pTmp->~AE();\ + }\ + if( pData && nP+1 < nA )\ + memmove( pData+nP, pData+nP+nL, (nA-nP-nL) * sizeof( AE ));\ + nA = nA - nL; nFree = nFree + nL;\ + if (nFree > nA) \ + _resize (nA);\ +}\ +\ +void nm::_ForEach( USHORT nStt, USHORT nE, \ + CONCAT( FnForEach_, nm ) fnCall, void* pArgs )\ +{\ + if( nStt >= nE || nE > nA )\ + return;\ + for( ; nStt < nE && (*fnCall)( *(pData+nStt), pArgs ); nStt++)\ + ;\ +}\ +\ +_SVOBJARR_IMPL_GET_OP_INLINE(nm, AE)\ + +#define _SV_DECL_PTRARR_DEF_GEN( nm, AE, IS, GS, AERef, vis )\ +_SV_DECL_VARARR_GEN( nm, AE, IS, GS, AERef, vis)\ +USHORT GetPos( const AERef aE ) const;\ +}; + +#define _SV_DECL_PTRARR_DEF( nm, AE, IS, GS, vis )\ +_SV_DECL_PTRARR_DEF_GEN( nm, AE, IS, GS, AE &, vis ) +#define _SV_DECL_PTRARR_DEF_PLAIN( nm, AE, IS, GS, vis )\ +_SV_DECL_PTRARR_DEF_GEN( nm, AE, IS, GS, AE, vis ) + +#define SV_DECL_PTRARR_GEN(nm, AE, IS, GS, Base, AERef, VPRef, vis )\ +typedef BOOL (*FnForEach_##nm)( const AERef, void* );\ +class vis nm: public Base \ +{\ +public:\ + nm( USHORT nIni=IS, BYTE nG=GS )\ + : Base(nIni,nG) {}\ + void Insert( const nm *pI, USHORT nP, \ + USHORT nS = 0, USHORT nE = USHRT_MAX ) {\ + Base::Insert((const Base*)pI, nP, nS, nE);\ + }\ + void Insert( const AERef aE, USHORT nP ) {\ + Base::Insert( (const VPRef )aE, nP );\ + }\ + void Insert( const AE *pE, USHORT nL, USHORT nP ) {\ + Base::Insert( (const VoidPtr*)pE, nL, nP );\ + }\ + void Replace( const AERef aE, USHORT nP ) {\ + Base::Replace( (const VPRef)aE, nP );\ + }\ + void Replace( const AE *pE, USHORT nL, USHORT nP ) {\ + Base::Replace( (const VoidPtr*)pE, nL, nP );\ + }\ + void Remove( USHORT nP, USHORT nL = 1) {\ + Base::Remove(nP,nL);\ + }\ + const AE* GetData() const {\ + return (const AE*)Base::GetData();\ + }\ + void ForEach( CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ + {\ + _ForEach( 0, nA, (FnForEach_##Base)fnForEach, pArgs );\ + }\ + void ForEach( USHORT nS, USHORT nE, \ + CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ + {\ + _ForEach( nS, nE, (FnForEach_##Base)fnForEach, pArgs );\ + }\ + AE operator[]( USHORT nP )const { \ + return (AE)Base::operator[](nP); }\ + AE GetObject(USHORT nP) const { \ + return (AE)Base::GetObject(nP); }\ + \ + USHORT GetPos( const AERef aE ) const { \ + return Base::GetPos((const VPRef)aE);\ + }\ + void DeleteAndDestroy( USHORT nP, USHORT nL=1 );\ +private:\ + nm( const nm& );\ + nm& operator=( const nm& );\ +}; + +#define SV_DECL_PTRARR(nm, AE, IS, GS )\ +SV_DECL_PTRARR_GEN(nm, AE, IS, GS, SvPtrarr, AE &, VoidPtr &, ) +#define SV_DECL_PTRARR_PLAIN(nm, AE, IS, GS )\ +SV_DECL_PTRARR_GEN(nm, AE, IS, GS, SvPtrarrPlain, AE, VoidPtr, ) + +#define SV_DECL_PTRARR_VISIBILITY(nm, AE, IS, GS, vis )\ +SV_DECL_PTRARR_GEN(nm, AE, IS, GS, SvPtrarr, AE &, VoidPtr &, vis ) +#define SV_DECL_PTRARR_PLAIN_VISIBILITY(nm, AE, IS, GS, vis )\ +SV_DECL_PTRARR_GEN(nm, AE, IS, GS, SvPtrarrPlain, AE, VoidPtr, vis ) + +#define SV_DECL_PTRARR_DEL_GEN(nm, AE, IS, GS, Base, AERef, VPRef, vis )\ +typedef BOOL (*FnForEach_##nm)( const AERef, void* );\ +class vis nm: public Base \ +{\ +public:\ + nm( USHORT nIni=IS, BYTE nG=GS )\ + : Base(nIni,nG) {}\ + ~nm() { DeleteAndDestroy( 0, Count() ); }\ + void Insert( const nm *pI, USHORT nP, \ + USHORT nS = 0, USHORT nE = USHRT_MAX ) {\ + Base::Insert((const Base*)pI, nP, nS, nE);\ + }\ + void Insert( const AERef aE, USHORT nP ) {\ + Base::Insert((const VPRef)aE, nP );\ + }\ + void Insert( const AE *pE, USHORT nL, USHORT nP ) {\ + Base::Insert( (const VoidPtr *)pE, nL, nP );\ + }\ + void Replace( const AERef aE, USHORT nP ) {\ + Base::Replace( (const VPRef)aE, nP );\ + }\ + void Replace( const AE *pE, USHORT nL, USHORT nP ) {\ + Base::Replace( (const VoidPtr*)pE, nL, nP );\ + }\ + void Remove( USHORT nP, USHORT nL = 1) {\ + Base::Remove(nP,nL);\ + }\ + const AE* GetData() const {\ + return (const AE*)Base::GetData();\ + }\ + void ForEach( CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ + {\ + _ForEach( 0, nA, (FnForEach_##Base)fnForEach, pArgs );\ + }\ + void ForEach( USHORT nS, USHORT nE, \ + CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ + {\ + _ForEach( nS, nE, (FnForEach_##Base)fnForEach, pArgs );\ + }\ + AE operator[]( USHORT nP )const { \ + return (AE)Base::operator[](nP); }\ + AE GetObject( USHORT nP )const { \ + return (AE)Base::GetObject(nP); }\ + \ + USHORT GetPos( const AERef aE ) const { \ + return Base::GetPos((const VPRef)aE);\ + } \ + void DeleteAndDestroy( USHORT nP, USHORT nL=1 );\ +private:\ + nm( const nm& );\ + nm& operator=( const nm& );\ +}; + +#define SV_DECL_PTRARR_DEL(nm, AE, IS, GS )\ +SV_DECL_PTRARR_DEL_GEN(nm, AE, IS, GS, SvPtrarr, AE &, VoidPtr &, ) +#define SV_DECL_PTRARR_DEL_PLAIN(nm, AE, IS, GS )\ +SV_DECL_PTRARR_DEL_GEN(nm, AE, IS, GS, SvPtrarrPlain, AE, VoidPtr, ) + +#define SV_DECL_PTRARR_DEL_VISIBILITY(nm, AE, IS, GS, vis )\ +SV_DECL_PTRARR_DEL_GEN(nm, AE, IS, GS, SvPtrarr, AE &, VoidPtr &, vis) +#define SV_DECL_PTRARR_DEL_PLAIN_VISIBILITY(nm, AE, IS, GS, vis )\ +SV_DECL_PTRARR_DEL_GEN(nm, AE, IS, GS, SvPtrarrPlain, AE, VoidPtr, vis) + +#define SV_IMPL_PTRARR_GEN(nm, AE, Base)\ +void nm::DeleteAndDestroy( USHORT nP, USHORT nL )\ +{ \ + if( nL ) {\ + DBG_ASSERT( nP < nA && nP + nL <= nA,"Del");\ + for( USHORT n=nP; n < nP + nL; n++ ) \ + delete *((AE*)pData+n); \ + Base::Remove( nP, nL ); \ + } \ +} + +#define SV_IMPL_PTRARR(nm, AE )\ +SV_IMPL_PTRARR_GEN(nm, AE, SvPtrarr ) +#define SV_IMPL_PTRARR_PLAIN(nm, AE )\ +SV_IMPL_PTRARR_GEN(nm, AE, SvPtrarrPlain ) + +typedef void* VoidPtr; +_SV_DECL_PTRARR_DEF( SvPtrarr, VoidPtr, 0, 1, SVL_DLLPUBLIC ) +_SV_DECL_PTRARR_DEF_PLAIN( SvPtrarrPlain, VoidPtr, 0, 1, SVL_DLLPUBLIC ) + +// SORTARR - Begin + +#ifdef __MWERKS__ +#define __MWERKS__PRIVATE public +#else +#define __MWERKS__PRIVATE private +#endif + +#define _SORT_CLASS_DEF(nm, AE, IS, GS, vis)\ +typedef BOOL (*FnForEach_##nm)( const AE&, void* );\ +class vis nm : __MWERKS__PRIVATE nm##_SAR \ +{\ +public:\ + nm(USHORT nSize = IS, BYTE nG = GS)\ + : nm##_SAR(nSize,nG) {}\ + void Insert( const nm *pI, USHORT nS=0, USHORT nE=USHRT_MAX );\ + BOOL Insert( const AE& aE );\ + BOOL Insert( const AE& aE, USHORT& rP );\ + void Insert( const AE *pE, USHORT nL );\ + void Remove( USHORT nP, USHORT nL = 1 );\ + void Remove( const AE& aE, USHORT nL = 1 );\ + USHORT Count() const { return nm##_SAR::Count(); }\ + const AE* GetData() const { return (const AE*)pData; }\ +\ +/* Das Ende stehe im DECL-Makro !!! */ + +#define _SV_SEEK_PTR(nm,AE)\ +BOOL nm::Seek_Entry( const AE aE, USHORT* pP ) const\ +{\ + register USHORT nO = nm##_SAR::Count(),\ + nM, \ + nU = 0;\ + if( nO > 0 )\ + {\ + nO--;\ + register long rCmp = (long)aE;\ + while( nU <= nO )\ + {\ + nM = nU + ( nO - nU ) / 2;\ + if( (long)*(pData + nM) == rCmp )\ + {\ + if( pP ) *pP = nM;\ + return TRUE;\ + }\ + else if( (long)*(pData+ nM) < (long)aE )\ + nU = nM + 1;\ + else if( nM == 0 )\ + {\ + if( pP ) *pP = nU;\ + return FALSE;\ + }\ + else\ + nO = nM - 1;\ + }\ + }\ + if( pP ) *pP = nU;\ + return FALSE;\ +} + +#define _SV_SEEK_PTR_TO_OBJECT( nm,AE )\ +BOOL nm::Seek_Entry( const AE aE, USHORT* pP ) const\ +{\ + register USHORT nO = nm##_SAR::Count(),\ + nM, \ + nU = 0;\ + if( nO > 0 )\ + {\ + nO--;\ + while( nU <= nO )\ + {\ + nM = nU + ( nO - nU ) / 2;\ + if( *(*((AE*)pData + nM)) == *(aE) )\ + {\ + if( pP ) *pP = nM;\ + return TRUE;\ + }\ + else if( *(*((AE*)pData + nM)) < *(aE) )\ + nU = nM + 1;\ + else if( nM == 0 )\ + {\ + if( pP ) *pP = nU;\ + return FALSE;\ + }\ + else\ + nO = nM - 1;\ + }\ + }\ + if( pP ) *pP = nU;\ + return FALSE;\ +} + +#define _SV_SEEK_OBJECT( nm,AE )\ +BOOL nm::Seek_Entry( const AE & aE, USHORT* pP ) const\ +{\ + register USHORT nO = nm##_SAR::Count(),\ + nM, \ + nU = 0;\ + if( nO > 0 )\ + {\ + nO--;\ + while( nU <= nO )\ + {\ + nM = nU + ( nO - nU ) / 2;\ + if( *(pData + nM) == aE )\ + {\ + if( pP ) *pP = nM;\ + return TRUE;\ + }\ + else if( *(pData + nM) < aE )\ + nU = nM + 1;\ + else if( nM == 0 )\ + {\ + if( pP ) *pP = nU;\ + return FALSE;\ + }\ + else\ + nO = nM - 1;\ + }\ + }\ + if( pP ) *pP = nU;\ + return FALSE;\ +} + +#define _SV_IMPL_SORTAR_ALG(nm, AE)\ +void nm::Insert( const nm * pI, USHORT nS, USHORT nE )\ +{\ + if( USHRT_MAX == nE )\ + nE = pI->Count();\ + USHORT nP;\ + const AE * pIArr = pI->GetData();\ + for( ; nS < nE; ++nS )\ + {\ + if( ! Seek_Entry( *(pIArr+nS), &nP) )\ + nm##_SAR::Insert( *(pIArr+nS), nP );\ + if( ++nP >= Count() )\ + {\ + nm##_SAR::Insert( pI, nP, nS+1, nE );\ + nS = nE;\ + }\ + }\ +}\ +\ +BOOL nm::Insert( const AE & aE )\ +{\ + USHORT nP;\ + BOOL bExist;\ + bExist = Seek_Entry( aE, &nP );\ + if( ! bExist )\ + nm##_SAR::Insert( aE, nP );\ + return !bExist;\ +}\ +BOOL nm::Insert( const AE & aE, USHORT& rP )\ +{\ + BOOL bExist;\ + bExist = Seek_Entry( aE, &rP );\ + if( ! bExist )\ + nm##_SAR::Insert( aE, rP );\ + return !bExist;\ +}\ +void nm::Insert( const AE* pE, USHORT nL)\ +{\ + USHORT nP;\ + for( USHORT n = 0; n < nL; ++n )\ + if( ! Seek_Entry( *(pE+n), &nP ))\ + nm##_SAR::Insert( *(pE+n), nP );\ +}\ +void nm::Remove( USHORT nP, USHORT nL )\ +{\ + if( nL )\ + nm##_SAR::Remove( nP, nL);\ +}\ +\ +void nm::Remove( const AE &aE, USHORT nL )\ +{\ + USHORT nP;\ + if( nL && Seek_Entry( aE, &nP ) ) \ + nm##_SAR::Remove( nP, nL);\ +}\ + +#if defined(TCPP) + +#define _SORTARR_BLC_CASTS(nm, AE )\ + BOOL Insert( AE &aE ) {\ + return Insert( (const AE&)aE );\ + }\ + USHORT GetPos( AE& aE ) const { \ + return SvPtrarr::GetPos((const VoidPtr&)aE);\ + }\ + void Remove( AE& aE, USHORT nL = 1 ) { \ + Remove( (const AE&) aE, nL );\ + } + +#else + +#define _SORTARR_BLC_CASTS(nm, AE )\ + USHORT GetPos( const AE& aE ) const { \ + return SvPtrarr::GetPos((const VoidPtr&)aE);\ + } + +#endif + +#define _SV_DECL_PTRARR_SORT_ALG(nm, AE, IS, GS, vis)\ +SV_DECL_PTRARR_VISIBILITY(nm##_SAR, AE, IS, GS, vis)\ +_SORT_CLASS_DEF(nm, AE, IS, GS, vis)\ + AE operator[](USHORT nP) const {\ + return nm##_SAR::operator[]( nP );\ + }\ + AE GetObject(USHORT nP) const {\ + return nm##_SAR::GetObject( nP );\ + }\ + BOOL Seek_Entry( const AE aE, USHORT* pP = 0 ) const;\ + void ForEach( CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ + {\ + _ForEach( 0, nA, (FnForEach_SvPtrarr)fnForEach, pArgs );\ + }\ + void ForEach( USHORT nS, USHORT nE, \ + CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ + {\ + _ForEach( nS, nE, (FnForEach_SvPtrarr)fnForEach, pArgs );\ + }\ + void DeleteAndDestroy( USHORT nP, USHORT nL=1 ); \ + _SORTARR_BLC_CASTS(nm, AE )\ +\ +/* Das Ende stehe im DECL-Makro !!! */ + +#define _SV_DECL_PTRARR_SORT(nm, AE, IS, GS, vis)\ +_SV_DECL_PTRARR_SORT_ALG(nm, AE, IS, GS, vis)\ +private:\ + nm( const nm& );\ + nm& operator=( const nm& );\ +}; + +#define SV_DECL_PTRARR_SORT(nm, AE, IS, GS)\ +_SV_DECL_PTRARR_SORT(nm, AE, IS, GS, ) + +#define SV_DECL_PTRARR_SORT_VISIBILITY(nm, AE, IS, GS, vis)\ +_SV_DECL_PTRARR_SORT(nm, AE, IS, GS, vis) + + +#define _SV_DECL_PTRARR_SORT_DEL(nm, AE, IS, GS, vis)\ +_SV_DECL_PTRARR_SORT_ALG(nm, AE, IS, GS, vis)\ + ~nm() { DeleteAndDestroy( 0, Count() ); }\ +private:\ + nm( const nm& );\ + nm& operator=( const nm& );\ +}; + +#define SV_DECL_PTRARR_SORT_DEL(nm, AE, IS, GS)\ +_SV_DECL_PTRARR_SORT_DEL(nm, AE, IS, GS, ) + +#define SV_DECL_PTRARR_SORT_DEL_VISIBILITY(nm, AE, IS, GS, vis)\ +_SV_DECL_PTRARR_SORT_DEL(nm, AE, IS, GS, vis) + +#define _SV_DECL_VARARR_SORT(nm, AE, IS, GS, vis)\ +SV_DECL_VARARR_VISIBILITY(nm##_SAR, AE, IS, GS, vis)\ +_SORT_CLASS_DEF(nm, AE, IS, GS, vis) \ + const AE& operator[](USHORT nP) const {\ + return nm##_SAR::operator[]( nP );\ + }\ + const AE& GetObject(USHORT nP) const {\ + return nm##_SAR::GetObject( nP );\ + }\ + BOOL Seek_Entry( const AE & aE, USHORT* pP = 0 ) const;\ + void ForEach( CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ + {\ + _ForEach( 0, nA, (FnForEach_##nm##_SAR)fnForEach, pArgs );\ + }\ + void ForEach( USHORT nS, USHORT nE, \ + CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ + {\ + _ForEach( nS, nE, (FnForEach_##nm##_SAR)fnForEach, pArgs );\ + }\ +private:\ + nm( const nm& );\ + nm& operator=( const nm& );\ +}; + +#define SV_DECL_VARARR_SORT(nm, AE, IS, GS)\ +_SV_DECL_VARARR_SORT(nm, AE, IS, GS,) + +#define SV_DECL_VARARR_SORT_VISIBILITY(nm, AE, IS, GS, vis)\ +_SV_DECL_VARARR_SORT(nm, AE, IS, GS, vis) + +#define SV_IMPL_PTRARR_SORT( nm,AE )\ +_SV_IMPL_SORTAR_ALG( nm,AE )\ + void nm::DeleteAndDestroy( USHORT nP, USHORT nL ) { \ + if( nL ) {\ + DBG_ASSERT( nP < nA && nP + nL <= nA, "ERR_VAR_DEL" );\ + for( USHORT n=nP; n < nP + nL; n++ ) \ + delete *((AE*)pData+n); \ + SvPtrarr::Remove( nP, nL ); \ + } \ + } \ +_SV_SEEK_PTR( nm, AE ) + +#define SV_IMPL_OP_PTRARR_SORT( nm,AE )\ +_SV_IMPL_SORTAR_ALG( nm,AE )\ + void nm::DeleteAndDestroy( USHORT nP, USHORT nL ) { \ + if( nL ) {\ + DBG_ASSERT( nP < nA && nP + nL <= nA, "ERR_VAR_DEL" );\ + for( USHORT n=nP; n < nP + nL; n++ ) \ + delete *((AE*)pData+n); \ + SvPtrarr::Remove( nP, nL ); \ + } \ + } \ +_SV_SEEK_PTR_TO_OBJECT( nm,AE ) + +#define SV_IMPL_VARARR_SORT( nm,AE )\ +SV_IMPL_VARARR(nm##_SAR, AE)\ +_SV_IMPL_SORTAR_ALG( nm,AE )\ +_SV_SEEK_OBJECT( nm,AE ) + +#define SV_DECL_PTRARR_STACK(nm, AE, IS, GS)\ +class nm: private SvPtrarr \ +{\ +public:\ + nm( USHORT nIni=IS, BYTE nG=GS )\ + : SvPtrarr(nIni,nG) {}\ + void Insert( const nm *pI, USHORT nP,\ + USHORT nS = 0, USHORT nE = USHRT_MAX ) {\ + SvPtrarr::Insert( pI, nP, nS, nE ); \ + }\ + void Remove( USHORT nP, USHORT nL = 1 ) {\ + SvPtrarr::Remove( nP, nL ); \ + }\ + void Push( const AE &aE ) {\ + SvPtrarr::Insert( (const VoidPtr &)aE, SvPtrarr::Count() );\ + }\ + USHORT Count() const { return SvPtrarr::Count(); }\ + AE operator[](USHORT nP) const {\ + return (AE)SvPtrarr::operator[]( nP );\ + }\ + AE GetObject(USHORT nP) const {\ + return (AE)SvPtrarr::GetObject( nP );\ + }\ + AE Pop(){\ + AE pRet = 0;\ + if( SvPtrarr::Count() ){\ + pRet = GetObject( SvPtrarr::Count()-1 );\ + SvPtrarr::Remove(Count()-1);\ + }\ + return pRet;\ + }\ + AE Top() const {\ + AE pRet = 0;\ + if( SvPtrarr::Count() )\ + pRet = GetObject( SvPtrarr::Count()-1 ); \ + return pRet;\ + }\ +}; + +#if defined (C40) || defined (C41) || defined (C42) || defined(C50) || defined(C52) +#define C40_INSERT( c, p, n) Insert( (c const *) p, n ) +#define C40_PUSH( c, p) Push( (c const *) p ) +#define C40_PTR_INSERT( c, p) Insert( (c const *) p ) +#define C40_REMOVE( c, p ) Remove( (c const *) p ) +#define C40_REPLACE( c, p, n) Replace( (c const *) p, n ) +#define C40_PTR_REPLACE( c, p) Replace( (c const *) p ) +#define C40_GETPOS( c, r) GetPos( (c const *)r ) +#else +#if defined WTC || defined ICC || defined HPUX || (defined GCC && __GNUC__ >= 3) || (defined(WNT) && _MSC_VER >= 1400) +#define C40_INSERT( c, p, n ) Insert( (c const *&) p, n ) +#define C40_PUSH( c, p) Push( (c const *&) p ) +#define C40_PTR_INSERT( c, p ) Insert( (c const *&) p ) +#define C40_REMOVE( c, p ) Remove( (c const *&) p ) +#define C40_REPLACE( c, p, n ) Replace( (c const *&) p, n ) +#define C40_PTR_REPLACE( c, p ) Replace( (c const *&) p ) +#define C40_GETPOS( c, r) GetPos( (c const *&) r ) +#else +#define C40_INSERT( c, p, n ) Insert( p, n ) +#define C40_PUSH( c, p) Push( p ) +#define C40_PTR_INSERT( c, p ) Insert( p ) +#define C40_REMOVE( c, p) Remove( p ) +#define C40_REPLACE( c, p, n ) Replace( p, n ) +#define C40_PTR_REPLACE( c, p ) Replace( p ) +#define C40_GETPOS( c, r) GetPos( r ) +#endif +#endif + +#endif //_SVARRAY_HXX |