xref: /openbmc/telemetry/src/utils/unique_call.hpp (revision b5645947)
1 #pragma once
2 
3 #include <memory>
4 #include <utility>
5 
6 namespace utils
7 {
8 
9 class UniqueCall
10 {
11   public:
12     struct Lock
13     {};
14 
15     template <class Functor, class... Args>
operator ()(Functor && functor,Args &&...args)16     void operator()(Functor&& functor, Args&&... args)
17     {
18         if (lock.expired())
19         {
20             auto l = std::make_shared<Lock>();
21             lock = l;
22             functor(std::move(l), std::forward<Args>(args)...);
23         }
24     }
25 
26   private:
27     std::weak_ptr<Lock> lock;
28 };
29 
30 } // namespace utils
31