| | |
| | | #define BH_UTIL_SOXWOK67 |
| | | |
| | | #include <functional> |
| | | #include <mutex> |
| | | #include <stdint.h> |
| | | |
| | | inline uint16_t Get8(const void *p) |
| | |
| | | } |
| | | }; |
| | | |
| | | 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 Mutex = std::mutex, class Lock = std::unique_lock<Mutex>> |
| | | class Synced |
| | | { |
| | | typedef T Data; |
| | | Mutex mutex_; |
| | | Data data_; |
| | | typedef SyncedPtr<Data, Mutex, 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_); |
| | | } |
| | | }; |
| | | |
| | | // macro helper |
| | | #define JOIN_IMPL(a, b) a##b |
| | | #define JOIN(a, b) JOIN_IMPL(a, b) |