// License: Modified MIT (NON-AI) // See the LICENSE file in the root directory for license information. // Copyright 2025 Timothy Prepscius #pragma once #include #include "Lock.hpp" #include "../assert/release_assert.h" namespace tjp::core { struct ColliderImp { Mutex m; std::atomic read = 0; std::atomic write = 0; } ; struct TestCollisionReadImp { ColliderImp &collider; TestCollisionReadImp (ColliderImp &collider_) : collider(collider_) { auto l = lock_of(collider.m); release_assert(collider.write == 0); collider.read++; } ~TestCollisionReadImp () { collider.read--; } }; struct TestCollisionWriteImp { ColliderImp &collider; TestCollisionWriteImp (ColliderImp &collider_) : collider(collider_) { auto l = lock_of(collider.m); release_assert(collider.write == 0); release_assert(collider.read == 0); collider.write++; } ~TestCollisionWriteImp () { collider.write--; } }; struct ColliderEmpty {}; struct TestCollisionEmpty { TestCollisionEmpty (ColliderEmpty &_){ (void)_; } } ; #ifdef DEBUG using Collider = ColliderImp; using TestCollisionRead = TestCollisionReadImp; using TestCollisionWrite = TestCollisionWriteImp; #else using Collider = ColliderEmpty; using TestCollisionRead = TestCollisionEmpty; using TestCollisionWrite = TestCollisionEmpty; #endif using ColliderAlways = ColliderImp; using TestCollisionReadAlways = TestCollisionReadImp; using TestCollisionWriteAlways = TestCollisionReadImp; } // namespace