in_chainz

Untitled

Mar 18th, 2019
126
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. #include <tuple>
  6.  
  7. template<typename T, typename Deleter = std::default_delete<T> >
  8. class UniquePtr {
  9. public:
  10.     UniquePtr() : data_(std::make_tuple(nullptr, Deleter())) {}
  11.  
  12.     const Deleter& get_deleter() const {
  13.         return std::get<1>(data_);
  14.     }
  15.     Deleter& get_deleter() {
  16.         return std::get<1>(data_);
  17.     }
  18.  
  19.     void reset(T *ptr) {
  20.         get_deleter()(std::get<0>(data_));
  21.         std::get<0>(data_) = ptr;
  22.     }
  23.  
  24.     explicit UniquePtr(T *ptr) : data_(ptr, Deleter()) {}
  25.  
  26.     UniquePtr(T *ptr, const Deleter &del) : data_(std::make_tuple(ptr, del)) {}
  27.  
  28.     UniquePtr(UniquePtr &&other) noexcept {
  29.         data_ = other.data_;
  30.         other.release();
  31.     }
  32.  
  33.     UniquePtr &operator=(const UniquePtr &other) = delete;
  34.  
  35.     UniquePtr(const UniquePtr &other) = delete;
  36.  
  37.     UniquePtr &operator=(std::nullptr_t) noexcept {
  38.         reset(nullptr);
  39.         return *this;
  40.     }
  41.  
  42.     T& operator*() const {
  43.         return *std::get<0>(data_);
  44.     }
  45.  
  46.     T *operator->() const noexcept {
  47.         return std::get<0>(data_);
  48.     }
  49.  
  50.     T *release() noexcept {
  51.         auto ref = std::get<0>(data_);
  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