72 lines · cpp
1//===--- unittest/Support/RecyclerTest.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/Recycler.h"10#include "llvm/Support/AllocatorBase.h"11#include "gtest/gtest.h"12 13using namespace llvm;14 15namespace {16 17struct Object1 {18 char Data[1];19};20 21struct Object8 {22 char Data[8];23};24 25class DecoratedMallocAllocator : public MallocAllocator {26public:27 int DeallocCount = 0;28 29 void Deallocate(const void *Ptr, size_t Size, size_t Alignment) {30 DeallocCount++;31 MallocAllocator::Deallocate(Ptr, Size, Alignment);32 }33 34 template <typename T> void Deallocate(T *Ptr) {35 DeallocCount++;36 MallocAllocator::Deallocate(Ptr);37 }38};39 40TEST(RecyclerTest, RecycleAllocation) {41 DecoratedMallocAllocator Allocator;42 // Recycler needs size to be atleast 8 bytes.43 Recycler<Object1, 8, 8> R;44 Object1 *A1 = R.Allocate(Allocator);45 Object1 *A2 = R.Allocate(Allocator);46 R.Deallocate(Allocator, A2);47 Object1 *A3 = R.Allocate(Allocator);48 EXPECT_EQ(A2, A3); // reuse the deallocated object.49 R.Deallocate(Allocator, A1);50 R.Deallocate(Allocator, A3);51 R.clear(Allocator); // Should deallocate A1 and A3.52 EXPECT_EQ(Allocator.DeallocCount, 2);53}54 55TEST(RecyclerTest, MoveConstructor) {56 DecoratedMallocAllocator Allocator;57 Recycler<Object8> R;58 Object8 *A1 = R.Allocate(Allocator);59 Object8 *A2 = R.Allocate(Allocator);60 R.Deallocate(Allocator, A1);61 R.Deallocate(Allocator, A2);62 Recycler<Object8> R2(std::move(R));63 Object8 *A3 = R2.Allocate(Allocator);64 R2.Deallocate(Allocator, A3);65 R.clear(Allocator); // Should not deallocate anything as it was moved from.66 EXPECT_EQ(Allocator.DeallocCount, 0);67 R2.clear(Allocator);68 EXPECT_EQ(Allocator.DeallocCount, 2);69}70 71} // end anonymous namespace72