Logo Search packages:      
Sourcecode: qt4-x11 version File versions

StringIntern.cpp

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

00040       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;
            }
      }

00063       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;
      }
      
00082       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;
            }
      }
      
00101       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

Generated by  Doxygen 1.6.0   Back to index