#pragma once

#define __ban_assert_stringify_helper(s) #s
#define __ban_assert_stringify(s) __ban_assert_stringify_helper(s)

#define ASSERT(cond)																						\
	(__builtin_expect(!(cond), 0)																			\
		? __ban_assertion_failed(__FILE__ ":" __ban_assert_stringify(__LINE__), "ASSERT(" #cond ") failed")	\
		: (void)0)

#define ASSERT_NOT_REACHED()																				\
	__ban_assertion_failed(__FILE__ ":" __ban_assert_stringify(__LINE__), "ASSERT_NOT_REACHED() reached")

[[noreturn]] void __ban_assertion_failed(const char* location, const char* msg);
