/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Generator/BesEvtGen/BesEvtGen-00-03-58/src/EvtGen/EvtGenBase/EvtStringHash.hh

Go to the documentation of this file.
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 

Generated on Tue Nov 29 23:12:15 2016 for BOSS_7.0.2 by  doxygen 1.4.7