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);
+}