• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. 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 
22 struct test_deleter_base
23 {
24     static int count;
25     static int dealloc_count;
26 };
27 
28 int test_deleter_base::count = 0;
29 int test_deleter_base::dealloc_count = 0;
30 
31 template <class T>
32 class test_deleter
33     : public test_deleter_base
34 {
35     int state_;
36 
37 public:
38 
test_deleter()39     test_deleter() : state_(0) {++count;}
test_deleter(int s)40     explicit test_deleter(int s) : state_(s) {++count;}
test_deleter(const test_deleter & d)41     test_deleter(const test_deleter& d)
42         : state_(d.state_) {++count;}
~test_deleter()43     ~test_deleter() {assert(state_ >= 0); --count; state_ = -1;}
44 
state()45     int state() const {return state_;}
set_state(int i)46     void set_state(int i) {state_ = i;}
47 
operator()48     void operator()(T* p) {assert(state_ >= 0); ++dealloc_count; delete p;}
49 };
50 
51 template <class T>
52 void
swap(test_deleter<T> & x,test_deleter<T> & y)53 swap(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  // DELETER_H
61