/* * This file is part of the DXX-Rebirth project . * It is copyright by its individual contributors, as recorded in the * project's Git history. See COPYING.txt at the top level for license * terms and a link to the Git history. */ #pragma once #if defined(DXX_HAVE_CXX11_STATIC_ASSERT) /* native */ #define static_assert(C,M) static_assert(C,M) #elif defined(DXX_HAVE_BOOST_STATIC_ASSERT) #include #define static_assert(C,M) BOOST_STATIC_ASSERT_MSG((C),M) #else #define DXX_C_STATIC_ASSERT_PASTE2(A,B,C) A##_##B##_##C #define DXX_C_STATIC_ASSERT_PASTE(A,B,C) DXX_C_STATIC_ASSERT_PASTE2(A,B,C) #ifdef DXX_HAVE_C_TYPEDEF_STATIC_ASSERT #define static_assert(C,M) enum { DXX_C_STATIC_ASSERT_PASTE(static_assertion_check, __LINE__, __COUNTER__) = sizeof(char[(C) ? 1 : -1]) } #else #define static_assert(C,M) enum { DXX_C_STATIC_ASSERT_PASTE(static_assertion_disabled, __LINE__, __COUNTER__) = sizeof((C)) } #endif #endif #define DEFINE_ASSERT_HELPER_CLASS(N,OP,STR) \ template \ class N \ { \ static_assert(L OP R, STR); \ public: \ static const bool value = (L OP R); \ } DEFINE_ASSERT_HELPER_CLASS(assert_equal, ==, "values must be equal"); #define assert_equal(L,R,S) static_assert((assert_equal::value), S)