brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · 696e397 Raw
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