131682d32SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 331682d32SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 431682d32SAndrew Rist * or more contributor license agreements. See the NOTICE file 531682d32SAndrew Rist * distributed with this work for additional information 631682d32SAndrew Rist * regarding copyright ownership. The ASF licenses this file 731682d32SAndrew Rist * to you under the Apache License, Version 2.0 (the 831682d32SAndrew Rist * "License"); you may not use this file except in compliance 931682d32SAndrew Rist * with the License. You may obtain a copy of the License at 1031682d32SAndrew Rist * 1131682d32SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 1231682d32SAndrew Rist * 1331682d32SAndrew Rist * Unless required by applicable law or agreed to in writing, 1431682d32SAndrew Rist * software distributed under the License is distributed on an 1531682d32SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 1631682d32SAndrew Rist * KIND, either express or implied. See the License for the 1731682d32SAndrew Rist * specific language governing permissions and limitations 1831682d32SAndrew Rist * under the License. 1931682d32SAndrew Rist * 2031682d32SAndrew Rist *************************************************************/ 2131682d32SAndrew Rist 2231682d32SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #include "preextstl.h" 25*18cf0442SDamjan Jovanovic #include "gtest/gtest.h" 26cdf0e10cSrcweir #include "postextstl.h" 27cdf0e10cSrcweir 28cdf0e10cSrcweir #include <o3tl/heap_ptr.hxx> 29cdf0e10cSrcweir 30cdf0e10cSrcweir 31cdf0e10cSrcweir 32cdf0e10cSrcweir 33cdf0e10cSrcweir using o3tl::heap_ptr; 34cdf0e10cSrcweir 35cdf0e10cSrcweir 36cdf0e10cSrcweir class Help 37cdf0e10cSrcweir { 38cdf0e10cSrcweir public: Help(int i_n)39cdf0e10cSrcweir explicit Help( 40cdf0e10cSrcweir int i_n ) 41cdf0e10cSrcweir : n(i_n) { ++nInstanceCount_; } ~Help()42cdf0e10cSrcweir ~Help() { --nInstanceCount_; } Value() const43cdf0e10cSrcweir int Value() const { return n; } InstanceCount_()44cdf0e10cSrcweir static int InstanceCount_() { return nInstanceCount_; } 45cdf0e10cSrcweir 46cdf0e10cSrcweir private: 47cdf0e10cSrcweir int n; 48cdf0e10cSrcweir static int nInstanceCount_; 49cdf0e10cSrcweir }; 50cdf0e10cSrcweir int Help::nInstanceCount_ = 0; 51cdf0e10cSrcweir 52cdf0e10cSrcweir 53*18cf0442SDamjan Jovanovic class heap_ptr_test : public ::testing::Test 54cdf0e10cSrcweir { 55cdf0e10cSrcweir public: 56*18cf0442SDamjan Jovanovic }; // class heap_ptr_test 57*18cf0442SDamjan Jovanovic TEST_F(heap_ptr_test,global)58*18cf0442SDamjan JovanovicTEST_F(heap_ptr_test, global) 59*18cf0442SDamjan Jovanovic { 60*18cf0442SDamjan Jovanovic // Construction 61*18cf0442SDamjan Jovanovic heap_ptr<Help> 62*18cf0442SDamjan Jovanovic t_empty; 63*18cf0442SDamjan Jovanovic const heap_ptr<Help> 64*18cf0442SDamjan Jovanovic t0( new Help(7000) ); 65*18cf0442SDamjan Jovanovic heap_ptr<Help> 66*18cf0442SDamjan Jovanovic t1( new Help(10) ); 67*18cf0442SDamjan Jovanovic heap_ptr<Help> 68*18cf0442SDamjan Jovanovic t2( new Help(20) ); 69*18cf0442SDamjan Jovanovic 70*18cf0442SDamjan Jovanovic int nHelpCount = 3; 71*18cf0442SDamjan Jovanovic 72*18cf0442SDamjan Jovanovic ASSERT_TRUE(! t_empty.is()) << "ctor1"; 73*18cf0442SDamjan Jovanovic ASSERT_TRUE(t0.is()) << "ctor2"; 74*18cf0442SDamjan Jovanovic ASSERT_TRUE((*t0).Value() == 7000) << "ctor3"; 75*18cf0442SDamjan Jovanovic ASSERT_TRUE(t0->Value() == 7000) << "ctor4"; 76*18cf0442SDamjan Jovanovic ASSERT_TRUE(t0.get() == t0.operator->()) << "ctor5"; 77*18cf0442SDamjan Jovanovic ASSERT_TRUE(t0.get() == &(*t0)) << "ctor6"; 78*18cf0442SDamjan Jovanovic 79*18cf0442SDamjan Jovanovic ASSERT_TRUE(t1.is()) << "ctor7"; 80*18cf0442SDamjan Jovanovic ASSERT_TRUE((*t1).Value() == 10) << "ctor8"; 81*18cf0442SDamjan Jovanovic ASSERT_TRUE(t1->Value() == 10) << "ctor9"; 82*18cf0442SDamjan Jovanovic ASSERT_TRUE(t1.get() == t1.operator->()) << "ctor10"; 83*18cf0442SDamjan Jovanovic ASSERT_TRUE(t1.get() == &(*t1)) << "ctor11"; 84*18cf0442SDamjan Jovanovic 85*18cf0442SDamjan Jovanovic ASSERT_TRUE(t2.operator*().Value() == 20) << "ctor12"; 86*18cf0442SDamjan Jovanovic ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "ctor13"; 87*18cf0442SDamjan Jovanovic 88*18cf0442SDamjan Jovanovic 89*18cf0442SDamjan Jovanovic // Operator safe_bool() / bool() 90*18cf0442SDamjan Jovanovic ASSERT_TRUE(! t_empty) << "bool1"; 91*18cf0442SDamjan Jovanovic ASSERT_TRUE(t0) << "bool2"; 92*18cf0442SDamjan Jovanovic ASSERT_TRUE(t1.is() == static_cast<bool>(t1)) << "bool3"; 93*18cf0442SDamjan Jovanovic 94*18cf0442SDamjan Jovanovic 95*18cf0442SDamjan Jovanovic // Assignment, reset() and release() 96*18cf0442SDamjan Jovanovic // Release 97*18cf0442SDamjan Jovanovic Help * hp = t1.release(); 98*18cf0442SDamjan Jovanovic ASSERT_TRUE(! t1.is()) << "release1"; 99*18cf0442SDamjan Jovanovic ASSERT_TRUE(t1.get() == 0) << "release2"; 100*18cf0442SDamjan Jovanovic ASSERT_TRUE(t1.operator->() == 0) << "release3"; 101*18cf0442SDamjan Jovanovic ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "release4"; 102*18cf0442SDamjan Jovanovic 103*18cf0442SDamjan Jovanovic // operator=() 104*18cf0442SDamjan Jovanovic t_empty = hp; 105*18cf0442SDamjan Jovanovic ASSERT_TRUE(t_empty.is()) << "assign1"; 106*18cf0442SDamjan Jovanovic ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "assign2"; 107*18cf0442SDamjan Jovanovic 108*18cf0442SDamjan Jovanovic t1 = t_empty.release(); 109*18cf0442SDamjan Jovanovic ASSERT_TRUE(t1.is()) << "assign3"; 110*18cf0442SDamjan Jovanovic ASSERT_TRUE(! t_empty.is()) << "assign4"; 111*18cf0442SDamjan Jovanovic ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "assign5"; 112*18cf0442SDamjan Jovanovic 113*18cf0442SDamjan Jovanovic // reset() 114*18cf0442SDamjan Jovanovic hp = new Help(30); 115*18cf0442SDamjan Jovanovic ++nHelpCount; 116*18cf0442SDamjan Jovanovic 117*18cf0442SDamjan Jovanovic t_empty.reset(hp); 118*18cf0442SDamjan Jovanovic ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "reset1"; 119*18cf0442SDamjan Jovanovic ASSERT_TRUE(t_empty.is()) << "reset2"; 120*18cf0442SDamjan Jovanovic ASSERT_TRUE(t_empty.get() == hp) << "reset3"; 121*18cf0442SDamjan Jovanovic 122*18cf0442SDamjan Jovanovic // Ignore second assignment 123*18cf0442SDamjan Jovanovic t_empty = hp; 124*18cf0442SDamjan Jovanovic ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "selfassign1"; 125*18cf0442SDamjan Jovanovic ASSERT_TRUE(t_empty.is()) << "selfassign2"; 126*18cf0442SDamjan Jovanovic ASSERT_TRUE(t_empty.get() == hp) << "selfassign3"; 127*18cf0442SDamjan Jovanovic 128*18cf0442SDamjan Jovanovic t_empty.reset(0); 129*18cf0442SDamjan Jovanovic hp = 0; 130*18cf0442SDamjan Jovanovic --nHelpCount; 131*18cf0442SDamjan Jovanovic ASSERT_TRUE(! t_empty.is()) << "reset4"; 132*18cf0442SDamjan Jovanovic ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "reset5"; 133*18cf0442SDamjan Jovanovic 134*18cf0442SDamjan Jovanovic 135*18cf0442SDamjan Jovanovic // swap 136*18cf0442SDamjan Jovanovic t1.swap(t2); 137*18cf0442SDamjan Jovanovic ASSERT_TRUE(t1->Value() == 20) << "swap1"; 138*18cf0442SDamjan Jovanovic ASSERT_TRUE(t2->Value() == 10) << "swap2"; 139*18cf0442SDamjan Jovanovic ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "swap3"; 140*18cf0442SDamjan Jovanovic 141*18cf0442SDamjan Jovanovic o3tl::swap(t1,t2); 142*18cf0442SDamjan Jovanovic ASSERT_TRUE(t1->Value() == 10) << "swap4"; 143*18cf0442SDamjan Jovanovic ASSERT_TRUE(t2->Value() == 20) << "swap5"; 144*18cf0442SDamjan Jovanovic ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "swap6"; 145*18cf0442SDamjan Jovanovic 146*18cf0442SDamjan Jovanovic // RAII 147cdf0e10cSrcweir { 148cdf0e10cSrcweir heap_ptr<Help> 149*18cf0442SDamjan Jovanovic t_raii( new Help(55) ); 150*18cf0442SDamjan Jovanovic ASSERT_TRUE(Help::InstanceCount_() == nHelpCount + 1) << "raii1"; 151cdf0e10cSrcweir } 152*18cf0442SDamjan Jovanovic ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "raii2"; 153*18cf0442SDamjan Jovanovic } 154cdf0e10cSrcweir 155cdf0e10cSrcweir 156