| 30 | // ------------------------------------------------------------------------ |
| 31 | template <class T> |
| 32 | class spp_sptr |
| 33 | { |
| 34 | public: |
| 35 | spp_sptr() : _p(0) {} |
| 36 | spp_sptr(T *p) : _p(p) { if (_p) _p->increment(); } |
| 37 | spp_sptr(const spp_sptr &o) : _p(o._p) { if (_p) _p->increment(); } |
| 38 | #ifndef SPP_NO_CXX11_RVALUE_REFERENCES |
| 39 | spp_sptr(spp_sptr &&o) : _p(o._p) { o._p = (T *)0; } |
| 40 | spp_sptr& operator=(spp_sptr &&o) { this->swap(o); return *this; } |
| 41 | #endif |
| 42 | ~spp_sptr() { if (_p) _p->decrement(); } |
| 43 | spp_sptr& operator=(const spp_sptr &o) { reset(o._p); return *this; } |
| 44 | T* get() const { return _p; } |
| 45 | void swap(spp_sptr &o) { T *tmp = _p; _p = o._p; o._p = tmp; } |
| 46 | void reset(const T *p = 0) |
| 47 | { |
| 48 | if (p == _p) |
| 49 | return; |
| 50 | if (_p) _p->decrement(); |
| 51 | _p = (T *)p; |
| 52 | if (_p) _p->increment(); |
| 53 | } |
| 54 | T* operator->() const { return const_cast<T *>(_p); } |
| 55 | bool operator!() const { return _p == 0; } |
| 56 | |
| 57 | private: |
| 58 | T *_p; |
| 59 | }; |
| 60 | |
| 61 | // ------------------------------------------------------------------------ |
| 62 | namespace std |