#pragma once #include "Common/Assert.hpp" namespace MC { enum class ThreadRole { None, Logic, Render, Worker }; // Hide the global from direct access namespace ThreadRoleDetail { thread_local inline ThreadRole g_thread_role = ThreadRole::None; } #define THREAD_ROLE (MC::ThreadRoleDetail::g_thread_role) #define HELLO_I_AM(role) do { \ ASSERT(THREAD_ROLE == MC::ThreadRole::None, "Thread role already set"); \ THREAD_ROLE = (role); \ } while (0) #define ASSERT_MAIN_THREAD() ASSERT(THREAD_ROLE == MC::ThreadRole::Logic, "Thread is not main") #define ASSERT_THREAD_IS(role) ASSERT(THREAD_ROLE == (role), "Thread role mismatch") #define ASSERT_THREAD_IS_NOT(role) ASSERT(THREAD_ROLE != (role), "Thread role mismatch") }