C++ interface bits for libhashkit
[m6w6/libmemcached] / libhashkit / function.c
1 /* HashKit
2 * Copyright (C) 2010 Brian Aker
3 * All rights reserved.
4 *
5 * Use and distribution licensed under the BSD license. See
6 * the COPYING file in the parent directory for full text.
7 */
8
9 #include "common.h"
10
11 static hashkit_return_t _set_function(struct hashkit_function_st *self, hashkit_hash_algorithm_t hash_algorithm)
12 {
13 switch (hash_algorithm)
14 {
15 case HASHKIT_HASH_DEFAULT:
16 self->function= hashkit_one_at_a_time;
17 break;
18 case HASHKIT_HASH_MD5:
19 self->function= hashkit_md5;
20 break;
21 case HASHKIT_HASH_CRC:
22 self->function= hashkit_crc32;
23 break;
24 case HASHKIT_HASH_FNV1_64:
25 self->function= hashkit_fnv1_64;
26 break;
27 case HASHKIT_HASH_FNV1A_64:
28 self->function= hashkit_fnv1a_64;
29 break;
30 case HASHKIT_HASH_FNV1_32:
31 self->function= hashkit_fnv1_32;
32 break;
33 case HASHKIT_HASH_FNV1A_32:
34 self->function= hashkit_fnv1a_32;
35 break;
36 case HASHKIT_HASH_HSIEH:
37 #ifdef HAVE_HSIEH_HASH
38 self->function= hashkit_hsieh;
39 break;
40 #else
41 return HASHKIT_FAILURE;
42 #endif
43 case HASHKIT_HASH_MURMUR:
44 self->function= hashkit_murmur;
45 break;
46 case HASHKIT_HASH_JENKINS:
47 self->function= hashkit_jenkins;
48 break;
49 case HASHKIT_HASH_CUSTOM:
50 case HASHKIT_HASH_MAX:
51 default:
52 return HASHKIT_FAILURE;
53 break;
54 }
55
56 self->context= NULL;
57
58 return HASHKIT_SUCCESS;
59 }
60
61 hashkit_return_t hashkit_set_function(hashkit_st *self, hashkit_hash_algorithm_t hash_algorithm)
62 {
63 return _set_function(&self->base_hash, hash_algorithm);
64 }
65
66 hashkit_return_t hashkit_set_distribution_function(hashkit_st *self, hashkit_hash_algorithm_t hash_algorithm)
67 {
68 return _set_function(&self->distribution_hash, hash_algorithm);
69 }
70
71 static hashkit_return_t _set_custom_function(struct hashkit_function_st *self, hashkit_hash_fn function, void *context)
72 {
73 if (function)
74 {
75 self->function= function;
76 self->context= context;
77
78 return HASHKIT_SUCCESS;
79 }
80
81 return HASHKIT_FAILURE;
82 }
83
84 hashkit_return_t hashkit_set_custom_function(hashkit_st *self, hashkit_hash_fn function, void *context)
85 {
86 return _set_custom_function(&self->base_hash, function, context);
87 }
88
89 hashkit_return_t hashkit_set_custom_distribution_function(hashkit_st *self, hashkit_hash_fn function, void *context)
90 {
91 return _set_custom_function(&self->distribution_hash, function, context);
92 }
93
94 static hashkit_hash_algorithm_t get_function_type(const hashkit_hash_fn function)
95 {
96 if (function == hashkit_one_at_a_time)
97 {
98 return HASHKIT_HASH_DEFAULT;
99 }
100 else if (function == hashkit_md5)
101 {
102 return HASHKIT_HASH_MD5;
103 }
104 else if (function == hashkit_crc32)
105 {
106 return HASHKIT_HASH_CRC;
107 }
108 else if (function == hashkit_fnv1_64)
109 {
110 return HASHKIT_HASH_FNV1_64;
111 }
112 else if (function == hashkit_fnv1a_64)
113 {
114 return HASHKIT_HASH_FNV1A_64;
115 }
116 else if (function == hashkit_fnv1_32)
117 {
118 return HASHKIT_HASH_FNV1_32;
119 }
120 else if (function == hashkit_fnv1a_32)
121 {
122 return HASHKIT_HASH_FNV1A_32;
123 }
124 #ifdef HAVE_HSIEH_HASH
125 else if (function == hashkit_hsieh)
126 {
127 return HASHKIT_HASH_HSIEH;
128 }
129 #endif
130 else if (function == hashkit_murmur)
131 {
132 return HASHKIT_HASH_MURMUR;
133 }
134 else if (function == hashkit_jenkins)
135 {
136 return HASHKIT_HASH_JENKINS;
137 }
138
139 return HASHKIT_HASH_CUSTOM;
140 }
141
142 hashkit_hash_algorithm_t hashkit_get_function(const hashkit_st *self)
143 {
144 return get_function_type(self->base_hash.function);
145 }
146
147 hashkit_hash_algorithm_t hashkit_get_distribution_function(const hashkit_st *self)
148 {
149 return get_function_type(self->distribution_hash.function);
150 }