1*61c4878aSAndroid Build Coastguard Worker // Copyright 2023 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker #include "pw_intrusive_ptr/recyclable.h"
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Worker #include <stdint.h>
18*61c4878aSAndroid Build Coastguard Worker
19*61c4878aSAndroid Build Coastguard Worker #include <utility>
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Worker #include "pw_intrusive_ptr/intrusive_ptr.h"
22*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
23*61c4878aSAndroid Build Coastguard Worker
24*61c4878aSAndroid Build Coastguard Worker namespace pw {
25*61c4878aSAndroid Build Coastguard Worker namespace {
26*61c4878aSAndroid Build Coastguard Worker
27*61c4878aSAndroid Build Coastguard Worker class TestItem : public RefCounted<TestItem>, public Recyclable<TestItem> {
28*61c4878aSAndroid Build Coastguard Worker public:
29*61c4878aSAndroid Build Coastguard Worker TestItem() = default;
30*61c4878aSAndroid Build Coastguard Worker
~TestItem()31*61c4878aSAndroid Build Coastguard Worker virtual ~TestItem() {}
32*61c4878aSAndroid Build Coastguard Worker
33*61c4878aSAndroid Build Coastguard Worker inline static int32_t recycle_counter = 0;
34*61c4878aSAndroid Build Coastguard Worker
35*61c4878aSAndroid Build Coastguard Worker private:
36*61c4878aSAndroid Build Coastguard Worker friend class Recyclable<TestItem>;
pw_recycle()37*61c4878aSAndroid Build Coastguard Worker void pw_recycle() {
38*61c4878aSAndroid Build Coastguard Worker recycle_counter++;
39*61c4878aSAndroid Build Coastguard Worker delete this;
40*61c4878aSAndroid Build Coastguard Worker }
41*61c4878aSAndroid Build Coastguard Worker };
42*61c4878aSAndroid Build Coastguard Worker
43*61c4878aSAndroid Build Coastguard Worker // Class that thas the pw_recyclable method, but does not derive from
44*61c4878aSAndroid Build Coastguard Worker // Recyclable.
45*61c4878aSAndroid Build Coastguard Worker class TestItemNonRecyclable : public RefCounted<TestItemNonRecyclable> {
46*61c4878aSAndroid Build Coastguard Worker public:
47*61c4878aSAndroid Build Coastguard Worker TestItemNonRecyclable() = default;
48*61c4878aSAndroid Build Coastguard Worker
~TestItemNonRecyclable()49*61c4878aSAndroid Build Coastguard Worker virtual ~TestItemNonRecyclable() {}
50*61c4878aSAndroid Build Coastguard Worker
51*61c4878aSAndroid Build Coastguard Worker inline static int32_t recycle_counter = 0;
52*61c4878aSAndroid Build Coastguard Worker
pw_recycle()53*61c4878aSAndroid Build Coastguard Worker void pw_recycle() { recycle_counter++; }
54*61c4878aSAndroid Build Coastguard Worker };
55*61c4878aSAndroid Build Coastguard Worker
56*61c4878aSAndroid Build Coastguard Worker class RecyclableTest : public ::testing::Test {
57*61c4878aSAndroid Build Coastguard Worker protected:
SetUp()58*61c4878aSAndroid Build Coastguard Worker void SetUp() override {
59*61c4878aSAndroid Build Coastguard Worker TestItem::recycle_counter = 0;
60*61c4878aSAndroid Build Coastguard Worker TestItemNonRecyclable::recycle_counter = 0;
61*61c4878aSAndroid Build Coastguard Worker }
62*61c4878aSAndroid Build Coastguard Worker };
63*61c4878aSAndroid Build Coastguard Worker
TEST_F(RecyclableTest,DeletingLastPtrRecyclesTheObject)64*61c4878aSAndroid Build Coastguard Worker TEST_F(RecyclableTest, DeletingLastPtrRecyclesTheObject) {
65*61c4878aSAndroid Build Coastguard Worker {
66*61c4878aSAndroid Build Coastguard Worker IntrusivePtr<TestItem> ptr(new TestItem());
67*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(TestItem::recycle_counter, 0);
68*61c4878aSAndroid Build Coastguard Worker }
69*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(TestItem::recycle_counter, 1);
70*61c4878aSAndroid Build Coastguard Worker }
71*61c4878aSAndroid Build Coastguard Worker
TEST_F(RecyclableTest,ConstRecycle)72*61c4878aSAndroid Build Coastguard Worker TEST_F(RecyclableTest, ConstRecycle) {
73*61c4878aSAndroid Build Coastguard Worker {
74*61c4878aSAndroid Build Coastguard Worker IntrusivePtr<const TestItem> ptr(new TestItem());
75*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(TestItem::recycle_counter, 0);
76*61c4878aSAndroid Build Coastguard Worker }
77*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(TestItem::recycle_counter, 1);
78*61c4878aSAndroid Build Coastguard Worker }
79*61c4878aSAndroid Build Coastguard Worker
TEST_F(RecyclableTest,NonRecyclableWithPwRecycleMethod)80*61c4878aSAndroid Build Coastguard Worker TEST_F(RecyclableTest, NonRecyclableWithPwRecycleMethod) {
81*61c4878aSAndroid Build Coastguard Worker {
82*61c4878aSAndroid Build Coastguard Worker IntrusivePtr<TestItemNonRecyclable> ptr(new TestItemNonRecyclable());
83*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(TestItemNonRecyclable::recycle_counter, 0);
84*61c4878aSAndroid Build Coastguard Worker }
85*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(TestItemNonRecyclable::recycle_counter, 0);
86*61c4878aSAndroid Build Coastguard Worker }
87*61c4878aSAndroid Build Coastguard Worker
88*61c4878aSAndroid Build Coastguard Worker } // namespace
89*61c4878aSAndroid Build Coastguard Worker } // namespace pw
90