/*------------------------------------------------------------------------------ * 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