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