Home | History | Annotate | Download | only in ADT
      1 //===- unittest/ADT/IntrusiveRefCntPtrTest.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 
     10 #include "llvm/ADT/IntrusiveRefCntPtr.h"
     11 #include "gtest/gtest.h"
     12 
     13 namespace llvm {
     14 
     15 namespace {
     16 struct SimpleRefCounted : public RefCountedBase<SimpleRefCounted> {
     17   SimpleRefCounted() { ++NumInstances; }
     18   SimpleRefCounted(const SimpleRefCounted &) : RefCountedBase() {
     19     ++NumInstances;
     20   }
     21   ~SimpleRefCounted() { --NumInstances; }
     22 
     23   static int NumInstances;
     24 };
     25 int SimpleRefCounted::NumInstances = 0;
     26 } // anonymous namespace
     27 
     28 TEST(IntrusiveRefCntPtr, RefCountedBaseCopyDoesNotLeak) {
     29   EXPECT_EQ(0, SimpleRefCounted::NumInstances);
     30   {
     31     SimpleRefCounted *S1 = new SimpleRefCounted;
     32     IntrusiveRefCntPtr<SimpleRefCounted> R1 = S1;
     33     SimpleRefCounted *S2 = new SimpleRefCounted(*S1);
     34     IntrusiveRefCntPtr<SimpleRefCounted> R2 = S2;
     35     EXPECT_EQ(2, SimpleRefCounted::NumInstances);
     36   }
     37   EXPECT_EQ(0, SimpleRefCounted::NumInstances);
     38 }
     39 
     40 struct InterceptRefCounted : public RefCountedBase<InterceptRefCounted> {
     41   InterceptRefCounted(bool *Released, bool *Retained)
     42     : Released(Released), Retained(Retained) {}
     43   bool * const Released;
     44   bool * const Retained;
     45 };
     46 template <> struct IntrusiveRefCntPtrInfo<InterceptRefCounted> {
     47   static void retain(InterceptRefCounted *I) {
     48     *I->Retained = true;
     49     I->Retain();
     50   }
     51   static void release(InterceptRefCounted *I) {
     52     *I->Released = true;
     53     I->Release();
     54   }
     55 };
     56 TEST(IntrusiveRefCntPtr, UsesTraitsToRetainAndRelease) {
     57   bool Released = false;
     58   bool Retained = false;
     59   {
     60     InterceptRefCounted *I = new InterceptRefCounted(&Released, &Retained);
     61     IntrusiveRefCntPtr<InterceptRefCounted> R = I;
     62   }
     63   EXPECT_TRUE(Released);
     64   EXPECT_TRUE(Retained);
     65 }
     66 
     67 } // end namespace llvm
     68