Advertisement
kevkul

monitor.h

Jun 15th, 2020
1,203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.58 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <functional>
  4. #include <memory>
  5. #include <mutex>
  6. #include <utility>
  7.  
  8. namespace ift630 {
  9.  
  10. using std::unique_ptr;
  11.  
  12. template <typename T>
  13. class Monitor {
  14.   mutable unique_ptr<std::mutex> mtx;
  15.   T resource;
  16.  
  17.  public:
  18.   template <typename... Args>
  19.   explicit Monitor(Args&&... args) noexcept
  20.       : mtx{std::make_unique<std::mutex>()}, resource(std::forward<Args>(args)...) {}
  21.   explicit Monitor(T&& resource) noexcept
  22.       : mtx{std::make_unique<std::mutex>()}, resource{resource} {}
  23.   Monitor(const Monitor&) = delete;
  24.   Monitor(Monitor&& other) noexcept = default;
  25.   ~Monitor() noexcept = default;
  26.  
  27.   auto operator=(const Monitor&) -> Monitor& = delete;
  28.   auto operator=(Monitor&&) noexcept -> Monitor& = default;
  29.  
  30.   template <typename F>
  31.   auto operator()(F f) {
  32.     const auto _ = std::lock_guard{*mtx};
  33.     return f(resource);
  34.   }
  35.  
  36.   template <typename F>
  37.   auto operator()(F f) const {
  38.     const auto _ = std::lock_guard{*mtx};
  39.     return f(resource);
  40.   }
  41. };
  42.  
  43. template <typename T>
  44. auto make_monitor(T&& resource) -> Monitor<T> {
  45.   return Monitor{std::forward(resource)};
  46. }
  47.  
  48. template <typename T>
  49. auto make_monitor(T& resource) -> Monitor<T> {
  50.   return Monitor{resource};
  51. }
  52.  
  53. }  // namespace ift630
  54.  
  55. // Example usage
  56. // using std::vector;
  57. // using std::string;
  58. // using ift630::Monitor;
  59. // const auto messages = vector<string>{"first", "second", "third"};
  60. // auto sync_vec = Monitor<vector<string>>{std::move(messages)};
  61. // sync_vec([](vector<string>&messages) {
  62. //   for(const auto& m : messages)
  63. //     std::cout << m << '\n';
  64. // });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement