lichao
2021-04-26 bcd780993c176b93f7393607f8003adf66e6676a
src/bh_util.h
@@ -19,6 +19,7 @@
#define BH_UTIL_SOXWOK67
#include <functional>
#include <mutex>
#include <stdint.h>
inline uint16_t Get8(const void *p)
@@ -104,6 +105,69 @@
   }
};
template <class D, class M, class G = std::unique_lock<M>>
class SyncedPtr
{
   G lock_;
   D *p_ = nullptr;
public:
   SyncedPtr(M &mtx, D &data) :
       lock_(mtx), p_(&data) {}
   SyncedPtr(SyncedPtr &&a)
   {
      lock_.swap(a.lock_);
      std::swap(p_, a.p_);
   }
   D *operator->() const { return p_; }
   D &operator*() const { return *p_; }
};
template <class T, class TMutex = std::mutex, class Lock = std::unique_lock<TMutex>>
class Synced
{
   typedef T Data;
   TMutex mutex_;
   Data data_;
   typedef SyncedPtr<Data, TMutex, Lock> Ptr;
public:
   template <class... P>
   explicit Synced(const P &...p) :
       data_(p...) {}
   Ptr operator->() { return Ptr(mutex_, data_); }
   auto Apply(const auto &f)
   {
      Lock lk(mutex_);
      return f(data_);
   }
};
template <class T, class Tag>
class StaticDataRef
{
   typedef T *Ptr;
   static inline Ptr &ptr()
   {
      static Ptr sp(nullptr);
      return sp;
   }
protected:
   static inline T &GetData()
   {
      if (!ptr()) { throw std::string("Must set ShmMsg shm before use!"); }
      return *ptr();
   }
public:
   static bool SetData(T &t)
   {
      auto Bind = [&]() { ptr() = &t; return true; };
      return ptr() ? false : Bind();
   }
};
// macro helper
#define JOIN_IMPL(a, b) a##b
#define JOIN(a, b) JOIN_IMPL(a, b)