get_deleter.pass.cpp revision f5256e16dfc425c1d466f6308d4026d529ce9e0b
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// License. See LICENSE.TXT for details.
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <memory>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// shared_ptr
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// template<class D, class T> D* get_deleter(const shared_ptr<T>& p);
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <memory>
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <cassert>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../test_deleter.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct A
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static int count;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    A() {++count;}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    A(const A&) {++count;}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~A() {--count;}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int A::count = 0;
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main()
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            A* ptr = new A;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            std::shared_ptr<A> p(ptr, test_deleter<A>(3));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            test_deleter<A>* d = std::get_deleter<test_deleter<A> >(p);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assert(test_deleter<A>::count == 1);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assert(test_deleter<A>::dealloc_count == 0);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assert(d);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assert(d->state() == 3);
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert(A::count == 0);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert(test_deleter<A>::count == 0);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert(test_deleter<A>::dealloc_count == 1);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_deleter<A>::dealloc_count = 0;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            std::shared_ptr<A> p(nullptr, test_deleter<A>(3));
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            test_deleter<A>* d = std::get_deleter<test_deleter<A> >(p);
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            assert(test_deleter<A>::count == 1);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assert(test_deleter<A>::dealloc_count == 0);
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assert(d);
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assert(d->state() == 3);
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert(A::count == 0);
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert(test_deleter<A>::count == 0);
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert(test_deleter<A>::dealloc_count == 1);
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test_deleter<A>::dealloc_count = 0;
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::shared_ptr<A> p(nullptr, test_deleter<A>(3));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::default_delete<A>* d = std::get_deleter<std::default_delete<A> >(p);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert(d == 0);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)