80 lines
1.5 KiB
C++
Executable File
80 lines
1.5 KiB
C++
Executable File
// License: Modified MIT (NON-AI)
|
|
// See the LICENSE file in the root directory for license information.
|
|
// Copyright 2025 Timothy Prepscius
|
|
|
|
#pragma once
|
|
|
|
#include <atomic>
|
|
#include "Lock.hpp"
|
|
#include "../assert/release_assert.h"
|
|
|
|
namespace tjp::core {
|
|
|
|
struct ColliderImp
|
|
{
|
|
Mutex m;
|
|
std::atomic<int> read = 0;
|
|
std::atomic<int> 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
|
|
|