blob: 1e80a38259d5d83c02c0ad4fa377aaa013fe1aa2 [file] [log] [blame]
/*------------------------------------------------------------------------------
* Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team
*
* Distributable under the terms of either the Apache License (Version 2.0) or
* the GNU Lesser General Public License, as specified in the COPYING file.
------------------------------------------------------------------------------*/
#include "CLucene/StdHeader.h"
#include "StringIntern.h"
CL_NS_DEF(util)
__wcsintrntype::iterator wblank;
bool blanksinitd=false;
__wcsintrntype CLStringIntern::stringPool(true);
__strintrntype CLStringIntern::stringaPool(true);
DEFINE_MUTEX(CLStringIntern::THIS_LOCK)
void CLStringIntern::shutdown(){
#ifdef _DEBUG
SCOPED_LOCK_MUTEX(THIS_LOCK)
if ( stringaPool.size() > 0 ){
printf("ERROR: stringaPool still contains intern'd strings (refcounts):\n");
__strintrntype::iterator itr = stringaPool.begin();
while ( itr != stringaPool.end() ){
printf(" %s (%d)\n",(itr->first), (itr->second));
++itr;
}
}
if ( stringPool.size() > 0 ){
printf("ERROR: stringPool still contains intern'd strings (refcounts):\n");
__wcsintrntype::iterator itr = stringPool.begin();
while ( itr != stringPool.end() ){
_tprintf(_T(" %s (%d)\n"),(itr->first), (itr->second));
++itr;
}
}
#endif
}
const TCHAR* CLStringIntern::intern(const TCHAR* str CL_FILELINEPARAM){
if ( str == NULL )
return NULL;
if ( str[0] == 0 )
return LUCENE_BLANK_STRING;
SCOPED_LOCK_MUTEX(THIS_LOCK)
__wcsintrntype::iterator itr = stringPool.find(str);
if ( itr==stringPool.end() ){
#ifdef _UCS2
TCHAR* ret = lucenewcsdup(str CL_FILELINEREF);
#else
TCHAR* ret = lucenestrdup(str CL_FILELINEREF);
#endif
stringPool[ret]= 1;
return ret;
}else{
(itr->second)++;
return itr->first;
}
}
bool CLStringIntern::unintern(const TCHAR* str){
if ( str == NULL )
return false;
if ( str[0] == 0 )
return false;
SCOPED_LOCK_MUTEX(THIS_LOCK)
__wcsintrntype::iterator itr = stringPool.find(str);
if ( itr != stringPool.end() ){
if ( (itr->second) == 1 ){
stringPool.removeitr(itr);
return true;
}else
(itr->second)--;
}
return false;
}
const char* CLStringIntern::internA(const char* str CL_FILELINEPARAM){
if ( str == NULL )
return NULL;
if ( str[0] == 0 )
return _LUCENE_BLANK_ASTRING;
SCOPED_LOCK_MUTEX(THIS_LOCK)
__strintrntype::iterator itr = stringaPool.find(str);
if ( itr==stringaPool.end() ){
char* ret = lucenestrdup(str CL_FILELINE);
stringaPool[ret] = 1;
return ret;
}else{
(itr->second)++;
return itr->first;
}
}
bool CLStringIntern::uninternA(const char* str){
if ( str == NULL )
return false;
if ( str[0] == 0 )
return false;
SCOPED_LOCK_MUTEX(THIS_LOCK)
__strintrntype::iterator itr = stringaPool.find(str);
if ( itr!=stringaPool.end() ){
if ( (itr->second) == 1 ){
stringaPool.removeitr(itr);
return true;
}else
(itr->second)--;
}
return false;
}
/* removed because of multi-threading problems...
__wcsintrntype::iterator CLStringIntern::internitr(const TCHAR* str CL_FILELINEPARAM){
if ( str[0] == 0 ){
if ( !blanksinitd ){
CLStringIntern::stringPool.put(LUCENE_BLANK_STRING,1);
wblank=stringPool.find(str);
blanksinitd=true;
}
return wblank;
}
__wcsintrntype::iterator itr = stringPool.find(str);
if (itr==stringPool.end()){
#ifdef _UCS2
TCHAR* ret = lucenewcsdup(str CL_FILELINEREF);
#else
TCHAR* ret = lucenestrdup(str CL_FILELINEREF);
#endif
stringPool.put(ret,1);
return stringPool.find(str);
}else{
(itr->second)++;
return itr;
}
}
bool CLStringIntern::uninternitr(__wcsintrntype::iterator itr){
if ( itr!=stringPool.end() ){
if ( itr==wblank )
return false;
if ( (itr->second) == 1 ){
stringPool.removeitr(itr);
return true;
}else
(itr->second)--;
}
return false;
}
*/
CL_NS_END