1 //===- unittest/ADT/IntrusiveRefCntPtrTest.cpp ----------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/ADT/IntrusiveRefCntPtr.h"
11 #include "gtest/gtest.h"
16 struct SimpleRefCounted
: public RefCountedBase
<SimpleRefCounted
> {
17 SimpleRefCounted() { ++NumInstances
; }
18 SimpleRefCounted(const SimpleRefCounted
&) : RefCountedBase() {
21 ~SimpleRefCounted() { --NumInstances
; }
23 static int NumInstances
;
25 int SimpleRefCounted::NumInstances
= 0;
26 } // anonymous namespace
28 TEST(IntrusiveRefCntPtr
, RefCountedBaseCopyDoesNotLeak
) {
29 EXPECT_EQ(0, SimpleRefCounted::NumInstances
);
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
);
37 EXPECT_EQ(0, SimpleRefCounted::NumInstances
);
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
;
46 template <> struct IntrusiveRefCntPtrInfo
<InterceptRefCounted
> {
47 static void retain(InterceptRefCounted
*I
) {
51 static void release(InterceptRefCounted
*I
) {
56 TEST(IntrusiveRefCntPtr
, UsesTraitsToRetainAndRelease
) {
57 bool Released
= false;
58 bool Retained
= false;
60 InterceptRefCounted
*I
= new InterceptRefCounted(&Released
, &Retained
);
61 IntrusiveRefCntPtr
<InterceptRefCounted
> R
= I
;
63 EXPECT_TRUE(Released
);
64 EXPECT_TRUE(Retained
);
67 } // end namespace llvm