shared_ptr_pointer.pass.cpp revision c52f43e72dfcea03037729649da84c23b3beb04a
12ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson//===----------------------------------------------------------------------===// 22ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// 32ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// The LLVM Compiler Infrastructure 42ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// 52ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// This file is distributed under the University of Illinois Open Source 62ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// License. See LICENSE.TXT for details. 72ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// 82ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson//===----------------------------------------------------------------------===// 92ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 102ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// <memory> 112ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 122ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// shared_ptr 132ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 142ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p); 152ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 162ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <memory> 172ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include <cassert> 182ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 192ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonstruct B 202ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson{ 212ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson static int count; 222ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 232ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson B() {++count;} 242ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson B(const B&) {++count;} 252ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson ~B() {--count;} 262ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}; 272ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 282ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonint B::count = 0; 292ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 302ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonstruct A 312ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson{ 322ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson static int count; 332ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 342ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson A() {++count;} 352ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson A(const A&) {++count;} 362ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson ~A() {--count;} 372ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}; 382ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 392ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonint A::count = 0; 402ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 412ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonint main() 422ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson{ 432ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson { 442ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson std::shared_ptr<A> pA(new A); 452ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson assert(pA.use_count() == 1); 462ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson { 472ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson B b; 482ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson std::shared_ptr<B> pB(pA, &b); 492ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson assert(A::count == 1); 502ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson assert(B::count == 1); 512ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson assert(pA.use_count() == 2); 522ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson assert(pB.use_count() == 2); 532ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson assert(pB.get() == &b); 542ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson } 552ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson assert(pA.use_count() == 1); 562ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson assert(A::count == 1); 572ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson assert(B::count == 0); 582ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson } 592ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson assert(A::count == 0); 602ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson assert(B::count == 0); 612ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson} 622ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson