352 lines
9.7 KiB
C++
352 lines
9.7 KiB
C++
/* -*- 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.
|
|
*
|
|
************************************************************************/
|
|
|
|
#include <impcont.hxx>
|
|
#include <tools/unqidx.hxx>
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::UniqueIndex()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
UniqueIndex::UniqueIndex( sal_uIntPtr _nStartIndex,
|
|
sal_uIntPtr _nInitSize, sal_uIntPtr _nReSize ) :
|
|
Container( _nInitSize )
|
|
{
|
|
nReSize = _nReSize;
|
|
nStartIndex = _nStartIndex;
|
|
nUniqIndex = 0;
|
|
nCount = 0;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::UniqueIndex()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
UniqueIndex::UniqueIndex( const UniqueIndex& rIdx ) :
|
|
Container( rIdx )
|
|
{
|
|
nReSize = rIdx.nReSize;
|
|
nStartIndex = rIdx.nStartIndex;
|
|
nUniqIndex = rIdx.nUniqIndex;
|
|
nCount = rIdx.nCount;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::Insert()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
sal_uIntPtr UniqueIndex::Insert( void* p )
|
|
{
|
|
// NULL-Pointer ist nicht erlaubt
|
|
if ( !p )
|
|
return UNIQUEINDEX_ENTRY_NOTFOUND;
|
|
|
|
// Ist Array voll, dann expandieren
|
|
if ( nCount == Container::GetSize() )
|
|
SetSize( nCount + nReSize );
|
|
|
|
// Damit UniqIndex nicht ueberlaeuft, wenn Items geloescht wurden
|
|
nUniqIndex = nUniqIndex % Container::GetSize();
|
|
|
|
// Leeren Eintrag suchen
|
|
while ( Container::ImpGetObject( nUniqIndex ) != NULL )
|
|
nUniqIndex = (nUniqIndex+1) % Container::GetSize();
|
|
|
|
// Object im Array speichern
|
|
Container::Replace( p, nUniqIndex );
|
|
|
|
// Anzahl der Eintraege erhoehen und Index zurueckgeben
|
|
nCount++;
|
|
nUniqIndex++;
|
|
return ( nUniqIndex + nStartIndex - 1 );
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::Insert()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
sal_uIntPtr UniqueIndex::Insert( sal_uIntPtr nIndex, void* p )
|
|
{
|
|
// NULL-Pointer ist nicht erlaubt
|
|
if ( !p )
|
|
return UNIQUEINDEX_ENTRY_NOTFOUND;
|
|
|
|
sal_uIntPtr nContIndex = nIndex - nStartIndex;
|
|
// Ist Array voll, dann expandieren
|
|
if ( nContIndex >= Container::GetSize() )
|
|
SetSize( nContIndex + nReSize );
|
|
|
|
// Object im Array speichern
|
|
Container::Replace( p, nContIndex );
|
|
|
|
// Anzahl der Eintraege erhoehen und Index zurueckgeben
|
|
nCount++;
|
|
return nIndex;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::Remove()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
void* UniqueIndex::Remove( sal_uIntPtr nIndex )
|
|
{
|
|
// Ist Index zulaessig
|
|
if ( (nIndex >= nStartIndex) &&
|
|
(nIndex < (Container::GetSize()+nStartIndex)) )
|
|
{
|
|
// Index-Eintrag als leeren Eintrag setzen und Anzahl der
|
|
// gespeicherten Indexe erniedriegen, wenn Eintrag belegt war
|
|
void* p = Container::Replace( NULL, nIndex-nStartIndex );
|
|
if ( p )
|
|
nCount--;
|
|
return p;
|
|
}
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::Get()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
void* UniqueIndex::Get( sal_uIntPtr nIndex ) const
|
|
{
|
|
// Ist Index zulaessig
|
|
if ( (nIndex >= nStartIndex) &&
|
|
(nIndex < (Container::GetSize()+nStartIndex)) )
|
|
return Container::ImpGetObject( nIndex-nStartIndex );
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::GetCurIndex()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
sal_uIntPtr UniqueIndex::GetCurIndex() const
|
|
{
|
|
sal_uIntPtr nPos = Container::GetCurPos();
|
|
|
|
// Ist der Current-Index nicht belegt, dann gibt es keinen Current-Index
|
|
if ( !Container::ImpGetObject( nPos ) )
|
|
return UNIQUEINDEX_ENTRY_NOTFOUND;
|
|
else
|
|
return nPos+nStartIndex;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::GetIndex()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
sal_uIntPtr UniqueIndex::GetIndex( const void* p ) const
|
|
{
|
|
// Wird ein NULL-Pointer uebergeben, dann wurde Pointer nicht gefunden
|
|
if ( !p )
|
|
return UNIQUEINDEX_ENTRY_NOTFOUND;
|
|
|
|
sal_uIntPtr nIndex = Container::GetPos( p );
|
|
|
|
if ( nIndex != CONTAINER_ENTRY_NOTFOUND )
|
|
return nIndex+nStartIndex;
|
|
else
|
|
return UNIQUEINDEX_ENTRY_NOTFOUND;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::IsIndexValid()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
sal_Bool UniqueIndex::IsIndexValid( sal_uIntPtr nIndex ) const
|
|
{
|
|
// Ist Index zulaessig
|
|
if ( (nIndex >= nStartIndex) &&
|
|
(nIndex < (Container::GetSize()+nStartIndex)) )
|
|
{
|
|
// Index ist nur zulaessig, wenn Eintrag auch belegt ist
|
|
if ( Container::ImpGetObject( nIndex-nStartIndex ) )
|
|
return sal_True;
|
|
else
|
|
return sal_False;
|
|
}
|
|
else
|
|
return sal_False;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::Seek()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
void* UniqueIndex::Seek( sal_uIntPtr nIndex )
|
|
{
|
|
// Index-Eintrag als aktuellen setzten, wenn er gueltig ist
|
|
if ( IsIndexValid( nIndex ) )
|
|
return Container::Seek( nIndex-nStartIndex );
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::Seek()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
void* UniqueIndex::Seek( void* p )
|
|
{
|
|
// Wird ein NULL-Pointer uebergeben, dann wurde Pointer nicht gefunden
|
|
if ( !p )
|
|
return NULL;
|
|
|
|
sal_uIntPtr nIndex = GetIndex( p );
|
|
|
|
// Ist Index vorhanden, dann als aktuellen Eintrag setzen
|
|
if ( nIndex != UNIQUEINDEX_ENTRY_NOTFOUND )
|
|
return Container::Seek( nIndex-nStartIndex );
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::First()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
void* UniqueIndex::First()
|
|
{
|
|
void* p = Container::First();
|
|
|
|
while ( !p && (Container::GetCurPos() < (Container::GetSize()-1)) )
|
|
p = Container::Next();
|
|
|
|
return p;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::Last()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
void* UniqueIndex::Last()
|
|
{
|
|
void* p = Container::Last();
|
|
|
|
while ( !p && Container::GetCurPos() )
|
|
p = Container::Prev();
|
|
|
|
return p;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::Next()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
void* UniqueIndex::Next()
|
|
{
|
|
void* p = NULL;
|
|
|
|
while ( !p && (Container::GetCurPos() < (Container::GetSize()-1)) )
|
|
p = Container::Next();
|
|
|
|
return p;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::Prev()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
void* UniqueIndex::Prev()
|
|
{
|
|
void* p = NULL;
|
|
|
|
while ( !p && Container::GetCurPos() )
|
|
p = Container::Prev();
|
|
|
|
return p;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::operator =()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
UniqueIndex& UniqueIndex::operator =( const UniqueIndex& rIdx )
|
|
{
|
|
// Neue Werte zuweisen
|
|
Container::operator =( rIdx );
|
|
nReSize = rIdx.nReSize;
|
|
nStartIndex = rIdx.nStartIndex;
|
|
nUniqIndex = rIdx.nUniqIndex;
|
|
nCount = rIdx.nCount;
|
|
return *this;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* UniqueIndex::operator ==()
|
|
|*
|
|
*************************************************************************/
|
|
|
|
sal_Bool UniqueIndex::operator ==( const UniqueIndex& rIdx ) const
|
|
{
|
|
// Neue Werte zuweisen
|
|
if ( (nStartIndex == rIdx.nStartIndex) &&
|
|
(nCount == rIdx.nCount) &&
|
|
(Container::operator ==( rIdx )) )
|
|
return sal_True;
|
|
else
|
|
return sal_False;
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|