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