2000-09-18 16:07:07 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2005-09-08 15:13:51 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2005-09-08 15:13:51 +00:00
|
|
|
* $RCSfile: svarray.cxx,v $
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2007-07-18 07:55:53 +00:00
|
|
|
* $Revision: 1.7 $
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2007-07-18 07:55:53 +00:00
|
|
|
* last change: $Author: obo $ $Date: 2007-07-18 08:55:53 $
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2005-09-08 15:13:51 +00:00
|
|
|
* The Contents of this file are made available subject to
|
|
|
|
* the terms of GNU Lesser General Public License Version 2.1.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
|
|
|
*
|
2005-09-08 15:13:51 +00:00
|
|
|
* GNU Lesser General Public License Version 2.1
|
|
|
|
* =============================================
|
|
|
|
* Copyright 2005 by Sun Microsystems, Inc.
|
|
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2005-09-08 15:13:51 +00:00
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License version 2.1, as published by the Free Software Foundation.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2005-09-08 15:13:51 +00:00
|
|
|
* This library 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 for more details.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2005-09-08 15:13:51 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
|
|
* MA 02111-1307 USA
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
2006-09-17 14:08:48 +00:00
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_svtools.hxx"
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
#define _SVARRAY_CXX
|
|
|
|
|
|
|
|
#define _SVSTDARR_BOOLS
|
|
|
|
#define _SVSTDARR_BYTES
|
|
|
|
#define _SVSTDARR_ULONGS
|
2001-03-20 17:31:40 +00:00
|
|
|
#define _SVSTDARR_ULONGSSORT
|
2000-09-18 16:07:07 +00:00
|
|
|
#define _SVSTDARR_USHORTS
|
|
|
|
#define _SVSTDARR_LONGS
|
2001-03-20 17:31:40 +00:00
|
|
|
#define _SVSTDARR_LONGSSORT
|
2000-09-18 16:07:07 +00:00
|
|
|
#define _SVSTDARR_SHORTS
|
|
|
|
#define _SVSTDARR_STRINGS
|
|
|
|
#define _SVSTDARR_STRINGSDTOR
|
|
|
|
#define _SVSTDARR_STRINGSSORT
|
|
|
|
#define _SVSTDARR_STRINGSSORTDTOR
|
|
|
|
#define _SVSTDARR_STRINGSISORT
|
|
|
|
#define _SVSTDARR_STRINGSISORTDTOR
|
|
|
|
#define _SVSTDARR_USHORTSSORT
|
|
|
|
|
|
|
|
#define _SVSTDARR_BYTESTRINGS
|
|
|
|
#define _SVSTDARR_BYTESTRINGSDTOR
|
|
|
|
#define _SVSTDARR_BYTESTRINGSSORT
|
|
|
|
#define _SVSTDARR_BYTESTRINGSSORTDTOR
|
|
|
|
#define _SVSTDARR_BYTESTRINGSISORT
|
|
|
|
#define _SVSTDARR_BYTESTRINGSISORTDTOR
|
|
|
|
|
|
|
|
#define _SVSTDARR_XUB_STRLEN
|
2001-03-20 17:31:40 +00:00
|
|
|
#define _SVSTDARR_XUB_STRLENSORT
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2007-06-27 20:48:00 +00:00
|
|
|
#include <svtools/svstdarr.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
#ifndef _STRING_HXX //autogen
|
|
|
|
#include <tools/string.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _TOOLS_DEBUG_HXX //autogen
|
|
|
|
#include <tools/debug.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
SV_IMPL_VARARR(SvPtrarr,VoidPtr)
|
|
|
|
SV_IMPL_VARARR_PLAIN(SvPtrarrPlain,VoidPtr)
|
|
|
|
|
|
|
|
USHORT SvPtrarr::GetPos( const VoidPtr& aElement ) const
|
|
|
|
{ USHORT n;
|
|
|
|
for( n=0; n < nA && *(GetData()+n) != aElement; ) n++;
|
|
|
|
return ( n >= nA ? USHRT_MAX : n );
|
|
|
|
}
|
|
|
|
|
|
|
|
USHORT SvPtrarrPlain::GetPos( const VoidPtr aElement ) const
|
|
|
|
{ USHORT n;
|
|
|
|
for( n=0; n < nA && *(GetData()+n) != aElement; ) n++;
|
|
|
|
return ( n >= nA ? USHRT_MAX : n );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SV_IMPL_VARARR( SvBools, BOOL )
|
|
|
|
SV_IMPL_VARARR( SvBytes, BYTE )
|
|
|
|
SV_IMPL_VARARR( SvULongs, ULONG )
|
|
|
|
SV_IMPL_VARARR( SvUShorts, USHORT )
|
|
|
|
SV_IMPL_VARARR( SvLongs, long)
|
|
|
|
SV_IMPL_VARARR( SvShorts, short )
|
|
|
|
|
2001-03-20 17:31:40 +00:00
|
|
|
SV_IMPL_VARARR_SORT( SvULongsSort, ULONG )
|
|
|
|
SV_IMPL_VARARR_SORT( SvLongsSort, long )
|
|
|
|
SV_IMPL_VARARR_SORT( SvXub_StrLensSort, xub_StrLen )
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
SV_IMPL_VARARR( SvXub_StrLens, xub_StrLen )
|
|
|
|
|
|
|
|
SV_IMPL_PTRARR( SvStrings, StringPtr )
|
|
|
|
SV_IMPL_PTRARR( SvStringsDtor, StringPtr )
|
|
|
|
SV_IMPL_OP_PTRARR_SORT( SvStringsSort, StringPtr )
|
|
|
|
SV_IMPL_OP_PTRARR_SORT( SvStringsSortDtor, StringPtr )
|
|
|
|
|
|
|
|
SV_IMPL_PTRARR( SvByteStrings, ByteStringPtr )
|
|
|
|
SV_IMPL_PTRARR( SvByteStringsDtor, ByteStringPtr )
|
|
|
|
SV_IMPL_OP_PTRARR_SORT( SvByteStringsSort, ByteStringPtr )
|
|
|
|
SV_IMPL_OP_PTRARR_SORT( SvByteStringsSortDtor, ByteStringPtr )
|
|
|
|
|
|
|
|
|
2001-03-20 17:31:40 +00:00
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
// ---------------- strings -------------------------------------
|
|
|
|
|
|
|
|
// Array mit anderer Seek-Methode!
|
|
|
|
_SV_IMPL_SORTAR_ALG( SvStringsISort, StringPtr )
|
|
|
|
void SvStringsISort::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 *((StringPtr*)pData+n);
|
|
|
|
SvPtrarr::Remove( nP, nL );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
BOOL SvStringsISort::Seek_Entry( const StringPtr aE, USHORT* pP ) const
|
|
|
|
{
|
|
|
|
register USHORT nO = SvStringsISort_SAR::Count(),
|
|
|
|
nM,
|
|
|
|
nU = 0;
|
|
|
|
if( nO > 0 )
|
|
|
|
{
|
|
|
|
nO--;
|
|
|
|
while( nU <= nO )
|
|
|
|
{
|
|
|
|
nM = nU + ( nO - nU ) / 2;
|
|
|
|
StringCompare eCmp = (*((StringPtr*)pData + nM))->
|
|
|
|
CompareIgnoreCaseToAscii( *(aE) );
|
|
|
|
if( COMPARE_EQUAL == eCmp )
|
|
|
|
{
|
|
|
|
if( pP ) *pP = nM;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
else if( COMPARE_LESS == eCmp )
|
|
|
|
nU = nM + 1;
|
|
|
|
else if( nM == 0 )
|
|
|
|
{
|
|
|
|
if( pP ) *pP = nU;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
nO = nM - 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if( pP ) *pP = nU;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// ---------------- strings -------------------------------------
|
|
|
|
|
|
|
|
// Array mit anderer Seek-Methode!
|
|
|
|
_SV_IMPL_SORTAR_ALG( SvStringsISortDtor, StringPtr )
|
|
|
|
void SvStringsISortDtor::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 *((StringPtr*)pData+n);
|
|
|
|
SvPtrarr::Remove( nP, nL );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
BOOL SvStringsISortDtor::Seek_Entry( const StringPtr aE, USHORT* pP ) const
|
|
|
|
{
|
|
|
|
register USHORT nO = SvStringsISortDtor_SAR::Count(),
|
|
|
|
nM,
|
|
|
|
nU = 0;
|
|
|
|
if( nO > 0 )
|
|
|
|
{
|
|
|
|
nO--;
|
|
|
|
while( nU <= nO )
|
|
|
|
{
|
|
|
|
nM = nU + ( nO - nU ) / 2;
|
|
|
|
StringCompare eCmp = (*((StringPtr*)pData + nM))->
|
|
|
|
CompareIgnoreCaseToAscii( *(aE) );
|
|
|
|
if( COMPARE_EQUAL == eCmp )
|
|
|
|
{
|
|
|
|
if( pP ) *pP = nM;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
else if( COMPARE_LESS == eCmp )
|
|
|
|
nU = nM + 1;
|
|
|
|
else if( nM == 0 )
|
|
|
|
{
|
|
|
|
if( pP ) *pP = nU;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
nO = nM - 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if( pP ) *pP = nU;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// ---------------- Ushorts -------------------------------------
|
|
|
|
|
|
|
|
/* SortArray fuer UShorts */
|
|
|
|
BOOL SvUShortsSort::Seek_Entry( const USHORT aE, USHORT* pP ) const
|
|
|
|
{
|
|
|
|
register USHORT nO = SvUShorts::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;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SvUShortsSort::Insert( const SvUShortsSort * pI, USHORT nS, USHORT nE )
|
|
|
|
{
|
|
|
|
if( USHRT_MAX == nE )
|
|
|
|
nE = pI->Count();
|
|
|
|
USHORT nP;
|
|
|
|
const USHORT * pIArr = pI->GetData();
|
|
|
|
for( ; nS < nE; ++nS )
|
|
|
|
{
|
|
|
|
if( ! Seek_Entry( *(pIArr+nS), &nP) )
|
|
|
|
SvUShorts::Insert( *(pIArr+nS), nP );
|
|
|
|
if( ++nP >= Count() )
|
|
|
|
{
|
|
|
|
SvUShorts::Insert( pI, nP, nS+1, nE );
|
|
|
|
nS = nE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL SvUShortsSort::Insert( const USHORT aE )
|
|
|
|
{
|
|
|
|
USHORT nP;
|
2006-10-12 14:23:09 +00:00
|
|
|
BOOL bExist = Seek_Entry( aE, &nP );
|
|
|
|
if( !bExist )
|
2000-09-18 16:07:07 +00:00
|
|
|
SvUShorts::Insert( aE, nP );
|
|
|
|
return !bExist;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL SvUShortsSort::Insert( const USHORT aE, USHORT& rP )
|
|
|
|
{
|
2006-10-12 14:23:09 +00:00
|
|
|
BOOL bExist = Seek_Entry( aE, &rP );
|
|
|
|
if( !bExist )
|
2000-09-18 16:07:07 +00:00
|
|
|
SvUShorts::Insert( aE, rP );
|
|
|
|
return !bExist;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SvUShortsSort::Insert( const USHORT* pE, USHORT nL)
|
|
|
|
{
|
|
|
|
USHORT nP;
|
|
|
|
for( USHORT n = 0; n < nL; ++n )
|
|
|
|
if( ! Seek_Entry( *(pE+n), &nP ))
|
|
|
|
SvUShorts::Insert( *(pE+n), nP );
|
|
|
|
}
|
|
|
|
|
|
|
|
// remove ab Pos
|
|
|
|
void SvUShortsSort::RemoveAt( const USHORT nP, USHORT nL )
|
|
|
|
{
|
|
|
|
if( nL )
|
|
|
|
SvUShorts::Remove( nP, nL);
|
|
|
|
}
|
|
|
|
|
|
|
|
// remove ab dem Eintrag
|
|
|
|
void SvUShortsSort::Remove( const USHORT aE, USHORT nL )
|
|
|
|
{
|
|
|
|
USHORT nP;
|
|
|
|
if( nL && Seek_Entry( aE, &nP ) )
|
|
|
|
SvUShorts::Remove( nP, nL);
|
|
|
|
}
|
|
|
|
|
|
|
|
// ---------------- bytestrings -------------------------------------
|
|
|
|
|
|
|
|
// Array mit anderer Seek-Methode!
|
|
|
|
_SV_IMPL_SORTAR_ALG( SvByteStringsISort, ByteStringPtr )
|
|
|
|
void SvByteStringsISort::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 *((ByteStringPtr*)pData+n);
|
|
|
|
SvPtrarr::Remove( nP, nL );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
BOOL SvByteStringsISort::Seek_Entry( const ByteStringPtr aE, USHORT* pP ) const
|
|
|
|
{
|
|
|
|
register USHORT nO = SvByteStringsISort_SAR::Count(),
|
|
|
|
nM,
|
|
|
|
nU = 0;
|
|
|
|
if( nO > 0 )
|
|
|
|
{
|
|
|
|
nO--;
|
|
|
|
while( nU <= nO )
|
|
|
|
{
|
|
|
|
nM = nU + ( nO - nU ) / 2;
|
|
|
|
StringCompare eCmp = (*((ByteStringPtr*)pData + nM))->
|
|
|
|
CompareIgnoreCaseToAscii( *(aE) );
|
|
|
|
if( COMPARE_EQUAL == eCmp )
|
|
|
|
{
|
|
|
|
if( pP ) *pP = nM;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
else if( COMPARE_LESS == eCmp )
|
|
|
|
nU = nM + 1;
|
|
|
|
else if( nM == 0 )
|
|
|
|
{
|
|
|
|
if( pP ) *pP = nU;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
nO = nM - 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if( pP ) *pP = nU;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Array mit anderer Seek-Methode!
|
|
|
|
_SV_IMPL_SORTAR_ALG( SvByteStringsISortDtor, ByteStringPtr )
|
|
|
|
void SvByteStringsISortDtor::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 *((ByteStringPtr*)pData+n);
|
|
|
|
SvPtrarr::Remove( nP, nL );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
BOOL SvByteStringsISortDtor::Seek_Entry( const ByteStringPtr aE, USHORT* pP ) const
|
|
|
|
{
|
|
|
|
register USHORT nO = SvByteStringsISortDtor_SAR::Count(),
|
|
|
|
nM,
|
|
|
|
nU = 0;
|
|
|
|
if( nO > 0 )
|
|
|
|
{
|
|
|
|
nO--;
|
|
|
|
while( nU <= nO )
|
|
|
|
{
|
|
|
|
nM = nU + ( nO - nU ) / 2;
|
|
|
|
StringCompare eCmp = (*((ByteStringPtr*)pData + nM))->
|
|
|
|
CompareIgnoreCaseToAscii( *(aE) );
|
|
|
|
if( COMPARE_EQUAL == eCmp )
|
|
|
|
{
|
|
|
|
if( pP ) *pP = nM;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
else if( COMPARE_LESS == eCmp )
|
|
|
|
nU = nM + 1;
|
|
|
|
else if( nM == 0 )
|
|
|
|
{
|
|
|
|
if( pP ) *pP = nU;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
nO = nM - 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if( pP ) *pP = nU;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|