00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef __STRINGPOOL_HPP
00015 #define __STRINGPOOL_HPP
00016
00017 #include <xqilla/framework/XQillaExport.hpp>
00018 #include <xercesc/framework/MemoryManager.hpp>
00019 #include <memory>
00020 #include <string>
00021
00022 class XQILLA_API StringPool
00023 {
00024 public:
00025 StringPool(XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager *mm);
00026 ~StringPool();
00027
00029 const XMLCh* getPooledString(const XMLCh *src);
00031 const XMLCh* getPooledString(const char *src);
00032
00033 unsigned int getCount() const { return _count; }
00034 unsigned int getHits() const { return _hits; }
00035 unsigned int getMisses() const { return _misses; }
00036 unsigned int getTooBig() const { return _toobig; }
00037 void dumpStatistics() const;
00038
00039 private:
00040 StringPool(const StringPool&);
00041 StringPool &operator=(const StringPool&);
00042
00043 static unsigned int hash(const XMLCh *v);
00044 const XMLCh *replicate(const XMLCh *v, unsigned int length) const;
00045 void resize();
00046
00047 class Bucket
00048 {
00049 public:
00050 Bucket(const XMLCh *v, unsigned int l, unsigned int h, Bucket *n)
00051 : value(v), length(l), hashValue(h), next(n) {}
00052
00053 const XMLCh *value;
00054 unsigned int length;
00055 unsigned int hashValue;
00056 Bucket *next;
00057 };
00058
00059 XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager *_mm;
00060 Bucket **_bucketList;
00061 unsigned int _modulus;
00062 unsigned int _count;
00063 unsigned int _hits;
00064 unsigned int _misses;
00065 unsigned int _toobig;
00066 };
00067
00068 inline unsigned int StringPool::hash(const XMLCh *v)
00069 {
00070 unsigned int top;
00071 unsigned int hashVal = 0;
00072 while(*v) {
00073 top = hashVal >> 24;
00074 hashVal += (hashVal * 37) + top + (unsigned int)(*v);
00075 ++v;
00076 }
00077 return hashVal;
00078 }
00079
00080 inline const XMLCh *StringPool::replicate(const XMLCh *v, unsigned int length) const
00081 {
00082 unsigned int size = (length+1) * sizeof(XMLCh);
00083 XMLCh *ret = (XMLCh*)_mm->allocate(size);
00084 memcpy(ret, v, size);
00085 return ret;
00086 }
00087
00088 #endif