00001 00002 // 00003 // Copyright Information: See EvtGen/COPYRIGHT 00004 // 00005 00006 #ifndef EVTSTRINGHASH_HH 00007 #define EVTSTRINGHASH_HH 00008 00009 #include <string> 00010 00011 00012 template<class T> 00013 class EvtStringHash{ 00014 00015 public: 00016 inline EvtStringHash(int size); 00017 inline void add(const std::string& str,T* data); 00018 inline T* get(const std::string& str); 00019 inline ~EvtStringHash(); 00020 00021 private: 00022 EvtStringHash(); 00023 int _size; 00024 inline int hash(const std::string& str); 00025 std::string*** _strings; 00026 T*** _data; 00027 int* _entries; 00028 00029 }; 00030 00031 00032 template<class T> 00033 EvtStringHash<T>::EvtStringHash(int size){ 00034 00035 _size=size; 00036 00037 typedef std::string** EvtStringPtrPtr; 00038 typedef T** TPtrPtr; 00039 00040 _strings=new EvtStringPtrPtr[_size]; 00041 _data=new TPtrPtr[_size]; 00042 _entries=new int[_size]; 00043 00044 int i; 00045 00046 for(i=0;i<_size;i++){ 00047 _entries[i]=0; 00048 } 00049 00050 } 00051 00052 template<class T> 00053 EvtStringHash<T>::~EvtStringHash(){ 00054 00055 int i; 00056 for(i=0;i<_size;i++){ 00057 int j; 00058 for(j=0;j<_entries[i];j++){ 00059 delete _strings[i][j]; 00060 } 00061 if (_entries[i]>0){ 00062 delete [] _strings[i]; 00063 delete [] _data[i]; 00064 } 00065 } 00066 00067 delete [] _strings; 00068 delete [] _data; 00069 delete [] _entries; 00070 00071 } 00072 00073 template<class T> 00074 void EvtStringHash<T>::add(const std::string& str,T* data){ 00075 00076 int ihash=hash(str); 00077 00078 typedef std::string* EvtStringPtr; 00079 typedef T* TPtr; 00080 00081 std::string** newstrings=new EvtStringPtr[_entries[ihash]+1]; 00082 T** newdata=new TPtr[_entries[ihash]+1]; 00083 00084 int i; 00085 00086 for(i=0;i<_entries[ihash];i++){ 00087 newstrings[i]=_strings[ihash][i]; 00088 newdata[i]=_data[ihash][i]; 00089 } 00090 00091 newstrings[_entries[ihash]]=new std::string; 00092 *(newstrings[_entries[ihash]])=str; 00093 newdata[_entries[ihash]]=data; 00094 00095 00096 if(_entries[ihash]!=0){ 00097 delete [] _strings[ihash]; 00098 delete [] _data[ihash]; 00099 } 00100 00101 _entries[ihash]++; 00102 00103 _strings[ihash]=newstrings; 00104 _data[ihash]=newdata; 00105 00106 } 00107 00108 template<class T> 00109 T* EvtStringHash<T>::get(const std::string& str){ 00110 00111 int ihash=hash(str); 00112 00113 int i; 00114 00115 for (i=0;i<_entries[ihash];i++){ 00116 if (*(_strings[ihash][i])==str) return _data[ihash][i]; 00117 } 00118 00119 return 0; 00120 00121 00122 } 00123 00124 00125 template<class T> 00126 int EvtStringHash<T>::hash(const std::string& str){ 00127 00128 const char* cstr=str.c_str(); 00129 00130 int i=0; 00131 00132 int value=0; 00133 00134 while(cstr[i]!=0){ 00135 value+=(int)cstr[i]; 00136 i++; 00137 } 00138 00139 return value%_size; 00140 00141 } 00142 00143 00144 #endif 00145 00146 00147 00148 00149