15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int num = 0; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string history; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Class which tracks allocation/deallocation 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct A { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A(): mynum(num++) { history += base::StringPrintf("A%d ctor\n", mynum); } 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~A() { history += base::StringPrintf("A%d dtor\n", mynum); } 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Use() { history += base::StringPrintf("A%d use\n", mynum); } 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mynum; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subclass 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct B: public A { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B() { history += base::StringPrintf("B%d ctor\n", mynum); } 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~B() { history += base::StringPrintf("B%d dtor\n", mynum); } 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Use() OVERRIDE { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history += base::StringPrintf("B%d use\n", mynum); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LinkedPtrTest, Test) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<A> a0, a1, a2; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a0 = a0; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a1 = a2; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(a0.get(), static_cast<A*>(NULL)); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(a1.get(), static_cast<A*>(NULL)); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(a2.get(), static_cast<A*>(NULL)); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(a0 == NULL); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(a1 == NULL); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(a2 == NULL); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<A> a3(new A); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a0 = a3; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(a0 == a3); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(a0 != NULL); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(a0.get() == a3); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(a0 == a3.get()); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<A> a4(a0); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a1 = a4; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<A> a5(new A); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(a5.get() != a3); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(a5 != a3.get()); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a2 = a5; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<B> b0(new B); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<A> a6(b0); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(b0 == a6); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(a6 == b0); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(b0 != NULL); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a5 = b0; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a5 = b0; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a3->Use(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a4->Use(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a5->Use(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a6->Use(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b0->Use(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*b0).Use(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b0.get()->Use(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a0->Use(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a1->Use(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a2->Use(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a1 = a2; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a2.reset(new A); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a0.reset(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<A> a7; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(history, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "A0 ctor\n" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "A1 ctor\n" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "A2 ctor\n" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "B2 ctor\n" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "A0 use\n" 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "A0 use\n" 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "B2 use\n" 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "B2 use\n" 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "B2 use\n" 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "B2 use\n" 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "B2 use\n" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "B2 dtor\n" 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "A2 dtor\n" 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "A0 use\n" 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "A0 use\n" 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "A1 use\n" 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "A3 ctor\n" 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "A0 dtor\n" 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "A3 dtor\n" 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "A1 dtor\n" 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 111