#ifndef LIBPKG_DATA_LOCKABLE_H #define LIBPKG_DATA_LOCKABLE_H #include #include namespace LibPkg { struct Lockable { [[nodiscard]] std::shared_lock lockToRead() const; [[nodiscard]] std::unique_lock lockToWrite(); [[nodiscard]] std::shared_lock tryLockToRead() const; [[nodiscard]] std::unique_lock tryLockToWrite(); [[nodiscard]] std::unique_lock lockToWrite(std::shared_lock &readLock); private: mutable std::shared_mutex m_mutex; }; inline std::shared_lock Lockable::lockToRead() const { return std::shared_lock(m_mutex); } inline std::unique_lock Lockable::lockToWrite() { return std::unique_lock(m_mutex); } inline std::shared_lock Lockable::tryLockToRead() const { return std::shared_lock(m_mutex, std::try_to_lock); } inline std::unique_lock Lockable::tryLockToWrite() { return std::unique_lock(m_mutex, std::try_to_lock); } inline std::unique_lock Lockable::lockToWrite(std::shared_lock &readLock) { readLock.unlock(); return std::unique_lock(m_mutex); } } // namespace LibPkg #endif // LIBPKG_DATA_LOCKABLE_H