Subversion Repositories gelsvn

Rev

Rev 60 | Rev 448 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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