runtime/kp_tab.h - ktap

Functions defined

Macros defined

Source code

  1. #ifndef __KTAP_TAB_H__
  2. #define __KTAP_TAB_H__

  3. /* Hash constants. Tuned using a brute force search. */
  4. #define HASH_BIAS       (-0x04c11db7)
  5. #define HASH_ROT1       14
  6. #define HASH_ROT2       5
  7. #define HASH_ROT3       13

  8. /* Every half-decent C compiler transforms this into a rotate instruction. */
  9. #define kp_rol(x, n)    (((x)<<(n)) | ((x)>>(-(int)(n)&(8*sizeof(x)-1))))
  10. #define kp_ror(x, n)    (((x)<<(-(int)(n)&(8*sizeof(x)-1))) | ((x)>>(n)))

  11. /* Scramble the bits of numbers and pointers. */
  12. static __always_inline uint32_t hashrot(uint32_t lo, uint32_t hi)
  13. {
  14.     /* Prefer variant that compiles well for a 2-operand CPU. */
  15.     lo ^= hi; hi = kp_rol(hi, HASH_ROT1);
  16.     lo -= hi; hi = kp_rol(hi, HASH_ROT2);
  17.     hi ^= lo; hi -= kp_rol(lo, HASH_ROT3);
  18.     return hi;
  19. }


  20. #define FLS(x)       ((uint32_t)(__builtin_clz(x)^31))
  21. #define hsize2hbits(s)  ((s) ? ((s)==1 ? 1 : 1+FLS((uint32_t)((s)-1))) : 0)

  22. #define arrayslot(t, i)         (&(t)->array[(i)])

  23. void kp_tab_set(ktap_state_t *ks, ktap_tab_t *t, const ktap_val_t *key,
  24.         const ktap_val_t *val);
  25. void kp_tab_setstr(ktap_state_t *ks, ktap_tab_t *t,
  26.            const ktap_str_t *key, const ktap_val_t *val);
  27. void kp_tab_incrstr(ktap_state_t *ks, ktap_tab_t *t, const ktap_str_t *key,
  28.             ktap_number n);
  29. void kp_tab_get(ktap_state_t *ks, ktap_tab_t *t, const ktap_val_t *key,
  30.         ktap_val_t *val);
  31. void kp_tab_getstr(ktap_tab_t *t, ktap_str_t *key, ktap_val_t *val);

  32. void kp_tab_getint(ktap_tab_t *t, uint32_t key, ktap_val_t *val);
  33. void kp_tab_setint(ktap_state_t *ks, ktap_tab_t *t,
  34.            uint32_t key, const ktap_val_t *val);
  35. void kp_tab_incrint(ktap_state_t *ks, ktap_tab_t *t, uint32_t key,
  36.             ktap_number n);
  37. ktap_tab_t *kp_tab_new(ktap_state_t *ks, uint32_t asize, uint32_t hbits);
  38. ktap_tab_t *kp_tab_new_ah(ktap_state_t *ks, int32_t a, int32_t h);
  39. ktap_tab_t *kp_tab_dup(ktap_state_t *ks, const ktap_tab_t *kt);

  40. void kp_tab_free(ktap_state_t *ks, ktap_tab_t *t);
  41. int kp_tab_len(ktap_state_t *ks, ktap_tab_t *t);
  42. void kp_tab_dump(ktap_state_t *ks, ktap_tab_t *t);
  43. void kp_tab_clear(ktap_tab_t *t);
  44. void kp_tab_print_hist(ktap_state_t *ks, ktap_tab_t *t, int n);
  45. int kp_tab_next(ktap_state_t *ks, ktap_tab_t *t, StkId key);
  46. int kp_tab_sort_next(ktap_state_t *ks, ktap_tab_t *t, StkId key);
  47. void kp_tab_sort(ktap_state_t *ks, ktap_tab_t *t, ktap_func_t *cmp_func);
  48. void kp_tab_incr(ktap_state_t *ks, ktap_tab_t *t, ktap_val_t *key,
  49.         ktap_number n);
  50. #endif /* __KTAP_TAB_H__ */