Subversion Repositories gelsvn

Rev

Rev 60 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
60 jab 1
#ifndef __HASHKEY_H
2
#define __HASHKEY_H
3
 
4
#include <stdlib.h>
5
#include <limits.h>
6
#include "CGLA/Vec3uc.h"
7
#include "CGLA/Vec3usi.h"
8
 
89 jab 9
namespace Util
60 jab 10
{
11
 
12
 
13
	extern int randoms1[UCHAR_MAX];
14
	extern int randoms2[UCHAR_MAX];
15
	extern int randoms3[UCHAR_MAX];
16
 
17
	bool init_randoms();
18
	void do_init_randoms();
19
 
20
	struct HashKey3uc
21
	{
22
		CGLA::Vec3uc key;
23
 
24
		HashKey3uc() {do_init_randoms();}
25
		HashKey3uc(CGLA::Vec3uc _key): key(_key) {do_init_randoms();}
26
		HashKey3uc(CGLA::Vec3i _key): key(_key) {do_init_randoms();}
27
 
28
		int hash(int use_size) const
29
		{
30
			return int((randoms1[key[0]] >> (key[1]&0x0f)) +
31
								 (randoms2[key[1]] >> (key[2]&0x0f)) +
32
								 (randoms3[key[2]] >> (key[0]&0x0f))) & (use_size-1);
33
		}
34
 
35
		bool operator==(const HashKey3uc& k2) const {return key==k2.key;}
36
		bool operator!=(const HashKey3uc& k2) const {return !(key==k2.key);}
37
	};
38
 
39
	struct HashKey3usi
40
	{
41
		CGLA::Vec3usi key;
42
 
43
		HashKey3usi() {do_init_randoms();}
44
		HashKey3usi(CGLA::Vec3usi _key): key(_key) {do_init_randoms();}
45
		HashKey3usi(CGLA::Vec3i _key): key(_key) {do_init_randoms();}
46
 
47
		int hash(int use_size) const
48
		{
49
			return int(
50
								 ((randoms1[key[0]&0xff00>>8] * randoms2[key[1]&0xff] >> (key[2]&0x0f))
51
									+ (randoms2[key[1]&0xff00>>8] * randoms1[key[2]&0xff] >> (key[0]&0x0f))
52
									+ (randoms3[key[2]&0xff00>>8] * randoms3[key[0]&0xff] >> (key[1]&0x0f)))
53
								 & (use_size-1));
54
		}
55
 
56
		bool operator==(const HashKey3usi& k2) const {return key==k2.key;}
57
		bool operator!=(const HashKey3usi& k2) const {return !(key==k2.key);}
58
	};
59
 
60
	struct HashKey1c
61
	{
62
		unsigned char key;
63
 
64
		HashKey1c() {do_init_randoms();}
65
		HashKey1c(unsigned char _key): key(_key) {do_init_randoms();}
66
 
67
		int hash(int use_size) const
68
		{
69
			return int(randoms1[key] & (use_size-1));
70
		}
71
 
72
		bool operator==(const HashKey1c& k2) const {return key==k2.key;}
73
		bool operator!=(const HashKey1c& k2) const {return !(key==k2.key);}
74
	};
75
}
76
 
77
 
78
#endif