1c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===// 2c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 3c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// The LLVM Compiler Infrastructure 4c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 8c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===// 9c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 10c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// <memory> 11c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 12c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// weak_ptr 13c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 14c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// weak_ptr(const weak_ptr& r); 1523ef15161479092c88ef24a6f8c80ca54119367aMarshall Clow// weak_ptr(weak_ptr &&r) 16c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 17c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <memory> 18c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <type_traits> 19c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <cassert> 20c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 21c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct B 22c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 23c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant static int count; 24c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 25c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant B() {++count;} 26c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant B(const B&) {++count;} 27c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant virtual ~B() {--count;} 28c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}; 29c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 30c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint B::count = 0; 31c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 32c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct A 33c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant : public B 34c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 35c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant static int count; 36c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 37c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant A() {++count;} 38c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant A(const A&) {++count;} 39c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant ~A() {--count;} 40c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}; 41c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 42c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint A::count = 0; 43c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 44c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct C 45c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 46c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant static int count; 47c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 48c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant C() {++count;} 49c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant C(const C&) {++count;} 50c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant virtual ~C() {--count;} 51c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}; 52c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 53c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint C::count = 0; 54c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 5523ef15161479092c88ef24a6f8c80ca54119367aMarshall Clowtemplate <class T> 5623ef15161479092c88ef24a6f8c80ca54119367aMarshall Clowstd::weak_ptr<T> source (std::shared_ptr<T> p) { return std::weak_ptr<T>(p); } 5723ef15161479092c88ef24a6f8c80ca54119367aMarshall Clow 5823ef15161479092c88ef24a6f8c80ca54119367aMarshall Clowtemplate <class T> 5923ef15161479092c88ef24a6f8c80ca54119367aMarshall Clowvoid sink (std::weak_ptr<T> &&) {} 6023ef15161479092c88ef24a6f8c80ca54119367aMarshall Clow 61c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint main() 62c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 63c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 64c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant const std::shared_ptr<A> ps(new A); 65c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant const std::weak_ptr<A> pA(ps); 66c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(pA.use_count() == 1); 67c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(B::count == 1); 68c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A::count == 1); 69c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 70c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::weak_ptr<A> pB(pA); 71c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(B::count == 1); 72c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A::count == 1); 73c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(pB.use_count() == 1); 74c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(pA.use_count() == 1); 75c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 76c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(pA.use_count() == 1); 77c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(B::count == 1); 78c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A::count == 1); 79c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 80c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(B::count == 0); 81c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A::count == 0); 82c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 83c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::weak_ptr<A> pA; 84c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(pA.use_count() == 0); 85c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(B::count == 0); 86c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A::count == 0); 87c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 88c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::weak_ptr<A> pB(pA); 89c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(B::count == 0); 90c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A::count == 0); 91c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(pB.use_count() == 0); 92c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(pA.use_count() == 0); 93c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 94c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(pA.use_count() == 0); 95c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(B::count == 0); 96c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A::count == 0); 97c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 98c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(B::count == 0); 99c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A::count == 0); 10023ef15161479092c88ef24a6f8c80ca54119367aMarshall Clow 10123ef15161479092c88ef24a6f8c80ca54119367aMarshall Clow { 10223ef15161479092c88ef24a6f8c80ca54119367aMarshall Clow std::shared_ptr<A> ps(new A); 10323ef15161479092c88ef24a6f8c80ca54119367aMarshall Clow std::weak_ptr<A> pA = source(ps); 10423ef15161479092c88ef24a6f8c80ca54119367aMarshall Clow assert(pA.use_count() == 1); 10523ef15161479092c88ef24a6f8c80ca54119367aMarshall Clow assert(A::count == 1); 10623ef15161479092c88ef24a6f8c80ca54119367aMarshall Clow sink(std::move(pA)); // kill off the weak pointer 10723ef15161479092c88ef24a6f8c80ca54119367aMarshall Clow } 10823ef15161479092c88ef24a6f8c80ca54119367aMarshall Clow assert(B::count == 0); 10923ef15161479092c88ef24a6f8c80ca54119367aMarshall Clow assert(A::count == 0); 110c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 111