blob: 5a047083517be0a807a68f7fe19e214ce3d31d46 [file] [log] [blame]
/**************************************************************
*
* 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 _TOOLS_STRINGLIST
# define _TOOLS_STRINGLIST
#endif
#define ENABLE_BYTESTRING_STREAM_OPERATORS
#include <tools/stream.hxx>
#include "soldep/sstring.hxx"
SByteStringList::SByteStringList()
{
}
SByteStringList::~SByteStringList()
{
}
sal_uIntPtr SByteStringList::IsString( ByteString* pStr )
{
sal_uIntPtr nRet = NOT_THERE;
if ( (nRet = GetPrevString( pStr )) != 0 )
{
ByteString* pString = GetObject( nRet );
if ( *pString == *pStr )
return nRet;
else
return NOT_THERE;
}
else
{
ByteString* pString = GetObject( 0 );
if ( pString && (*pString == *pStr) )
return 0;
else
return NOT_THERE;
}
}
sal_uIntPtr SByteStringList::GetPrevString( ByteString* pStr )
{
sal_uIntPtr nRet = 0;
sal_Bool bFound = sal_False;
sal_uIntPtr nCountMember = Count();
sal_uIntPtr nUpper = nCountMember;
sal_uIntPtr nLower = 0;
sal_uIntPtr nCurrent = nUpper / 2;
sal_uIntPtr nRem = 0;
ByteString* pString;
do
{
if ( (nCurrent == nLower) || (nCurrent == nUpper) )
return nLower;
pString = GetObject( nCurrent );
StringCompare nResult = pStr->CompareTo( *pString );
if ( nResult == COMPARE_LESS )
{
nUpper = nCurrent;
nCurrent = (nCurrent + nLower) /2;
}
else if ( nResult == COMPARE_GREATER )
{
nLower = nCurrent;
nCurrent = (nUpper + nCurrent) /2;
}
else if ( nResult == COMPARE_EQUAL )
return nCurrent;
if ( nRem == nCurrent )
return nCurrent;
nRem = nCurrent;
}
while ( !bFound );
return nRet;
}
/**************************************************************************
*
* Sortiert einen ByteString in die Liste ein und gibt die Position,
* an der einsortiert wurde, zurueck
*
**************************************************************************/
sal_uIntPtr SByteStringList::PutString( ByteString* pStr )
{
sal_uIntPtr nPos = GetPrevString ( pStr );
if ( Count() )
{
{
ByteString* pString = GetObject( 0 );
if ( pString->CompareTo( *pStr ) == COMPARE_GREATER )
{
Insert( pStr, (sal_uIntPtr)0 );
return (sal_uIntPtr)0;
}
}
ByteString* pString = GetObject( nPos );
if ( *pStr != *pString )
{
Insert( pStr, nPos+1 );
return ( nPos +1 );
}
}
else
{
Insert( pStr );
return (sal_uIntPtr)0;
}
return NOT_THERE;
}
ByteString* SByteStringList::RemoveString( const ByteString& rName )
{
sal_uIntPtr i;
ByteString* pReturn;
for( i = 0 ; i < Count(); i++ )
{
if ( rName == *GetObject( i ) )
{
pReturn = GetObject(i);
Remove(i);
return pReturn;
}
}
return NULL;
}
void SByteStringList::CleanUp()
{
ByteString* pByteString = First();
while (pByteString) {
delete pByteString;
pByteString = Next();
}
Clear();
}
SByteStringList& SByteStringList::operator<< ( SvStream& rStream )
{
sal_uInt32 nListCount;
rStream >> nListCount;
for ( sal_uInt16 i = 0; i < nListCount; i++ ) {
ByteString* pByteString = new ByteString();
rStream >> *pByteString;
Insert (pByteString, LIST_APPEND);
}
return *this;
}
SByteStringList& SByteStringList::operator>> ( SvStream& rStream )
{
sal_uInt32 nListCount = Count();
rStream << nListCount;
ByteString* pByteString = First();
while (pByteString) {
rStream << *pByteString;
pByteString = Next();
}
return *this;
}
SUniStringList::SUniStringList()
{
}
SUniStringList::~SUniStringList()
{
}
sal_uIntPtr SUniStringList::IsString( UniString* pStr )
{
sal_uIntPtr nRet = NOT_THERE;
if ( (nRet = GetPrevString( pStr )) != 0 )
{
UniString* pString = GetObject( nRet );
if ( *pString == *pStr )
return nRet;
else
return NOT_THERE;
}
else
{
UniString* pString = GetObject( 0 );
if ( pString && (*pString == *pStr) )
return 0;
else
return NOT_THERE;
}
}
sal_uIntPtr SUniStringList::GetPrevString( UniString* pStr )
{
sal_uIntPtr nRet = 0;
sal_Bool bFound = sal_False;
sal_uIntPtr nCountMember = Count();
sal_uIntPtr nUpper = nCountMember;
sal_uIntPtr nLower = 0;
sal_uIntPtr nCurrent = nUpper / 2;
sal_uIntPtr nRem = 0;
UniString* pString;
do
{
if ( (nCurrent == nLower) || (nCurrent == nUpper) )
return nLower;
pString = GetObject( nCurrent );
StringCompare nResult = pStr->CompareTo( *pString );
if ( nResult == COMPARE_LESS )
{
nUpper = nCurrent;
nCurrent = (nCurrent + nLower) /2;
}
else if ( nResult == COMPARE_GREATER )
{
nLower = nCurrent;
nCurrent = (nUpper + nCurrent) /2;
}
else if ( nResult == COMPARE_EQUAL )
return nCurrent;
if ( nRem == nCurrent )
return nCurrent;
nRem = nCurrent;
}
while ( !bFound );
return nRet;
}
/**************************************************************************
*
* Sortiert einen UniString in die Liste ein und gibt die Position,
* an der einsortiert wurde, zurueck
*
**************************************************************************/
sal_uIntPtr SUniStringList::PutString( UniString* pStr )
{
sal_uIntPtr nPos = GetPrevString ( pStr );
if ( Count() )
{
{
UniString* pString = GetObject( 0 );
if ( pString->CompareTo( *pStr ) == COMPARE_GREATER )
{
Insert( pStr, (sal_uIntPtr)0);
return (sal_uIntPtr)0;
}
}
UniString* pString = GetObject( nPos );
if ( *pStr != *pString )
{
Insert( pStr, nPos+1 );
return ( nPos +1 );
}
}
else
{
Insert( pStr );
return (sal_uIntPtr)0;
}
return NOT_THERE;
}
UniString* SUniStringList::RemoveString( const UniString& rName )
{
sal_uIntPtr i;
UniString* pReturn;
for( i = 0 ; i < Count(); i++ )
{
if ( rName == *GetObject( i ) )
{
pReturn = GetObject(i);
Remove(i);
return pReturn;
}
}
return NULL;
}