handle_test.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /*
  2. * Copyright 2010-2019 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
  4. */
  5. #include "test.h"
  6. #include <bx/handlealloc.h>
  7. #include <bx/hash.h>
  8. TEST_CASE("HandleListT", "")
  9. {
  10. bx::HandleListT<32> list;
  11. list.pushBack(16);
  12. REQUIRE(list.getFront() == 16);
  13. REQUIRE(list.getBack() == 16);
  14. list.pushFront(7);
  15. REQUIRE(list.getFront() == 7);
  16. REQUIRE(list.getBack() == 16);
  17. uint16_t expected0[] = { 15, 31, 7, 16, 17, 11, 13 };
  18. list.pushBack(17);
  19. list.pushBack(11);
  20. list.pushBack(13);
  21. list.pushFront(31);
  22. list.pushFront(15);
  23. uint16_t count = 0;
  24. for (uint16_t it = list.getFront(); it != UINT16_MAX; it = list.getNext(it), ++count)
  25. {
  26. REQUIRE(it == expected0[count]);
  27. }
  28. REQUIRE(count == BX_COUNTOF(expected0) );
  29. list.remove(17);
  30. list.remove(31);
  31. list.remove(16);
  32. list.pushBack(16);
  33. uint16_t expected1[] = { 15, 7, 11, 13, 16 };
  34. count = 0;
  35. for (uint16_t it = list.getFront(); it != UINT16_MAX; it = list.getNext(it), ++count)
  36. {
  37. REQUIRE(it == expected1[count]);
  38. }
  39. REQUIRE(count == BX_COUNTOF(expected1) );
  40. list.popBack();
  41. list.popFront();
  42. list.popBack();
  43. list.popBack();
  44. REQUIRE(list.getFront() == 7);
  45. REQUIRE(list.getBack() == 7);
  46. list.popBack();
  47. REQUIRE(list.getFront() == UINT16_MAX);
  48. REQUIRE(list.getBack() == UINT16_MAX);
  49. }
  50. TEST_CASE("HandleAllocLruT", "")
  51. {
  52. bx::HandleAllocLruT<16> lru;
  53. uint16_t handle[4] =
  54. {
  55. lru.alloc(),
  56. lru.alloc(),
  57. lru.alloc(),
  58. lru.alloc(),
  59. };
  60. lru.touch(handle[1]);
  61. uint16_t expected0[] = { handle[1], handle[3], handle[2], handle[0] };
  62. uint16_t count = 0;
  63. for (uint16_t it = lru.getFront(); it != UINT16_MAX; it = lru.getNext(it), ++count)
  64. {
  65. REQUIRE(it == expected0[count]);
  66. }
  67. }
  68. TEST_CASE("HandleHashTable", "")
  69. {
  70. typedef bx::HandleHashMapT<512> HashMap;
  71. HashMap hm;
  72. REQUIRE(512 == hm.getMaxCapacity() );
  73. bx::StringView sv0("test0");
  74. bool ok = hm.insert(bx::hash<bx::HashMurmur2A>(sv0), 0);
  75. REQUIRE(ok);
  76. ok = hm.insert(bx::hash<bx::HashMurmur2A>(sv0), 0);
  77. REQUIRE(!ok);
  78. REQUIRE(1 == hm.getNumElements() );
  79. bx::StringView sv1("test1");
  80. ok = hm.insert(bx::hash<bx::HashMurmur2A>(sv1), 0);
  81. REQUIRE(ok);
  82. REQUIRE(2 == hm.getNumElements() );
  83. hm.removeByHandle(0);
  84. REQUIRE(0 == hm.getNumElements() );
  85. ok = hm.insert(bx::hash<bx::HashMurmur2A>(sv0), 0);
  86. REQUIRE(ok);
  87. hm.removeByKey(bx::hash<bx::HashMurmur2A>(sv0) );
  88. REQUIRE(0 == hm.getNumElements() );
  89. for (uint32_t ii = 0, num = hm.getMaxCapacity(); ii < num; ++ii)
  90. {
  91. ok = hm.insert(ii, uint16_t(ii) );
  92. REQUIRE(ok);
  93. }
  94. }