in_chainz

Untitled

Mar 18th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.80 KB | None | 0 0
  1. #include <utility>
  2. #include <cstddef>
  3. #include <memory>
  4. #include <iostream>
  5.  
  6. template<typename T, typename Deleter = std::default_delete<T> >
  7. class UniquePtr {
  8. public:
  9.     UniquePtr() : data_(std::make_tuple(nullptr, Deleter())) {}
  10.  
  11.     void reset(T *ptr) {
  12.         delete std::get<0>(data_);
  13.         std::get<0>(data_) = ptr;
  14.     }
  15.  
  16.     explicit UniquePtr(T *ptr) : data_(ptr, Deleter()) {}
  17.  
  18.     UniquePtr(T *ptr, const Deleter &del) : data_(std::make_tuple(ptr, del)) {}
  19.  
  20.     const Deleter& get_deleter() const {
  21.         return std::get<1>(data_);
  22.     }
  23.     Deleter& get_deleter() {
  24.         return std::get<1>(data_);
  25.     }
  26.  
  27.     UniquePtr(UniquePtr &&other) noexcept {
  28.         data_ = other.data_;
  29.         other.release();
  30.     }
  31.  
  32.     UniquePtr &operator=(const UniquePtr &other) = delete;
  33.  
  34.     UniquePtr(const UniquePtr &other) = delete;
  35.  
  36.     UniquePtr &operator=(std::nullptr_t) noexcept {
  37.         reset(nullptr);
  38.         return *this;
  39.     }
  40.  
  41.     T& operator*() const {
  42.         return *std::get<0>(data_);
  43.     }
  44.  
  45.     T *operator->() const noexcept{
  46.         return std::get<0>(data_);
  47.     }
  48.  
  49.     T *release() noexcept {
  50.         auto ref = std::get<0>(data_);
  51.         // ptr_ = nullptr;
  52.         std::get<0>(data_) = nullptr;
  53.         return ref;
  54.     }
  55.  
  56.     UniquePtr &operator=(UniquePtr &&other) noexcept {
  57.         data_ = other.data_;
  58.         other.release();
  59.         return *this;
  60.     }
  61.  
  62.     void swap(UniquePtr &other) noexcept {
  63.         std::swap(data_, other.data_);
  64.     }
  65.  
  66.     T *get() const noexcept {
  67.         return std::get<0>(data_);
  68.     }
  69.  
  70.     explicit operator bool() const noexcept {
  71.         return std::get<0>(data_) != nullptr;
  72.     }
  73.  
  74.     ~UniquePtr() {
  75.         get_deleter()(std::get<0>(data_));
  76.     }
  77.  
  78. private:
  79.     std::tuple<T*, Deleter> data_;
  80. };
Advertisement
Add Comment
Please, Sign In to add comment