Pottu
memory.hpp
Go to the documentation of this file.
1 
6 #ifndef H_POTTU_MEMORY
7 #define H_POTTU_MEMORY
8 
9 
10 namespace pottu {
11 
18  public:
19  void _increaseRefCount() noexcept {
20  ++_sharedCounter;
21  }
22  void _decreaseRefCount() noexcept {
23  assert( _sharedCounter > 0 );
24  --_sharedCounter;
25  }
26  size_t _getRefCount() const noexcept { return _sharedCounter; }
27  private:
28  size_t _sharedCounter{0};
29  };
30 
31 
32 
42  template <class R, class Deleter=std::default_delete<R> >
44  public:
45  SharedResourceHandle() : _p(nullptr) {}
46 
47  SharedResourceHandle( R *p, Deleter deleter = Deleter{} )
48  : _p(p), _deleter(deleter)
49  {
50  if( _p )
51  _p->_increaseRefCount();
52  }
53 
55  : _p(o._p), _deleter(o._deleter)
56  {
57  if( _p )
58  _p->_increaseRefCount();
59  }
60 
62  : _p(o._p), _deleter(o._deleter)
63  {
64  o._p = nullptr;
65  }
66 
68  if( _p ) {
69  _p->_decreaseRefCount();
70  if( !_p->_getRefCount() )
71  _deleter( _p );
72  }
73  }
74 
75  SharedResourceHandle &operator=( SharedResourceHandle o ) noexcept
76  {
77  swap( o, *this );
78  return *this;
79  }
80 
81  SharedResourceHandle &operator=( SharedResourceHandle &&o ) noexcept
82  {
83  swap( std::move(o), *this );
84  return *this;
85  }
86 
87  friend void swap( SharedResourceHandle &h1, SharedResourceHandle &h2 ) noexcept
88  {
89  std::swap( h1._p, h2._p );
90  std::swap( h1._deleter, h2._deleter );
91  }
92 
93  explicit operator bool() const noexcept {
94  return _p != nullptr;
95  }
96 
97 
98  R &operator*() const noexcept { return *_p; }
99  R *operator->() const noexcept { return _p; }
100 
101  R *get() const noexcept { return _p; }
102 
103 
104  R *_p;
105  Deleter _deleter;
106  };
107 
108 
109 }
110 
111 
112 #endif
113 
114 
Handle for a resource derived from SharedResource.
Definition: memory.hpp:43
Class which implements reference counter for a shared resource.
Definition: memory.hpp:17
Definition: mainpage.dox:6