summaryrefslogtreecommitdiff
path: root/src/weak_ptr.hh
blob: 5859d0c73d73202b7d1566512271cdf741d3768d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#ifndef WEAK_PTR_HH
#define WEAK_PTR_HH

#include <memory>

template <typename T>
class WeakPtr {
public:
  explicit WeakPtr(T* ptr)
    : ptr_(ptr) {}

  void unlink() {
    ptr_ = nullptr;
  }

  T* get() {
    return ptr_;
  }

private:
  T* ptr_;
};

template<typename T>
class WeakPtrOwner {
public:
  explicit WeakPtrOwner(T* ptr)
    : ptr_(std::make_shared<WeakPtr<T>>(ptr)) {}

  ~WeakPtrOwner() {
    ptr_->unlink();
  }

  std::shared_ptr<WeakPtr<T>> get() {
    return ptr_;
  }

private:
  std::shared_ptr<WeakPtr<T>> ptr_;
};

#endif  // WEAK_PTR_HH