get_deleter.pass.cpp revision c52f43e72dfcea03037729649da84c23b3beb04a
1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//===----------------------------------------------------------------------===//
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//                     The LLVM Compiler Infrastructure
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This file is distributed under the University of Illinois Open Source
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// License. See LICENSE.TXT for details.
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//===----------------------------------------------------------------------===//
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// <memory>
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// shared_ptr
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// template<class D, class T> D* get_deleter(const shared_ptr<T>& p);
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <memory>
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <cassert>
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "../test_deleter.h"
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct A
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    static int count;
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    A() {++count;}
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    A(const A&) {++count;}
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    ~A() {--count;}
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov};
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint A::count = 0;
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main()
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        {
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            A* ptr = new A;
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            std::shared_ptr<A> p(ptr, test_deleter<A>(3));
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            test_deleter<A>* d = std::get_deleter<test_deleter<A> >(p);
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            assert(test_deleter<A>::count == 1);
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            assert(test_deleter<A>::dealloc_count == 0);
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            assert(d);
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            assert(d->state() == 3);
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        }
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        assert(A::count == 0);
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        assert(test_deleter<A>::count == 0);
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        assert(test_deleter<A>::dealloc_count == 1);
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    test_deleter<A>::dealloc_count = 0;
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        {
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            std::shared_ptr<A> p(nullptr, test_deleter<A>(3));
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            test_deleter<A>* d = std::get_deleter<test_deleter<A> >(p);
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            assert(test_deleter<A>::count == 1);
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            assert(test_deleter<A>::dealloc_count == 0);
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            assert(d);
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            assert(d->state() == 3);
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        }
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        assert(A::count == 0);
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        assert(test_deleter<A>::count == 0);
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        assert(test_deleter<A>::dealloc_count == 1);
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    test_deleter<A>::dealloc_count = 0;
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std::shared_ptr<A> p(nullptr, test_deleter<A>(3));
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std::default_delete<A>* d = std::get_deleter<std::default_delete<A> >(p);
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        assert(d == 0);
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown