Advertisement
Guest User

Untitled

a guest
Feb 24th, 2020
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.88 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <memory>
  4.  
  5. #include <twist/stdlike/mutex.hpp>
  6.  
  7. namespace solutions {
  8.  
  9. template <typename T>
  10. class Guarded : std::enable_shared_from_this<Guarded<T>> {
  11.   template<typename> struct Ptr;
  12.  
  13.  public:
  14.   Ptr<Guarded> operator->() {
  15.     return Ptr<Guarded>(std::enable_shared_from_this<Guarded<T>>::shared_from_this(), mutex_);
  16.   }
  17.  
  18.   T* GetObjectPtr() {
  19.     return &object_;
  20.   }
  21.  
  22.  private:
  23.   template <typename S>
  24.   struct Ptr {
  25.     Ptr(std::shared_ptr<S> ptr, twist::stdlike::mutex& mutex) : ptr_(ptr), mutex_(mutex) {
  26.       mutex_.lock();
  27.     }
  28.  
  29.     ~Ptr() {
  30.       mutex_.unlock();
  31.     }
  32.  
  33.     auto operator->() {
  34.       //return ptr_.lock()->GetObjectPtr();
  35.       return ptr_->GetObjectPtr();
  36.     }
  37.  
  38.     std::shared_ptr<S> ptr_;
  39.     twist::stdlike::mutex& mutex_;
  40.   };
  41.  
  42.   T object_;
  43.   twist::stdlike::mutex mutex_;
  44. };
  45.  
  46. }  // namespace solutions
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement