xref: /aosp_15_r20/external/deqp/framework/delibs/decpp/deUniquePtr.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements C++ Base Library
3*35238bceSAndroid Build Coastguard Worker  * -----------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief Unique pointer.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "deUniquePtr.hpp"
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include <exception>
27*35238bceSAndroid Build Coastguard Worker 
28*35238bceSAndroid Build Coastguard Worker namespace de
29*35238bceSAndroid Build Coastguard Worker {
30*35238bceSAndroid Build Coastguard Worker 
31*35238bceSAndroid Build Coastguard Worker namespace
32*35238bceSAndroid Build Coastguard Worker {
33*35238bceSAndroid Build Coastguard Worker 
34*35238bceSAndroid Build Coastguard Worker class Object
35*35238bceSAndroid Build Coastguard Worker {
36*35238bceSAndroid Build Coastguard Worker public:
Object(bool & exists)37*35238bceSAndroid Build Coastguard Worker     Object(bool &exists) : m_exists(exists)
38*35238bceSAndroid Build Coastguard Worker     {
39*35238bceSAndroid Build Coastguard Worker         m_exists = true;
40*35238bceSAndroid Build Coastguard Worker     }
41*35238bceSAndroid Build Coastguard Worker 
~Object(void)42*35238bceSAndroid Build Coastguard Worker     ~Object(void)
43*35238bceSAndroid Build Coastguard Worker     {
44*35238bceSAndroid Build Coastguard Worker         m_exists = false;
45*35238bceSAndroid Build Coastguard Worker     }
46*35238bceSAndroid Build Coastguard Worker 
47*35238bceSAndroid Build Coastguard Worker private:
48*35238bceSAndroid Build Coastguard Worker     bool &m_exists;
49*35238bceSAndroid Build Coastguard Worker };
50*35238bceSAndroid Build Coastguard Worker 
51*35238bceSAndroid Build Coastguard Worker struct CustomDeleter
52*35238bceSAndroid Build Coastguard Worker {
CustomDeleterde::__anon90d808610111::CustomDeleter53*35238bceSAndroid Build Coastguard Worker     CustomDeleter(bool *called) : m_called(called)
54*35238bceSAndroid Build Coastguard Worker     {
55*35238bceSAndroid Build Coastguard Worker     }
56*35238bceSAndroid Build Coastguard Worker 
operator ()de::__anon90d808610111::CustomDeleter57*35238bceSAndroid Build Coastguard Worker     void operator()(Object *ptr)
58*35238bceSAndroid Build Coastguard Worker     {
59*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(!*m_called);
60*35238bceSAndroid Build Coastguard Worker         delete ptr;
61*35238bceSAndroid Build Coastguard Worker         *m_called = true;
62*35238bceSAndroid Build Coastguard Worker     }
63*35238bceSAndroid Build Coastguard Worker 
64*35238bceSAndroid Build Coastguard Worker     bool *m_called;
65*35238bceSAndroid Build Coastguard Worker };
66*35238bceSAndroid Build Coastguard Worker 
createObject(bool & exists)67*35238bceSAndroid Build Coastguard Worker MovePtr<Object> createObject(bool &exists)
68*35238bceSAndroid Build Coastguard Worker {
69*35238bceSAndroid Build Coastguard Worker     UniquePtr<Object> objectPtr(new Object(exists));
70*35238bceSAndroid Build Coastguard Worker     return objectPtr.move();
71*35238bceSAndroid Build Coastguard Worker }
72*35238bceSAndroid Build Coastguard Worker 
73*35238bceSAndroid Build Coastguard Worker } // namespace
74*35238bceSAndroid Build Coastguard Worker 
UniquePtr_selfTest(void)75*35238bceSAndroid Build Coastguard Worker void UniquePtr_selfTest(void)
76*35238bceSAndroid Build Coastguard Worker {
77*35238bceSAndroid Build Coastguard Worker     // Basic test.
78*35238bceSAndroid Build Coastguard Worker     {
79*35238bceSAndroid Build Coastguard Worker         bool exists = false;
80*35238bceSAndroid Build Coastguard Worker         {
81*35238bceSAndroid Build Coastguard Worker             UniquePtr<Object> ptr(new Object(exists));
82*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(exists);
83*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(ptr.get() != DE_NULL);
84*35238bceSAndroid Build Coastguard Worker         }
85*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(!exists);
86*35238bceSAndroid Build Coastguard Worker     }
87*35238bceSAndroid Build Coastguard Worker 
88*35238bceSAndroid Build Coastguard Worker     // Exception test.
89*35238bceSAndroid Build Coastguard Worker     {
90*35238bceSAndroid Build Coastguard Worker         bool exists = false;
91*35238bceSAndroid Build Coastguard Worker         try
92*35238bceSAndroid Build Coastguard Worker         {
93*35238bceSAndroid Build Coastguard Worker             UniquePtr<Object> ptr(new Object(exists));
94*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(exists);
95*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(ptr.get() != DE_NULL);
96*35238bceSAndroid Build Coastguard Worker             throw std::exception();
97*35238bceSAndroid Build Coastguard Worker         }
98*35238bceSAndroid Build Coastguard Worker         catch (const std::exception &)
99*35238bceSAndroid Build Coastguard Worker         {
100*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(!exists);
101*35238bceSAndroid Build Coastguard Worker         }
102*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(!exists);
103*35238bceSAndroid Build Coastguard Worker     }
104*35238bceSAndroid Build Coastguard Worker 
105*35238bceSAndroid Build Coastguard Worker     // Expression test.
106*35238bceSAndroid Build Coastguard Worker     {
107*35238bceSAndroid Build Coastguard Worker         bool exists = false;
108*35238bceSAndroid Build Coastguard Worker         bool test   = (UniquePtr<Object>(new Object(exists))).get() != DE_NULL && exists;
109*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(!exists);
110*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(test);
111*35238bceSAndroid Build Coastguard Worker     }
112*35238bceSAndroid Build Coastguard Worker 
113*35238bceSAndroid Build Coastguard Worker     // Custom deleter.
114*35238bceSAndroid Build Coastguard Worker     {
115*35238bceSAndroid Build Coastguard Worker         bool exists        = false;
116*35238bceSAndroid Build Coastguard Worker         bool deleterCalled = false;
117*35238bceSAndroid Build Coastguard Worker         {
118*35238bceSAndroid Build Coastguard Worker             UniquePtr<Object, CustomDeleter> ptr(new Object(exists), CustomDeleter(&deleterCalled));
119*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(exists);
120*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(!deleterCalled);
121*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(ptr.get() != DE_NULL);
122*35238bceSAndroid Build Coastguard Worker         }
123*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(!exists);
124*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(deleterCalled);
125*35238bceSAndroid Build Coastguard Worker     }
126*35238bceSAndroid Build Coastguard Worker 
127*35238bceSAndroid Build Coastguard Worker     // MovePtr -> MovePtr moving
128*35238bceSAndroid Build Coastguard Worker     {
129*35238bceSAndroid Build Coastguard Worker         bool exists = false;
130*35238bceSAndroid Build Coastguard Worker         MovePtr<Object> ptr(new Object(exists));
131*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(exists);
132*35238bceSAndroid Build Coastguard Worker         {
133*35238bceSAndroid Build Coastguard Worker             MovePtr<Object> ptr2 = ptr;
134*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(exists);
135*35238bceSAndroid Build Coastguard Worker             // Ownership moved to ptr2, should be deleted when ptr2 goes out of scope.
136*35238bceSAndroid Build Coastguard Worker         }
137*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(!exists);
138*35238bceSAndroid Build Coastguard Worker     }
139*35238bceSAndroid Build Coastguard Worker 
140*35238bceSAndroid Build Coastguard Worker     // UniquePtr -> MovePtr moving
141*35238bceSAndroid Build Coastguard Worker     {
142*35238bceSAndroid Build Coastguard Worker         bool exists = false;
143*35238bceSAndroid Build Coastguard Worker         UniquePtr<Object> ptr(new Object(exists));
144*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(exists);
145*35238bceSAndroid Build Coastguard Worker         {
146*35238bceSAndroid Build Coastguard Worker             MovePtr<Object> ptr2 = ptr.move();
147*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(exists);
148*35238bceSAndroid Build Coastguard Worker             // Ownership moved to ptr2, should be deleted when ptr2 goes out of scope.
149*35238bceSAndroid Build Coastguard Worker         }
150*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(!exists);
151*35238bceSAndroid Build Coastguard Worker     }
152*35238bceSAndroid Build Coastguard Worker 
153*35238bceSAndroid Build Coastguard Worker     // MovePtr -> UniquePtr moving
154*35238bceSAndroid Build Coastguard Worker     {
155*35238bceSAndroid Build Coastguard Worker         bool exists = false;
156*35238bceSAndroid Build Coastguard Worker         {
157*35238bceSAndroid Build Coastguard Worker             UniquePtr<Object> ptr(createObject(exists));
158*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(exists);
159*35238bceSAndroid Build Coastguard Worker         }
160*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(!exists);
161*35238bceSAndroid Build Coastguard Worker     }
162*35238bceSAndroid Build Coastguard Worker 
163*35238bceSAndroid Build Coastguard Worker     // MovePtr assignment
164*35238bceSAndroid Build Coastguard Worker     {
165*35238bceSAndroid Build Coastguard Worker         bool exists1 = false;
166*35238bceSAndroid Build Coastguard Worker         bool exists2 = false;
167*35238bceSAndroid Build Coastguard Worker         MovePtr<Object> ptr1(new Object(exists1));
168*35238bceSAndroid Build Coastguard Worker         MovePtr<Object> ptr2(new Object(exists2));
169*35238bceSAndroid Build Coastguard Worker         ptr1 = ptr2;
170*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(!exists1);
171*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(exists2);
172*35238bceSAndroid Build Coastguard Worker     }
173*35238bceSAndroid Build Coastguard Worker 
174*35238bceSAndroid Build Coastguard Worker     // MovePtr stealing
175*35238bceSAndroid Build Coastguard Worker     {
176*35238bceSAndroid Build Coastguard Worker         bool exists = false;
177*35238bceSAndroid Build Coastguard Worker         Object *raw = DE_NULL;
178*35238bceSAndroid Build Coastguard Worker         {
179*35238bceSAndroid Build Coastguard Worker             MovePtr<Object> ptr1(new Object(exists));
180*35238bceSAndroid Build Coastguard Worker             raw = ptr1.release();
181*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(raw != DE_NULL);
182*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(ptr1.get() == DE_NULL);
183*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(exists);
184*35238bceSAndroid Build Coastguard Worker         }
185*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(exists);
186*35238bceSAndroid Build Coastguard Worker         delete raw;
187*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(!exists);
188*35238bceSAndroid Build Coastguard Worker     }
189*35238bceSAndroid Build Coastguard Worker 
190*35238bceSAndroid Build Coastguard Worker     // Null MovePtr and assigning to it.
191*35238bceSAndroid Build Coastguard Worker     {
192*35238bceSAndroid Build Coastguard Worker         bool exists = false;
193*35238bceSAndroid Build Coastguard Worker         {
194*35238bceSAndroid Build Coastguard Worker             MovePtr<Object> ptr1;
195*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(ptr1.get() == DE_NULL);
196*35238bceSAndroid Build Coastguard Worker             MovePtr<Object> ptr2(new Object(exists));
197*35238bceSAndroid Build Coastguard Worker             ptr1 = ptr2;
198*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(exists);
199*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(ptr1.get() != DE_NULL);
200*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(ptr2.get() == DE_NULL);
201*35238bceSAndroid Build Coastguard Worker         }
202*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(!exists);
203*35238bceSAndroid Build Coastguard Worker     }
204*35238bceSAndroid Build Coastguard Worker 
205*35238bceSAndroid Build Coastguard Worker #if 0
206*35238bceSAndroid Build Coastguard Worker     // UniquePtr assignment or copy construction should not compile. This
207*35238bceSAndroid Build Coastguard Worker     // piece of code is intentionally commented out. To manually test that
208*35238bceSAndroid Build Coastguard Worker     // copying a UniquePtr is statically forbidden, uncomment and try to
209*35238bceSAndroid Build Coastguard Worker     // compile.
210*35238bceSAndroid Build Coastguard Worker     {
211*35238bceSAndroid Build Coastguard Worker         bool exists = false;
212*35238bceSAndroid Build Coastguard Worker         UniquePtr<Object> ptr(new Object(exists));
213*35238bceSAndroid Build Coastguard Worker         {
214*35238bceSAndroid Build Coastguard Worker             UniquePtr<Object> ptr2(ptr);
215*35238bceSAndroid Build Coastguard Worker             DE_TEST_ASSERT(exists);
216*35238bceSAndroid Build Coastguard Worker         }
217*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(!exists);
218*35238bceSAndroid Build Coastguard Worker     }
219*35238bceSAndroid Build Coastguard Worker #endif
220*35238bceSAndroid Build Coastguard Worker }
221*35238bceSAndroid Build Coastguard Worker 
222*35238bceSAndroid Build Coastguard Worker } // namespace de
223