Files
core_zero/tjp/core/threads/TestCollision.h
Timothy Prepscius 996151a56a flatten 20260225
2026-02-25 12:43:06 -05:00

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