Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00024 #ifndef __CS_UTIL_HASHR_H__
00025 #define __CS_UTIL_HASHR_H__
00026
00027 #include "csutil/hash.h"
00028
00032
00033 template <class T, class K = unsigned int>
00034 class csHashReversible : public csHash<T, K>
00035 {
00036 csHash<K, T> reverse;
00037 public:
00051 csHashReversible (int size = 23, int grow_rate = 5, int max_size = 20000) :
00052 csHash<T, K> (size, grow_rate, max_size),
00053 reverse (size, grow_rate, max_size)
00054 {
00055 }
00059 void Put (const K& key, const T &value)
00060 {
00061 csHash<T, K>::Put (key, value);
00062 reverse.Put (value, key);
00063 }
00064
00069 void PutUnique (const K& key, const T &value)
00070 {
00071 csHash<T, K>::PutUnique (key, value);
00072 reverse.PutUnique (value, key);
00073 }
00074
00078 bool Delete (const K& key, const T &value)
00079 {
00080 bool ret = csHash<T, K>::Delete (key, value);
00081 ret &= reverse.Delete (value, key);
00082 return ret;
00083 }
00084
00088 bool DeleteAll (const K& key)
00089 {
00090 csArray<T> values = csHash<T,K>::GetAll (key);
00091 bool ret = csHash<T,K>::DeleteAll (key);
00092 for(size_t i=0; i<values.GetSize (); i++)
00093 {
00094 ret &= reverse.Delete (values[i], key);
00095 }
00096 return ret;
00097 }
00098
00100 void DeleteAll ()
00101 {
00102 csHash<T,K>::DeleteAll ();
00103 reverse.DeleteAll ();
00104 }
00105
00110 const K* GetKeyPointer (const T& key) const
00111 {
00112 return reverse.GetElementPointer (key);
00113 }
00114
00119 const K& GetKey (const T& key, const K& fallback) const
00120 {
00121 return reverse.Get (key, fallback);
00122 }
00123 };
00124
00127 #endif // __CS_UTIL_HASHR_H__