blob: d708eb836ae15f72e4a0de5f57954c90b2af4623 [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 _CNTRSRT_HXX
#define _CNTRSRT_HXX
#if 0
***********************************************************************
*
* Hier folgt die Beschreibung fuer die exportierten Makros:
*
* DECLARE_CONTAINER_SORT( ClassName, Type )
* IMPL_CONTAINER_SORT( ClassName, Type, SortFunc )
*
* Definiert eine von Container abgeleitete Klasse "ClassName",
* in der die Elemente des Typs "Type" sortiert enthalten sind.
* Dazu muss einer Funktion "SortFunc" definiert sein, die als
* Paramter zwei "const Type&" erwartet und 0 zurueckgibt, wenn
* beide gleich sind, -1 wenn der erste Paramter kleiner ist als
* der zweite und +1 wenn der erste Paramter groesser ist als
* der zweite.
*
* Die Zugriffs-Methoden entsprechen in etwa denen der Container-
* Klasse, mit Ausnahme von Insert, DeleteAndDestroy und Seek_Entry,
* der den SV-Pointer-Arrays entsprechen.
*
* DECLARE_CONTAINER_SORT_DEL( ClassName, Type )
* IMPL_CONTAINER_SORT( ClassName, Type, SortFunc )
*
* Wie DECLARE_CONTAINER_SORT, nur dass beim Aufruf des Destruktors
* alle im Conatiner vorhandenen Objekte geloescht werden.
*
#endif
#include <tools/contnr.hxx>
#define DECLARE_CONTAINER_SORT_COMMON( ClassName, Type ) \
ClassName( const ClassName& ); \
ClassName& operator =( const ClassName& ); \
public: \
using Container::Count; \
\
ClassName( sal_uInt16 InitSize, sal_uInt16 ReSize ) : \
Container( CONTAINER_MAXBLOCKSIZE, InitSize, ReSize ) {} \
\
sal_Bool Insert( Type* pObj ); \
\
Type *Remove( sal_uLong nPos ) \
{ return (Type *)Container::Remove( nPos ); } \
\
Type *Remove( Type* pObj ); \
\
void DeleteAndDestroy( sal_uLong nPos ) \
{ \
Type *pObj = Remove( nPos ); \
if( pObj ) \
delete pObj; \
} \
\
void DeleteAndDestroy() \
{ while( Count() ) DeleteAndDestroy( 0 ); } \
\
Type* GetObject( sal_uLong nPos ) const \
{ return (Type *)Container::GetObject( nPos ); } \
\
Type* operator[]( sal_uLong nPos ) const \
{ return GetObject(nPos); } \
\
sal_Bool Seek_Entry( const Type *pObj, sal_uLong* pPos ) const; \
\
sal_uLong GetPos( const Type* pObj ) const; \
#define DECLARE_CONTAINER_SORT( ClassName, Type ) \
class ClassName : private Container \
{ \
DECLARE_CONTAINER_SORT_COMMON( ClassName, Type ) \
~ClassName() {} \
}; \
#define DECLARE_CONTAINER_SORT_DEL( ClassName, Type ) \
class ClassName : private Container \
{ \
DECLARE_CONTAINER_SORT_COMMON( ClassName, Type ) \
~ClassName() { DeleteAndDestroy(); } \
}; \
#define IMPL_CONTAINER_SORT( ClassName, Type, SortFunc ) \
sal_Bool ClassName::Insert( Type *pObj ) \
{ \
sal_uLong nPos; \
sal_Bool bExist = Seek_Entry( pObj, &nPos ); \
if( !bExist ) \
Container::Insert( pObj, nPos ); \
return !bExist; \
} \
\
Type *ClassName::Remove( Type* pObj ) \
{ \
sal_uLong nPos; \
if( Seek_Entry( pObj, &nPos ) ) \
return Remove( nPos ); \
else \
return 0; \
} \
\
sal_uLong ClassName::GetPos( const Type* pObj ) const \
{ \
sal_uLong nPos; \
if( Seek_Entry( pObj, &nPos ) ) \
return nPos; \
else \
return CONTAINER_ENTRY_NOTFOUND; \
} \
\
sal_Bool ClassName::Seek_Entry( const Type* pObj, sal_uLong* pPos ) const \
{ \
register sal_uLong nO = Count(), \
nM, \
nU = 0; \
if( nO > 0 ) \
{ \
nO--; \
while( nU <= nO ) \
{ \
nM = nU + ( nO - nU ) / 2; \
int nCmp = SortFunc( *GetObject(nM), *pObj ); \
\
if( 0 == nCmp ) \
{ \
if( pPos ) *pPos = nM; \
return sal_True; \
} \
else if( nCmp < 0 ) \
nU = nM + 1; \
else if( nM == 0 ) \
{ \
if( pPos ) *pPos = nU; \
return sal_False; \
} \
else \
nO = nM - 1; \
} \
} \
if( pPos ) *pPos = nU; \
return sal_False; \
} \
#endif