2007-04-19 05:56:36 -05:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-10 06:04:37 -05:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2007-04-19 05:56:36 -05:00
|
|
|
*
|
2008-04-10 06:04:37 -05:00
|
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
2007-04-19 05:56:36 -05:00
|
|
|
*
|
2008-04-10 06:04:37 -05:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2007-04-19 05:56:36 -05:00
|
|
|
*
|
2008-04-10 06:04:37 -05:00
|
|
|
* $RCSfile: hash.cxx,v $
|
|
|
|
* $Revision: 1.5 $
|
2007-04-19 05:56:36 -05:00
|
|
|
*
|
2008-04-10 06:04:37 -05:00
|
|
|
* This file is part of OpenOffice.org.
|
2007-04-19 05:56:36 -05:00
|
|
|
*
|
2008-04-10 06:04:37 -05:00
|
|
|
* 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.
|
2007-04-19 05:56:36 -05:00
|
|
|
*
|
2008-04-10 06:04:37 -05:00
|
|
|
* 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).
|
2007-04-19 05:56:36 -05:00
|
|
|
*
|
2008-04-10 06:04:37 -05:00
|
|
|
* 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.
|
2007-04-19 05:56:36 -05:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_sal.hxx"
|
2007-04-03 08:04:47 -05:00
|
|
|
#include "rtl/allocator.hxx"
|
|
|
|
|
|
|
|
#include "hash.h"
|
|
|
|
#include "strimp.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include <hash_set>
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
struct UStringHash
|
|
|
|
{
|
|
|
|
size_t operator()(rtl_uString * const &rString) const
|
|
|
|
{ return (size_t)rtl_ustr_hashCode_WithLength( rString->buffer, rString->length ); }
|
|
|
|
};
|
|
|
|
struct UStringEqual
|
|
|
|
{
|
|
|
|
sal_Bool operator() ( rtl_uString * const &pStringA,
|
|
|
|
rtl_uString * const &pStringB) const
|
|
|
|
{
|
|
|
|
if (pStringA == pStringB)
|
|
|
|
return true;
|
|
|
|
if (pStringA->length != pStringB->length)
|
|
|
|
return false;
|
|
|
|
return !rtl_ustr_compare_WithLength( pStringA->buffer, pStringA->length,
|
|
|
|
pStringB->buffer, pStringB->length);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef std::hash_set< rtl_uString *, UStringHash, UStringEqual,
|
|
|
|
rtl::Allocator<rtl_uString *> > UniqueHash;
|
|
|
|
|
|
|
|
struct StringHashTableImpl : public UniqueHash
|
|
|
|
{
|
|
|
|
StringHashTableImpl(sal_uInt32 nSize) : UniqueHash( nSize ) {}
|
|
|
|
};
|
|
|
|
|
|
|
|
StringHashTable *
|
|
|
|
rtl_str_hash_new (sal_uInt32 nSize)
|
|
|
|
{
|
|
|
|
return new StringHashTableImpl (nSize);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
rtl_str_hash_free (StringHashTable *pHash)
|
|
|
|
{
|
|
|
|
delete pHash;
|
|
|
|
}
|
|
|
|
|
|
|
|
rtl_uString *
|
|
|
|
rtl_str_hash_intern (StringHashTable *pHash,
|
|
|
|
rtl_uString *pString,
|
|
|
|
int can_return)
|
|
|
|
{
|
|
|
|
UniqueHash::iterator aIter;
|
|
|
|
aIter = pHash->find(pString);
|
|
|
|
if (aIter != pHash->end())
|
|
|
|
{
|
|
|
|
rtl_uString *pHashStr = *aIter;
|
|
|
|
rtl_uString_acquire (pHashStr);
|
|
|
|
return pHashStr;
|
|
|
|
}
|
|
|
|
if (!can_return)
|
|
|
|
{
|
|
|
|
rtl_uString *pCopy = NULL;
|
|
|
|
rtl_uString_newFromString( &pCopy, pString );
|
|
|
|
pString = pCopy;
|
|
|
|
if (!pString)
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2007-06-13 02:13:30 -05:00
|
|
|
if (!SAL_STRING_IS_STATIC (pString))
|
|
|
|
pString->refCount |= SAL_STRING_INTERN_FLAG;
|
2007-04-03 08:04:47 -05:00
|
|
|
pHash->insert(pString);
|
|
|
|
|
|
|
|
return pString;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
rtl_str_hash_remove (StringHashTable *pHash,
|
|
|
|
rtl_uString *pString)
|
|
|
|
{
|
|
|
|
pHash->erase(pString);
|
|
|
|
}
|