Mercurial > hg > Members > kono > Cerium
diff TaskManager/Test/test_render/spe/TileHash.cc @ 423:afb717c43a3c
change spe/*.cpp -> spe/*.cc
author | hiroki@henri.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Thu, 24 Sep 2009 15:26:58 +0900 |
parents | TaskManager/Test/test_render/spe/TileHash.cpp@b4b8345b5366 |
children | 44c0bce54dcf |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/Test/test_render/spe/TileHash.cc Thu Sep 24 15:26:58 2009 +0900 @@ -0,0 +1,88 @@ +#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(memaddr data) +{ + int value = 0; + int n = 0; + int key; + + for (uint32 i = 0; i < sizeof(memaddr) * 2; i ++) { + key = data & 0xf; + value += key * PRIME[n++ & 7]; + data >>= 4; + } + + return value % hashSize; +} + +TileHash::TileHash(void) +{ + //hashSize = 263; + //tableSize = sizeof(TilePtr)*hashSize; + + table = (TilePtr*)malloc(tableSize); + clear(); +} + +int +TileHash::put(memaddr key, TilePtr data) +{ + int hashval = hash(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(memaddr key) +{ + int hashval = hash(key); + + for (int i = 0; i < hashSize/2; i++) { + int index = (hashval + i*i)%hashSize; + + if (table[index] != NULL && + table[index]->address == key) { + return table[index]; + } + } + + return NULL; +} + +void +TileHash::remove(memaddr key) +{ + int hashval = hash(key); + + for (int i = 0; i < hashSize/2; i++) { + int index = (hashval + i*i)%hashSize; + + if (table[index] != NULL && + table[index]->address == key) { + table[index] = NULL; + } + } +} + +void +TileHash::clear(void) +{ + bzero(table, tableSize); +}