ngs_server 0.4 → 0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/ext/tabix/khash.h ADDED
@@ -0,0 +1,486 @@
1
+ /* The MIT License
2
+
3
+ Copyright (c) 2008 Genome Research Ltd (GRL).
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ SOFTWARE.
24
+ */
25
+
26
+ /* Contact: Heng Li <lh3@sanger.ac.uk> */
27
+
28
+ /*
29
+ An example:
30
+
31
+ #include "khash.h"
32
+ KHASH_MAP_INIT_INT(32, char)
33
+ int main() {
34
+ int ret, is_missing;
35
+ khiter_t k;
36
+ khash_t(32) *h = kh_init(32);
37
+ k = kh_put(32, h, 5, &ret);
38
+ if (!ret) kh_del(32, h, k);
39
+ kh_value(h, k) = 10;
40
+ k = kh_get(32, h, 10);
41
+ is_missing = (k == kh_end(h));
42
+ k = kh_get(32, h, 5);
43
+ kh_del(32, h, k);
44
+ for (k = kh_begin(h); k != kh_end(h); ++k)
45
+ if (kh_exist(h, k)) kh_value(h, k) = 1;
46
+ kh_destroy(32, h);
47
+ return 0;
48
+ }
49
+ */
50
+
51
+ /*
52
+ 2008-09-19 (0.2.3):
53
+
54
+ * Corrected the example
55
+ * Improved interfaces
56
+
57
+ 2008-09-11 (0.2.2):
58
+
59
+ * Improved speed a little in kh_put()
60
+
61
+ 2008-09-10 (0.2.1):
62
+
63
+ * Added kh_clear()
64
+ * Fixed a compiling error
65
+
66
+ 2008-09-02 (0.2.0):
67
+
68
+ * Changed to token concatenation which increases flexibility.
69
+
70
+ 2008-08-31 (0.1.2):
71
+
72
+ * Fixed a bug in kh_get(), which has not been tested previously.
73
+
74
+ 2008-08-31 (0.1.1):
75
+
76
+ * Added destructor
77
+ */
78
+
79
+
80
+ #ifndef __AC_KHASH_H
81
+ #define __AC_KHASH_H
82
+
83
+ /*!
84
+ @header
85
+
86
+ Generic hash table library.
87
+
88
+ @copyright Heng Li
89
+ */
90
+
91
+ #define AC_VERSION_KHASH_H "0.2.2"
92
+
93
+ #include <stdint.h>
94
+ #include <stdlib.h>
95
+ #include <string.h>
96
+
97
+ typedef uint32_t khint_t;
98
+ typedef khint_t khiter_t;
99
+
100
+ #define __ac_HASH_PRIME_SIZE 32
101
+ static const uint32_t __ac_prime_list[__ac_HASH_PRIME_SIZE] =
102
+ {
103
+ 0ul, 3ul, 11ul, 23ul, 53ul,
104
+ 97ul, 193ul, 389ul, 769ul, 1543ul,
105
+ 3079ul, 6151ul, 12289ul, 24593ul, 49157ul,
106
+ 98317ul, 196613ul, 393241ul, 786433ul, 1572869ul,
107
+ 3145739ul, 6291469ul, 12582917ul, 25165843ul, 50331653ul,
108
+ 100663319ul, 201326611ul, 402653189ul, 805306457ul, 1610612741ul,
109
+ 3221225473ul, 4294967291ul
110
+ };
111
+
112
+ #define __ac_isempty(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&2)
113
+ #define __ac_isdel(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&1)
114
+ #define __ac_iseither(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&3)
115
+ #define __ac_set_isdel_false(flag, i) (flag[i>>4]&=~(1ul<<((i&0xfU)<<1)))
116
+ #define __ac_set_isempty_false(flag, i) (flag[i>>4]&=~(2ul<<((i&0xfU)<<1)))
117
+ #define __ac_set_isboth_false(flag, i) (flag[i>>4]&=~(3ul<<((i&0xfU)<<1)))
118
+ #define __ac_set_isdel_true(flag, i) (flag[i>>4]|=1ul<<((i&0xfU)<<1))
119
+
120
+ static const double __ac_HASH_UPPER = 0.77;
121
+
122
+ #define KHASH_INIT(name, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \
123
+ typedef struct { \
124
+ khint_t n_buckets, size, n_occupied, upper_bound; \
125
+ uint32_t *flags; \
126
+ khkey_t *keys; \
127
+ khval_t *vals; \
128
+ } kh_##name##_t; \
129
+ static inline kh_##name##_t *kh_init_##name() { \
130
+ return (kh_##name##_t*)calloc(1, sizeof(kh_##name##_t)); \
131
+ } \
132
+ static inline void kh_destroy_##name(kh_##name##_t *h) \
133
+ { \
134
+ if (h) { \
135
+ free(h->keys); free(h->flags); \
136
+ free(h->vals); \
137
+ free(h); \
138
+ } \
139
+ } \
140
+ static inline void kh_clear_##name(kh_##name##_t *h) \
141
+ { \
142
+ if (h && h->flags) { \
143
+ memset(h->flags, 0xaa, ((h->n_buckets>>4) + 1) * sizeof(uint32_t)); \
144
+ h->size = h->n_occupied = 0; \
145
+ } \
146
+ } \
147
+ static inline khint_t kh_get_##name(const kh_##name##_t *h, khkey_t key) \
148
+ { \
149
+ if (h->n_buckets) { \
150
+ khint_t inc, k, i, last; \
151
+ k = __hash_func(key); i = k % h->n_buckets; \
152
+ inc = 1 + k % (h->n_buckets - 1); last = i; \
153
+ while (!__ac_isempty(h->flags, i) && (__ac_isdel(h->flags, i) || !__hash_equal(h->keys[i], key))) { \
154
+ if (i + inc >= h->n_buckets) i = i + inc - h->n_buckets; \
155
+ else i += inc; \
156
+ if (i == last) return h->n_buckets; \
157
+ } \
158
+ return __ac_iseither(h->flags, i)? h->n_buckets : i; \
159
+ } else return 0; \
160
+ } \
161
+ static inline void kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets) \
162
+ { \
163
+ uint32_t *new_flags = 0; \
164
+ khint_t j = 1; \
165
+ { \
166
+ khint_t t = __ac_HASH_PRIME_SIZE - 1; \
167
+ while (__ac_prime_list[t] > new_n_buckets) --t; \
168
+ new_n_buckets = __ac_prime_list[t+1]; \
169
+ if (h->size >= (khint_t)(new_n_buckets * __ac_HASH_UPPER + 0.5)) j = 0; \
170
+ else { \
171
+ new_flags = (uint32_t*)malloc(((new_n_buckets>>4) + 1) * sizeof(uint32_t)); \
172
+ memset(new_flags, 0xaa, ((new_n_buckets>>4) + 1) * sizeof(uint32_t)); \
173
+ if (h->n_buckets < new_n_buckets) { \
174
+ h->keys = (khkey_t*)realloc(h->keys, new_n_buckets * sizeof(khkey_t)); \
175
+ if (kh_is_map) \
176
+ h->vals = (khval_t*)realloc(h->vals, new_n_buckets * sizeof(khval_t)); \
177
+ } \
178
+ } \
179
+ } \
180
+ if (j) { \
181
+ for (j = 0; j != h->n_buckets; ++j) { \
182
+ if (__ac_iseither(h->flags, j) == 0) { \
183
+ khkey_t key = h->keys[j]; \
184
+ khval_t val; \
185
+ if (kh_is_map) val = h->vals[j]; \
186
+ __ac_set_isdel_true(h->flags, j); \
187
+ while (1) { \
188
+ khint_t inc, k, i; \
189
+ k = __hash_func(key); \
190
+ i = k % new_n_buckets; \
191
+ inc = 1 + k % (new_n_buckets - 1); \
192
+ while (!__ac_isempty(new_flags, i)) { \
193
+ if (i + inc >= new_n_buckets) i = i + inc - new_n_buckets; \
194
+ else i += inc; \
195
+ } \
196
+ __ac_set_isempty_false(new_flags, i); \
197
+ if (i < h->n_buckets && __ac_iseither(h->flags, i) == 0) { \
198
+ { khkey_t tmp = h->keys[i]; h->keys[i] = key; key = tmp; } \
199
+ if (kh_is_map) { khval_t tmp = h->vals[i]; h->vals[i] = val; val = tmp; } \
200
+ __ac_set_isdel_true(h->flags, i); \
201
+ } else { \
202
+ h->keys[i] = key; \
203
+ if (kh_is_map) h->vals[i] = val; \
204
+ break; \
205
+ } \
206
+ } \
207
+ } \
208
+ } \
209
+ if (h->n_buckets > new_n_buckets) { \
210
+ h->keys = (khkey_t*)realloc(h->keys, new_n_buckets * sizeof(khkey_t)); \
211
+ if (kh_is_map) \
212
+ h->vals = (khval_t*)realloc(h->vals, new_n_buckets * sizeof(khval_t)); \
213
+ } \
214
+ free(h->flags); \
215
+ h->flags = new_flags; \
216
+ h->n_buckets = new_n_buckets; \
217
+ h->n_occupied = h->size; \
218
+ h->upper_bound = (khint_t)(h->n_buckets * __ac_HASH_UPPER + 0.5); \
219
+ } \
220
+ } \
221
+ static inline khint_t kh_put_##name(kh_##name##_t *h, khkey_t key, int *ret) \
222
+ { \
223
+ khint_t x; \
224
+ if (h->n_occupied >= h->upper_bound) { \
225
+ if (h->n_buckets > (h->size<<1)) kh_resize_##name(h, h->n_buckets - 1); \
226
+ else kh_resize_##name(h, h->n_buckets + 1); \
227
+ } \
228
+ { \
229
+ khint_t inc, k, i, site, last; \
230
+ x = site = h->n_buckets; k = __hash_func(key); i = k % h->n_buckets; \
231
+ if (__ac_isempty(h->flags, i)) x = i; \
232
+ else { \
233
+ inc = 1 + k % (h->n_buckets - 1); last = i; \
234
+ while (!__ac_isempty(h->flags, i) && (__ac_isdel(h->flags, i) || !__hash_equal(h->keys[i], key))) { \
235
+ if (__ac_isdel(h->flags, i)) site = i; \
236
+ if (i + inc >= h->n_buckets) i = i + inc - h->n_buckets; \
237
+ else i += inc; \
238
+ if (i == last) { x = site; break; } \
239
+ } \
240
+ if (x == h->n_buckets) { \
241
+ if (__ac_isempty(h->flags, i) && site != h->n_buckets) x = site; \
242
+ else x = i; \
243
+ } \
244
+ } \
245
+ } \
246
+ if (__ac_isempty(h->flags, x)) { \
247
+ h->keys[x] = key; \
248
+ __ac_set_isboth_false(h->flags, x); \
249
+ ++h->size; ++h->n_occupied; \
250
+ *ret = 1; \
251
+ } else if (__ac_isdel(h->flags, x)) { \
252
+ h->keys[x] = key; \
253
+ __ac_set_isboth_false(h->flags, x); \
254
+ ++h->size; \
255
+ *ret = 2; \
256
+ } else *ret = 0; \
257
+ return x; \
258
+ } \
259
+ static inline void kh_del_##name(kh_##name##_t *h, khint_t x) \
260
+ { \
261
+ if (x != h->n_buckets && !__ac_iseither(h->flags, x)) { \
262
+ __ac_set_isdel_true(h->flags, x); \
263
+ --h->size; \
264
+ } \
265
+ }
266
+
267
+ /* --- BEGIN OF HASH FUNCTIONS --- */
268
+
269
+ /*! @function
270
+ @abstract Integer hash function
271
+ @param key The integer [uint32_t]
272
+ @return The hash value [khint_t]
273
+ */
274
+ #define kh_int_hash_func(key) (uint32_t)(key)
275
+ /*! @function
276
+ @abstract Integer comparison function
277
+ */
278
+ #define kh_int_hash_equal(a, b) ((a) == (b))
279
+ /*! @function
280
+ @abstract 64-bit integer hash function
281
+ @param key The integer [uint64_t]
282
+ @return The hash value [khint_t]
283
+ */
284
+ #define kh_int64_hash_func(key) (uint32_t)((key)>>33^(key)^(key)<<11)
285
+ /*! @function
286
+ @abstract 64-bit integer comparison function
287
+ */
288
+ #define kh_int64_hash_equal(a, b) ((a) == (b))
289
+ /*! @function
290
+ @abstract const char* hash function
291
+ @param s Pointer to a null terminated string
292
+ @return The hash value
293
+ */
294
+ static inline khint_t __ac_X31_hash_string(const char *s)
295
+ {
296
+ khint_t h = *s;
297
+ if (h) for (++s ; *s; ++s) h = (h << 5) - h + *s;
298
+ return h;
299
+ }
300
+ /*! @function
301
+ @abstract Another interface to const char* hash function
302
+ @param key Pointer to a null terminated string [const char*]
303
+ @return The hash value [khint_t]
304
+ */
305
+ #define kh_str_hash_func(key) __ac_X31_hash_string(key)
306
+ /*! @function
307
+ @abstract Const char* comparison function
308
+ */
309
+ #define kh_str_hash_equal(a, b) (strcmp(a, b) == 0)
310
+
311
+ /* --- END OF HASH FUNCTIONS --- */
312
+
313
+ /* Other necessary macros... */
314
+
315
+ /*!
316
+ @abstract Type of the hash table.
317
+ @param name Name of the hash table [symbol]
318
+ */
319
+ #define khash_t(name) kh_##name##_t
320
+
321
+ /*! @function
322
+ @abstract Initiate a hash table.
323
+ @param name Name of the hash table [symbol]
324
+ @return Pointer to the hash table [khash_t(name)*]
325
+ */
326
+ #define kh_init(name) kh_init_##name()
327
+
328
+ /*! @function
329
+ @abstract Destroy a hash table.
330
+ @param name Name of the hash table [symbol]
331
+ @param h Pointer to the hash table [khash_t(name)*]
332
+ */
333
+ #define kh_destroy(name, h) kh_destroy_##name(h)
334
+
335
+ /*! @function
336
+ @abstract Reset a hash table without deallocating memory.
337
+ @param name Name of the hash table [symbol]
338
+ @param h Pointer to the hash table [khash_t(name)*]
339
+ */
340
+ #define kh_clear(name, h) kh_clear_##name(h)
341
+
342
+ /*! @function
343
+ @abstract Resize a hash table.
344
+ @param name Name of the hash table [symbol]
345
+ @param h Pointer to the hash table [khash_t(name)*]
346
+ @param s New size [khint_t]
347
+ */
348
+ #define kh_resize(name, h, s) kh_resize_##name(h, s)
349
+
350
+ /*! @function
351
+ @abstract Insert a key to the hash table.
352
+ @param name Name of the hash table [symbol]
353
+ @param h Pointer to the hash table [khash_t(name)*]
354
+ @param k Key [type of keys]
355
+ @param r Extra return code: 0 if the key is present in the hash table;
356
+ 1 if the bucket is empty (never used); 2 if the element in
357
+ the bucket has been deleted [int*]
358
+ @return Iterator to the inserted element [khint_t]
359
+ */
360
+ #define kh_put(name, h, k, r) kh_put_##name(h, k, r)
361
+
362
+ /*! @function
363
+ @abstract Retrieve a key from the hash table.
364
+ @param name Name of the hash table [symbol]
365
+ @param h Pointer to the hash table [khash_t(name)*]
366
+ @param k Key [type of keys]
367
+ @return Iterator to the found element, or kh_end(h) is the element is absent [khint_t]
368
+ */
369
+ #define kh_get(name, h, k) kh_get_##name(h, k)
370
+
371
+ /*! @function
372
+ @abstract Remove a key from the hash table.
373
+ @param name Name of the hash table [symbol]
374
+ @param h Pointer to the hash table [khash_t(name)*]
375
+ @param k Iterator to the element to be deleted [khint_t]
376
+ */
377
+ #define kh_del(name, h, k) kh_del_##name(h, k)
378
+
379
+
380
+ /*! @function
381
+ @abstract Test whether a bucket contains data.
382
+ @param h Pointer to the hash table [khash_t(name)*]
383
+ @param x Iterator to the bucket [khint_t]
384
+ @return 1 if containing data; 0 otherwise [int]
385
+ */
386
+ #define kh_exist(h, x) (!__ac_iseither((h)->flags, (x)))
387
+
388
+ /*! @function
389
+ @abstract Get key given an iterator
390
+ @param h Pointer to the hash table [khash_t(name)*]
391
+ @param x Iterator to the bucket [khint_t]
392
+ @return Key [type of keys]
393
+ */
394
+ #define kh_key(h, x) ((h)->keys[x])
395
+
396
+ /*! @function
397
+ @abstract Get value given an iterator
398
+ @param h Pointer to the hash table [khash_t(name)*]
399
+ @param x Iterator to the bucket [khint_t]
400
+ @return Value [type of values]
401
+ @discussion For hash sets, calling this results in segfault.
402
+ */
403
+ #define kh_val(h, x) ((h)->vals[x])
404
+
405
+ /*! @function
406
+ @abstract Alias of kh_val()
407
+ */
408
+ #define kh_value(h, x) ((h)->vals[x])
409
+
410
+ /*! @function
411
+ @abstract Get the start iterator
412
+ @param h Pointer to the hash table [khash_t(name)*]
413
+ @return The start iterator [khint_t]
414
+ */
415
+ #define kh_begin(h) (khint_t)(0)
416
+
417
+ /*! @function
418
+ @abstract Get the end iterator
419
+ @param h Pointer to the hash table [khash_t(name)*]
420
+ @return The end iterator [khint_t]
421
+ */
422
+ #define kh_end(h) ((h)->n_buckets)
423
+
424
+ /*! @function
425
+ @abstract Get the number of elements in the hash table
426
+ @param h Pointer to the hash table [khash_t(name)*]
427
+ @return Number of elements in the hash table [khint_t]
428
+ */
429
+ #define kh_size(h) ((h)->size)
430
+
431
+ /*! @function
432
+ @abstract Get the number of buckets in the hash table
433
+ @param h Pointer to the hash table [khash_t(name)*]
434
+ @return Number of buckets in the hash table [khint_t]
435
+ */
436
+ #define kh_n_buckets(h) ((h)->n_buckets)
437
+
438
+ /* More conenient interfaces */
439
+
440
+ /*! @function
441
+ @abstract Instantiate a hash set containing integer keys
442
+ @param name Name of the hash table [symbol]
443
+ */
444
+ #define KHASH_SET_INIT_INT(name) \
445
+ KHASH_INIT(name, uint32_t, char, 0, kh_int_hash_func, kh_int_hash_equal)
446
+
447
+ /*! @function
448
+ @abstract Instantiate a hash map containing integer keys
449
+ @param name Name of the hash table [symbol]
450
+ @param khval_t Type of values [type]
451
+ */
452
+ #define KHASH_MAP_INIT_INT(name, khval_t) \
453
+ KHASH_INIT(name, uint32_t, khval_t, 1, kh_int_hash_func, kh_int_hash_equal)
454
+
455
+ /*! @function
456
+ @abstract Instantiate a hash map containing 64-bit integer keys
457
+ @param name Name of the hash table [symbol]
458
+ */
459
+ #define KHASH_SET_INIT_INT64(name) \
460
+ KHASH_INIT(name, uint64_t, char, 0, kh_int64_hash_func, kh_int64_hash_equal)
461
+
462
+ /*! @function
463
+ @abstract Instantiate a hash map containing 64-bit integer keys
464
+ @param name Name of the hash table [symbol]
465
+ @param khval_t Type of values [type]
466
+ */
467
+ #define KHASH_MAP_INIT_INT64(name, khval_t) \
468
+ KHASH_INIT(name, uint64_t, khval_t, 1, kh_int64_hash_func, kh_int64_hash_equal)
469
+
470
+ typedef const char *kh_cstr_t;
471
+ /*! @function
472
+ @abstract Instantiate a hash map containing const char* keys
473
+ @param name Name of the hash table [symbol]
474
+ */
475
+ #define KHASH_SET_INIT_STR(name) \
476
+ KHASH_INIT(name, kh_cstr_t, char, 0, kh_str_hash_func, kh_str_hash_equal)
477
+
478
+ /*! @function
479
+ @abstract Instantiate a hash map containing const char* keys
480
+ @param name Name of the hash table [symbol]
481
+ @param khval_t Type of values [type]
482
+ */
483
+ #define KHASH_MAP_INIT_STR(name, khval_t) \
484
+ KHASH_INIT(name, kh_cstr_t, khval_t, 1, kh_str_hash_func, kh_str_hash_equal)
485
+
486
+ #endif /* __AC_KHASH_H */