00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __CS_UTIL_WEAKREFHASH_H__
00020 #define __CS_UTIL_WEAKREFHASH_H__
00021
00022 #include "csutil/hash.h"
00023 #include "csutil/weakref.h"
00024
00028 template <class T, class K = unsigned int,
00029 class ArrayMemoryAlloc = CS::Memory::AllocatorMalloc>
00030 class csWeakRefHash :
00031 public csHash<csWeakRef<T>, K,
00032 ArrayMemoryAlloc,
00033 csArraySafeCopyElementHandler<CS::Container::HashElement<
00034 csWeakRef<T>, K> > >
00035 {
00036 public:
00037 typedef csHash<csWeakRef<T>, K,
00038 ArrayMemoryAlloc, csArraySafeCopyElementHandler<
00039 CS::Container::HashElement<csWeakRef<T>, K> > > SuperClass;
00040 csWeakRefHash (size_t size = 23, size_t grow_rate = 5,
00041 size_t max_size = 20000)
00042 : SuperClass(size, grow_rate, max_size)
00043 {
00044 }
00045
00047 csWeakRefHash (const csWeakRefHash<csWeakRef<T>, K, ArrayMemoryAlloc> &o) :
00048 SuperClass(o) {}
00049
00053 void Compact()
00054 {
00055 for(size_t i=0; i<this->Elements.GetSize(); i++)
00056 {
00057 typename SuperClass::ElementArray& values = this->Elements[i];
00058 for (size_t j = values.GetSize(); j > 0; j--)
00059 {
00060 const size_t idx = j - 1;
00061 if(csComparator<csWeakRef<T>, csWeakRef<T> >::Compare (
00062 values[idx].GetValue(), NULL) == 0)
00063 {
00064 values.DeleteIndexFast(idx);
00065 this->Size--;
00066 }
00067 }
00068 }
00069 }
00070 };
00071
00072 #endif // __CS_UTIL_WEAKREFHASH_H__