summaryrefslogtreecommitdiffstats
path: root/3rdparty/clucene/src/CLucene/util/StringIntern.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/clucene/src/CLucene/util/StringIntern.cpp')
-rw-r--r--3rdparty/clucene/src/CLucene/util/StringIntern.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/3rdparty/clucene/src/CLucene/util/StringIntern.cpp b/3rdparty/clucene/src/CLucene/util/StringIntern.cpp
new file mode 100644
index 000000000..cb7a889d1
--- /dev/null
+++ b/3rdparty/clucene/src/CLucene/util/StringIntern.cpp
@@ -0,0 +1,158 @@
+/*------------------------------------------------------------------------------
+* 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