/* -----------------------------------------------------------------------------
	GSFramework
	Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */


#ifndef	__NASSERT__
#define	__NASSERT__


namespace GS {
	namespace Assert {

		/// Trigger a system assertion.
extern void Trigger(const char *source, int line, const char *condition, const char *message = 0);

	} // Assert
} // GS

	// Portable assert.
#ifdef	_DEBUG
	#define	__ASSERT__(_EXP_)				if (!(_EXP_)) GS::Assert::Trigger(__FILE__, __LINE__, #_EXP_)
	#define	__ASSERT_MSG__(_EXP_, _MSG_)	if (!(_EXP_)) GS::Assert::Trigger(__FILE__, __LINE__, #_EXP_, _MSG_)
	#define	__ASSERT_ALWAYS__				GS::Assert::Trigger(__FILE__, __LINE__, "Unconditional")
#else
	#define	__ASSERT__(_EXP_)
	#define	__ASSERT_MSG__(_EXP_, _MSG_)
	#define	__ASSERT_ALWAYS__
#endif

	#define	__RASSERT__(_EXP_)				if (!(_EXP_)) GS::Assert::Trigger(__FILE__, __LINE__, #_EXP_)
	#define	__RASSERT_MSG__(_EXP_, _MSG_)	if (!(_EXP_)) GS::Assert::Trigger(__FILE__, __LINE__, #_EXP_, _MSG_)


#endif	// __NASSERT__
