Kaydet (Commit) d85b7f15 authored tarafından Michael Stahl's avatar Michael Stahl

move tools/table.hxx to binfilter

üst a26c2ee3
......@@ -57,8 +57,6 @@ class SvxSearchItem;
#include "objdlg.hxx"
#include <set>
#include <tools/table.hxx>
DBG_NAMEEX( ModulWindow )
#define MARKER_NOMARKER 0xFFFF
......
......@@ -88,7 +88,6 @@ $(eval $(call gb_Library_add_exception_objects,tl,\
tools/source/memtools/contnr \
tools/source/memtools/mempool \
tools/source/memtools/multisel \
tools/source/memtools/table \
tools/source/memtools/unqidx \
tools/source/misc/appendunixshellword \
tools/source/misc/extendapplicationenvironment \
......
......@@ -83,7 +83,6 @@ $(eval $(call gb_Package_add_file,tools_inc,inc/tools/stream.hxx,tools/stream.hx
$(eval $(call gb_Package_add_file,tools_inc,inc/tools/string.hxx,tools/string.hxx))
$(eval $(call gb_Package_add_file,tools_inc,inc/tools/svborder.hxx,tools/svborder.hxx))
$(eval $(call gb_Package_add_file,tools_inc,inc/tools/svlibrary.hxx,tools/svlibrary.hxx))
$(eval $(call gb_Package_add_file,tools_inc,inc/tools/table.hxx,tools/table.hxx))
$(eval $(call gb_Package_add_file,tools_inc,inc/tools/tempfile.hxx,tools/tempfile.hxx))
$(eval $(call gb_Package_add_file,tools_inc,inc/tools/tenccvt.hxx,tools/tenccvt.hxx))
$(eval $(call gb_Package_add_file,tools_inc,inc/tools/time.hxx,tools/time.hxx))
......
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* 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 _TOOLS_TABLE_HXX
#define _TOOLS_TABLE_HXX
#include "tools/toolsdllapi.h"
#include <tools/solar.h>
#include <tools/contnr.hxx>
// ---------
// - Table -
// ---------
#define TABLE_ENTRY_NOTFOUND CONTAINER_ENTRY_NOTFOUND
class TOOLS_DLLPUBLIC Table : private Container
{
private:
sal_uIntPtr nCount;
TOOLS_DLLPRIVATE sal_uIntPtr ImplGetIndex( sal_uIntPtr nKey, sal_uIntPtr* pIndex = NULL ) const;
public:
Table( sal_uInt16 nInitSize = 16, sal_uInt16 nReSize = 16 );
Table( const Table& rTable ) : Container( rTable )
{ nCount = rTable.nCount; }
sal_Bool Insert( sal_uIntPtr nKey, void* p );
void* Remove( sal_uIntPtr nKey );
void* Replace( sal_uIntPtr nKey, void* p );
void* Get( sal_uIntPtr nKey ) const;
void Clear() { Container::Clear(); nCount = 0; }
sal_uIntPtr Count() const { return( nCount ); }
void* GetCurObject() const;
sal_uIntPtr GetCurKey() const { return (sal_uIntPtr)Container::GetCurObject(); }
sal_uIntPtr GetKey( const void* p ) const;
sal_Bool IsKeyValid( sal_uIntPtr nKey ) const;
void* GetObject( sal_uIntPtr nPos ) const
{ return Container::GetObject( (nPos*2)+1 ); }
sal_uIntPtr GetObjectKey( sal_uIntPtr nPos ) const
{ return (sal_uIntPtr)Container::GetObject( nPos*2 ); }
sal_uIntPtr SearchKey( sal_uIntPtr nKey, sal_uIntPtr* pPos = NULL ) const;
void* Seek( sal_uIntPtr nKey );
void* First();
void* Last();
void* Next();
void* Prev();
Table& operator =( const Table& rTable );
sal_Bool operator ==( const Table& rTable ) const
{ return Container::operator ==( rTable ); }
sal_Bool operator !=( const Table& rTable ) const
{ return Container::operator !=( rTable ); }
};
inline Table& Table::operator =( const Table& r )
{
Container::operator =( r );
nCount = r.nCount;
return *this;
}
// -----------------
// - DECLARE_TABLE -
// -----------------
#define DECLARE_TABLE( ClassName, Type ) \
class ClassName : private Table \
{ \
public: \
using Table::Clear; \
using Table::Count; \
using Table::GetCurKey; \
using Table::GetObjectKey; \
using Table::SearchKey; \
using Table::IsKeyValid; \
\
ClassName( sal_uInt16 _nInitSize = 16, \
sal_uInt16 _nReSize = 16 ) : \
Table( _nInitSize, _nReSize ) {} \
ClassName( const ClassName& rClassName ) : \
Table( rClassName ) {} \
\
sal_Bool Insert( sal_uIntPtr nKey, Type p ) \
{ return Table::Insert( nKey, (void*)p ); } \
Type Remove( sal_uIntPtr nKey ) \
{ return (Type)Table::Remove( nKey ); } \
Type Replace( sal_uIntPtr nKey, Type p ) \
{ return (Type)Table::Replace( nKey, (void*)p ); } \
Type Get( sal_uIntPtr nKey ) const \
{ return (Type)Table::Get( nKey ); } \
\
Type GetCurObject() const \
{ return (Type)Table::GetCurObject(); } \
sal_uIntPtr GetKey( const Type p ) const \
{ return Table::GetKey( (const void*)p ); } \
\
Type GetObject( sal_uIntPtr nPos ) const \
{ return (Type)Table::GetObject( nPos ); } \
\
Type Seek( sal_uIntPtr nKey ) \
{ return (Type)Table::Seek( nKey ); } \
Type First() { return (Type)Table::First(); } \
Type Last() { return (Type)Table::Last(); } \
Type Next() { return (Type)Table::Next(); } \
Type Prev() { return (Type)Table::Prev(); } \
\
ClassName& operator =( const ClassName& rClassName ) \
{ Table::operator =( rClassName ); \
return *this; } \
\
sal_Bool operator ==( const ClassName& rTable ) const \
{ return Table::operator ==( rTable ); } \
sal_Bool operator !=( const ClassName& rTable ) const \
{ return Table::operator !=( rTable ); } \
};
#endif // _TOOLS_TABLE_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* 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.
*
************************************************************************/
#define _TOOLS_TABLE_CXX
// -----------------------------------------------------------------------
#include <tools/debug.hxx>
#include <impcont.hxx>
#include <tools/table.hxx>
// =======================================================================
sal_uIntPtr Table::ImplGetIndex( sal_uIntPtr nKey, sal_uIntPtr* pIndex ) const
{
// Abpruefen, ob der erste Key groesser als der Vergleichskey ist
if ( !nCount || (nKey < (sal_uIntPtr)Container::ImpGetObject(0)) )
return TABLE_ENTRY_NOTFOUND;
sal_uIntPtr nLow;
sal_uIntPtr nHigh;
sal_uIntPtr nMid;
sal_uIntPtr nCompareKey;
void** pNodes = Container::ImpGetOnlyNodes();
// Binaeres Suchen
nLow = 0;
nHigh = nCount-1;
if ( pNodes )
{
do
{
nMid = (nLow + nHigh) / 2;
nCompareKey = (sal_uIntPtr)pNodes[nMid*2];
if ( nKey < nCompareKey )
nHigh = nMid-1;
else
{
if ( nKey > nCompareKey )
nLow = nMid + 1;
else
return nMid*2;
}
}
while ( nLow <= nHigh );
}
else
{
do
{
nMid = (nLow + nHigh) / 2;
nCompareKey = (sal_uIntPtr)Container::ImpGetObject( nMid*2 );
if ( nKey < nCompareKey )
nHigh = nMid-1;
else
{
if ( nKey > nCompareKey )
nLow = nMid + 1;
else
return nMid*2;
}
}
while ( nLow <= nHigh );
}
if ( pIndex )
{
if ( nKey > nCompareKey )
*pIndex = (nMid+1)*2;
else
*pIndex = nMid*2;
}
return TABLE_ENTRY_NOTFOUND;
}
// =======================================================================
Table::Table( sal_uInt16 _nInitSize, sal_uInt16 _nReSize ) :
Container( CONTAINER_MAXBLOCKSIZE, _nInitSize*2, _nReSize*2 )
{
DBG_ASSERT( _nInitSize <= 32767, "Table::Table(): InitSize > 32767" );
DBG_ASSERT( _nReSize <= 32767, "Table::Table(): ReSize > 32767" );
nCount = 0;
}
// -----------------------------------------------------------------------
sal_Bool Table::Insert( sal_uIntPtr nKey, void* p )
{
// Tabellenelement einsortieren
sal_uIntPtr i;
if ( nCount )
{
if ( nCount <= 24 )
{
sal_uInt16 nTempCount = (sal_uInt16)nCount * 2;
if( void** pNodes = Container::ImpGetOnlyNodes() )
{
sal_uInt16 n = 0;
sal_uIntPtr nCompareKey = (sal_uIntPtr)(*pNodes);
while ( nKey > nCompareKey )
{
n += 2;
pNodes += 2;
if ( n < nTempCount )
nCompareKey = (sal_uIntPtr)(*pNodes);
else
{
nCompareKey = 0;
break;
}
}
// Testen, ob sich der Key schon in der Tabelle befindet
if ( nKey == nCompareKey )
return sal_False;
i = n;
}
else
{
i = 0;
if ( ImplGetIndex( nKey, &i ) != TABLE_ENTRY_NOTFOUND )
return sal_False;
}
}
else
{
i = 0;
if ( ImplGetIndex( nKey, &i ) != TABLE_ENTRY_NOTFOUND )
return sal_False;
}
}
else
i = 0;
// Eintrag einfuegen (Key vor Pointer)
Container::Insert( (void*)nKey, i );
Container::Insert( p, i+1 );
// Ein neuer Eintrag
nCount++;
return sal_True;
}
// -----------------------------------------------------------------------
void* Table::Remove( sal_uIntPtr nKey )
{
// Index besorgen
sal_uIntPtr nIndex = ImplGetIndex( nKey );
// Testen, ob sich der Key in der Tabelle befindet
if ( nIndex == TABLE_ENTRY_NOTFOUND )
return NULL;
// Itemanzahl erniedrigen
nCount--;
// Key entfernen
Container::Remove( nIndex );
// Pointer entfernen und zurueckgeben
return Container::Remove( nIndex );
}
// -----------------------------------------------------------------------
void* Table::Replace( sal_uIntPtr nKey, void* p )
{
// Index abfragen
sal_uIntPtr nIndex = ImplGetIndex( nKey );
// Existiert kein Eintrag mit dem Schluessel
if ( nIndex == TABLE_ENTRY_NOTFOUND )
return NULL;
else
return Container::Replace( p, nIndex+1 );
}
// -----------------------------------------------------------------------
void* Table::Get( sal_uIntPtr nKey ) const
{
// Index besorgen
sal_uIntPtr nIndex = ImplGetIndex( nKey );
// Testen, ob sich der Key in der Tabelle befindet
if ( nIndex == TABLE_ENTRY_NOTFOUND )
return NULL;
else
return Container::ImpGetObject( nIndex+1 );
}
// -----------------------------------------------------------------------
void* Table::GetCurObject() const
{
return Container::ImpGetObject( Container::GetCurPos()+1 );
}
// -----------------------------------------------------------------------
sal_uIntPtr Table::GetKey( const void* p ) const
{
sal_uIntPtr nIndex = 0;
// Solange noch Eintraege Vorhanden sind
while ( nIndex < nCount )
{
// Stimmt der Pointer ueberein, wird der Key zurueckgegeben
if ( p == Container::ImpGetObject( (nIndex*2)+1 ) )
return (sal_uIntPtr)Container::ImpGetObject( nIndex*2 );
nIndex++;
}
return TABLE_ENTRY_NOTFOUND;
}
// -----------------------------------------------------------------------
sal_Bool Table::IsKeyValid( sal_uIntPtr nKey ) const
{
return (ImplGetIndex( nKey ) != TABLE_ENTRY_NOTFOUND) ? sal_True : sal_False;
}
// -----------------------------------------------------------------------
sal_uIntPtr Table::SearchKey( sal_uIntPtr nKey, sal_uIntPtr* pPos ) const
{
*pPos = 0;
sal_uIntPtr nPos = ImplGetIndex( nKey, pPos );
if ( nPos != TABLE_ENTRY_NOTFOUND )
{
nPos /= 2;
*pPos = nPos;
}
else
*pPos /= 2;
return nPos;
}
// -----------------------------------------------------------------------
void* Table::Seek( sal_uIntPtr nKey )
{
// Testen, ob ein Eintrag vorhanden ist
if ( nCount )
{
sal_uIntPtr nIndex = ImplGetIndex( nKey );
// Ist Key nicht enthalten
if ( nIndex == TABLE_ENTRY_NOTFOUND )
return NULL;
else
{
// Index setzen
Container::Seek( nIndex );
// Pointer zurueckgeben
return Container::ImpGetObject( Container::GetCurPos() + 1 );
}
}
else
return NULL;
}
void* Table::First()
{
// Testen, ob ein Eintrag vorhanden ist
if ( nCount )
{
// Auf ersten Eintag setzen
Container::First();
// Pointer zurueckgeben
return Container::ImpGetObject( 1 );
}
else
return NULL;
}
// -----------------------------------------------------------------------
void* Table::Last()
{
// Testen, ob ein Eintrag vorhanden ist
if ( nCount )
{
// Last auf letzten Eintrag setzen
void* p = Container::Last();
Container::Prev();
// Pointer zurueckgeben
return p;
}
else
return NULL;
}
// -----------------------------------------------------------------------
void* Table::Next()
{
// Ueber den Pointer weiterschalten
Container::Next();
// Nachsten Eintag
Container::Next();
// Pointer vom naechsten Key zurueckgeben
return Container::ImpGetObject( Container::GetCurPos() + 1 );
}
// -----------------------------------------------------------------------
void* Table::Prev()
{
// Ueber den Pointer weiterschalten
void* p = Container::Prev();
// Nachsten Eintag
Container::Prev();
// Pointer vom vorherigen Key zurueckgeben
return p;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment