Fix a few spots where when I did the update for EXIT_ I made more
[awesomized/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 #ifdef HAVE_MURMUR_HASH
45 self->function= hashkit_murmur;
46 break;
47 #else
48 return HASHKIT_FAILURE;
49 #endif
50 case HASHKIT_HASH_JENKINS:
51 self->function= hashkit_jenkins;
52 break;
53 case HASHKIT_HASH_CUSTOM:
54 case HASHKIT_HASH_MAX:
55 default:
56 return HASHKIT_FAILURE;
57 }
58
59 self->context= NULL;
60
61 return HASHKIT_SUCCESS;
62 }
63
64 hashkit_return_t hashkit_set_function(hashkit_st *self, hashkit_hash_algorithm_t hash_algorithm)
65 {
66 return _set_function(&self->base_hash, hash_algorithm);
67 }
68
69 hashkit_return_t hashkit_set_distribution_function(hashkit_st *self, hashkit_hash_algorithm_t hash_algorithm)
70 {
71 return _set_function(&self->distribution_hash, hash_algorithm);
72 }
73
74 static hashkit_return_t _set_custom_function(struct hashkit_function_st *self, hashkit_hash_fn function, void *context)
75 {
76 if (function)
77 {
78 self->function= function;
79 self->context= context;
80
81 return HASHKIT_SUCCESS;
82 }
83
84 return HASHKIT_FAILURE;
85 }
86
87 hashkit_return_t hashkit_set_custom_function(hashkit_st *self, hashkit_hash_fn function, void *context)
88 {
89 return _set_custom_function(&self->base_hash, function, context);
90 }
91
92 hashkit_return_t hashkit_set_custom_distribution_function(hashkit_st *self, hashkit_hash_fn function, void *context)
93 {
94 return _set_custom_function(&self->distribution_hash, function, context);
95 }
96
97 static hashkit_hash_algorithm_t get_function_type(const hashkit_hash_fn function)
98 {
99 if (function == hashkit_one_at_a_time)
100 {
101 return HASHKIT_HASH_DEFAULT;
102 }
103 else if (function == hashkit_md5)
104 {
105 return HASHKIT_HASH_MD5;
106 }
107 else if (function == hashkit_crc32)
108 {
109 return HASHKIT_HASH_CRC;
110 }
111 else if (function == hashkit_fnv1_64)
112 {
113 return HASHKIT_HASH_FNV1_64;
114 }
115 else if (function == hashkit_fnv1a_64)
116 {
117 return HASHKIT_HASH_FNV1A_64;
118 }
119 else if (function == hashkit_fnv1_32)
120 {
121 return HASHKIT_HASH_FNV1_32;
122 }
123 else if (function == hashkit_fnv1a_32)
124 {
125 return HASHKIT_HASH_FNV1A_32;
126 }
127 #ifdef HAVE_HSIEH_HASH
128 else if (function == hashkit_hsieh)
129 {
130 return HASHKIT_HASH_HSIEH;
131 }
132 #endif
133 #ifdef HAVE_MURMUR_HASH
134 else if (function == hashkit_murmur)
135 {
136 return HASHKIT_HASH_MURMUR;
137 }
138 #endif
139 else if (function == hashkit_jenkins)
140 {
141 return HASHKIT_HASH_JENKINS;
142 }
143
144 return HASHKIT_HASH_CUSTOM;
145 }
146
147 hashkit_hash_algorithm_t hashkit_get_function(const hashkit_st *self)
148 {
149 return get_function_type(self->base_hash.function);
150 }
151
152 hashkit_hash_algorithm_t hashkit_get_distribution_function(const hashkit_st *self)
153 {
154 return get_function_type(self->distribution_hash.function);
155 }