#pragma once #include "core/os/mutex.h" struct SharedMutex { void lock_shared(); void unlock_shared(); void lock_exclusive(); void unlock_exclusive(); bool is_locked(); private: BinaryMutex lock{}; unsigned shared_count{}; public: class LockExclusive { SharedMutex &mtx; public: explicit LockExclusive(SharedMutex &mtx); ~LockExclusive(); LockExclusive() = delete; LockExclusive(LockExclusive &) = delete; LockExclusive(LockExclusive &&) = delete; LockExclusive &operator=(LockExclusive &) = delete; }; class LockShared { SharedMutex &mtx; public: explicit LockShared(SharedMutex &mtx); ~LockShared(); LockShared() = delete; LockShared(LockShared &) = delete; LockShared(LockShared &&) = delete; LockShared &operator=(LockShared &) = delete; }; };