test_deleter.h revision bc8d3f97eb5c958007f2713238472e0c1c8fe02c
1//===----------------------------------------------------------------------===// 2// 3// ��������������������The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10// <memory> 11 12// shared_ptr 13 14// Example move-only deleter 15 16#ifndef DELETER_H 17#define DELETER_H 18 19#include <type_traits> 20#include <cassert> 21 22struct test_deleter_base 23{ 24 static int count; 25 static int dealloc_count; 26}; 27 28int test_deleter_base::count = 0; 29int test_deleter_base::dealloc_count = 0; 30 31template <class T> 32class test_deleter 33 : public test_deleter_base 34{ 35 int state_; 36 37public: 38 39 test_deleter() : state_(0) {++count;} 40 explicit test_deleter(int s) : state_(s) {++count;} 41 test_deleter(const test_deleter& d) 42 : state_(d.state_) {++count;} 43 ~test_deleter() {assert(state_ >= 0); --count; state_ = -1;} 44 45 int state() const {return state_;} 46 void set_state(int i) {state_ = i;} 47 48 void operator()(T* p) {assert(state_ >= 0); ++dealloc_count; delete p;} 49}; 50 51template <class T> 52void 53swap(test_deleter<T>& x, test_deleter<T>& y) 54{ 55 test_deleter<T> t(std::move(x)); 56 x = std::move(y); 57 y = std::move(t); 58} 59 60#endif 61