test_htable.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #include "test.h"
  2. #include "htable.h"
  3. #define _CT 8
  4. static inline uint64_t id_hash_fn(const void *key, ksize_t size, uint64_t seed)
  5. { return *(uint64_t*)key; }
  6. static inline bool buffer_eq_fn(const void *a, const void *b, ksize_t size)
  7. { return memcmp(a, b, size) == 0; }
  8. static int htable_idx()
  9. {
  10. LSUP_Key keys[_CT] = {5, 8, 13, 21, 34, 55, 89, 5};
  11. LSUP_HTable *ht = LSUP_htable_new(
  12. _CT, sizeof(LSUP_Key), sizeof(LSUP_Buffer),
  13. id_hash_fn, buffer_eq_fn, 0);
  14. LSUP_Buffer values[_CT];
  15. for (int i = 0; i < _CT; i++) {
  16. char tmp[64];
  17. sprintf(tmp, "<%lu>", keys[i]);
  18. LSUP_buffer_init(values + i, strlen(tmp) + 1);
  19. memcpy((values + i)->addr, tmp, strlen(tmp) + 1);
  20. printf("Buffer to insert: ");
  21. LSUP_buffer_print(values + i);
  22. if (LSUP_htable_put(ht, keys + i, values + i) != LSUP_OK)
  23. LSUP_buffer_done(values + i);
  24. }
  25. EXPECT_INT_EQ(LSUP_htable_size(ht), 7);
  26. for (int i = 0; i < _CT; i++) {
  27. LSUP_Buffer* vtmp;
  28. char ptmp[64];
  29. LSUP_htable_get(ht, keys + i, (void**)&vtmp);
  30. printf("Key in get: <%lu>: ", keys[i]);
  31. LSUP_buffer_print(vtmp);
  32. sprintf(ptmp, "<%lu>", keys[i]);
  33. EXPECT_INT_EQ(memcmp(ptmp, vtmp->addr, vtmp->size), 0);
  34. }
  35. LSUP_Key *ktmp;
  36. LSUP_Buffer *vtmp;
  37. htsize_t cur = 0;
  38. while(LSUP_htable_iter(ht, &cur, (void**)&ktmp, (void**)&vtmp) == LSUP_OK) {
  39. printf("Key in iter: <%lu>: ", *ktmp);
  40. LSUP_buffer_print(vtmp);
  41. char ptmp[64];
  42. sprintf(ptmp, "<%lu>", *ktmp);
  43. EXPECT_INT_EQ(memcmp(ptmp, vtmp->addr, vtmp->size), 0);
  44. }
  45. cur = 0;
  46. while(LSUP_htable_iter(ht, &cur, (void**)&ktmp, (void**)&vtmp) == LSUP_OK) {
  47. LSUP_buffer_done(vtmp);
  48. }
  49. printf("Freeing hash table.\n");
  50. LSUP_htable_free(ht);
  51. return 0;
  52. }
  53. static int htable_keys()
  54. {
  55. LSUP_TripleKey keys[_CT] = {
  56. {1, 1, 1},
  57. {2, 1, 1},
  58. {1, 2, 3},
  59. {1, 9, 9},
  60. {5, 6, 7},
  61. {7, 6, 5},
  62. {1, 1, 1}, // Duplicate.
  63. {2, 1, 1}, // Duplicate.
  64. };
  65. LSUP_HTable *ht = LSUP_htable_new(
  66. _CT, sizeof(LSUP_TripleKey), sizeof(LSUP_Buffer),
  67. id_hash_fn, buffer_eq_fn, 0);
  68. LSUP_Buffer values[_CT];
  69. for (int i = 0; i < _CT; i++) {
  70. char tmp[64];
  71. sprintf(tmp, "<%lu : %lu : %lu>", keys[i][0], keys[i][1], keys[i][2]);
  72. LSUP_buffer_init(values + i, strlen(tmp) + 1);
  73. memcpy((values + i)->addr, tmp, strlen(tmp) + 1);
  74. TRACE(STR, "Buffer to insert: ");
  75. LSUP_buffer_print(values + i);
  76. if (LSUP_htable_put(ht, keys + i, values + i) != LSUP_OK)
  77. LSUP_buffer_done(values + i);
  78. }
  79. EXPECT_INT_EQ(LSUP_htable_size(ht), 6);
  80. for (int i = 0; i < _CT; i++) {
  81. LSUP_Buffer* vtmp;
  82. char ptmp[64];
  83. LSUP_htable_get(ht, keys[i], (void**)&vtmp);
  84. printf(
  85. "Key in get: <%lu : %lu : %lu>: ",
  86. keys[i][0], keys[i][1], keys[i][2]);
  87. LSUP_buffer_print(vtmp);
  88. sprintf(ptmp, "<%lu : %lu : %lu>", keys[i][0], keys[i][1], keys[i][2]);
  89. EXPECT_INT_EQ(memcmp(ptmp, vtmp->addr, vtmp->size), 0);
  90. }
  91. LSUP_TripleKey *ktmp;
  92. LSUP_Buffer *vtmp;
  93. htsize_t cur = 0;
  94. while(LSUP_htable_iter(ht, &cur, (void**)&ktmp, (void**)&vtmp) == LSUP_OK) {
  95. printf(
  96. "Key in iter: <%lu : %lu : %lu>: ",
  97. (*ktmp)[0], (*ktmp)[1], (*ktmp)[2]);
  98. LSUP_buffer_print(vtmp);
  99. char ptmp[64];
  100. sprintf(ptmp, "<%lu : %lu : %lu>", (*ktmp)[0], (*ktmp)[1], (*ktmp)[2]);
  101. EXPECT_INT_EQ(memcmp(ptmp, vtmp->addr, vtmp->size), 0);
  102. }
  103. cur = 0;
  104. while(LSUP_htable_iter(ht, &cur, (void**)&ktmp, (void**)&vtmp) == LSUP_OK) {
  105. LSUP_buffer_done(vtmp);
  106. }
  107. printf("Freeing hash table.\n");
  108. LSUP_htable_free(ht);
  109. return 0;
  110. }
  111. int htable_tests()
  112. {
  113. RUN(htable_idx);
  114. RUN(htable_keys);
  115. return 0;
  116. }