#ifdef INTELLISENSE_DIRECTIVES
#	pragma once
#	include "context_cracking.h"
#	include "linkage.h"
#endif

#ifndef local_persist
#define local_persist static
#endif

#if COMPILER_MSVC
#	define thread_static __declspec(thread)
#elif COMPILER_CLANG || COMPILER_GCC
#	define thread_static __thread
#endif

////////////////////////////////
//~ rjf: Branch Predictor Hints

#if COMPILER_CLANG
# define expect(expr, val) __builtin_expect((expr), (val))
#else
# define expect(expr, val) (expr)
#endif

#define likely(expr)   expect(expr, 1)
#define unlikely(expr) expect(expr, 0)

////////////////////////////////
//~ erg: type casting

#if LANG_CPP
#	ifndef ccast
#	define ccast( type, value ) ( const_cast< type >( (value) ) )
#	endif
#	ifndef pcast
#	define pcast( type, value ) ( * reinterpret_cast< type* >( & ( value ) ) )
#	endif
#	ifndef rcast
#	define rcast( type, value ) reinterpret_cast< type >( value )
#	endif
#	ifndef scast
#	define scast( type, value ) static_cast< type >( value )
#	endif
#else
#	ifndef ccast
#	define ccast( type, value ) ( (type)(value) )
#	endif
#	ifndef pcast
#	define pcast( type, value ) ( * (type*)(& value) )
#	endif
#	ifndef rcast
#	define rcast( type, value ) ( (type)(value) )
#	endif
#	ifndef scast
#	define scast( type, value ) ( (type)(value) )
#	endif
#endif

#if ! defined(typeof) && ( ! LANG_C || __STDC_VERSION__ < 202311L)
#	if ! LANG_C
#		define typeof decltype
#	elif defined(_MSC_VER)
#		define typeof __typeof__
#	elif defined(__GNUC__) || defined(__clang__)
#		define typeof __typeof__
#	else
#		error "Compiler not supported"
#	endif
#endif

#if LANG_C
#	if __STDC_VERSION__ >= 202311L
#		define enum_underlying(type) : type
#	else
#		define enum_underlying(type)
#   endif
#else
#	define enum_underlying(type) : type
#endif

#if LANG_C
#	ifndef nullptr
#		define nullptr NULL
#	endif

#	ifndef MD_REMOVE_PTR
#		define MD_REMOVE_PTR(type) typeof(* ( (type) NULL) )
#	endif
#endif

#if ! defined(MD_PARAM_DEFAULT) && LANG_CPP
#	define MD_PARAM_DEFAULT = {}
#else
#	define MD_PARAM_DEFAULT
#endif

#if LANG_C
#	ifndef static_assert
#	undef  static_assert
#		if __STDC_VERSION__ >= 201112L
#			define static_assert(condition, message) _Static_assert(condition, message)
#		else
#			define static_assert(condition, message) typedef char static_assertion_##__LINE__[(condition)?1:-1]
#		endif
#	endif
#endif
