1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//===----------------------------------------------------------------------===// 2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// 3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// The LLVM Compiler Infrastructure 4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// 5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// This file is dual licensed under the MIT and the University of Illinois Open 6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// Source Licenses. See LICENSE.TXT for details. 7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// 8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//===----------------------------------------------------------------------===// 9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// <memory> 11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// weak_ptr 13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// template<class Y> weak_ptr& operator=(const weak_ptr<Y>& r); 15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project#include <memory> 17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project#include <type_traits> 18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project#include <cassert> 19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectstruct B 21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{ 22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project static int count; 23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project B() {++count;} 25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project B(const B&) {++count;} 26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project virtual ~B() {--count;} 27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project}; 28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectint B::count = 0; 30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectstruct A 32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project : public B 33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{ 34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project static int count; 35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project A() {++count;} 37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project A(const A&) {++count;} 38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project ~A() {--count;} 39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project}; 40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectint A::count = 0; 42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectint main() 44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{ 45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project const std::shared_ptr<A> ps(new A); 47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project const std::weak_ptr<A> pA(ps); 48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project std::weak_ptr<B> pB; 50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project pB = pA; 51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project assert(B::count == 1); 52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project assert(A::count == 1); 53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project assert(pB.use_count() == 1); 54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project assert(pA.use_count() == 1); 55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project assert(pA.use_count() == 1); 57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project assert(B::count == 1); 58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project assert(A::count == 1); 59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project assert(B::count == 0); 61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project assert(A::count == 0); 62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project const std::shared_ptr<A> ps(new A); 65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project std::weak_ptr<A> pA(ps); 66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project std::weak_ptr<B> pB; 68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project pB = std::move(pA); 69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project assert(B::count == 1); 70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project assert(A::count == 1); 71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project assert(pB.use_count() == 1); 72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project assert(B::count == 1); 74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project assert(A::count == 1); 75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project assert(B::count == 0); 77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project assert(A::count == 0); 78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} 79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project