Advertisement
Guest User

Untitled

a guest
Dec 20th, 2012
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.67 KB | None | 0 0
  1. template<typename T> class shared_ptr {
  2. struct deleter_base {
  3. unsigned strongrefs;
  4. virtual void destroy(T* p) = 0;
  5. virtual ~deleter_base() {}
  6. };
  7. template<typename Del> struct deleter_derived : public deleter_base {
  8. deleter_derived(Del del) : d(std::move(del)) {}
  9. Del d;
  10. void destroy(T* p) { d(p); }
  11. };
  12. struct unique_deleter {
  13. unique_deleter(unique_deleter&& other)
  14. : d(nullptr) {
  15. std::swap(d, other.d);
  16. }
  17.  
  18. unique_deleter(deleter_base* d)
  19. : d(d) {
  20. if (!d) return;
  21. d->strongrefs++;
  22. }
  23.  
  24. deleter_base* d;
  25. void operator()(T* p) {
  26. if (!d) return;
  27. if (! --d->strongrefs) {
  28. d->destroy();
  29. delete d;
  30. }
  31. }
  32. };
  33. std::unique_ptr<T, unique_deleter> ptr;
  34. public:
  35. shared_ptr() {}
  36. shared_ptr(const shared_ptr& other)
  37. : ptr(other.get(), other.ptr.get_deleter().d) {}
  38. shared_ptr(shared_ptr&& other)
  39. : ptr(std::move(other.ptr)) {}
  40.  
  41. shared_ptr& operator=(const shared_ptr& other) {
  42. ptr = std::unique_ptr<T, unique_deleter>(other.get(), other.ptr.get_deleter().d);
  43. }
  44. shared_ptr& operator=(shared_ptr&& other) {
  45. ptr = std::move(other.ptr);
  46. }
  47.  
  48. shared_ptr(T* p) {
  49. auto destruct = [](T* ptr) { delete ptr; };
  50. ptr = std::unique_ptr<T, unique_deleter>(p, new deleter_derived<decltype(destruct)>(destruct);
  51. }
  52.  
  53. explicit operator unique_ptr<T, unique_deleter>() {
  54. return unique_ptr<T, unique_deleter>(ptr.get(), ptr.get_deleter().d);
  55. }
  56. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement