| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #ifndef _SVARRAY_HXX |
| #define _SVARRAY_HXX |
| |
| #if 0 |
| // Nobody wants to touch this code, not even with a ten-foot pole. |
| // If one has to read it then the following mapping might be useful: |
| // "nm" seems to be "type name" of the array |
| // "AE" means "type of array element" |
| // "IS" means "initial size", i.e. the initial number of elements |
| // "GS" means "growth size" |
| *********************************************************************** |
| * |
| * 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_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 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[](sal_uInt16 nP) const { return *(pData+nP); }\ |
| \ |
| void Insert( const nm * pI, sal_uInt16 nP,\ |
| sal_uInt16 nS = 0, sal_uInt16 nE = USHRT_MAX )\ |
| {\ |
| if( USHRT_MAX == nE ) \ |
| nE = pI->nA; \ |
| if( nS < nE ) \ |
| Insert( (const ArrElem*)pI->pData+nS, (sal_uInt16)nE-nS, nP );\ |
| } |
| |
| #define _SVVARARR_IMPL_GET_OP_INLINE( nm, ArrElem ) |
| |
| #else |
| |
| #define _SVVARARR_DEF_GET_OP_INLINE( nm,ArrElem )\ |
| ArrElem& operator[](sal_uInt16 nP) const;\ |
| void Insert( const nm *pI, sal_uInt16 nP,\ |
| sal_uInt16 nS = 0, sal_uInt16 nE = USHRT_MAX ); |
| |
| #define _SVVARARR_IMPL_GET_OP_INLINE( nm, ArrElem )\ |
| ArrElem& nm::operator[](sal_uInt16 nP) const\ |
| {\ |
| DBG_ASSERT( pData && nP < nA,"Op[]");\ |
| return *(pData+nP);\ |
| }\ |
| void nm::Insert( const nm *pI, sal_uInt16 nP, sal_uInt16 nStt, sal_uInt16 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, (sal_uInt16)nE-nStt, nP );\ |
| } |
| |
| #endif |
| |
| #define _SV_DECL_VARARR_GEN(nm, AE, IS, GS, AERef, vis )\ |
| typedef sal_Bool (*FnForEach_##nm)( const AERef, void* );\ |
| class vis nm\ |
| {\ |
| protected:\ |
| AE *pData;\ |
| sal_uInt16 nFree;\ |
| sal_uInt16 nA;\ |
| \ |
| void _resize(size_t n);\ |
| \ |
| public:\ |
| nm( sal_uInt16= IS, sal_uInt8= GS );\ |
| ~nm() { rtl_freeMemory( pData ); }\ |
| \ |
| _SVVARARR_DEF_GET_OP_INLINE(nm, AE )\ |
| AERef GetObject(sal_uInt16 nP) const { return (*this)[nP]; } \ |
| \ |
| void Insert( const AERef aE, sal_uInt16 nP );\ |
| void Insert( const AE *pE, sal_uInt16 nL, sal_uInt16 nP );\ |
| void Remove( sal_uInt16 nP, sal_uInt16 nL = 1 );\ |
| void Replace( const AERef aE, sal_uInt16 nP );\ |
| void Replace( const AE *pE, sal_uInt16 nL, sal_uInt16 nP );\ |
| sal_uInt16 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( sal_uInt16 nS, sal_uInt16 nE, \ |
| CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ |
| {\ |
| _ForEach( nS, nE, fnForEach, pArgs );\ |
| }\ |
| \ |
| void _ForEach( sal_uInt16 nStt, sal_uInt16 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_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_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( sal_uInt16 nInit, sal_uInt8 )\ |
| : 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)\ |
| {\ |
| sal_uInt16 nL = ((n < USHRT_MAX) ? sal_uInt16(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, sal_uInt16 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, sal_uInt16 nL, sal_uInt16 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, sal_uInt16 nP )\ |
| {\ |
| if( nP < nA )\ |
| *(pData+nP) = (AE&)aE;\ |
| }\ |
| \ |
| void nm::Replace( const AE *pE, sal_uInt16 nL, sal_uInt16 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 \ |
| {\ |
| sal_uInt16 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( sal_uInt16 nP, sal_uInt16 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( sal_uInt16 nStt, sal_uInt16 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_DECL_PTRARR_DEF_GEN( nm, AE, IS, GS, AERef, vis )\ |
| _SV_DECL_VARARR_GEN( nm, AE, IS, GS, AERef, vis)\ |
| sal_uInt16 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_GEN(nm, AE, IS, GS, Base, AERef, VPRef, vis )\ |
| typedef sal_Bool (*FnForEach_##nm)( const AERef, void* );\ |
| class vis nm: public Base \ |
| {\ |
| public:\ |
| nm( sal_uInt16 nIni=IS, sal_uInt8 nG=GS )\ |
| : Base(nIni,nG) {}\ |
| void Insert( const nm *pI, sal_uInt16 nP, \ |
| sal_uInt16 nS = 0, sal_uInt16 nE = USHRT_MAX ) {\ |
| Base::Insert((const Base*)pI, nP, nS, nE);\ |
| }\ |
| void Insert( const AERef aE, sal_uInt16 nP ) {\ |
| Base::Insert( (const VPRef )aE, nP );\ |
| }\ |
| void Insert( const AE *pE, sal_uInt16 nL, sal_uInt16 nP ) {\ |
| Base::Insert( (const VoidPtr*)pE, nL, nP );\ |
| }\ |
| void Replace( const AERef aE, sal_uInt16 nP ) {\ |
| Base::Replace( (const VPRef)aE, nP );\ |
| }\ |
| void Replace( const AE *pE, sal_uInt16 nL, sal_uInt16 nP ) {\ |
| Base::Replace( (const VoidPtr*)pE, nL, nP );\ |
| }\ |
| void Remove( sal_uInt16 nP, sal_uInt16 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( sal_uInt16 nS, sal_uInt16 nE, \ |
| CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ |
| {\ |
| _ForEach( nS, nE, (FnForEach_##Base)fnForEach, pArgs );\ |
| }\ |
| AE operator[]( sal_uInt16 nP )const { \ |
| return (AE)Base::operator[](nP); }\ |
| AE GetObject(sal_uInt16 nP) const { \ |
| return (AE)Base::GetObject(nP); }\ |
| \ |
| sal_uInt16 GetPos( const AERef aE ) const { \ |
| return Base::GetPos((const VPRef)aE);\ |
| }\ |
| void DeleteAndDestroy( sal_uInt16 nP, sal_uInt16 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_VISIBILITY(nm, AE, IS, GS, vis )\ |
| SV_DECL_PTRARR_GEN(nm, AE, IS, GS, SvPtrarr, AE &, VoidPtr &, vis ) |
| |
| #define SV_DECL_PTRARR_DEL_GEN(nm, AE, IS, GS, Base, AERef, VPRef, vis )\ |
| typedef sal_Bool (*FnForEach_##nm)( const AERef, void* );\ |
| class vis nm: public Base \ |
| {\ |
| public:\ |
| nm( sal_uInt16 nIni=IS, sal_uInt8 nG=GS )\ |
| : Base(nIni,nG) {}\ |
| ~nm() { DeleteAndDestroy( 0, Count() ); }\ |
| void Insert( const nm *pI, sal_uInt16 nP, \ |
| sal_uInt16 nS = 0, sal_uInt16 nE = USHRT_MAX ) {\ |
| Base::Insert((const Base*)pI, nP, nS, nE);\ |
| }\ |
| void Insert( const AERef aE, sal_uInt16 nP ) {\ |
| Base::Insert((const VPRef)aE, nP );\ |
| }\ |
| void Insert( const AE *pE, sal_uInt16 nL, sal_uInt16 nP ) {\ |
| Base::Insert( (const VoidPtr *)pE, nL, nP );\ |
| }\ |
| void Replace( const AERef aE, sal_uInt16 nP ) {\ |
| Base::Replace( (const VPRef)aE, nP );\ |
| }\ |
| void Replace( const AE *pE, sal_uInt16 nL, sal_uInt16 nP ) {\ |
| Base::Replace( (const VoidPtr*)pE, nL, nP );\ |
| }\ |
| void Remove( sal_uInt16 nP, sal_uInt16 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( sal_uInt16 nS, sal_uInt16 nE, \ |
| CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ |
| {\ |
| _ForEach( nS, nE, (FnForEach_##Base)fnForEach, pArgs );\ |
| }\ |
| AE operator[]( sal_uInt16 nP )const { \ |
| return (AE)Base::operator[](nP); }\ |
| AE GetObject( sal_uInt16 nP )const { \ |
| return (AE)Base::GetObject(nP); }\ |
| \ |
| sal_uInt16 GetPos( const AERef aE ) const { \ |
| return Base::GetPos((const VPRef)aE);\ |
| } \ |
| void DeleteAndDestroy( sal_uInt16 nP, sal_uInt16 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_VISIBILITY(nm, AE, IS, GS, vis )\ |
| SV_DECL_PTRARR_DEL_GEN(nm, AE, IS, GS, SvPtrarr, AE &, VoidPtr &, vis) |
| |
| #define SV_IMPL_PTRARR_GEN(nm, AE, Base)\ |
| void nm::DeleteAndDestroy( sal_uInt16 nP, sal_uInt16 nL )\ |
| { \ |
| if( nL ) {\ |
| DBG_ASSERT( nP < nA && nP + nL <= nA,"Del");\ |
| for( sal_uInt16 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 ) |
| |
| typedef void* VoidPtr; |
| _SV_DECL_PTRARR_DEF( SvPtrarr, 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 sal_Bool (*FnForEach_##nm)( const AE&, void* );\ |
| class vis nm : __MWERKS__PRIVATE nm##_SAR \ |
| {\ |
| public:\ |
| nm(sal_uInt16 nSize = IS, sal_uInt8 nG = GS)\ |
| : nm##_SAR(nSize,nG) {}\ |
| void Insert( const nm *pI, sal_uInt16 nS=0, sal_uInt16 nE=USHRT_MAX );\ |
| sal_Bool Insert( const AE& aE );\ |
| sal_Bool Insert( const AE& aE, sal_uInt16& rP );\ |
| void Insert( const AE *pE, sal_uInt16 nL );\ |
| void Remove( sal_uInt16 nP, sal_uInt16 nL = 1 );\ |
| void Remove( const AE& aE, sal_uInt16 nL = 1 );\ |
| sal_uInt16 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)\ |
| sal_Bool nm::Seek_Entry( const AE aE, sal_uInt16* pP ) const\ |
| {\ |
| register sal_uInt16 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 sal_True;\ |
| }\ |
| else if( (long)*(pData+ nM) < (long)aE )\ |
| nU = nM + 1;\ |
| else if( nM == 0 )\ |
| {\ |
| if( pP ) *pP = nU;\ |
| return sal_False;\ |
| }\ |
| else\ |
| nO = nM - 1;\ |
| }\ |
| }\ |
| if( pP ) *pP = nU;\ |
| return sal_False;\ |
| } |
| |
| #define _SV_SEEK_PTR_TO_OBJECT( nm,AE )\ |
| sal_Bool nm::Seek_Entry( const AE aE, sal_uInt16* pP ) const\ |
| {\ |
| register sal_uInt16 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 sal_True;\ |
| }\ |
| else if( *(*((AE*)pData + nM)) < *(aE) )\ |
| nU = nM + 1;\ |
| else if( nM == 0 )\ |
| {\ |
| if( pP ) *pP = nU;\ |
| return sal_False;\ |
| }\ |
| else\ |
| nO = nM - 1;\ |
| }\ |
| }\ |
| if( pP ) *pP = nU;\ |
| return sal_False;\ |
| } |
| |
| #define _SV_SEEK_OBJECT( nm,AE )\ |
| sal_Bool nm::Seek_Entry( const AE & aE, sal_uInt16* pP ) const\ |
| {\ |
| register sal_uInt16 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 sal_True;\ |
| }\ |
| else if( *(pData + nM) < aE )\ |
| nU = nM + 1;\ |
| else if( nM == 0 )\ |
| {\ |
| if( pP ) *pP = nU;\ |
| return sal_False;\ |
| }\ |
| else\ |
| nO = nM - 1;\ |
| }\ |
| }\ |
| if( pP ) *pP = nU;\ |
| return sal_False;\ |
| } |
| |
| #define _SV_IMPL_SORTAR_ALG(nm, AE)\ |
| void nm::Insert( const nm * pI, sal_uInt16 nS, sal_uInt16 nE )\ |
| {\ |
| if( USHRT_MAX == nE )\ |
| nE = pI->Count();\ |
| sal_uInt16 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;\ |
| }\ |
| }\ |
| }\ |
| \ |
| sal_Bool nm::Insert( const AE & aE )\ |
| {\ |
| sal_uInt16 nP;\ |
| sal_Bool bExist;\ |
| bExist = Seek_Entry( aE, &nP );\ |
| if( ! bExist )\ |
| nm##_SAR::Insert( aE, nP );\ |
| return !bExist;\ |
| }\ |
| sal_Bool nm::Insert( const AE & aE, sal_uInt16& rP )\ |
| {\ |
| sal_Bool bExist;\ |
| bExist = Seek_Entry( aE, &rP );\ |
| if( ! bExist )\ |
| nm##_SAR::Insert( aE, rP );\ |
| return !bExist;\ |
| }\ |
| void nm::Insert( const AE* pE, sal_uInt16 nL)\ |
| {\ |
| sal_uInt16 nP;\ |
| for( sal_uInt16 n = 0; n < nL; ++n )\ |
| if( ! Seek_Entry( *(pE+n), &nP ))\ |
| nm##_SAR::Insert( *(pE+n), nP );\ |
| }\ |
| void nm::Remove( sal_uInt16 nP, sal_uInt16 nL )\ |
| {\ |
| if( nL )\ |
| nm##_SAR::Remove( nP, nL);\ |
| }\ |
| \ |
| void nm::Remove( const AE &aE, sal_uInt16 nL )\ |
| {\ |
| sal_uInt16 nP;\ |
| if( nL && Seek_Entry( aE, &nP ) ) \ |
| nm##_SAR::Remove( nP, nL);\ |
| }\ |
| |
| #if defined(TCPP) |
| |
| #define _SORTARR_BLC_CASTS(nm, AE )\ |
| sal_Bool Insert( AE &aE ) {\ |
| return Insert( (const AE&)aE );\ |
| }\ |
| sal_uInt16 GetPos( AE& aE ) const { \ |
| return SvPtrarr::GetPos((const VoidPtr&)aE);\ |
| }\ |
| void Remove( AE& aE, sal_uInt16 nL = 1 ) { \ |
| Remove( (const AE&) aE, nL );\ |
| } |
| |
| #else |
| |
| #define _SORTARR_BLC_CASTS(nm, AE )\ |
| sal_uInt16 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[](sal_uInt16 nP) const {\ |
| return nm##_SAR::operator[]( nP );\ |
| }\ |
| AE GetObject(sal_uInt16 nP) const {\ |
| return nm##_SAR::GetObject( nP );\ |
| }\ |
| sal_Bool Seek_Entry( const AE aE, sal_uInt16* pP = 0 ) const;\ |
| void ForEach( CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ |
| {\ |
| _ForEach( 0, nA, (FnForEach_SvPtrarr)fnForEach, pArgs );\ |
| }\ |
| void ForEach( sal_uInt16 nS, sal_uInt16 nE, \ |
| CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ |
| {\ |
| _ForEach( nS, nE, (FnForEach_SvPtrarr)fnForEach, pArgs );\ |
| }\ |
| void DeleteAndDestroy( sal_uInt16 nP, sal_uInt16 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[](sal_uInt16 nP) const {\ |
| return nm##_SAR::operator[]( nP );\ |
| }\ |
| const AE& GetObject(sal_uInt16 nP) const {\ |
| return nm##_SAR::GetObject( nP );\ |
| }\ |
| sal_Bool Seek_Entry( const AE & aE, sal_uInt16* pP = 0 ) const;\ |
| void ForEach( CONCAT( FnForEach_, nm ) fnForEach, void* pArgs = 0 )\ |
| {\ |
| _ForEach( 0, nA, (FnForEach_##nm##_SAR)fnForEach, pArgs );\ |
| }\ |
| void ForEach( sal_uInt16 nS, sal_uInt16 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( sal_uInt16 nP, sal_uInt16 nL ) { \ |
| if( nL ) {\ |
| DBG_ASSERT( nP < nA && nP + nL <= nA, "ERR_VAR_DEL" );\ |
| for( sal_uInt16 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( sal_uInt16 nP, sal_uInt16 nL ) { \ |
| if( nL ) {\ |
| DBG_ASSERT( nP < nA && nP + nL <= nA, "ERR_VAR_DEL" );\ |
| for( sal_uInt16 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 C40_INSERT( c, p, n ) Insert( (c const *&) p, n ) |
| #define C40_PTR_INSERT( c, p ) Insert( (c const *&) p ) |
| #define C40_REPLACE( c, p, n ) Replace( (c const *&) p, n ) |
| #define C40_GETPOS( c, r) GetPos( (c const *&) r ) |
| |
| #endif //_SVARRAY_HXX |