merged tag ooo/DEV300_m102
[LibreOffice.git] / sal / rtl / source / hash.cxx
blob7caa2341ca11d5316fabf506960caebe1469a050
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2000, 2010 Oracle and/or its affiliates.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * This file is part of OpenOffice.org.
11 * OpenOffice.org is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License version 3
13 * only, as published by the Free Software Foundation.
15 * OpenOffice.org is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Lesser General Public License version 3 for more details
19 * (a copy is included in the LICENSE file that accompanied this code).
21 * You should have received a copy of the GNU Lesser General Public License
22 * version 3 along with OpenOffice.org. If not, see
23 * <http://www.openoffice.org/license.html>
24 * for a copy of the LGPLv3 License.
26 ************************************************************************/
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sal.hxx"
30 #include "rtl/allocator.hxx"
32 #include "hash.h"
33 #include "strimp.h"
36 #include <hash_set>
38 namespace {
40 struct UStringHash
42 size_t operator()(rtl_uString * const &rString) const
43 { return (size_t)rtl_ustr_hashCode_WithLength( rString->buffer, rString->length ); }
46 struct UStringEqual
48 sal_Bool operator() ( rtl_uString * const &pStringA,
49 rtl_uString * const &pStringB) const
51 if (pStringA == pStringB)
52 return true;
53 if (pStringA->length != pStringB->length)
54 return false;
55 return !rtl_ustr_compare_WithLength( pStringA->buffer, pStringA->length,
56 pStringB->buffer, pStringB->length);
60 typedef std::hash_set< rtl_uString *, UStringHash, UStringEqual,
61 rtl::Allocator<rtl_uString *> > StringHashTable;
63 StringHashTable *
64 getHashTable ()
66 static StringHashTable *pInternPool = NULL;
67 if (pInternPool == NULL) {
68 static StringHashTable aImpl(1024);
69 pInternPool = &aImpl;
71 return pInternPool;
76 extern "C" {
78 rtl_uString *
79 rtl_str_hash_intern (rtl_uString *pString,
80 int can_return)
82 StringHashTable *pHash = getHashTable();
83 StringHashTable::iterator aIter;
84 aIter = pHash->find(pString);
85 if (aIter != pHash->end())
87 rtl_uString *pHashStr = *aIter;
88 rtl_uString_acquire (pHashStr);
89 return pHashStr;
91 if (!can_return)
93 rtl_uString *pCopy = NULL;
94 rtl_uString_newFromString( &pCopy, pString );
95 pString = pCopy;
96 if (!pString)
97 return NULL;
100 if (!SAL_STRING_IS_STATIC (pString))
101 pString->refCount |= SAL_STRING_INTERN_FLAG;
102 pHash->insert(pString);
104 return pString;
107 void
108 rtl_str_hash_remove (rtl_uString *pString)
110 getHashTable()->erase(pString);