test_htable.c 3.9 KB

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