#pragma once #include #include "Common.hpp" #include "Exception.hpp" struct AssertiveLocked { private: std::atomic& _held; public: AssertiveLocked(std::atomic& held): _held(held) { bool expected = false; if (!_held.compare_exchange_strong(expected, true)) { throw EGGS_EXCEPTION("could not aquire lock, are you using this function concurrently?"); } } AssertiveLocked() = delete; AssertiveLocked& operator=(const AssertiveLocked&) = delete; ~AssertiveLocked() { _held.store(false); } }; struct AssertiveLock { private: std::atomic _held; public: AssertiveLock(): _held(false) {} AssertiveLock(const AssertiveLock&) = delete; AssertiveLock& operator=(const AssertiveLock&) = delete; AssertiveLocked lock() { return AssertiveLocked(_held); } };