xref: /aosp_15_r20/external/perfetto/src/protozero/copyable_ptr_unittest.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker  *
4*6dbdd20aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker  *
8*6dbdd20aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker  *
10*6dbdd20aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker  * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker  */
16*6dbdd20aSAndroid Build Coastguard Worker 
17*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/protozero/copyable_ptr.h"
18*6dbdd20aSAndroid Build Coastguard Worker 
19*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
20*6dbdd20aSAndroid Build Coastguard Worker 
21*6dbdd20aSAndroid Build Coastguard Worker namespace protozero {
22*6dbdd20aSAndroid Build Coastguard Worker namespace {
23*6dbdd20aSAndroid Build Coastguard Worker 
24*6dbdd20aSAndroid Build Coastguard Worker struct X {
25*6dbdd20aSAndroid Build Coastguard Worker   X() = default;
26*6dbdd20aSAndroid Build Coastguard Worker   X(const X&) = default;
27*6dbdd20aSAndroid Build Coastguard Worker   X& operator=(const X&) = default;
~Xprotozero::__anon1866db700111::X28*6dbdd20aSAndroid Build Coastguard Worker   ~X() { val = -1; }
29*6dbdd20aSAndroid Build Coastguard Worker 
operator ==(const X & lhs,const X & rhs)30*6dbdd20aSAndroid Build Coastguard Worker   friend bool operator==(const X& lhs, const X& rhs) {
31*6dbdd20aSAndroid Build Coastguard Worker     return lhs.val == rhs.val;
32*6dbdd20aSAndroid Build Coastguard Worker   }
33*6dbdd20aSAndroid Build Coastguard Worker 
34*6dbdd20aSAndroid Build Coastguard Worker   // Deliberately unusual implementation.
operator !=(const X & lhs,const X & rhs)35*6dbdd20aSAndroid Build Coastguard Worker   friend bool operator!=(const X& lhs, const X& rhs) {
36*6dbdd20aSAndroid Build Coastguard Worker     return lhs.val == rhs.val * -1;
37*6dbdd20aSAndroid Build Coastguard Worker   }
38*6dbdd20aSAndroid Build Coastguard Worker 
39*6dbdd20aSAndroid Build Coastguard Worker   int val = 0;
40*6dbdd20aSAndroid Build Coastguard Worker };
41*6dbdd20aSAndroid Build Coastguard Worker 
TEST(CopyablePtrTest,CopyOperators)42*6dbdd20aSAndroid Build Coastguard Worker TEST(CopyablePtrTest, CopyOperators) {
43*6dbdd20aSAndroid Build Coastguard Worker   CopyablePtr<X> p1;
44*6dbdd20aSAndroid Build Coastguard Worker   p1->val = 1;
45*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_NE(p1.get(), nullptr);
46*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(&*p1, p1.get());
47*6dbdd20aSAndroid Build Coastguard Worker 
48*6dbdd20aSAndroid Build Coastguard Worker   CopyablePtr<X> p2(p1);
49*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_NE(p1.get(), nullptr);
50*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_NE(p2.get(), nullptr);
51*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_NE(p1.get(), p2.get());
52*6dbdd20aSAndroid Build Coastguard Worker 
53*6dbdd20aSAndroid Build Coastguard Worker   p2->val = 2;
54*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(p1->val, 1);
55*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(p2->val, 2);
56*6dbdd20aSAndroid Build Coastguard Worker 
57*6dbdd20aSAndroid Build Coastguard Worker   {
58*6dbdd20aSAndroid Build Coastguard Worker     CopyablePtr<X> p3;
59*6dbdd20aSAndroid Build Coastguard Worker     p3 = p1;
60*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(p3->val, 1);
61*6dbdd20aSAndroid Build Coastguard Worker 
62*6dbdd20aSAndroid Build Coastguard Worker     p3 = p2;
63*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(p3->val, 2);
64*6dbdd20aSAndroid Build Coastguard Worker 
65*6dbdd20aSAndroid Build Coastguard Worker     p3->val = 3;
66*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(p3->val, 3);
67*6dbdd20aSAndroid Build Coastguard Worker   }
68*6dbdd20aSAndroid Build Coastguard Worker 
69*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(p1->val, 1);
70*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(p2->val, 2);
71*6dbdd20aSAndroid Build Coastguard Worker }
72*6dbdd20aSAndroid Build Coastguard Worker 
TEST(CopyablePtrTest,MoveOperators)73*6dbdd20aSAndroid Build Coastguard Worker TEST(CopyablePtrTest, MoveOperators) {
74*6dbdd20aSAndroid Build Coastguard Worker   CopyablePtr<X> p1;
75*6dbdd20aSAndroid Build Coastguard Worker   p1->val = 1;
76*6dbdd20aSAndroid Build Coastguard Worker 
77*6dbdd20aSAndroid Build Coastguard Worker   CopyablePtr<X> p2(std::move(p1));
78*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(p2->val, 1);
79*6dbdd20aSAndroid Build Coastguard Worker 
80*6dbdd20aSAndroid Build Coastguard Worker   // The moved-from object needs to stay valid and non-null.
81*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(p1->val, 0);
82*6dbdd20aSAndroid Build Coastguard Worker   {
83*6dbdd20aSAndroid Build Coastguard Worker     CopyablePtr<X> p3;
84*6dbdd20aSAndroid Build Coastguard Worker     p3->val = 3;
85*6dbdd20aSAndroid Build Coastguard Worker     p1 = std::move(p3);
86*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(p1->val, 3);
87*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(p3->val, 0);
88*6dbdd20aSAndroid Build Coastguard Worker   }
89*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(p1->val, 3);
90*6dbdd20aSAndroid Build Coastguard Worker }
91*6dbdd20aSAndroid Build Coastguard Worker 
TEST(CopyablePtrTest,DeepCompare)92*6dbdd20aSAndroid Build Coastguard Worker TEST(CopyablePtrTest, DeepCompare) {
93*6dbdd20aSAndroid Build Coastguard Worker   CopyablePtr<X> p1;
94*6dbdd20aSAndroid Build Coastguard Worker   p1->val = 1;
95*6dbdd20aSAndroid Build Coastguard Worker 
96*6dbdd20aSAndroid Build Coastguard Worker   CopyablePtr<X> p2;
97*6dbdd20aSAndroid Build Coastguard Worker   p2->val = 2;
98*6dbdd20aSAndroid Build Coastguard Worker 
99*6dbdd20aSAndroid Build Coastguard Worker   CopyablePtr<X> p3;
100*6dbdd20aSAndroid Build Coastguard Worker   p3->val = -2;
101*6dbdd20aSAndroid Build Coastguard Worker 
102*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_NE(p1.get(), p2.get());
103*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_NE(p1.get(), p3.get());
104*6dbdd20aSAndroid Build Coastguard Worker 
105*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_FALSE(p1 == p2);
106*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_FALSE(p1 == p3);
107*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_FALSE(p2 == p3);
108*6dbdd20aSAndroid Build Coastguard Worker 
109*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_FALSE(p1 != p2);  // The operator!= is special, see above.
110*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_TRUE(p2 != p3);
111*6dbdd20aSAndroid Build Coastguard Worker 
112*6dbdd20aSAndroid Build Coastguard Worker   p1->val = -2;
113*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_TRUE(p1 != p2);
114*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_FALSE(p1 == p2);
115*6dbdd20aSAndroid Build Coastguard Worker }
116*6dbdd20aSAndroid Build Coastguard Worker 
117*6dbdd20aSAndroid Build Coastguard Worker }  // namespace
118*6dbdd20aSAndroid Build Coastguard Worker }  // namespace protozero
119