ArrayRecyclerTest.cpp 2.7 KB

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