Mercurial > hg > Game > Cerium
view TaskManager/Test/test_render/spe/TileHash.cpp @ 243:c4918a1fb6c9 draft
rm warning
author | e065746@localhost.localdomain |
---|---|
date | Sun, 31 May 2009 16:26:20 +0900 |
parents | e75f9eb97180 |
children | 9738837c225c |
line wrap: on
line source
#include <stdio.h> #include <string.h> #include <stdlib.h> #include "TileHash.h" static unsigned short PRIME[8] = { 0x002, 0x065, 0x0c7, 0x133, 0x191, 0x1f3, 0x259, 0x2bd, }; int TileHash::hash(uint32 data) { int value = 0; int n = 0; int key; for (int i = 0; i < 8; i ++) { key = data & 0xf; value += key * PRIME[n++]; data >>= 4; } return value % hashSize; } TileHash::TileHash(void) { hashSize = 263; tableSize = sizeof(TilePtr)*hashSize; table = (TilePtr*)malloc(tableSize); clear(); } int TileHash::put(uint32 *key, TilePtr data) { int hashval = hash((uint32)key); for (int i = 0; i < hashSize/2; i++) { int index = (hashval + i*i)%hashSize; if (table[index] == 0) { // 空の table に入れる table[index] = data; return index; } } return -1; } TilePtr TileHash::get(uint32 *key) { int hashval = hash((uint32)key); for (int i = 0; i < hashSize/2; i++) { int index = (hashval + i*i)%hashSize; if (table[index] != NULL && table[index]->texture_addr == key) { return table[index]; } } return NULL; } void TileHash::remove(uint32 *key) { int hashval = hash((uint32)key); for (int i = 0; i < hashSize/2; i++) { int index = (hashval + i*i)%hashSize; if (table[index] != NULL && table[index]->texture_addr == key) { table[index] = NULL; } } } void TileHash::clear(void) { bzero(table, tableSize); }