ArrayRecyclerTest.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. //===--- unittest/Support/ArrayRecyclerTest.cpp ---------------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "llvm/Support/ArrayRecycler.h"
  9. #include "llvm/Support/Allocator.h"
  10. #include "gtest/gtest.h"
  11. #include <cstdlib>
  12. using namespace llvm;
  13. namespace {
  14. struct Object {
  15. int Num;
  16. Object *Other;
  17. };
  18. typedef ArrayRecycler<Object> ARO;
  19. TEST(ArrayRecyclerTest, Capacity) {
  20. // Capacity size should never be 0.
  21. ARO::Capacity Cap = ARO::Capacity::get(0);
  22. EXPECT_LT(0u, Cap.getSize());
  23. size_t PrevSize = Cap.getSize();
  24. for (unsigned N = 1; N != 100; ++N) {
  25. Cap = ARO::Capacity::get(N);
  26. EXPECT_LE(N, Cap.getSize());
  27. if (PrevSize >= N)
  28. EXPECT_EQ(PrevSize, Cap.getSize());
  29. else
  30. EXPECT_LT(PrevSize, Cap.getSize());
  31. PrevSize = Cap.getSize();
  32. }
  33. // Check that the buckets are monotonically increasing.
  34. Cap = ARO::Capacity::get(0);
  35. PrevSize = Cap.getSize();
  36. for (unsigned N = 0; N != 20; ++N) {
  37. Cap = Cap.getNext();
  38. EXPECT_LT(PrevSize, Cap.getSize());
  39. PrevSize = Cap.getSize();
  40. }
  41. }
  42. TEST(ArrayRecyclerTest, Basics) {
  43. BumpPtrAllocator Allocator;
  44. ArrayRecycler<Object> DUT;
  45. ARO::Capacity Cap = ARO::Capacity::get(8);
  46. Object *A1 = DUT.allocate(Cap, Allocator);
  47. A1[0].Num = 21;
  48. A1[7].Num = 17;
  49. Object *A2 = DUT.allocate(Cap, Allocator);
  50. A2[0].Num = 121;
  51. A2[7].Num = 117;
  52. Object *A3 = DUT.allocate(Cap, Allocator);
  53. A3[0].Num = 221;
  54. A3[7].Num = 217;
  55. EXPECT_EQ(21, A1[0].Num);
  56. EXPECT_EQ(17, A1[7].Num);
  57. EXPECT_EQ(121, A2[0].Num);
  58. EXPECT_EQ(117, A2[7].Num);
  59. EXPECT_EQ(221, A3[0].Num);
  60. EXPECT_EQ(217, A3[7].Num);
  61. DUT.deallocate(Cap, A2);
  62. // Check that deallocation didn't clobber anything.
  63. EXPECT_EQ(21, A1[0].Num);
  64. EXPECT_EQ(17, A1[7].Num);
  65. EXPECT_EQ(221, A3[0].Num);
  66. EXPECT_EQ(217, A3[7].Num);
  67. // Verify recycling.
  68. Object *A2x = DUT.allocate(Cap, Allocator);
  69. EXPECT_EQ(A2, A2x);
  70. DUT.deallocate(Cap, A2x);
  71. DUT.deallocate(Cap, A1);
  72. DUT.deallocate(Cap, A3);
  73. // Objects are not required to be recycled in reverse deallocation order, but
  74. // that is what the current implementation does.
  75. Object *A3x = DUT.allocate(Cap, Allocator);
  76. EXPECT_EQ(A3, A3x);
  77. Object *A1x = DUT.allocate(Cap, Allocator);
  78. EXPECT_EQ(A1, A1x);
  79. Object *A2y = DUT.allocate(Cap, Allocator);
  80. EXPECT_EQ(A2, A2y);
  81. // Back to allocation from the BumpPtrAllocator.
  82. Object *A4 = DUT.allocate(Cap, Allocator);
  83. EXPECT_NE(A1, A4);
  84. EXPECT_NE(A2, A4);
  85. EXPECT_NE(A3, A4);
  86. DUT.clear(Allocator);
  87. }
  88. } // end anonymous namespace