brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 264cf97 Raw
109 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/Support/ArrayRecycler.h"10#include "llvm/Support/Allocator.h"11#include "gtest/gtest.h"12#include <cstdlib>13 14using namespace llvm;15 16namespace {17 18struct Object {19  int Num;20  Object *Other;21};22typedef ArrayRecycler<Object> ARO;23 24TEST(ArrayRecyclerTest, Capacity) {25  // Capacity size should never be 0.26  ARO::Capacity Cap = ARO::Capacity::get(0);27  EXPECT_LT(0u, Cap.getSize());28 29  size_t PrevSize = Cap.getSize();30  for (unsigned N = 1; N != 100; ++N) {31    Cap = ARO::Capacity::get(N);32    EXPECT_LE(N, Cap.getSize());33    if (PrevSize >= N)34      EXPECT_EQ(PrevSize, Cap.getSize());35    else36      EXPECT_LT(PrevSize, Cap.getSize());37    PrevSize = Cap.getSize();38  }39 40  // Check that the buckets are monotonically increasing.41  Cap = ARO::Capacity::get(0);42  PrevSize = Cap.getSize();43  for (unsigned N = 0; N != 20; ++N) {44    Cap = Cap.getNext();45    EXPECT_LT(PrevSize, Cap.getSize());46    PrevSize = Cap.getSize();47  }48}49 50TEST(ArrayRecyclerTest, Basics) {51  BumpPtrAllocator Allocator;52  ArrayRecycler<Object> DUT;53 54  ARO::Capacity Cap = ARO::Capacity::get(8);55  Object *A1 = DUT.allocate(Cap, Allocator);56  A1[0].Num = 21;57  A1[7].Num = 17;58 59  Object *A2 = DUT.allocate(Cap, Allocator);60  A2[0].Num = 121;61  A2[7].Num = 117;62 63  Object *A3 = DUT.allocate(Cap, Allocator);64  A3[0].Num = 221;65  A3[7].Num = 217;66 67  EXPECT_EQ(21, A1[0].Num);68  EXPECT_EQ(17, A1[7].Num);69  EXPECT_EQ(121, A2[0].Num);70  EXPECT_EQ(117, A2[7].Num);71  EXPECT_EQ(221, A3[0].Num);72  EXPECT_EQ(217, A3[7].Num);73 74  DUT.deallocate(Cap, A2);75 76  // Check that deallocation didn't clobber anything.77  EXPECT_EQ(21, A1[0].Num);78  EXPECT_EQ(17, A1[7].Num);79  EXPECT_EQ(221, A3[0].Num);80  EXPECT_EQ(217, A3[7].Num);81 82  // Verify recycling.83  Object *A2x = DUT.allocate(Cap, Allocator);84  EXPECT_EQ(A2, A2x);85 86  DUT.deallocate(Cap, A2x);87  DUT.deallocate(Cap, A1);88  DUT.deallocate(Cap, A3);89 90  // Objects are not required to be recycled in reverse deallocation order, but91  // that is what the current implementation does.92  Object *A3x = DUT.allocate(Cap, Allocator);93  EXPECT_EQ(A3, A3x);94  Object *A1x = DUT.allocate(Cap, Allocator);95  EXPECT_EQ(A1, A1x);96  Object *A2y = DUT.allocate(Cap, Allocator);97  EXPECT_EQ(A2, A2y);98 99  // Back to allocation from the BumpPtrAllocator.100  Object *A4 = DUT.allocate(Cap, Allocator);101  EXPECT_NE(A1, A4);102  EXPECT_NE(A2, A4);103  EXPECT_NE(A3, A4);104 105  DUT.clear(Allocator);106}107 108} // end anonymous namespace109