llsimplehash.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llsimplehash.h
  3.  *
  4.  * $LicenseInfo:firstyear=2003&license=viewergpl$
  5.  * 
  6.  * Copyright (c) 2003-2010, Linden Research, Inc.
  7.  * 
  8.  * Second Life Viewer Source Code
  9.  * The source code in this file ("Source Code") is provided by Linden Lab
  10.  * to you under the terms of the GNU General Public License, version 2.0
  11.  * ("GPL"), unless you have obtained a separate licensing agreement
  12.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  13.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  14.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  15.  * 
  16.  * There are special exceptions to the terms and conditions of the GPL as
  17.  * it is applied to this Source Code. View the full text of the exception
  18.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  19.  * online at
  20.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  21.  * 
  22.  * By copying, modifying or distributing this software, you acknowledge
  23.  * that you have read and understood your obligations described above,
  24.  * and agree to abide by those obligations.
  25.  * 
  26.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  27.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  28.  * COMPLETENESS OR PERFORMANCE.
  29.  * $/LicenseInfo$
  30.  */
  31. #ifndef LL_LLSIMPLEHASH_H
  32. #define LL_LLSIMPLEHASH_H
  33. #include "llstl.h"
  34. template <typename HASH_KEY_TYPE>
  35. class LLSimpleHashEntry
  36. {
  37. protected:
  38. HASH_KEY_TYPE mHashKey;
  39. LLSimpleHashEntry<HASH_KEY_TYPE>* mNextEntry;
  40. public:
  41. LLSimpleHashEntry(HASH_KEY_TYPE key) :
  42. mHashKey(key),
  43. mNextEntry(0)
  44. {
  45. }
  46. virtual ~LLSimpleHashEntry()
  47. {
  48. }
  49. HASH_KEY_TYPE getHashKey() const
  50. {
  51. return mHashKey;
  52. }
  53. LLSimpleHashEntry<HASH_KEY_TYPE>* getNextEntry() const
  54. {
  55. return mNextEntry;
  56. }
  57. void setNextEntry(LLSimpleHashEntry<HASH_KEY_TYPE>* next)
  58. {
  59. mNextEntry = next;
  60. }
  61. };
  62. template <typename HASH_KEY_TYPE, int TABLE_SIZE>
  63. class LL_COMMON_API LLSimpleHash
  64. {
  65. public:
  66. LLSimpleHash()
  67. {
  68. llassert(TABLE_SIZE);
  69. llassert((TABLE_SIZE ^ (TABLE_SIZE-1)) == (TABLE_SIZE | (TABLE_SIZE-1))); // power of 2
  70. memset(mEntryTable, 0, sizeof(mEntryTable));
  71. }
  72. virtual ~LLSimpleHash()
  73. {
  74. }
  75. virtual int getIndex(HASH_KEY_TYPE key)
  76. {
  77. return key & (TABLE_SIZE-1);
  78. }
  79. bool insert(LLSimpleHashEntry<HASH_KEY_TYPE>* entry)
  80. {
  81. llassert(entry->getNextEntry() == 0);
  82. int index = getIndex(entry->getHashKey());
  83. entry->setNextEntry(mEntryTable[index]);
  84. mEntryTable[index] = entry;
  85. return true;
  86. }
  87. LLSimpleHashEntry<HASH_KEY_TYPE>* find(HASH_KEY_TYPE key)
  88. {
  89. int index = getIndex(key);
  90. LLSimpleHashEntry<HASH_KEY_TYPE>* res = mEntryTable[index];
  91. while(res && (res->getHashKey() != key))
  92. {
  93. res = res->getNextEntry();
  94. }
  95. return res;
  96. }
  97. bool erase(LLSimpleHashEntry<HASH_KEY_TYPE>* entry)
  98. {
  99. return erase(entry->getHashKey());
  100. }
  101. bool erase(HASH_KEY_TYPE key)
  102. {
  103. int index = getIndex(key);
  104. LLSimpleHashEntry<HASH_KEY_TYPE>* prev = 0;
  105. LLSimpleHashEntry<HASH_KEY_TYPE>* res = mEntryTable[index];
  106. while(res && (res->getHashKey() != key))
  107. {
  108. prev = res;
  109. res = res->getNextEntry();
  110. }
  111. if (res)
  112. {
  113. LLSimpleHashEntry<HASH_KEY_TYPE>* next = res->getNextEntry();
  114. if (prev)
  115. {
  116. prev->setNextEntry(next);
  117. }
  118. else
  119. {
  120. mEntryTable[index] = next;
  121. }
  122. return true;
  123. }
  124. else
  125. {
  126. return false;
  127. }
  128. }
  129. // Removes and returns an arbitrary ("first") element from the table
  130. // Used for deleting the entire table.
  131. LLSimpleHashEntry<HASH_KEY_TYPE>* pop_element()
  132. {
  133. for (int i=0; i<TABLE_SIZE; i++)
  134. {
  135. LLSimpleHashEntry<HASH_KEY_TYPE>* entry = mEntryTable[i];
  136. if (entry)
  137. {
  138. mEntryTable[i] = entry->getNextEntry();
  139. return entry;
  140. }
  141. }
  142. return 0;
  143. }
  144. // debugging
  145. LLSimpleHashEntry<HASH_KEY_TYPE>* get_element_at_index(S32 index) const
  146. {
  147. return mEntryTable[index];
  148. }
  149. private:
  150. LLSimpleHashEntry<HASH_KEY_TYPE>* mEntryTable[TABLE_SIZE];
  151. };
  152. #endif // LL_LLSIMPLEHASH_H