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)