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 WorkerMovePtr<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 Workervoid 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