csutil/weakrefhash.h
00001 /* 00002 Copyright (C) 2003 by Mat Sutcliffe <oktal@gmx.co.uk> 00003 00004 This library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Lesser General Public 00006 License as published by the Free Software Foundation; either 00007 version 2 of the License, or (at your option) any later version. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public 00015 License along with this library; if not, write to the Free 00016 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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__
Generated for Crystal Space 2.0 by doxygen 1.6.1