hashmap.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <hashmap.h>
  4. enum {
  5. verbose = 1,
  6. };
  7. int
  8. main(void)
  9. {
  10. Hashmap map;
  11. uint64_t *keys;
  12. size_t stats[40];
  13. size_t i, j, nkeys, maxkeys;
  14. hmapinit(&map);
  15. maxkeys = 1000000;
  16. nkeys = maxkeys;
  17. keys = malloc(nkeys * sizeof keys[0]);
  18. for(j = 0; j < 100; j++){
  19. nkeys = maxkeys / (100-j);
  20. uintptr_t rnd = (uintptr_t)rand() << 32;
  21. rnd |= rand();
  22. rnd &= ~1023ull;
  23. if(j == 99)
  24. rnd = 0;
  25. for(i = 0; i < nkeys; i++)
  26. keys[i] = rnd + ((uintptr_t)i<<12);
  27. for(i = 0; i < nkeys; i++){
  28. int err;
  29. if((err = hmapput(&map, keys[i], (uint64_t)i)) != 0){
  30. fprint(2, "hmapput: error: %d\n", err);
  31. exits(smprint("hmapput: error: %d\n", err));
  32. }
  33. }
  34. for(i = 0; i < nkeys; i++){
  35. uint64_t val;
  36. int err;
  37. if((err = hmapget(&map, keys[i], &val)) != 0){
  38. fprint(2, "hmapget: error: %d\n", err);
  39. exits(smprint("hmapget: error: %d\n", err));
  40. }
  41. if(val != (uint64_t)i){
  42. fprint(2, "got the wrong val.\n");
  43. exits(smprint("got the wrong val.\n"));
  44. }
  45. }
  46. if(verbose){
  47. size_t sum = 0;
  48. hmapstats(&map, stats, nelem(stats));
  49. for(i = 0; i < nelem(stats); i++){
  50. if(stats[i] > 0){
  51. sum += stats[i];
  52. print("size %u: %u %u\n", i, sum, stats[i]);
  53. }
  54. }
  55. }
  56. for(i = 0; i < nkeys; i++){
  57. uint64_t val;
  58. int err;
  59. if((err = hmapdel(&map, keys[i], &val)) != 0){
  60. fprint(2, "hmapget: error: %d\n", err);
  61. exits(smprint("hmapget: error: %d\n", err));
  62. }
  63. if(val != (uint64_t)i){
  64. fprint(2, "got the wrong val.\n");
  65. exits("got the wrong val.\n");
  66. }
  67. }
  68. }
  69. if(map.cur->len != 0){
  70. fprint(2, "map isn't empty at the end.\n");
  71. exits("map isn't empty at the end.\n");
  72. }
  73. print("map cap %u at the end\n", map.cur->cap);
  74. fprint(2, "random put/del sequencing\n");
  75. for(j = 0; j < 100*maxkeys; j++){
  76. i = rand()%maxkeys;
  77. uintptr_t key = (uintptr_t)keys[i];
  78. if((key&1) == 0){
  79. int err;
  80. if((err = hmapput(&map, key, (uint64_t)i)) != 0){
  81. fprint(2, "hmapput: error: %d\n", err);
  82. exits(smprint("hmapput: error: %d\n", err));
  83. }
  84. key |= 1;
  85. keys[i] = key;
  86. } else {
  87. uint64_t val;
  88. int err;
  89. key &= ~1;
  90. if((err = hmapdel(&map, key, &val)) != 0){
  91. fprint(2, "hmapget: error: %d\n", err);
  92. exits(smprint("hmapget: error: %d\n", err));
  93. }
  94. if(val != (uint64_t)i){
  95. fprint(2, "got the wrong val.\n");
  96. exits(smprint("got the wrong val.\n"));
  97. }
  98. keys[i] = key;
  99. }
  100. }
  101. for(i = 0; i < maxkeys; i++){
  102. uintptr_t key = (uintptr_t)keys[i];
  103. if((key&1) == 0)
  104. continue;
  105. uint64_t val;
  106. int err;
  107. key &= ~1;
  108. if((err = hmapdel(&map, key, &val)) != 0){
  109. fprint(2, "hmapget: error: %d\n", err);
  110. exits(smprint("hmapget: error: %d\n", err));
  111. }
  112. if(val != (uint64_t)i){
  113. fprint(2, "got the wrong val.\n");
  114. exits(smprint("got the wrong val.\n"));
  115. }
  116. }
  117. if(map.cur->len != 0){
  118. fprint(2, "map isn't empty at the end.\n");
  119. exits(smprint("map isn't empty at the end.\n"));
  120. }
  121. print("map cap %u at the end\n", map.cur->cap);
  122. free(keys);
  123. hmapfree(&map);
  124. return 0;
  125. }