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