annotate Renderer/test_render/task/TileHash.cpp @ 283:55ea4465b1a2

fix test_render
author e065746@localhost.localdomain
date Fri, 05 Jun 2009 16:49:12 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
283
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
1 #include <stdio.h>
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
2 #include <string.h>
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
3 #include <stdlib.h>
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
4 #include "TileHash.h"
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
5
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
6 static unsigned short PRIME[8] = {
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
7 0x002, 0x065, 0x0c7, 0x133, 0x191, 0x1f3, 0x259, 0x2bd,
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
8 };
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
9
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
10 int
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
11 TileHash::hash(uint32 data)
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
12 {
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
13 int value = 0;
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
14 int n = 0;
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
15 int key;
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
16
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
17 for (int i = 0; i < 8; i ++) {
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
18 key = data & 0xf;
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
19 value += key * PRIME[n++];
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
20 data >>= 4;
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
21 }
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
22
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
23 return value % hashSize;
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
24 }
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
25
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
26 TileHash::TileHash(void)
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
27 {
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
28 hashSize = 263;
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
29 tableSize = sizeof(TilePtr)*hashSize;
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
30
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
31 table = (TilePtr*)malloc(tableSize);
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
32 clear();
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
33 }
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
34
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
35 int
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
36 TileHash::put(uint32 *key, TilePtr data)
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
37 {
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
38 int hashval = hash((uint32)key);
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
39
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
40 for (int i = 0; i < hashSize/2; i++) {
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
41 int index = (hashval + i*i)%hashSize;
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
42
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
43 if (table[index] == 0) { // 空の table に入れる
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
44 table[index] = data;
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
45 return index;
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
46 }
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
47 }
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
48
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
49 return -1;
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
50 }
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
51
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
52 TilePtr
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
53 TileHash::get(uint32 *key)
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
54 {
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
55 int hashval = hash((uint32)key);
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
56
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
57 for (int i = 0; i < hashSize/2; i++) {
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
58 int index = (hashval + i*i)%hashSize;
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
59
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
60 if (table[index] != NULL &&
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
61 table[index]->texture_addr == key) {
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
62 return table[index];
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
63 }
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
64 }
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
65
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
66 return NULL;
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
67 }
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
68
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
69 void
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
70 TileHash::remove(uint32 *key)
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
71 {
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
72 int hashval = hash((uint32)key);
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
73
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
74 for (int i = 0; i < hashSize/2; i++) {
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
75 int index = (hashval + i*i)%hashSize;
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
76
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
77 if (table[index] != NULL &&
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
78 table[index]->texture_addr == key) {
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
79 table[index] = NULL;
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
80 }
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
81 }
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
82 }
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
83
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
84 void
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
85 TileHash::clear(void)
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
86 {
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
87 bzero(table, tableSize);
55ea4465b1a2 fix test_render
e065746@localhost.localdomain
parents:
diff changeset
88 }